有条件地在Makefile中定义一个变量

时间:2014-02-11 17:49:30

标签: c makefile

我的Makefile中有一个标记如下:

%.o: %.c
    CFLAGS="$(CFLAGS)"
    $(CC) -c $(CFLAGS) $(STACK_OPTS) $(SIO_FLAGS) $(IO_FLAGS) $(LOCAL_INCLUDES) $(OAK_FLAGS) -DSYNC_WRITE $(OAK_LIBS) $<
    $(CC) -MM $(CFLAGS) $(OAK_FLAGS) $(LOCAL_INCLUDES) $^ > $*.d
    @cp -f $*.d $*.d.tmp
    @sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \
      sed -e 's/^ *//' -e 's/$$/:/' >> $*.d
    @rm -f $*.d.tmp

我需要为一组.c源文件添加另一个定义变量,并将其设置为仅用于那些。可以这样做吗?我认为它将在CFLAGS =行之后插入。

有什么想法吗?我想要定义的var是FOO_OTO。只需要定义不设置为任何值。

2 个答案:

答案 0 :(得分:1)

您可以使用特定于目标的变量在每个目标的基础上设置变量(假设为GNU make)。因此,如果您在FOO_SRC中有一个源文件列表,并且想要为它们添加一些额外的标志,那么您可以执行以下操作:

EXTRA_CFLAGS =

FOO_SRC = foo.c bar.c baz.c

$(FOO_SRC:.c=.o): EXTRA_CFLAGS = -DEXTRA

然后将$(EXTRA_CFLAGS)添加到编译规则中。顺便说一下,在你的规则中使用CFLAGS="$(CFLAGS)"是没用的。这没有任何作用(除了花费你一些表现)。

答案 1 :(得分:0)

如果您有一个变量,其中包含您需要的文件名称,如下所示:

FILES_WITH_FOO_OTO = foo.c bar.c

您可以使用以下构造:

$(CC) -c $(CFLAGS) $(if $(filter $<,$(FILES_WITH_FOO_OTO)), -DFOO_OTO)

这完全改写了我的答案,因为我显然误解了这个问题。