Makefile和Shell变量

时间:2018-12-01 18:18:34

标签: bash shell makefile compilation

我正在我的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。

有人有建议吗

1 个答案:

答案 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基本上是无害的,但是您仍然要避免使用反模式。

顺便说一句,您不应该使用@来禁用配方命令的打印,尤其是在调试复杂的配方时。