我正在尝试编写一个GNU make调用函数(下面的例子),它有多个shell命令要执行,这样就可以用不同的参数调用它。
shell_commands = $(shell echo $(1); ls -ltr $(2))
try:
$(call shell_commands,$(FILE1),$(FILE2))
1)高于使用多个命令编写调用函数的正确方法吗?用分号分开它们?为了使其可读,我编写了如下所示的目标。是否有类似的方式来编写调用函数?
shell_commands:
echo $(1)
ls -ltr $(2)
2)当我执行make -B try
时,我从make中得到此错误。看起来它正在尝试执行/ home / user / file1。但为什么呢?
make: execvp: /home/user/file1: Permission denied
make: *** [try] Error 127
3)是否可以将可变数量的参数传递给调用函数?就像传递第二个参数而不是第一个参数一样。
$(call shell_commands,,$(FILE2))
我尝试谷歌搜索,搜索SO,并在gnu.org上查找,但我没有得到任何解决方案。将会感谢任何有关多个可选参数和命令调用函数的资源的任何答案或指针。
答案 0 :(得分:2)
问题1:不,这不对。 shell make函数永远不应该在配方中使用:配方已经在shell中运行了,那你为什么要运行另一个shell?这只是令人困惑。其次,通常建议在配方中的多个命令之间使用&&
,这样如果第一个命令失败,整个命令将立即失败,而不是继续并且可能成功。当然,这也不总是正确的,这取决于你想要做什么。
问题2:这是因为shell make函数就像shell中的反引号:它扩展到它运行的shell命令打印的输出。执行运行的shell命令是:
echo $(1); ls -ltr $(2)
(其中,假设$1
扩展为/home/user/file1
),打印字符串/home/user/file1
。扩展后,该字符串被替换为配方,并尝试运行该配方,给出您在上面看到的错误。
你想要这个,很有可能:
shell_commands = echo $(1) && ls -ltr $(2)
try:
$(call shell_commands,$(FILE1),$(FILE2))
现在调用扩展为实际文本,而不是调用make的shell函数,然后该文本作为配方运行。
问题3:当然,只使用空参数意味着变量$1
(在本例中)扩展为空字符串。