2012-07-27 198 views
0

我有幾個使用對方的庫。無論何時我構建它們,我需要定義預處理器定義以確保使用正確的可見性修飾符(例如,Windows中的dllimport/dllexport會說)。

所有庫都使用相同的生成文件,也就是說,它們共享規則,CFLAGS等。所有這些庫只根據輸入文件列表的不同而不同,其餘的庫文件由庫共享。

共享的Makefile有一個包含所有庫的列表中的變量,像這樣:makfile變量擴展

MODULE_LIBS = liba123 libb456 libc999 

然後,我需要這些預處理器定義了每個庫的啓用:

For liba123: -Da123_EXPORTS 
For libb456: -Db456_EXPORTS 
For libc999: -Dc999_EXPORTS 

這些庫中的每一個都存在於它們各自的子庫中,這些庫都是庫本身的名稱(例如liba123,libb456等)。 所以,我寫信給啓用這些出口定義了基於文件的路徑正在編譯這個Makefile招:

%的.o:%.c的
        $(CC)$(CPPFLAGS)$( CFLAGS)-D $(過濾器$(MODULE_LIBS),$(SUBST LIB,$(SUBST /,$ @)))_日出口 -c -o $ @ $ <


我要補充('-D $(filter $(MODULE_LIBS),$(subst lib,$(subst /,$ $)))_ EXPORTS'),因爲我有很多類似的規則。所有這些不同的規則都無法完成,但是他們有一個共同點:$(CPPFLAGS)。
問題出在這裏。我可以在CPPFLAGS中添加「-D $(filter $(MODULE_LIBS),$(subst lib,,$(subst /,$ $)))__ EXPORTS」,以便所有這些makefile變量只能在原地擴展它在哪裏使用?

回答

0

我想我會做這種方式:

liba123/%.o : EXPORTS=a123_EXPORTS 
libb456/%.o : EXPORTS=b456_EXPORTS 
libc999/%.o : EXPORTS=c999_EXPORTS 

%.o: %.c 
    $(CC) $(CPPFLAGS) $(CFLAGS) -D$(EXPORTS) -c -o [email protected] $< 

但是你可以把它們放在CPPFLAGS如果你喜歡:

liba123/%.o : CPPFLAGS+=-Da123_EXPORTS 
libb456/%.o : CPPFLAGS+=-Db456_EXPORTS 
libc999/%.o : CPPFLAGS+=-Dc999_EXPORTS 
+0

我想我做到了我前面提到的方式。我只需使用*遞歸擴展*而不是*簡單的可變擴展*。這樣,所有的自動裝置都不會擴展,直到執行規則。我之所以沒有按照你提到的方式去做,是因爲模塊和makefile的列表是第三方產品,它一直在改變。 – Pavel 2012-07-27 18:45:41