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

时间:2018-10-12 15:40:42

标签: makefile

我有一个包含以下规则的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 个答案:

答案 0 :(得分: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变量,而没有为其他目标设置

答案 1 :(得分: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

答案 2 :(得分: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