2014-02-11 48 views
0

我在我的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 =行之後插入。

任何想法?我想定義的變量是FOO_OTO。只需要被定義爲不設置任何值。

+0

實際上,'CFLAGS'賦值什麼也不做。配方中的每一行都在其自己的子shell中執行;因此,shell分配'CFLAGS'並退出,在父項中保持該值不變。 – tripleee

+0

作爲一種解決方法,您是否可以將賦值添加到需要它的文件的'$ *。d'中? (我假設這個文件包含目標的依賴信息。) – tripleee

回答

0

如果你有一個變量保存的文件名,你需要像這樣:

FILES_WITH_FOO_OTO = foo.c bar.c 

您可以使用下面的結構:

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

這就是我的回答完全重寫爲我顯然誤解了這個問題。

+0

你可以像'VAR_foo = -DFOO_OTO'那樣使用間接尋址,然後對目標'foo.o'使用'$ {VAR_ $ *}' -DFOO_OTO'。對於需要它的每個其他目標也是如此。 – tripleee

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)"沒用。這什麼都不做(除非你花費一些性能)。

+0

thx。我喜歡這種方法。我找到了gnu make手冊和關於目標變量的部分。這是更清潔。丹卡。 :) – user3053087

相關問題