我正在我的makefile中定义一个像这样的变量
target:
@for entry in ${FOLDERSS} ; \
do \
COUNT=$$(( $${COUNT}+1 )) ; \
if [ $$COUNT -eq 1 ] ; then \
FOLDERS="[ -s " ; \
aux=`echo $$entry` ; \
FOLDERS+=$$aux ; \
else \
FOLDERS+=" [ -s " ; \
aux=`echo $$entry` ; \
FOLDERS+=$$aux ; \
FOLDERS+=" ]" ; \
fi ; \
done ; \
FOLDERS+=" ]";\
“文件夹”是在我的Makefile中手动定义的,其中包含我需要考虑进行编译的所有文件夹。现在,我要执行以下操作:
deps: target
${AUTOGEN} -d $${FOLDERS}) -f ${AUTOCONF};\
其中AUTOGEN是bash脚本,而AUTOCONF是配置文件。文件夹应该确切地写出其中包含的内容,例如: [-s / home / at / src / folder1 [-s / home / at / src / folder2]] 因此,在我的makefile中执行bashscript的所有操作中,都应具有以下命令:
./path/to/autogen -d [ -s /home/at/src/folder1 [ -s /home/at/src/folder2 ] ] -f /path/to/autoconfile
如果我在makefile中手动键入此命令,它将起作用,但是当使用双美元符号时,似乎无法计算变量FOLDERS。
有人有建议吗
答案 0 :(得分:1)
这是一件有点奇怪的事情,而且是解决问题的非常复杂的方法。怎么样?
folders := $(patsubst %,[ -s %,${FOLDERSS})\
$(patsubst %, ],${FOLDERSS})
deps: target
${AUTOGEN} -d $(folders)-f ${AUTOCONF}
我们声明一个Make变量folders
,其值为${FOLDERSS}
,并在每个令牌之前添加字符串[ -s
,后跟相同数量的]
右括号。>
尝试使用Bash数组要求将Make专门设置为使用sh
的Bash intead;并且您没有使用正确的语法来调用数组的值。 Shell变量无论如何不会在配方调用之间持久化(除非您采取特殊措施来强制执行此行为)。 useless use of echo
in backticks基本上是无害的,但是您仍然要避免使用反模式。
顺便说一句,您不应该使用@
来禁用配方命令的打印,尤其是在调试复杂的配方时。