2017-07-18 91 views
0

昨天我寫了一個Makefile來構建一個可以正常工作的程序。 現在,我嘗試構建不同的構建配置。如何使用Make使用不同的構建配置來構建程序?

建議在源文件和輸出路徑列表中建立不同配置的建議方法是什麼?

我試圖用目標特定變量...編譯器工具鏈的

可執行文件。

編譯器:= CCRL LINKER:= RLINK ASSEMBLER:= ASRL

DEVICE_FILE:用來產生* .d文件= DR5F100LL.DVF

編譯標誌。

DFLAGS:= \ -MM \ -MP \ -cpu = S2 \ -dev = 「$(DEVICE_FILE)」 \ -no_warning_num = 11179,11180 \ -g \ -Onothing

用於從c源文件生成* .obj文件的編譯器標誌。

CFLAGS:= \ -cpu = S2 \ -c \ -dev = 「$(DEVICE_FILE)」 \ -no_warning_num = 11179,11180 \ -g \ -Onothing

編譯器標誌用於從彙編文件生成* .obj文件。

ASMFLAGS:= $(CFLAGS)

連接標誌

LDFLAGS:= \ -library = 「$ {COMPILER_PATH} /lib/rl78cm4s.lib」 \ -library =「$ {COMPILER_PATH } /lib/rl78cm4r.lib 「\ -library =」 ./ FFT_Library/libfft_rl78g13.lib」 \ -nooptimize \ -entry = _start \ -security_id = 00000000000000000000 \ -ocdbg = 04 \ -user_opt_byte = EEFFE9 \ -debug \ -npresspress \ -Memory =高\ -vectn = 2 = FFFF \ -ROM =。數據= .dataR \ -ROM = .sdata中= .sdataR \ -nomessage \ -device = 「$(DEVICE_FILE)」 \ -nologo \

-start = .const中,的.text,.RLIB,.SLIB,.textf,.constf,。數據,.sdata中/ 03000,.dataR,.BSS/0F7F00,.sdataR, .SBSS/0FFE20

包含目錄

C_INCS:= \ -I $ {COMPILER_PATH}/inc \ ...

C源文件用於構建程序。

C_SRCS_FFT_TEST:= \ CodeGenerator/r_cg_cgc.c \ ...

C_SRCS_HISTORY_TEST:= \ CodeGenerator/r_cg_cgc.c \ ...

C_SRCS_IOLINK_TEST:= \ CodeGenerator/r_cg_cgc .C \ ...用於構建程序

彙編文件。

ASM_SRCS:= \ ...

生成結果的根目錄。

OUT_ROOT_DIR:=建立 PUBLISH_ROOT_DIR:=發佈

.SECONDEXPANSION:

構建配置的名稱。

BUILD_CONFIG =未知

OUT_DIR = $(OUT_ROOT_DIR)/ $(BUILD_CONFIG) PUB_DIR = $(PUBLISH_ROOT_DIR)/ $(BUILD_CONFIG)

確定生成文件的文件路徑。

OBJS = $(patsubst%.C,$(OUT_DIR)/%。OBJ,$(C_SRCS)) OBJS + = $(patsubst%.ASM,$(OUT_DIR)/%。OBJ,$(ASM_SRCS )) DEPS = $(OBJS:.obj = .d)

輸出文件的文件名。

OUT_FILE = $(PUB_DIR)/MyFile.abs MAP_FILE = $(OUT_DIR)/MyFile.map

.PHONY:內置定義 集結定義:FFT-測試歷史測試IOLINK測試

FFT測試:BUILD_CONFIG = FFT_Test FFT測試:C_SRCS = $(C_SRCS_FFT_TEST) .PHONY:FFT測試 FFT測試:$$(OUT_FILE)

歷史檢驗:BUILD_CONFIG = History_Test 歷史測試:C_SRCS = $(C_SRCS_H ISTORY_TEST) .PHONY:歷史檢驗 歷史檢驗: @echo -e 「大廈$(BUILD_CONFIG)」

