在 makefile 中构建 RELEASE 和 DEBUG

Posted

技术标签:

【中文标题】在 makefile 中构建 RELEASE 和 DEBUG【英文标题】:RELEASE and DEBUG build in makefile 【发布时间】:2021-06-09 16:07:14 【问题描述】:

我正在stm32cubeIDE中开发STM32的应用程序

我正在使用以下自定义 makefile。现在我想要发布和调试版本,但它们都构建了调试版本。

我试过了

RELDIR = bin/release
DEBUGDIR = bin/debug

ifdef DEBUG
BIN=$(DEBUGDIR)
COMPILERFLAGS += -g3 -O0 -D_DEBUG
else
BIN=$(RELDIR)
COMPILERFLAGS += -O3
endif

debug : rebuild
BIN=$(DEBUGDIR)
COMPILERFLAGS += -g3 -O0 -D_DEBUG

release : rebuild
BIN=$(RELDIR)
COMPILERFLAGS += -O3

谁能告诉我如何实现发布和调试构建:)

完整脚本:

RED = [31m
GREEN = [32m
YELLOW = [33m
BLUE = [34m
NC = [0m

BIN = bin
SRC = src
INC = inc

SOURCE = $(wildcard $(SRC)/*.c)
OBJECT = $(patsubst %,$(BIN)/%, $(notdir $(SOURCE:.c=.o)))

COMPILER=arm-none-eabi-gcc
ARCHITECTURE=cortex-m4
COMPILERFLAGS= -c -mcpu=$(ARCHITECTURE) -mthumb -mfloat-abi=soft -std=gnu11 -Wall -I $(INC)
LINKERFLAGS= -mcpu=$(ARCHITECTURE) -mthumb -mfloat-abi=soft --specs=nano.specs --specs=rdimon.specs -lc -lrdimon --specs=nosys.specs -T stm32_linker_script.ld -Wl,-Map=out.map

COMPILE= $(COMPILER) $(COMPILERFLAGS) -o $@ $<
LINK= $(COMPILER) $(LINKERFLAGS) -o $@ $^

RELDIR = bin/release
DEBUGDIR = bin/debug

ifdef DEBUG
BIN=$(DEBUGDIR)
COMPILERFLAGS += -g3 -O0 -D_DEBUG
else
BIN=$(RELDIR)
COMPILERFLAGS += -O3
endif

debug : rebuild
#BIN=$(DEBUGDIR)
#COMPILERFLAGS += -g3 -O0 -D_DEBUG
#
release : rebuild
#BIN=$(RELDIR)
#COMPILERFLAGS += -O3

.PHONY: rebuild
rebuild:
    $(MAKE) clean
    $(MAKE) all 

all : out.elf
    @echo "$(GREEN)Done!$(NC)"
    
out.elf : $(OBJECT)
    @echo "$(YELLOW)Linking...$(NC)"
    $(LINK)
    
$(BIN)/%.o : $(SRC)/%.c
    $(COMPILE)

.PHONY: all clean debug prep release remake
clean:
    @echo "$(GREEN)Cleaning...$(NC)"
    rm -rf $(BIN)/*.o $(BIN)/*.elf

【问题讨论】:

当您需要调试版本时如何调用make 我将 IDE 设置为从 IDE 调用“make release”和“make debug”(属性 c/c++ 构建/行为)。从控制台调用时,它的行为相同。 好吧,这还不够好。在您的makefile 中有ifdef DEBUG,这意味着要启用调试构建,需要设置DEBUG make 变量。仅运行make debug 本身不足以设置名为DEBUG 的变量。你需要有一些东西来设置这个变量。 【参考方案1】:

我最终创建了两个 makefile,一个用于调试,一个用于发布。重复代码有点烦人,但至少每个脚本中发生的事情是显而易见的。然后通过“make -f Makefile.DEBUG.mk rebuild”和“make -f Makefile.REBUILD.mk rebuild”从 IDE 调用脚本

#RED = [31m
#GREEN = [32m
#YELLOW = [33m
BLUE = [34m
NC = [0m

BIN = bin/release
SRC = src
INC = inc

MAKE = make -f Makefile.RELEASE.mk

COMPILER=arm-none-eabi-gcc
ARCHITECTURE=cortex-m4

COMPILERFLAGS= -c -mcpu=$(ARCHITECTURE) \
    -mthumb -mfloat-abi=soft -std=gnu11 -Wall -O3 -I $(INC)

LINKERFLAGS= -mcpu=$(ARCHITECTURE) \
    -mthumb -mfloat-abi=soft \
    --specs=nano.specs \
    -T stm32_linker_script.ld \
    -Wl,-Map=$(BIN)/out.map

COMPILE= $(COMPILER) $(COMPILERFLAGS) -o $@ $<
LINK= $(COMPILER) $(LINKERFLAGS) -o $(BIN)/$@ $^
SOURCE = $(wildcard $(SRC)/*.c)
OBJECT = $(patsubst %,$(BIN)/%, $(notdir $(SOURCE:.c=.o)))

.PHONY: rebuild
rebuild:
    $(MAKE) clean
    $(MAKE) all 

all : out.elf
    @echo "$(BLUE)Done!$(NC)"
    
out.elf : $(OBJECT)
    @echo "$(BLUE)Linking...$(NC)"
    $(LINK)
    
$(BIN)/%.o : $(SRC)/%.c
    $(COMPILE)

.PHONY: all clean
clean:
    @echo "$(BLUE)Cleaning...$(NC)"
    rm -rf $(BIN)/*.o $(BIN)/*.elf $(BIN)/*.map



and

#RED = [31m
#GREEN = [32m
#YELLOW = [33m
BLUE = [34m
NC = [0m

BIN = bin/debug
SRC = src
INC = inc

MAKE = make -f Makefile.DEBUG.mk

COMPILER=arm-none-eabi-gcc
ARCHITECTURE=cortex-m4

COMPILERFLAGS= -c -mcpu=$(ARCHITECTURE) \
    -mthumb -mfloat-abi=soft -std=gnu11 -Wall -g -I $(INC)

LINKERFLAGS= -mcpu=$(ARCHITECTURE) \
    -mthumb -mfloat-abi=soft \
    --specs=nano.specs \
    --specs=rdimon.specs -lc -lrdimon \
    --specs=nosys.specs \
    -T stm32_linker_script.ld \
    -Wl,-Map=$(BIN)/out.map

COMPILE= $(COMPILER) $(COMPILERFLAGS) -o $@ $<
LINK= $(COMPILER) $(LINKERFLAGS) -o $(BIN)/$@ $^
SOURCE = $(wildcard $(SRC)/*.c)
OBJECT = $(patsubst %,$(BIN)/%, $(notdir $(SOURCE:.c=.o)))

.PHONY: rebuild
rebuild:
    $(MAKE) clean
    $(MAKE) all 

all : out.elf
    @echo "$(BLUE)Done!$(NC)"
    
out.elf : $(OBJECT)
    @echo "$(BLUE)Linking...$(NC)"
    $(LINK)
    
$(BIN)/%.o : $(SRC)/%.c
    $(COMPILE)

.PHONY: all clean
clean :
    @echo "$(BLUE)Cleaning...$(NC)"
    rm -rf $(BIN)/*.o $(BIN)/*.elf $(BIN)/*.map
    


    

【讨论】:

以上是关于在 makefile 中构建 RELEASE 和 DEBUG的主要内容,如果未能解决你的问题,请参考以下文章

将atollic项目导出为基于makefile的项目

如何从文件中写入/读取变量并使用 Makefile 进行解析?

Makefile 包含基于 Debug / Release 目标的依赖项

如何调试Linux下vim编辑器写的代码?含实用快捷指令make和Makefile

如何调试Linux下vim编辑器写的代码?含实用快捷指令make和Makefile

如何调试Linux下vim编辑器写的代码?含实用快捷指令make和Makefile