【问题标题】:Make commands with variables使用变量制作命令
【发布时间】:2015-02-22 19:58:39
【问题描述】:

我一直在学习 make 并且正在努力解决问题。我对这个一般结构有一些规则。

FILE = "myfile.txt"

test :
    YOUR = $(subst my,your,$(FILE));\
    cat $(FILE) $(YOUR)

我希望最终结果是运行命令:

cat myfile.txt yourfile.txt

相反,我得到以下...

YOUR = "yourfile.txt";\
    cat "myfile.txt" 
/bin/sh: YOUR: command not found
make: *** [test] Error 1

如果不使用subst 函数,我只是在makefile 中执行YOUR="yourfile",一切看起来都很好。有什么建议还是我错过了一些非常基本的东西?我应该补充一点,我使用制表符而不是空格来开始规则中命令的行。

【问题讨论】:

    标签: bash makefile


    【解决方案1】:
    FILE = "myfile.txt"
    
    test :
        $(eval YOUR = $(subst my,your,$(FILE)))
        cp $(FILE) $(YOUR)
    

    你必须在配方中使用eval函数(Define make variable at rule execution time

    【讨论】:

    • 谢谢 - 做到了。在更复杂的示例中,测试类似于 $(test),我需要对 $@ 变量进行 subst,然后将结果传递给 shell 脚本。
    【解决方案2】:

    您需要区分make 执行的内容和shell 执行的内容。您的YOUR = 行以制表符开头,并且是规则操作的一部分,因此它由shell 执行,它找不到程序YOUR 来执行带有一些参数的程序。

    将扩展放在规则之外:

    YOUR = $(subst my,your,$(FILE))
    
    test:
        cat $(FILE) $(YOUR)
    

    请注意,shell 赋值不需要等号周围的空格,并使用${} 而不是$() 来引用变量:Bash 中的YOUR=${FILE/my/your}(如果以make 规则编写,则需要@ 987654329@ 代替 $ 以便 shell 看到一个美元符号并且 make 不会尝试它不理解的变量扩展)。 shell 使用$() 执行其中包含的命令,结果通常被捕获在一个变量中:YOUR=$(echo "${FILE}" | sed 's/my/your/')

    【讨论】:

    • 你是对的,但在这种情况下你可以使用它,只需 echo "$file"
    • @BallPython echo "$file" 在 make 配方中将无法正常工作...除非您期望 make 扩展 $f 变量并让 echo 吐出 <value-of-f>ile
    【解决方案3】:

    如果您只需要 shell 配方中的变量而不是 make 上下文中的变量,那么您无需费心使用 eval(已提升),只需分配给 shell 变量即可。

    例如:

    FILE = "myfile.txt"
    
    test :
        YOUR='$(subst my,your,$(FILE))';\
        cat $(FILE) "$${YOUR}"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-10
      • 2013-02-07
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      相关资源
      最近更新 更多