我正在尝试编写一个makefile以在执行时执行以下操作:
CMVC_VIEW = ../../..
TB_DIR = $(CMVC_VIEW)/tarball_images
SMAC_TOOLS = $(TB_DIR)/smac_tools
SMAC_BIN = $(SMAC_TOOLS)/bin
DIR_LIST = $(TB_DIR)
$(SMAC_TOOLS)
$(SMAC_BIN)
install:
rm -f *.o
for DIR in $(DIR_LIST); do
echo $${DIR};
chmod 2775 $${DIR};
done
但是,当生成文件运行时,我收到一个错误,说 chmod:2775
后缺少操作数。 我不明白为什么会发生这种情况,因为$${DIR}
应该包含与需要更改其访问权限的目录相对应的路径。
当我用静态目录路径替换$${DIR}
时,这似乎有效。
出于此生成文件的目的,假设DIR_LIST
宏分配给以空格分隔的目录列表。
你对 make 变量引用和 shell 变量引用感到困惑。 请记住,make 会将任何字符串(如 $(FOO)
)解释为 make 变量的引用,使用该名称查找变量,并将引用替换为值。 基于 shell 的 for
循环会创建一个名为 DIR 的 shell 变量,但由于您刚刚 $(DIR)
,make 正在尝试(并失败)找到一个名为 DIR 的 make 变量。
您的解决方案之所以有效,是因为双$
阻止 make 执行自己的可变引用分辨率,因此文本$(DIR)
被传递给 shell,然后 shell 执行自己的可变分辨率! 当然,这是有效的,因为for
循环创建了DIR变量。