我一直在学习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
函数,而是在YOUR="yourfile"
中执行makefile
,一切看起来都不错。任何建议或我错过了一些非常基本的东西?我应该补充一点,我使用制表符而不是空格来启动规则中命令的行。
答案 0 :(得分:1)
您需要区分make
执行的内容和shell执行的内容。您的YOUR =
行以选项卡开头,是规则操作的一部分,因此它由shell执行,它无法找到一个程序YOUR
来执行某些参数。
将扩展放在规则之外:
YOUR = $(subst my,your,$(FILE))
test:
cat $(FILE) $(YOUR)
请注意,shell分配在等号周围不需要空格,并使用${}
而不是$()
来引用Bash中的变量:YOUR=${FILE/my/your}
(如果用{{1}编写的话}规则,您需要make
代替$$
,以便shell看到一个美元符号,而$
不会尝试变量扩展,它不会了解)。 shell使用make
来执行其中包含的命令,结果通常在变量中捕获:$()
。
答案 1 :(得分:1)
FILE = "myfile.txt"
test :
$(eval YOUR = $(subst my,your,$(FILE)))
cp $(FILE) $(YOUR)
您必须使用食谱中的eval
功能(Define make variable at rule execution time)
答案 2 :(得分:0)
如果你只需要shell配方中的变量而不是make上下文,那么你就不需要打扰eval(它被提升),而只需要分配给shell变量。
例如:
FILE = "myfile.txt"
test :
YOUR='$(subst my,your,$(FILE))';\
cat $(FILE) "$${YOUR}"