【makefile】makefile 通用模板

1、makefile 动态库模板

如果子目录下没有嵌套其他子目录,该模板无需修改。如果makefile文件和源文件不在一个目录下,则需要修改根目录 ROOT_DIR

###############################################################################
# 设置编译器、编译选项
###############################################################################
TOOL_CHAIN_PATH		= /home/gzx/Desktop/tool/arm-linux/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin
CC					= $(TOOL_CHAIN_PATH)/arm-linux-gnueabihf-gcc
NFS_PATH			= /usr/local/nfsd/rootfs/home/root/workspace/lcd

###############################################################################
# 获取有效子目录
###############################################################################
ROOT_DIR 			= .
ALL_SUBDIRS  		= $(shell ls $(ROOT_DIR) -l | grep ^d | awk '{print	$$9}')	# 获取ROOT_DIR下的所有子目录
EXCLUDE_DIRS		= build	lcd_test												# 不会去编译的目录
VALID_SUBDIRS		= $(filter-out $(EXCLUDE_DIRS), $(ALL_SUBDIRS))			# 得到真正会去编译的目录
VALID_SUBDIRS		+= $(ROOT_DIR)											# 加上当前根目录

###############################################################################
# 获取源文件
###############################################################################
SOURCES				+= $(foreach subdir, ${VALID_SUBDIRS}, $(wildcard ${subdir}/*.c ${subdir}/*.cpp))		# 获取各个子目录下的源文件(含当前目录)		

###############################################################################
# 设置目标文件的生成位置
###############################################################################
BUILD_DIR			= build			
OBJ_DIR				= $(BUILD_DIR)/obj
OBJS				= $(OBJ_DIR)/*.o
TARGET				= $(BUILD_DIR)/libtest.so
# 判断build目录是否存在,存在就清空目录,不在就创建
$(shell \
	if test -e $(BUILD_DIR); then \
		rm -rf $(BUILD_DIR)/*; \
	else \
		mkdir -p $(BUILD_DIR); \
fi)

###############################################################################
# 开始生成目标对象
###############################################################################
default: $(TARGET)

$(TARGET): $(OBJS)
	${CC} -shared -o $@ $^

###############################################################################
# 提前生成 .o 文件(OBJS)
#	- 判断 .c 文件还是 .cpp 文件,都替换成 .o 的样式
#	- OBJ 包含路径,去除 OBJ 中的路径
#	- 开始编译生成 .o 文件
###############################################################################
define compile
OBJ = $(if $(findstring .c,$1), $(patsubst %.c,%.o,$1), $(patsubst %.cpp,%.o,$1))	 
NODIR_OBJ = $$(notdir $$(OBJ))
$$(shell $$(CC) -fPIC -o $$(OBJ_DIR)/$$(NODIR_OBJ) -c $1)
endef
$(foreach src_file, ${SOURCES}, $(eval $(call compile, $(src_file))))	# 遍历每一个源文件,同时生成对应的 .o 文件


###############################################################################
# 伪目标
###############################################################################
.PHONY:clean
clean:
	rm -rf $(BUILD_DIR)/*

$(shell ls $(DIR2) -l | grep ^d | awk '{print   $$9}')

=》ls $(DIR2) -l | grep ^d:输出当前目录的所有文件以及目录等的详细信息,然后筛选出其中只是目录的信息

=》awk '{print   $$9}':输出目录详细信息中的目录的名称

2、 生成可执行文件模板

遍历一级目录下的所有子目录,如果子目录下嵌套了其他子目录,那就作为二级子目录处理

# ################################################################
# # 指定编译器、获取源文件、指定目标文件的生成位置
# ################################################################
# 编译器
CXX  			= gcc

# 目标文件名
TARGET_NAME		= main
 
# 编译选项
CXXFLAGS += -Wall -O3 -std=c++11
 
# 获取到一级子目录下的源文件
ROOT_DIR 		= 	src													# 源文件的根目录
SOURCES 		+=	$(wildcard ${ROOT_DIR}/*.c)							# 获取main函数

FILTER_OUT_DIR 	= BSW src_fusion										# 要滤除的子目录(待添加)
ALL_SUBDIRS 	= $(shell find ${ROOT_DIR} * -type d | grep -v "\.")	# 获取ROOT_DIR下的所有子目录
SUBDIRS 		= $(filter-out ${FILTER_OUT_DIR},${ALL_SUBDIRS})		# 滤除子目录
SOURCES 		+= $(foreach subdir,${SUBDIRS}, $(wildcard ${subdir}/*.c))

# 获取二级子目录下的源文件
ROOT_DIR2		= src_fusion/DspLib
SOURCES 		+= $(foreach subdir,${ROOT_DIR2}, $(wildcard ${ROOT_DIR}/${subdir}/*.c))

# 获取三级子目录下的源文件
ROOT_DIR3		= BSW/OS/Kernel
SOURCES 		+= $(foreach subdir,${ROOT_DIR3}, $(wildcard ${ROOT_DIR}/${subdir}/*.c))

# 指定目标生成位置
TARGET_DIR		= build
TARGET_FILE		= ${TARGET_DIR}/${TARGET_NAME}


# ################################################################
# # 编译生成目标文件、库文件/执行文件
# ################################################################
all: build_dir ${TARGET_FILE}

# 生成目标目录
build_dir:
	@mkdir -pv ${TARGET_DIR}

# 生成目标文件
${TARGET_FILE}: ${SOURCES}
	${CXX} -o $@ $^

# ################################################################
# # 伪目标/自定义函数
# ################################################################
.PHONY:clean
clean:
	@rm -rf ${TARGET_DIR} ${TARGET_DIR}/${TARGET_FILE}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值