我写了一个非常简单的Makefile

我写了一个非常简单的Makefile

我写了一个非常简单的Makefile

$ cat Makefile

install_path=/usr/local/bin
script_name_1=encrypt-file-aes256
script_name_2=decrypt-file-aes256

.PHONY: install
.PHONY: uninstall

install:
        install -m 0755 -o root -g root -t $(install_path) $(script_name_1) $(script_name_2)

uninstall:
        rm $(install_path)/$(script_name_1) $(install_path)/$(script_name_2)

它在我已经测试过的 Linux Mint 18.3 上表现得非常出色。

但不是在Cygwin;这就是我得到的错误

$ make install

install -m 0755 -o root -g root -t /usr/local/bin encrypt-file-aes256 decrypt-file-aes256
install: invalid user ‘root’
make: *** [Makefile:9: install] Error 1

root我知道中没有用户Cygwin,但不知道如何修复它。

如何推广它才能在Linux 上Makefile工作?Cygwin


重要评论在这里整合和回答

  1. 如果将-o-g选项完全删除在Cygwin系统上会发生什么?

    然后它工作得很好,但我想在 Linux 系统上用户和组会是错误的。

  2. 对用户和组名进行硬编码似乎是个坏主意。

    我承认我没有想到这一点,当我现在思考时,我也这么认为。

  3. 我建议您不要硬编码安装路径。

    这是一个可爱的想法,是的,我同意,让用户决定安装它的位置。

  4. 你如何Makefile在Linux下调用这个?

    作为普通用户sudo,即sudo make install

  5. 如果您让 9 号线在 之外工作make,那么它就会工作。这不成make问题。

    我知道这不是make问题。我只是不知道如何概括它也Makefile能发挥作用Cygwin

答案1

Cygwin以下是兼容的一个例子Makefile

DESTDIR?=/usr/local/bin
install_path=$(DESTDIR)
USER_ID=$(shell whoami)
GROUP_ID=$(shell id -gn)
script_name_1=encrypt-file-aes256
script_name_2=decrypt-file-aes256

.PHONY: install
.PHONY: uninstall

install:
    install -m 0755 -o $(USER_ID) -g $(GROUP_ID) -t $(install_path) $(script_name_1) $(script_name_2)

    # with long options together with verbosity turned on it might be better for users
    #install --verbose --mode=0755 --owner=$(USER_ID) --group=$(GROUP_ID) --target-directory=$(install_path) $(script_name_1) $(script_name_2)

uninstall:
    rm $(install_path)/$(script_name_1) $(install_path)/$(script_name_2)

当您想安装在任何其他位置时,您可以覆盖该变量DESTDIR或在Makefile.

当您运行脚本时,sudoGNU/Linux设置USER_ID为 root。

笔记:目前已在 上验证GNU/Linux

编者注:

  1. 已验证在Cygwin.

  2. 改变了方式USER_IDGROUP_ID分配给标准shell内置。

  3. 在评论中添加了详细的长选项版本。

  4. 如果你想改变目的地,你可以简单地调用,例如:

    DESTDIR=/desired/target/directory/ make install
    

答案2

这不是程序的问题,而是你的程序与Cygwin不兼容Makefile导致的问题。install

如果您希望拥有可在没有root用户的平台上工作的便携式构建系统,那么您需要一个更好的 install能够检测当前用户是否能够将文件所有权更改为所需用户的程序。

我建议看一下conf/install-sh中的脚本schilytools包裹

它是为了支持而编写的Cygwin,并且脚本是免费的。

相关内容