makefile 循环:轻松注释掉一些项目

makefile loop: easily comment out some items

我有一个 makefile 循环遍历某些项目,如下所示:

all:
    for i in \
        foo \
        bar \
        baz \
    ; do \
      echo $$i ;\
    done

在调试时,我经常注释掉除了一个循环行之外的所有行,但随后我需要将这些行移到 for 上方,否则我会收到此错误:

/bin/sh: 3: Syntax error: word unexpected (expecting "do")

问题:是否有更好的设置方法,可以轻松地在 makefile 中注释掉循环行?注意:我不想为每个循环项目创建单独的目标。

您使用的是续行(尾部反斜杠),因此您的食谱等同于:

for i in foo bar baz; do echo $$i ; done

并且您不能只在所有这些中间放置一个 #,make 会忽略该行并且您会破坏您的行连续性。你必须找到一个 shell 兼容的方式。例如,如果您的 shell 是 bash,并且评论项目包括在前面加上 -:

all:
    @for i in \
        foo \
        -bar \
        baz \
    ; do \
      [[ "$$i" != -* ]] && echo $$i ;\
    done

演示:

$ make
foo
baz

还有很多其他方法可以做到,这完全取决于您想要什么。此外,由于我们没有您的实际 makefile,只有一个示例,因此不清楚实际的 makefile 是否提供其他机会来使事情变得更好。我不知道有什么方法比在所有情况下都只移动线更客观。

一个想法,因为你正在使用 make,所以 pre-create 使用 make 变量的循环内容如下:

DATA =
DATA += foo
DATA += bar
DATA += baz

all:
        for i in $(DATA); do \
          echo $$i ;\
        done

现在您可以注释掉不需要的 DATA += ... 行。

另一种可能性是使用变量,并过滤掉不需要的条目:

list=foo bar baz

all:
   @for i in $(filter_out bar,$(list)); do \
     echo $$i