如何使用不同的构建配置使用Make构建程序?

时间:2017-07-18 08:29:41

标签: makefile

昨天我写了一个Makefile来构建一个工程正常的程序。 现在,我尝试构建不同的构建配置。

建议在源文件和输出路径列表中有不同配置的推荐方法是什么?

我尝试使用目标特定变量......

  

编译器工具链的可执行文件。

     

编译器:= ccrl   LINKER:= rlink   汇编:= asrl

     

DEVICE_FILE:= DR5F100LL.DVF

     

用于生成* .d文件的编译器标志。

     

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" \        - 无优化       -entry = _start \       -security_id = 00000000000000000000 \       -ocdbg = 04 \       -user_opt_byte = EEFFE9 \       -debug \       -nocompress \       -memory = high \       -vectn = 2 = ffff \       -rom = .data = .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:= build   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-test history-test iolink-test

     

fft-test:BUILD_CONFIG = FFT_Test   fft-test:C_SRCS = $(C_SRCS_FFT_TEST)   .PHONY:fft-test   fft-test:$$(OUT_FILE)

     

history-test:BUILD_CONFIG = History_Test   历史测试:C_SRCS = $(C_SRCS_HISTORY_TEST)   .PHONY:历史测验   历史测试:     @echo -e"建立$(BUILD_CONFIG)。"

     

iolink-test:BUILD_CONFIG = IOLink_Test   iolink-test:C_SRCS = $(C_SRCS_IOLINK_TEST)   .PHONY:iolink-test   IOLINK测试:     @echo -e"建立$(BUILD_CONFIG)。"

     

.PHONY:全部   all:pre-build $(OUT_FILE)post-build

     

.PHONY:预构建   预编译:     @echo -e"运行预构建目标。"

     

.PHONE:构建后   生成后:     @echo -e"运行构建后目标。"

     

.PHONY:干净   清洁:     @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)

     

如何从c源文件构建依赖项文件。

     

$(OUT_DIR)/%。d:%。c     @echo'建立文件:$<'     @mkdir -p" $(dir $ @)"     $(编译)$(DFLAGS)$(C_INCS)-o" $(@:%。obj =%。d)" -MT =" $ @" -MT =" $(@:%OBJ =%d)" " $<"

     

如何从asm文件构建依赖项文件。

     

$(OUT_DIR)/%。d:%。asm     @echo'建立文件:$<'     @mkdir -p" $(dir $ @)"     $(编译)$(DFLAGS)$(C_INCS)-o" $(@:%。obj =%。d)" -MT =" $ @" -MT =" $(@:%OBJ =%d)" " $<"

     

如何从c源文件构建目标文件。

     

$(OUT_DIR)/%。obj:%。c     @echo'构建obj文件:$<'     @mkdir -p" $(dir $ @)"     $(编译)$(CFLAGS)$(C_INCS)-o" $ @" " $<"     @echo -e $(@:%= - input = \"%\")>> $(OUT_DIR)/LinkerSubCommand.tmp

     

如何从asm文件构建目标文件。

     

$(OUT_DIR)/%。obj:%。asm     @echo'构建asm文件:$<'     @mkdir -p" $(dir $ @)"     $(编译)$(CFLAGS)$(C_INCS)-o" $ @" " $<"     @echo -e $(@:%= - input = \"%\")>> $$(OUT_DIR)/LinkerSubCommand.tmp

     

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

     

如何从所有目标文件构建输出文件。

     

%。abs:$(OBJS)     @echo -e"建筑$(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)"

我知道我应该使用private作为目标特定变量的范围,但我必须下载/编译更新的make版本...

我想知道构建此类配置的推荐方法。 也许某人可以提供一个简单(完整)的例子?

非常感谢! 迈克尔

1 个答案:

答案 0 :(得分: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调用是这样的:

make confg=debug

make config=light_debug

make config=release