在gnu make中使用shell for loop的问题?

时间:2011-02-01 17:00:07

标签: gnu-make nested-loops

考虑以下make文件

all: 
     @for x in y z; \ 
     do \ 
          for a in b c; \
          do \
                   echo $$x$$a >> log_$$x; \
          done; \
     done

执行此make文件时,创建了两个文件log_y和log_z。 log_y具有数据“yb”和“yc”。类似地,log_z具有数据“zb”和“zc”。

实际上我想创建四个文件(log_y_b,log_y_c,log_z_b,log_z_c)。为此,我已将上述make文件修改为,

all:
     @for x in y z; \ 
     do \ 
          for a in b c; \
          do \
                   echo $$x$$a >> log_$$x_$$a; \
          done; \
     done

但它只创建一个文件log_。我应该怎么做才能创建四个文件。

2 个答案:

答案 0 :(得分:4)

也许在变量名称周围添加括号:它适用于我的系统。

all:
    @for x in y z; \
    do \
        for a in b c; \
        do \
            echo $$x$$a >> log_$${x}_$${a}; \
        done; \
    done

您还可以使用foreach

all:
    @$(foreach x,y z,$(foreach a,b c,echo $(x)$(a) >> log_$(x)_$(a);))

答案 1 :(得分:1)

对于shell, Makefile 中的

log_$$x_$$a变为log_$x_$a,相当于log_${x_}${a}。但是,变量$x_未定义,因此shell将其替换为空字符串。

解决方案:正确地在名称($x)周围用花括号写${variablename}变量,即为了保持一致,写log_${x}_${a}(或在 Makefile 样式中:log_$${x}_$${a})。