IOLINK測試:BUILD_CONFIG = IOLink_Test IOLINK測試:C_SRCS = $(C_SRCS_IOLINK_TEST) .PHONY:IOLINK測試 IOLINK測試: @echo -e 「大廈$(BUILD_CONFIG)。」

.PHONY:所有 所有:預生成$(OUT_FILE)後建立

.PHONY:預建立 預編譯: @echo -e 「運行預構建的目標。」

。電話:後期製作 後期製作: @echo -e「運行後期製作目標。」

.PHONY:clean clean: @echo -e「運行乾淨的目標。」
@Rm -f -v $(OUT_DIR)/LinkerSubCommand.tmp @Rm -f -v $(OBJS) @Rm -f -v $(DEPS) @Rm -f -v $(OUT_FILE) @rm -f -v $(MAP_FILE)

如何從ac源文件構建依賴文件。

$(OUT_DIR)/%d:%.C @echo '建設d文件:$ <' @mkdir -p 「$(DIR $ @)」 $(編譯)$(DFLAGS)$ (C_INCS)-o「$(​​@:%。obj =%。d)」-MT =「$ @」-MT =「$(@:%。obj =%。d)」「$ <」

如何從一個asm文件構建依賴文件。

$(OUT_DIR)/%d:%.ASM @echo '建設d文件:$ <' @mkdir -p 「$(DIR $ @)」 $(編譯)$(DFLAGS)$ (C_INCS)-o「$(​​@:%。obj =%。d)」-MT =「$ @」-MT =「$(@:%。obj =%。d)」「$ <」

如何從ac源文件構建目標文件。

$(OUT_DIR)/%OBJ:%.C @echo '建設OBJ文件:$ <' @mkdir -p 「$(DIR $ @)」 $(編譯)$(CFLAGS)$ (C_INCS)-o 「$ @」, 「$ <」 @echo -e $(@:%= - 輸入= \ 「%\」)>> $(OUT_DIR)/LinkerSubCommand.tmp

如何建立來自asm文件的目標文件。

$(OUT_DIR)/%OBJ:%.ASM @echo '建設ASM文件:$ <' @mkdir -p 「$(DIR $ @)」 $(編譯)$(CFLAGS)$ (C_INCS)-o 「$ @」, 「$ <」 @echo -e $(@:%= - 輸入= \ 「%\」)>> $$(OUT_DIR)/LinkerSubCommand.tmp

# $(OBJ):%.obj:%.c $(DEPS)

如何從所有目標文件構建輸出文件。

%.abs:$(OBJS) @echo -e「Building $(BUILD_CONFIG)」。 @echo -e「輸出目錄是$(OUT_DIR)。」 @echo -e「發佈目錄是$(PUB_DIR)。」 @echo -e「源文件是$(C_SRCS)。」 「 @echo -e」彙編程序文件是$(ASM_SRCS)。「 @echo -e「生成的目標文件是$(OBJS)。」 @echo -e「構建輸出文件是$ @」。
@mkdir -p「$(PUB_DIR)」 @mkdir -p「$(OUT_DIR)」 $(LINKER)$(LDFLAGS)-subcommand =「$(OUT_DIR)/LinkerSubCommand.tmp」-list =「$ (MAP_FILE)「-output =」$(OUT_FILE)「

我知道我應該使用私有作爲目標特定變量的範圍,但我必須下載/編譯更新的make版本...

我想知道推薦的方法來建立這樣的配置。 也許有人可以提供一個簡單(和完整)的例子?

非常感謝! 邁克爾

回答

0

生成文件:

ifeq ($(config), debug) 
    CFLAGS := -DDEBUG -g 
    OUT_PATH := ./build/debug/ 
else ifeq ($(config), light_debug) 
    CFLAGS := -g 
    OUT_PATH := ./build/light_debug/ 
else #release config by default 
    OUT_PATH := ./build/release 
endif 

#... 

然後make invokation是這樣的:

make confg=debug 

make config=light_debug 

make config=release 
+0

謝謝,但在這種情況下,我不能調用make debug light_debug發佈。有沒有基於目標的解決方案? – user3118472

+0

你可以調用'make config = debug && make config = release'。無論如何,'make debug release'的值看起來並不重要。 – igagis

相關問題