在linux的世界里,makefile是不可逾越的编程规则,摆脱了传统的IDE的束缚,但是面对的却是灵活多变的makefile编译规则,如何能以不变应万变,能有个相对通用一点的模板,此模板也在不断的根据工程的扩展在完善:
编译规则我定义了3个文件,主要包括makefile文件,config.mk,src.mk,其实在linux里后缀名不重要,这里.mk后缀主要做区分用没有其他特殊含义
makefile文件:主要起到编译源码、链接目标文件,最终生成可执行文件
config.mk文件:主要是配置参数
src.mk文件:主要是源码的增加和删减,比如增加了一个目录或者源码文件,在此修改
src.mk文件内容:
#source file location configuration
#./01.src
DIR_01=./01.src
SRC=$(DIR_01)/main.c
SRC+=$(DIR_01)/app.c
#./02.drv
DIR_02=./02.drv
SRC+=$(DIR_02)/flash.c
#./03.net
DIR_03=./03.net
SRC+=$(DIR_03)/net.c
#./04.uart
DIR_04=./04.uart
SRC+=$(DIR_04)/uart.c
SRC+=$(DIR_04)/serial.c #no use
#./05.task
DIR_05=./05.task
SRC+=$(DIR_05)/taskuart1.c
SRC+=$(DIR_05)/taskuart2.c
SRC+=$(DIR_05)/taskuart3.c
#the header file include file path
INC= -I$(DIR_01) -I$(DIR_02) -I$(DIR_03) -I$(DIR_04) -I$(DIR_05)
LIB=
config.mk文件内容:
#this is a compiler file
#configing the compiler
#sunlishuang 2019.12.22
#compile tools configuration
CROSS_COMPILE=arm-none-linux-gnueabi-
AS = $(CROSS_COMPILE)as
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)gcc
SIZE = $(CROSS_COMPILE)size
OBJCOPY = $(CROSS_COMPILE)objcopy
GDB = $(CROSS_COMPILE)gdb
AR = $(CROSS_COMPILE)ar
#compile options
CFLAG=-g
CFLAG+=-Wall
#CFLAG+=-v
CFLAG+=-O0
CFLAG+=-pthread -lrt #POSIX thread and shared memory
makefile文件内容:
-include config.mk
-include src.mk
ALL_COMPILE_CFG=$(CFLAG) $(INC) $(LIB)
TARGET=main
OBJS=$(SRC:.c=.o)
$(TARGET):$(OBJS)
$(CC) $(ALL_COMPILE_CFG) $(OBJS) -o $@
%.o:%.c
$(CC) $(ALL_COMPILE_CFG) -c $< -o $@
.PHONY: clean
clean:
-rm -rvf $(TARGET) $(OBJS)