我写了一个非常简单的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
重要评论在这里整合和回答
如果将
-o
和-g
选项完全删除在Cygwin
系统上会发生什么?然后它工作得很好,但我想在 Linux 系统上用户和组会是错误的。
对用户和组名进行硬编码似乎是个坏主意。
我承认我没有想到这一点,当我现在思考时,我也这么认为。
我建议您不要硬编码安装路径。
这是一个可爱的想法,是的,我同意,让用户决定安装它的位置。
你如何
Makefile
在Linux下调用这个?作为普通用户
sudo
,即sudo make install
。如果您让 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
.
当您运行脚本时,sudo
将GNU/Linux
设置USER_ID
为 root。
笔记:目前已在 上验证GNU/Linux
。
编者注:
已验证在
Cygwin
.改变了方式
USER_ID
并GROUP_ID
分配给标准shell
内置。在评论中添加了详细的长选项版本。
如果你想改变目的地,你可以简单地调用,例如:
DESTDIR=/desired/target/directory/ make install
答案2
这不是程序的问题,而是你的程序与Cygwin不兼容Makefile
导致的问题。install
如果您希望拥有可在没有root
用户的平台上工作的便携式构建系统,那么您需要一个更好的 install
能够检测当前用户是否能够将文件所有权更改为所需用户的程序。
我建议看一下conf/install-sh
中的脚本schilytools
包裹。
它是为了支持而编写的Cygwin
,并且脚本是免费的。