2012-06-24 19 views
1

我有一個文件夾佈局的項目,如:GNU Make:如何構建一個通用庫作爲32位和64位?

/project_root 
    /common-code-sources 
    /common1 
    /common2 
    /... 
    /prog-A-sources 
    /prog-B-sources 
    /prog-C-sources 

三可執行文件需要製作方案A,B和C.每個人都有獨特的獨特的源代碼量小,但大多預計靜態鏈接來自各種libCommonCodeN.a文件的功能。

但是,我需要構建程序C以及所有需要的通用代碼庫以及一組特定的編譯標誌。 (在這種情況下,32位並禁用某些優化)

這意味着程序C所需的common_sources下的特定代碼必須第二次使用正確的標誌編譯。

我正在尋找關於如何最好地創建基於Makefile的構建系統以涵蓋這種情況的想法。

我在想這個解決方案會涉及一個用於lib文件和所謂的「目標特定」變量的並行輸出文件夾來指導這個過程,但我不確定如何將它們放在一起。

問題:我如何能確保在項目的根目錄運行make做正確的事時的common-code來源之一發生了變化?

那就是:我怎樣才能重建有問題的特定.a的兩種風味,並重新鏈接3個可執行文件?

回答

1

下面是兩種方法:

在第一種情況下,你有依賴的完全控制...爲了使自定義構建使用:

 
    $ cat Makefile 
... 
ifeq '$(DEBUG)' 'yes' 
    BUILD_DIR = debug 
    CFLAGS += $(CFLAGS_DEBUG) 
else 
    BUILD_DIR = release 
    CFLAGS += $(CFLAGS_OPTIM) 
endif 
... 
    $ make DEBUG=yes 

在第二種情況下混合第一與提示:

 
    $ cat Makefile 
... 
ifeq '$(DEBUG)' 'yes' 
    BUILD_DIR = debug 
    MODULE_A_BUILD_DIR = ../module-A/_debug_build 
    CFLAGS += $(CFLAGS_DEBUG) 
else 
    BUILD_DIR = release 
    MODULE_A_BUILD_DIR = ../module-A/_release_build 
    CFLAGS += $(CFLAGS_OPTIM) 
endif 

build: $(MODULE_A_BUILD_DIR)/libmodulea.a 
    make -C $(MODULE_A_BUILD_DIR)/.. DEBUG=$(DEBUG) 
... 

你說一切正常在你的問題。只要做到這一點邏輯上一致,不要害怕))

因此,請構建/DIST路徑依賴化妝標誌或目標模式:

 
ifneq '$(filter %-debug,$(MAKECMDGOALS))' '' 
    BUILD_DIR = debug 
    MODULE_A_BUILD_DIR = ../module-A/_debug_build 
    CFLAGS += $(CFLAGS_DEBUG) 
    ... 
endif