我有一个包含以下规则的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 '}'
是';'有问题吗?
答案 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