Function 具有多个参数和多个命令的GNU make call函数

Function 具有多个参数和多个命令的GNU make call函数,function,makefile,arguments,call,gnu,Function,Makefile,Arguments,Call,Gnu,我正在尝试编写一个GNU make call函数(下面的示例),它有多个shell命令要执行,因此可以使用不同的参数调用它 shell_commands = $(shell echo $(1); ls -ltr $(2)) try: $(call shell_commands,$(FILE1),$(FILE2)) 1) 使用多个命令编写调用函数是否正确?用分号把它们分开?为了使其可读,我编写了如下所示的目标。有没有类似的方法来编写调用函数 shell_commands: echo $

我正在尝试编写一个GNU make call函数(下面的示例),它有多个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))

我试着用谷歌ing,搜索SO,并在gnu.org上搜索,但我没有得到任何解决方案。如果您有任何答案或指向使用多个可选参数和命令调用函数的任何资源的指针,我们将不胜感激。

问题1:不,这是不对的。shell make函数不应该在配方中使用:配方已经在shell中运行,那么为什么要运行另一个shell呢?只是让人困惑。第二,通常建议在配方中的多个命令之间使用
&&
,这样,如果第一个命令失败,整个命令将立即失败,而不是继续执行并可能成功。当然,这也不总是正确的,这取决于你想做什么

问题2:之所以会出现这种情况,是因为shell make函数类似于shell中的backticks:它扩展到由它运行的shell命令打印的输出。进行运行的shell命令是:

echo $(1); ls -ltr $(2)
(其中假定,
$1
扩展为
/home/user/file1
),它打印字符串
/home/user/file1
。展开后,该字符串被替换到配方中,make尝试运行该配方,给出上面看到的错误

你很可能想要这个:

shell_commands = echo $(1) && ls -ltr $(2)

try:
        $(call shell_commands,$(FILE1),$(FILE2))
现在,调用扩展到实际文本,而不是调用make的shell函数,然后该文本作为配方运行


问题3:当然,只使用空参数意味着变量
$1
(在本例中)将扩展为空字符串。

谢谢!基本上,我希望重用通用函数。我想我可以通过使用变量来做到这一点——在一个公共文件中设置默认值,然后在主make文件中覆盖它们。