我的项目目录中有几个文件,我想使用非常具体的编译选项来编译某些文件,并使用标准编译选项来编译其他文件,我想使用 if else 来处理这些文件。
我目前遇到的问题,程序在 if 语句处崩溃,你能帮我吗?
作为信息,我使用 Windows cmd.exe
低于预期结果,非常感谢您的帮助
生成文件:
SPECIAL_FILES := Fee_PBcfg.obj Fee.obj Can_17_McmCan_PBcfg.obj Dio.obj
Dio_Lcfg.obj Mcu.obj Can_17_McmCan_Isr.obj Can_17_McmCan.obj
McalLib.obj Spi_PBcfg.obj Spi.obj EcuM_Callout_Stubs.obj EcuM_Cfg.obj
EcuM_Init_Cfg.obj
%.$(OBJ_EXT): %.c $(MCS_H)_mcs.h $(COMPILER_OPT_FILE)
if exist $(BUILD_PATH)\$*.obj del $(BUILD_PATH)\$*.obj
if exist $(BUILD_PATH)\$*.d del $(BUILD_PATH)\$*.d
if exist $(BUILD_PATH)\$*.i del $(BUILD_PATH)\$*.i
if exist $(BUILD_PATH)\$*.s del $(BUILD_PATH)\$*.s
if $(filter $*, $(SPECIAL_FILES))
$(DBGOUT)
echo Compile $* with $(COPT_ECHO_MCAL) option
$(CC) $(TARGET) $(CFLAGS_MCAL) $(INCLUDES_PATH) -o
$(BUILD_PATH)/$*.obj $< 2>$(BUILD_PATH)/$*.warn || type
$(BUILD_PATH)\$*.warn && $(FALSE)
else
$(DBGOUT)
echo Compile $* with $(COPT_ECHO) option
$(CC) $(TARGET) $(CFLAGS) $(INCLUDES_PATH) -o $(BUILD_PATH)/$*.obj
$< 2>$(BUILD_PATH)/$*.warn || type $(BUILD_PATH)\$*.warn && $(FALSE)
endif
您不能使用
ifeq
等,因为它们就像预处理器语句:它们在读入 makefile 时进行处理。但是,直到很久以后 make 构建目标时才会构建配方。
在 GNU Make 手册中,你会发现像
$*
这样的自动变量只在配方中有效;这里的“在配方内部”是指在配方脚本内,这是由 TAB 字符缩进并传递到 shell 的规则部分。像 ifeq
等这样的操作符(如上所述)会生成预处理器语句,并且不是配方的一部分。
为了满足您的要求,您可以使用特定于目标的变量。像这样的东西:
$(SPECIAL_FILES) : CFLAGS := $(CFLAGS_MCAL)
%.$(OBJ_EXT): %.c $(MCS_H)_mcs.h $(COMPILER_OPT_FILE)
...
echo Compile $* with $(CFLAGS) option
$(CC) $(TARGET) $(CFLAGS) $(INCLUDES_PATH) -o $(BUILD_PATH)/$*.obj $< 2>$(BUILD_PATH)/$*.warn || type $(BUILD_PATH)\$*.warn && $(FALSE)
或者,如果您愿意,您可以保持大部分 CFLAGS 相同,只为特殊目标添加一些额外的 CFLAGS:
EXTRA_CFLAGS =
$(SPECIAL_FILES) : EXTRA_CFLAGS := $(MCAL_FLAGS)
%.$(OBJ_EXT): %.c $(MCS_H)_mcs.h $(COMPILER_OPT_FILE)
...
echo Compile $* with $(EXTRA_CFLAGS) option
$(CC) $(TARGET) $(CFLAGS) $(EXTRA_CFLAGS) $(INCLUDES_PATH) -o $(BUILD_PATH)/$*.obj $< 2>$(BUILD_PATH)/$*.warn || type $(BUILD_PATH)\$*.warn && $(FALSE)