一个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
posted @   nikoladi  阅读(77)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示