万能Makefile

SRC_ROOT:=.
INC_ROOT:=.
CPP_EXCLUDE_LIST:= #排除的cpp文件,需要加路径
C_EXCLUDE_LIST:= #排除的c文件,需要加路径
LIB_ROOT:=
BUILD_DIR:=../build
TARGET:=main #cfg9516
OBJ_ROOT_DIR:=../obj
CC:=arm-linux-gnueabihf-g++
C:=arm-linux-gnueabihf-gcc
DEF:=-DLINUX #宏定义,如-DLINUX -DTEST
LDFLAGS:=-lpthread #-shared#编译动态库需要添加-shared
CFLAGS:=-w -fpermissive -std=c99 #-fPIC#编译动态库需要添加-fPIC
CPPFLAGS:=-w -fpermissive -std=c++11 #-fPIC#编译动态库需要添加-fPIC

INC:=$(addprefix -I ,$(shell find $(INC_ROOT) -type d))
SRC_DIR:=$(shell find $(SRC_ROOT) -type d)
C_SRC:=$(filter-out $(C_EXCLUDE_LIST),$(subst ./,,$(wildcard $(addsuffix /*.c,$(SRC_DIR)))))
CPP_SRC:=$(filter-out $(CPP_EXCLUDE_LIST),$(subst ./,,$(wildcard $(addsuffix /*.cpp,$(SRC_DIR)))))
OBJS:=$(addprefix $(OBJ_ROOT_DIR)/,$(C_SRC:.c=.o) $(CPP_SRC:.cpp=.o))
CPP_DEPS:=$(addprefix $(OBJ_ROOT_DIR)/,$(CPP_SRC:.cpp=.d))
C_DEPS:=$(addprefix $(OBJ_ROOT_DIR)/,$(C_SRC:.c=.d))

$(BUILD_DIR)/$(TARGET):$(OBJS)
	@mkdir -p $(BUILD_DIR)
ifneq ($(strip $(LIB_ROOT)),) #判断LIB_ROOT是否为空
	$(CC) $^ $(addprefix -L ,$(shell find $(LIB_ROOT) -type d)) $(addprefix -l:,$(notdir $(shell find $(LIB_ROOT) -name "libbylhDriver*.so"))) $(LDFLAGS) -o $@
else
	$(CC) $^ $(LDFLAGS) -o $@
endif

$(CPP_DEPS):$(OBJ_ROOT_DIR)/%.d:%.cpp
	@mkdir -p $(dir $@)
	@$(CC) -MM $(INC) $(CPPFLAGS) $(DEF) $< > $@
	@sed -i ":a;N;s|\\n||g;ta" $@
	@sed -i 's|\\||g' $@
	@sed -i -re 's|\w+\.o:\s*((\w+\/)+).+|\1\0|' $@
	@sed -i -re 's|^|$(OBJ_ROOT_DIR)\/|' $@
	@echo "	$(CC) $(CPPFLAGS) $(DEF) $(INC) -c $< -o $(OBJ_ROOT_DIR)/$*.o" >> $@

$(C_DEPS):$(OBJ_ROOT_DIR)/%.d:%.c
	@mkdir -p $(dir $@)
	@$(C) -MM $(INC) $(CFLAGS) $(DEF) $< > $@
	@sed -i ":a;N;s|\\n||g;ta" $@
	@sed -i 's|\\||g' $@
	@sed -i -re 's|\w+\.o:\s*((\w+\/)+).+|\1\0|' $@
	@sed -i -re 's|^|$(OBJ_ROOT_DIR)\/|' $@
	@echo "	$(C) $(CFLAGS) $(DEF) $(INC) -c $< -o $(OBJ_ROOT_DIR)/$*.o" >> $@

-include $(C_DEPS) $(CPP_DEPS)

.PHONY:clean
clean:
	rm -rfd $(BUILD_DIR)/$(TARGET) $(OBJ_ROOT_DIR)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值