如何将变量传递给Makefile中foreach函数调用的子make?

时间:2018-08-04 13:30:44

标签: linux makefile gnu-make makefile-errors

我想通过将变量KDIR传递到在module/文件夹中调用的Makefile来在循环中进行子make。

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

任何人都可以解决吗?

2 个答案:

答案 0 :(得分:2)

删除空格。更改

@$(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,它将打印出上面的内容。或者,您可以删除@,该操作也将如此。

答案 1 :(得分:2)

A final caution

  

在将空白添加到call的参数时要小心。与其他函数一样,第二个及后续参数中包含的所有空格都将保留;这可能会导致奇怪的后果。向call提供参数时,通常最安全的方法是删除所有多余的空格。