Makefile之学习总结(5)--- Makefile (v4.0)
2016-08-06 00:21
197 查看
Makefile 4.0的特点:
1)支持指定平台的make命令,如:make platform=m64x86
2)自动添加所有的源码目录(非源码文件所在目录不会被添加进去)
3)自动添加所有的include目录(非Include目录不会被添加进去)
4)所有.o目标文件都编译生成到对应的.cpp所在目录
5)不支持生成本工程的.a库以及.so动态库(暂时不打算支持)
Makefile 4.0内容如下所示:
注:OBJS:=$(sort $(OBJS)),这句的功能是对OBJS中的目标文件去重。
#Makefile v4.0
####设置target
.PHONY:all help srcs includes objs platforms ldflags cxxflags a.out
all: srcs help includes objs platforms ldflags cxxflags a.out
###set complier
CC=gcc
CPP=g++
RM=rm
####set paths
PWD:=$(shell pwd)
SRC_DIRS:=$(PWD)
SRC_DIRS+=$(PWD)/Src
SRC_DIRS+=$(shell find $(PWD)/Src -type d)
INCLUDE_DIRS:=$(SRC_DIRS)
INCLUDE_DIRS+=$(PWD)/Include
INCLUDE_DIRS+=$(shell find $(PWD)/Include -type d)
ALL_DIRS:=$(shell find $(PWD) -type d)
vpath %.cpp $(ALL_DIRS)
vpath %.c $(ALL_DIRS)
vpath %.h $(ALL_DIRS)
###创建源文件集合(绝对路径)
src_files:=$(foreach dir, $(SRC_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)
else
platform=m64x86
endif
####设置LDFLAGS
LDFLAGS += -L$(PWD)/Depend/$(platform)
LDFLAGS += -Igtest.a -lrt -lpthread
####设置CXXFLAGS
CXXFLAGS += -Wall -g -lpthread -lstdc++
CXXFLAGS += $(addprefix -I, $(INCLUDE_DIRS))
#CXXFLAGS += $(foreach dir, $(INCLUDE_DIRS), -I$(dir))
###编译生成所有的目标文件
OBJS:=$(sort $(OBJS))
$(OBJS):%.o:%.cpp
$(CPP) $(CXXFLAGS) -c $< -o $@
###链接生成最终可执行文件
TARGET = a.out
$(TARGET):$(OBJS)
$(CPP) -o $@ $^ $(LDFLAGS)
.PHONY: clean cleanall cleanobj
clean:cleanall cleanobj
@-$(RM) $(TARGET)
cleanall:cleanobj
@-$(RM) $(OBJS)
#####debug
srcDirs:
@echo "=======srcDirs========="
@echo $(SRC_DIRS)
@echo "************************"
includeDirs:
@echo "=======includeDirs========="
@echo $(INCLUDE_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)
1)支持指定平台的make命令,如:make platform=m64x86
2)自动添加所有的源码目录(非源码文件所在目录不会被添加进去)
3)自动添加所有的include目录(非Include目录不会被添加进去)
4)所有.o目标文件都编译生成到对应的.cpp所在目录
5)不支持生成本工程的.a库以及.so动态库(暂时不打算支持)
Makefile 4.0内容如下所示:
注:OBJS:=$(sort $(OBJS)),这句的功能是对OBJS中的目标文件去重。
#Makefile v4.0
####设置target
.PHONY:all help srcs includes objs platforms ldflags cxxflags a.out
all: srcs help includes objs platforms ldflags cxxflags a.out
###set complier
CC=gcc
CPP=g++
RM=rm
####set paths
PWD:=$(shell pwd)
SRC_DIRS:=$(PWD)
SRC_DIRS+=$(PWD)/Src
SRC_DIRS+=$(shell find $(PWD)/Src -type d)
INCLUDE_DIRS:=$(SRC_DIRS)
INCLUDE_DIRS+=$(PWD)/Include
INCLUDE_DIRS+=$(shell find $(PWD)/Include -type d)
ALL_DIRS:=$(shell find $(PWD) -type d)
vpath %.cpp $(ALL_DIRS)
vpath %.c $(ALL_DIRS)
vpath %.h $(ALL_DIRS)
###创建源文件集合(绝对路径)
src_files:=$(foreach dir, $(SRC_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)
else
platform=m64x86
endif
####设置LDFLAGS
LDFLAGS += -L$(PWD)/Depend/$(platform)
LDFLAGS += -Igtest.a -lrt -lpthread
####设置CXXFLAGS
CXXFLAGS += -Wall -g -lpthread -lstdc++
CXXFLAGS += $(addprefix -I, $(INCLUDE_DIRS))
#CXXFLAGS += $(foreach dir, $(INCLUDE_DIRS), -I$(dir))
###编译生成所有的目标文件
OBJS:=$(sort $(OBJS))
$(OBJS):%.o:%.cpp
$(CPP) $(CXXFLAGS) -c $< -o $@
###链接生成最终可执行文件
TARGET = a.out
$(TARGET):$(OBJS)
$(CPP) -o $@ $^ $(LDFLAGS)
.PHONY: clean cleanall cleanobj
clean:cleanall cleanobj
@-$(RM) $(TARGET)
cleanall:cleanobj
@-$(RM) $(OBJS)
#####debug
srcDirs:
@echo "=======srcDirs========="
@echo $(SRC_DIRS)
@echo "************************"
includeDirs:
@echo "=======includeDirs========="
@echo $(INCLUDE_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)
相关文章推荐
- makefile学习总结
- makefile学习总结-----通配符使用
- makefile学习总结-----基础知识
- makefile 学习的点滴总结-(7)
- Makefile之学习总结(1)---工程搭建
- makefile学习总结
- makefile----学习笔记总结
- linux基础学习之 makefile重要知识点总结
- 本人学习Makefile的总结和分享
- 编写VC Makefile的学习总结
- Makefile之学习总结(3)--- Makefile (v2.0)
- Makefile之学习总结(4)--- Makefile (v3.0)
- Makefile学习总结
- makefile学习总结-----make的递归执行
- makefile学习总结(修正版)
- makefile 学习总结
- Makefile之学习总结(2)--- Makefile (v1.0)
- GNU Makefile学习专题(四) | GNU Make 常用内置函数的总结 | 零碎知识点的总结 | (待完善)
- 软件工程通用makefile写法学习总结
- makefile学习总结