【问题标题】:Makefile and shell variablesMakefile 和 shell 变量
【发布时间】:2018-12-01 18:18:33
【问题描述】:

我在我的 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+=" ]";\

“FOLDERSS”是在我的 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。

大家有什么建议吗

【问题讨论】:

    标签: bash shell makefile compilation


    【解决方案1】:

    这是一件有点奇怪的事情,也是一种解决问题的非常复杂的方法。这是怎么回事?

    folders := $(patsubst %,[ -s %,${FOLDERSS})\
        $(patsubst %, ],${FOLDERSS})
    
    deps: target
        ${AUTOGEN} -d $(folders)-f ${AUTOCONF}
    

    我们声明了一个 Make 变量 folders,其值为 ${FOLDERSS},并在每个标记前添加字符串 [ -s,后跟相同数量的 ] 右括号。​​

    尝试使用 Bash 数组需要专门设置 Make 以使用 Bash 而不是 sh;并且您没有使用正确的语法来调用数组的值。 Shell 变量无论如何都不会在配方调用之间持续存在(除非您采取特殊措施来强制这种行为)。 useless use of echo in backticks 本身基本上是无害的,但仍然是您要避免的反模式。

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

    【讨论】:

    • 谢谢,这样做更有意义。虽然,文件夹变量并没有给出预期的结果。由于某种原因,它会跳过整个路径到文件夹,所以它只给出了 folder1/ 和 folder2/
    • 这似乎与我发布的代码无关。你能显示一个 Pastebin 或类似的确切代码和你得到的输出吗?
    • 所以 FOLDERSS = $(SRCDIR)/folder1 $(SRCDIR)/folder2 应用你所说的只给: [ -s /folder1 [ -s /folder2 ] ] 所以缺少 $(SRCDIR)
    • 在我看来 SRCDIR 在评估时未设置。这是一个演示/minimal reproducible example:ideone.com/xNyvM8
    猜你喜欢
    • 2011-06-20
    • 2017-02-18
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多