一个Makefile项目框架
目录
- 顶层 Makefile
- 其他 Makefile
顶层 Makefile
# NOTE 配置交叉编译环境
CROSS_COMPILE ?=
# NOTE 配置内核目录
KDIR ?= /lib/modules/$(shell uname -r)/build
# NOTE 配置架构
ARCH ?= $(shell uname -m)
# 导出的变量可以在 子Makefile 中使用
export CROSS_COMPILE KDIR ARCH
CP := @cp -rf
RM := @rm -rf
ECHO := @echo
MAKE := @make
TOUCH := @touch
MKDIR := @mkdir -p
MV := @mv -f
export CP RM ECHO MAKE TOUCH MKDIR MV
CC := @$(CROSS_COMPILE)gcc
LD := @$(CROSS_COMPILE)ld
AR := @$(CROSS_COMPILE)ar
STRIP := @$(CROSS_COMPILE)strip
export CC LD AR STRIP
# Git相关信息
GIT_BRANCH := $(shell git rev-parse --abbrev-ref HEAD)
GIT_HASH := $(shell git describe --tags --always --dirty=-X | sed 's/\//-/g')
export GIT_BRANCH GIT_HASH
OUT := $(shell pwd)/out
export OUT
CFLAGS := -g -std=gnu99 -I$(OUT)
LDFLAGS := -L$(OUT)
export CFLAGS LDFLAGS
# 依次进入目录中执行 make
SUB_DIRS := driver
SUB_DIRS += thirdpart/libusb
SUB_DIRS += api
SUB_DIRS += test/interface_test
SUB_DIRS += out/
.PHONY: all prebuild postbuild $(SUB_DIRS) clean env
all: prebuild $(SUB_DIRS) postbuild
$(ECHO) ""
prebuild:
$(ECHO) ""
$(MKDIR) $(OUT)
postbuild:
$(ECHO) ""
$(ECHO) "all build success"
$(SUB_DIRS):
$(ECHO) ""
$(ECHO) "*****************************************"
$(ECHO) "* Make $@ !!! "
$(ECHO) "*****************************************"
$(MAKE) -s -C $@
clean:
@$(foreach N, $(SUB_DIRS),make -s -C $(N) clean;)
env:
$(ECHO) $(GIT_BRANCH)
$(ECHO) $(GIT_HASH)
$(ECHO) $(MAKE)
$(ECHO) $(CC)
其他 Makefile
LDFLAGS += -lusb
SRC_FILES = main.c xprint.c utils.c
OBJS = $(SRC_FILES:%.c=%.o)
TARGET = interface_test.out
$(TARGET): $(OBJS)
$(CC) -o $(TARGET) $(CFLAGS) $(OBJS) $(LDFLAGS)
$(CP) $(TARGET) $(OUT)
$(OBJS):%.o:%.c
$(CC) -c $(CFLAGS) $< -o $@
$(ECHO) [CC] $<
clean:
$(RM) $(TARGET) *.o