Building C-program “out of source tree” with GNU make

后端 未结 4 960
广开言路
广开言路 2020-11-28 08:36

I would like to build a C-project for my microcontroller with the GNU make tool. I would like to do it in a clean way, such that my source code is not cluttered with object

4条回答
  •  佛祖请我去吃肉
    2020-11-28 09:06

    Here's a basic one I use all the time, it's pretty much a skeleton as it is but works perfectly fine for simple projects. For more complex projects it certainly needs to be adapted, but I always use this one as a starting point.

    APP=app
    
    SRC_DIR=src
    INC_DIR=inc
    OBJ_DIR=obj
    BIN_DIR=bin
    
    CC=gcc
    LD=gcc
    CFLAGS=-O2 -c -Wall -pedantic -ansi
    LFLGAS=
    DFLAGS=-g3 -O0 -DDEBUG
    INCFLAGS=-I$(INC_DIR)
    
    SOURCES=$(wildcard $(SRC_DIR)/*.c)
    HEADERS=$(wildcard $(INC_DIR)/*.h)
    OBJECTS=$(SOURCES:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
    DEPENDS=$(OBJ_DIR)/.depends
    
    
    .PHONY: all
    all: $(BIN_DIR)/$(APP)
    
    .PHONY: debug
    debug: CFLAGS+=$(DFLAGS)
    debug: all
    
    
    $(BIN_DIR)/$(APP): $(OBJECTS) | $(BIN_DIR)
        $(LD) $(LFLGAS) -o $@ $^
    
    $(OBJ_DIR)/%.o: | $(OBJ_DIR)
        $(CC) $(CFLAGS) $(INCFLAGS) -o $@ $<
    
    $(DEPENDS): $(SOURCES) | $(OBJ_DIR)
        $(CC) $(INCFLAGS) -MM $(SOURCES) | sed -e 's!^!$(OBJ_DIR)/!' >$@
    
    ifneq ($(MAKECMDGOALS),clean)
    -include $(DEPENDS)
    endif
    
    
    $(BIN_DIR):
        mkdir -p $@
    $(OBJ_DIR):
        mkdir -p $@
    
    .PHONY: clean
    clean:
        rm -rf $(BIN_DIR) $(OBJ_DIR)
    

提交回复
热议问题