Makefile之学习总结(3)--- Makefile (v2.0)

来源:互联网 发布:颜值测试软件 编辑:程序博客网 时间:2024/05/22 05:00

在Makefile之学习总结(2) --- Makefile(v1.0)文章给出的Makefile具有以下几个特点:

1)支持指定平台的make命令,如:make platform=m64x86

2)需要手动添加源码目录

3)自动添加Include目录,但只支持L2级目录,仅形如后面两种:./Include和./Include/gtest

4)所有.o目标文件都编译生成到指定一个目录下./objs

5)不支持生成本工程的.a库(暂时不打算支持)

其中2)和3)是本版Makefile v1.0的局限性。

在本章将会优化Makefile v1.0的2)和3)以及4),本章的Makefile v2.0会有以下几个特点:

1)支持指定平台的make命令,如:make platform=m64x86

2)自动添加所有的源码目录

3)自动添加所有的include目录

4)所有.o目标文件都编译生成到对应的.cpp所在目录

5)不支持生成本工程的.a库以及.so动态库(暂时不打算支持)

注:相关工程结构请查看 Makefile之学习总结(1)和 Makefile之学习总结(2)


Makefile v2.0如下所示:

#Makefile v2.0####设置target.PHONY:all help srcs includes objs platforms ldflags cxxflags a.out all: srcs help includes objs platforms ldflags cxxflags a.out###set complierCC=gccCPP=g++RM=rm####set pathsPWD:=$(shell pwd)ALL_DIRS:=$(shell find $(PWD) -type d)vpath %.cpp $(ALL_DIRS)vpath %.c   $(ALL_DIRS)vpath %.h$(ALL_DIRS)###创建源文件集合(绝对路径)src_files:=$(foreach dir, $(ALL_DIRS), $(wildcard $(dir)/*.cpp))###创建目标文件集合(绝对路径)OBJS:=$(src_files:%.cpp=%.o)#OBJS:=$(src_files:.cpp=.o)#OBJS:=$(patsubst %.cpp,%.o,$(src_files))###获取make platform=64x86中的m64x86平台名称ifneq ($(PLATFORM), )platform=$(PLATFORM)elseplatform=m64x86endif####设置LDFLAGSLDFLAGS += -L$(PWD)/Depend/$(platform)LDFLAGS += -Igtest.a -lrt -lpthread####设置CXXFLAGSCXXFLAGS += -Wall -g -lpthread -lstdc++ CXXFLAGS += $(addprefix -I, $(ALL_DIRS))#CXXFLAGS += $(foreach dir, $(include_dirpaths), -I$(dir))###编译生成所有的目标文件$(OBJS):%.o:%.cpp$(CPP) $(CXXFLAGS) -c $< -o $@###链接生成最终可执行文件TARGET = a.out$(TARGET):$(OBJS)$(CPP) -o $@ $^ $(LDFLAGS).PHONY: clean cleanall cleanobjclean:cleanall cleanobj@-$(RM) $(TARGET)cleanall:cleanobj@-$(RM) $(OBJS)#####debugsrcDirs:@echo "=======srcDirs========="@echo $(ALL_DIRS)@echo "************************"includeDirs:@echo "=======includeDirs========="@echo $(ALL_DIRS)@echo "************************"srcs:@echo "=======srcs========="@echo $(src_files)@echo "************************"objs:@echo "=======objs========="@echo $(OBJS)@echo "************************"platforms:@echo "=======platforms========="@echo $(platform)@echo "************************"ldflags:@echo "=======LDFLAGS========="@echo $(LDFLAGS)@echo "************************"cxxflags:@echo "=======CXXFLAGS========="@echo $(CXXFLAGS)@echo "************************"help:@echo make srcDirs@echo make srcDirs@echo make includeDirs@echo make srcs@echo make objs@echo make platforms@echo make ldflags@echo make cxxflags@echo make a.out@echo make clean@echo make cleanall@echo make cleanobj

运行结果如下所示:


(END)

0 0
原创粉丝点击