Bash Makefile和shell变量
我在makefile中定义了这样一个变量Bash Makefile和shell变量,bash,shell,makefile,compilation,Bash,Shell,Makefile,Compilation,我在makefile中定义了这样一个变量 target: @for entry in ${FOLDERSS} ; \ do \ COUNT=$$(( $${COUNT}+1 )) ; \ if [ $$COUNT -eq 1 ] ; then \ FOLDERS="[ -s "
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+=" ]";\
“FoLDRSS”是在我的Mag文件中手动定义的,包含了我需要考虑的所有文件夹。现在,我要执行以下操作:
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 := $(patsubst %,[ -s %,${FOLDERSS})\
$(patsubst %, ],${FOLDERSS})
deps: target
${AUTOGEN} -d $(folders)-f ${AUTOCONF}
我们声明一个Make变量folders
,其值为${FOLDERSS}
,在每个标记之前添加字符串[-s
,后跟相同数量的]
结束括号
试图使用Bash数组需要专门设置Make以使用Bash intead ofsh
;您没有使用正确的语法调用数组的值。Shell变量无论如何都不会在配方调用之间保持不变(除非您采取特殊措施强制执行此行为)。这样做基本上是无害的,但仍然是一种您希望避免的反模式
另外,您不应使用
@
禁用配方命令的打印,尤其是在调试复杂配方时。谢谢,这样做更有意义。尽管如此,folders变量并没有给出期望的结果。出于某种原因,它跳过了到文件夹的整个路径,因此它只给出了folder1/和folder2/,这似乎与我发布的代码无关。你能显示一个粘贴库或精确代码的相似项以及你得到的输出吗?所以FOLDERSS=$(SRCDIR)/folder1$(SRCDIR)/folder2应用你所说的只给出:[-s/folder1[-s/folder2]]所以$(SRCDIR)丢失了。在我看来,在计算时SRCDIR是未设置的。这是一个演示: