使用特殊编译标志编译目录中的某些文件

问题描述 投票:0回答:1

我的项目目录中有几个文件,我想使用非常具体的编译选项来编译某些文件,并使用标准编译选项来编译其他文件,我想使用 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

c makefile compilation compiler-optimization gnu
1个回答
0
投票

您不能使用

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)
© www.soinside.com 2019 - 2024. All rights reserved.