Makefile: 检查目录写入权限

3

在Makefile规则中,有没有一种方法可以检查它是否有权限写入指定目录?这是我正在编写的Makefile的一个小部分:

APP_NAME = electro
CC = gcc
C_FLAGS = -Wall
LIB_DIR = lib
SRC_DIR = src
INST_DIR = /usr/bin
INST_LIBDIR = /usr/lib
LIBS = libcomponent.so libpower.so libresistance.so
L_FLAGS = -lresistance -lpower -lcomponent

.PHONY: lib

lib:
    @$(MAKE) --directory=$(LIB_DIR)

install:    $(SRC_DIR)/main.c lib
    (cd $(LIB_DIR); cp $(LIBS) $(INST_LIBDIR))
    $(CC) $(C_FLAGS) -o $(INST_DIR)/$(APP_NAME) $(L_FLAGS) $< 
    @echo "$(APP_NAME) installed successfully."

如果用户没有写入 /usr/lib 和 /usr/bin 的权限,'install' 规则显然会失败。有没有一种方法在执行这两行之前检查这个权限,并在这种情况下输出适当的错误消息(也许是 "您没有足够的权限运行此命令")?


请注意,在Cygwin上这些检查并不值得太多。最好的方法可能是在那里写入失败。 - reinierpost
2个回答

6

Shell的/bin/test或/bin/[ 可以让您执行如下命令:/bin/test -d /path/to/foo -a -w /path/to/foo,即使make本身不能。

使目录可访问的另一种方法是尝试使用mkdir -p创建它,然后再测试它是否可写。 我知道有人会这样做:

mkdir -p ${TARGETDIR} && test -w ${TARGETDIR}

如果第一个命令失败,第二个命令将不会执行。如果目录已经存在,则mkdir -p命令将成功执行。

运行完美,谢谢! 我使用了:if [ -w /usr/lib ] && [ -w /usr/bin ] - yzfr1
2
不要低估 mkdir -p 的价值。例如,如果您的文档需要安装在 ${PREFIX}/share/${PKGNAME}/html/ 中,运行单个 mkdir -p 要比测试和创建该路径的每个部分更容易。如果您真正的目标是“尽可能写入 ${PATH}”,那么这是更快达到目标的方法。 - ghoti
@yzfr1,这不是什么大问题,但是if [ -w /usr/lib ] && [ -w /usr/bin ]比我在答案中提到的格式使用更多的资源。通过使用&&连接两个[测试,如果你在POSIX shell中,你会运行/bin/[二进制两次。当然,如果你在bash中,[是内置的,所以性能差异将是可以忽略不计的。 - Graham

0

你可以通过将小的 shell 脚本嵌入到你的 makefile 中来完成类似的操作。


好的,是的,我意识到了。我要找的是一段具体的 shell 代码,用来实现这个目标。 - yzfr1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接