繁体   English   中英

如何将条件放在Makefile模式规则中?

How do I put conditionals in makefile pattern rules?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一个包含以下规则的makefile包含文件:

$(OUT_DIR)/%.0: %.c
    $(CC) $(CFLAGS) -c -o $@ $<
    $(CC) $(CFLAGS) -E -P $< -o $(OUT_DIR)/$<.preproc
    $(CC) $(CFLAGS) -E -dD $< -o $(OUT_DIR)/$<.macros

效果很好。 但是,对于某些目标,我只想要这样:

$(OUT_DIR)/%.0: %.c
    $(CC) $(CFLAGS) -c -o $@ $<

我可以使用预定义的(或命令行)变量来执行以下操作吗:

$(OUT_DIR)/%.0: %.c
    $(CC) $(CFLAGS) -c -o $@ $<
    ifeq ($(CIFLAG), 1)
        $(CC) $(CFLAGS) -E -P $< -o $(OUT_DIR)/$<.preproc
        $(CC) $(CFLAGS) -E -dD $< -o $(OUT_DIR)/$<.macros
    endif

我确定我可以根据CIFLAG值包含其他文件,但希望可以通过修改模式规则来做到这一点。

有任何想法吗?

谢谢!

我按照MadScientist的建议做了(感谢教育),但没有得到我想要的。 我的文件现在显示为:

$(OUT_DIR)/%.0: %.c
    $(CC) $(CFLAGS) -c -o $@ $<
    [ $(CI_BUILD) -eq 0 ] \
        || {$(CC) $(CFLAGS) -E -P $< -o $(OUT_DIR)/$<.preproc \
        && $(CC) $(CFLAGS) -E -dD $< -o $(OUT_DIR)/$<.macros; }

但是,当我执行该命令时,我得到了这一点(修剪了大量无关的输出):

cc -c -o test.o
[ 1 -eq 0 ] \
     || {cc -E -P test.c -o test.c.preproc \
     && cc -E -dD test.c -o test.c.macros; }

/bin/sh: -c: line 2: syntax error near unexpected token '}'

是个 ';' 一个问题?

3 个回复

您不能在传递给shell的配方中使用诸如ifeq之类的make条件,因为shell运行的不是make配方。 您可以使用shell条件:

$(OUT_DIR)/%.0: %.c
        $(CC) $(CFLAGS) -c -o $@ $<
        [ ($(CIFLAG) -ne 1 ] \
          || { $(CC) $(CFLAGS) -E -P $< -o $(OUT_DIR)/$<.preproc \
               && $(CC) $(CFLAGS) -E -dD $< -o $(OUT_DIR)/$<.macros; }

当然,您还没有讨论如何计划为某些目标设置CIFLAG变量,但没有为其他目标设置...

我可以通过将代码更改为:

$(OUT_DIR)/%.0: %.c
    $(CC) $(CFLAGS) -c -o $@ $<
    if [ ($(CIFLAG) -ne 1 ]; then \
      $(CC) $(CFLAGS) -E -P $< -o $(OUT_DIR)/$<.preproc; \
      $(CC) $(CFLAGS) -E -dD $< -o $(OUT_DIR)/$<.macros; fi

您不得缩进使用标签设置条件:

$(OUT_DIR)/%.0: %.c
    $(CC) $(CFLAGS) -c -o $@ $<
ifeq ($(CIFLAG), 1)
    $(CC) $(CFLAGS) -E -P $< -o $(OUT_DIR)/$<.preproc
    $(CC) $(CFLAGS) -E -dD $< -o $(OUT_DIR)/$<.macros
endif

参见项目符号4: https//www.gnu.org/software/make/manual/html_node/Recipe-Syntax.html

1 Makefile中的模式规则

我有以下makefile: 如您所见,此文件正在编译AceUnit测试文件(.c)。 第一步是使用AceUnit的标头生成器,如上一条规则所示。 因此,我尝试在编译之前将标头(.h)文件添加为对目标(.o)文件的依赖关系,但是它不起作用。 您看到的规则与%.o模式不匹配,而是运行m ...

2 Makefile中的复杂模式规则

我有以下makefile用于从一些模板生成文件,生成的文件有两个可能的扩展: 依赖项列表将匹配a.tex_tpl , a.tex-subpart1_tpl , a.tex-subpart2_tpl 。 虽然这有效,但有没有办法避免重复? 例如,通过在规则名称中匹配*.{tex,x ...

3 如何简化Makefile中的模式规则?

我是Makefile创建中的新手。 你能告诉我如何简化我的makefile文件,给我一些提示吗? 在我的代码中,我必须为每个新目录创建一个新的模式规则。 感谢您的关注。 ...

4 Makefile模式规则中的替换

我有这样的文件: 前两个由脚本构建 第三个是 等等。 我想写这样的makefile规则 如何在依赖项中进行替换? 我认为这个答案是正确的,但是我该如何用通配符替换更复杂的内容? ...

5 Makefile:模式规则中的多个 %

例如,我有以下项目结构: 这个makefile: 在上述项目结构的情况下,我需要以下目标: 正如Paljas在他对这个问题的回答中所发表的那样: 模式规则看起来像一条普通规则,只是它的目标包含字符“%”(恰好是其中之一) 有人可以帮我解决这个问题吗? 此致, 乌萨姆 ...

6 makefile模式规则前提条件可以是模式规则吗?

我有这个makefile: 我希望它使用第一个%.o规则,先创建bar.inc,然后再创建foo.o。 相反,它使用最后一条规则,我得到了: 如果我将%.inc更改为bar.inc或将%.o更改为foo.o它都可以正常工作。 该文件说 为了应用模式规则,其目标模式必 ...

10 makefile 中的任何匹配模式规则的行为

假设我的来源是test.c : 我希望在名为bin的文件夹中创建名为test的可执行文件。 所以我的makefile是: 当我执行make ,我希望发生以下内置规则: 因为目标%应该匹配bin/test并且因为test.c存在,它应该执行配方。 但是, make说: No rule to ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM