【问题标题】:Makefile: Check write permission to directoryMakefile:检查目录的写权限
【发布时间】:2012-03-02 02:18:07
【问题描述】:

有没有办法在 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 的权限,“安装”规则显然会失败。有没有办法在执行这两行之前检查此权限并在这种情况下输出适当的错误消息(可能类似于“您没有足够的权限运行此命令”之类的内容)?

【问题讨论】:

  • 请注意,这些检查在 Cygwin 上没有多大价值。最好不要在那里写。

标签: linux permissions makefile


【解决方案1】:

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 ]
  • 不要低估mkdir -p的价值。例如,如果您的文档需要安装在 ${PREFIX}/share/${PKGNAME}/html/ 中,则运行单个 mkdir -p 比测试和创建该路径的每个单独部分要容易得多。如果您的真正目标是“尽可能写入 ${PATH}”,这是实现它的更快方法。
  • @yzfr1,这没什么大不了的,但if [ -w /usr/lib ] &amp;&amp; [ -w /usr/bin ] 确实比我在回答中提到的格式使用了更多的资源。通过将两个[ 测试与&amp;&amp; 结合起来,如果您在POSIX shell 中,您将运行/bin/[ 二进制两次。当然,如果你在 bash 中,[ 是内置的,所以性能差异可以忽略不计。
【解决方案2】:

您或多或少通过将少量的 shell 脚本嵌入到您的 makefile 中来做类似的事情。

【讨论】:

  • 嗯,是的,我知道这一点。我正在寻找的是可以用来完成此任务的特定 shell 代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 2015-09-04
相关资源
最近更新 更多