代码之家  ›  专栏  ›  技术社区  ›  river

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

  •  1
  • river  · 技术社区  · 6 年前

    我想在一个循环中用一个变量 KDIR 传递到正在调用的生成文件 module/ 文件夹。

    sub_make=$(MAKE) -C module all KDIR=$(1);
    
    SUB_DIRS= k1 k2 k3 
    
    all:  
        @$(foreach n, $(SUB_DIRS), $(call sub_make, $(n)))
    

    中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 回复  |  直到 6 年前
        1
  •  2
  •   Joseph Quinsey Taseen    6 年前

    移除空间。改变

    @$(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
  •  2
  •   Community CDub    6 年前

    A final caution :

    在参数中添加空格时要小心 call . 与其他函数一样,保留第二个参数和后续参数中包含的任何空格;这可能会产生奇怪的效果。在提供参数给 呼叫 .