您的位置:首页 > 其它

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: