【问题标题】:How to pass a variable to the sub make called by foreach function in a Makefile?如何将变量传递给Makefile中foreach函数调用的子make?
【发布时间】:2018-08-04 13:30:44
【问题描述】:

我想在循环中使用变量 KDIR 进行子制作,并将其传递给在 module/ 文件夹中调用的 Makefile。

sub_make=$(MAKE) -C module all KDIR=$(1);

SUB_DIRS= k1 k2 k3 

all:  
    @$(foreach n, $(SUB_DIRS), $(call sub_make, $(n)))

module/文件夹中Makefile的内容很简单,如下:

all:
    echo $(KDIR)

但我收到以下错误:

make[1]: *** No rule to make target 'k1'.  Stop.
make[1]: Leaving directory '/home/r/Desktop/work/test/module'
make[1]: Entering directory '/home/r/Desktop/work/test/module'
echo 

make[1]: *** No rule to make target 'k2'.  Stop.
make[1]: Leaving directory '/home/r/Desktop/work/test/module'
make[1]: Entering directory '/home/r/Desktop/work/test/module'
echo 

make[1]: *** No rule to make target 'k3'.  Stop.
make[1]: Leaving directory '/home/r/Desktop/work/test/module'
Makefile:6: recipe for target 'all' failed
make: *** [all] Error 2

谁能解决?

【问题讨论】:

  • make 调试的第一条规则:删除@ 修饰符然后仔细查看正在调用的命令。在您的 makefile 完全工作后的最后一件事之前,您永远不应该添加 @。实际上最好不要添加它们,而是使用诸如make.mad-scientist.net/managing-recipe-echoing之类的方法...

标签: linux gnu-make makefile


【解决方案1】:

删除一个空格。改变

@$(foreach n, $(SUB_DIRS), $(call sub_make, $(n)))

到:

@$(foreach n, $(SUB_DIRS), $(call sub_make,$(n)))

有了空间,

$(MAKE) -C module all KDIR=$(1);

将扩展为:

make -C module all KDIR= k1;
make -C module all KDIR= k2;
make -C module all KDIR= k3;

这(希望)显然是错误的。

至少有两种方法可以调试您的 makefile。一种是尝试make -n,它会打印出上面的内容。或者您可以删除@,它也会这样做。

【讨论】:

    【解决方案2】:

    A final caution

    call 的参数中添加空格时要小心。与其他函数一样,保留第二个和后续参数中包含的任何空格;这可能会导致奇怪的效果。向call 提供参数时,删除所有无关空格通常是最安全的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      相关资源
      最近更新 更多