我有一个包含以下规则的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 '}'

是个 ';' 一个问题?

#1楼 票数:0

您不能在传递给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变量,但没有为其他目标设置...

#2楼 票数:0

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

$(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

#3楼 票数:0 已采纳

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

$(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

  ask by Josef Zeevi translate from so

未解决问题?本站智能推荐:

1回复

Makefile中的模式规则

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

Makefile中的复杂模式规则

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

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

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

Makefile模式规则中的替换

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

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

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

Makefile:将.o放在不同目录中的规则[复制]

这个问题在这里已有答案: 如何将目标文件放在单独的子目录 6答案中 我有这个目录结构: ./src包含了。 cpp和我需要的所有文件的.h ./bin应该暂时包含.o和.bin 。 此外,调用make clean时应删除此文件夹。 ./包含Makefile
1回复

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

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

Makefile中的特殊情况模式规则

我有一个具有给定扩展名的文件的通用规则,但我想为具有前缀的文件添加特殊情况。 我试过这个: 但是当我运行make special-1.dat ,它会忽略第一个规则并运行第二个规则。 切换规则的顺序没有区别。 我怎样才能解决这个问题?