昨天我写了一个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版本...
我想知道构建此类配置的推荐方法。 也许某人可以提供一个简单(完整)的例子?
非常感谢! 迈克尔
答案 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