2012-03-02 140 views
3

有没有办法在Makefile规则中检查它是否有权写入指定的目录?这是我写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中的“安装”规则显然会失败。有没有办法在执行这两行之前检查这个权限,并在这种情况下输出一个适当的错误信息(可能是“你没有足够的权限来运行这个命令”)?

+0

请注意,这些检查在Cygwin上并不值得。不写在那里可能会更好。 – reinierpost 2012-03-02 09:52:56

回答

5

Shell的/ bin/test或/ bin/[即使make本身没有,也会让你/bin/test -d /path/to/foo -a -w /path/to/foo

使目录可访问的一种替代方法是在测试它是否可写之前尝试使用mkdir -p来创建它。我已经知道要做到以下几点:

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

如果第一个命令失败,二是没试过。如果该目录已经存在,mkdir -p将会成功。

+0

完美工作,谢谢! 我使用过:if [-w/usr/lib] && [-w/usr/bin] – yzfr1 2012-03-02 17:03:39

+2

不要低估'mkdir -p'的价值。例如,如果您的文档需要安装在'$ {PREFIX}/share/$ {PKGNAME}/html /'中,运行一个'mkdir -p'而不是测试并创建每个单独部分路径。如果你真正的目标是“如果可能的话,写入$ {PATH}”,这是一个更快的方法来达到它。 – ghoti 2012-03-05 03:39:07

+0

@ yzfr1,这不是什么大问题,但是如果[-w/usr/lib] && [-w/usr/bin]'的使用比我在我的答案中提到的格式更多的资源。通过用'&&'连接两个'''测试,如果你在POSIX shell中,你可以运行'/ bin/['binary *'*]。当然,如果你在bash中,'['是内置的,所以性能差异可以忽略不计。 – Graham 2017-03-11 00:03:20

0

您可以通过将少量shell脚本嵌入到makefile中来或多或少地做这些事情。

+0

好的,我意识到这一点。我正在寻找的是我可以用来实现这个特定的一段shell代码。 – yzfr1 2012-03-02 02:26:30