复杂就是简单的多态叠加--处理多级子目录的Makefile
2010-12-08 13:35
441 查看
开发中常常有这样的需求:一个不算简单的目录结构,需要一个统一的Makefile来进行编译管理。这时候最简单的做法就是遍历--搜罗所有的头文件和代码文件,使用统一的规则gcc -Ixx -o *.o *.c<pp>然后打扫战场,处理尸体;最标准的做法就是在每个子目录下编程时随手加上Makefile, 然后再百川归海,有统一的父目录(确切的说是始祖)Makefile来遥控, 但是,,,,你不觉得烦吗?
其实Makefile提供了很多方法(函数)来方便懒人的,下面有个小例子:
LIBS= -L/usr/lib /
-L../MicroSip6.0 /
-L./lib /
-lssl /
-lcrypto /
ARCH=
MW_DIR=$(PWD)
CC = $(ARCH)gcc
LD = $(ARCH)ld
AS = $(ARCH)as
CPP = $(ARCH)g++
AR = $(ARCH)ar
MW_DIR=.
INCLUDE = -I.
以上这一段没什么可说的, 相信广大软件行业的民工兄弟都再熟悉不够--备草料。
然后,我希望找到所有编译目录下的头文件--
SAMDIR=$(MW_DIR)
SAMINCH=$(shell find $(SAMDIR) -name "*.h*")
:::找到了,大家可以看到Makefile是可以使用shell命令的,现在结果存储在SAMINCH。
TMPDIR=$(dir $(SAMINCH))
dir是个函数,就是列出SAMINCH目录前缀(/*.h之前的字串)的结果。
SAMINCDIR=$(sort $(TMPDIR))
sort也是个函数,这是为了去除重复的目录名。
INCLUDE += $(foreach temp, $(SAMINCDIR), -I$(temp))
只是列出所有匹配的目录结果, 加到-I选项之后,用空格隔开。
结果类似:-I./1 -I./2.....
如果引用本目录之外的头文件,没办法了,手动加上吧:
INCLUDE += -Iaa/bb/vv
好了,轮到源程序了。
SRC=$(shell find $(SAMDIR)/src -path ./src/util/system/mac -prune -name '*.cpp')
这个很简单,就是用shell find命令找到本目录下所有的.cpp文件(c,java同理)
但是,碰上我不想编译的目录怎么办呢?比如在Linux上碰到win32的系统代码,上一条命令可以改为:
SRC=$(shell find $(SAMDIR)/src -path ./src/util/system/win32 -prune -o -name '*.cpp')
这就把不需要的路径跳过去了。
APP=$(SRC:%.cpp=%.o)
建立规则
下面实际的编译过程加上:
all: control
$(APP): %.o: %.cpp
$(CC) $(CFLAGS) $(INCLUDE) $< -o $@
#for possible C complie in the future
#$(APPC): %.o: %.c
# $(CC) -c $(CFLAGS) $(INCLUDE) $< -o $@
control: clean $(APP)
$(CPP) -m32 -o $@ $(INCLUDE) $(APP)
clean:
rm -fr $(APP)
rm -f control
打完收工。
完整的例子如下:
HOST_OS=mac
OSX_DEFS += -D__LINUX__ -D__G3__ -D__USE_GNU -D_GNU_SOURCE
#OSX_DEFS += -D__MIPS__ -D__UCLIBC__ -D__BRDCM__
OSX_DEFS += -DCOMM -DCOMM_H323 -DCOMM_RSVP -DCOMM_TERMINAL -DAUDIO -DVIDEO
OSX_DEFS += -DCOMM_SIP
OSX_DEFS += -DANSI_PROTO -DSIP_BY_REFERENCE -DSIP_TXN_LAYER -DSIP_RPR
OSX_DEFS += -DSIP_NO_CALLBACK -DSIP_IMPP -DSIP_TEL -DSIP_SESSIONTIMER
OSX_DEFS += -DSIP_CLONE -DSIP_ACC
OSX_DEFS += -DSIP_REFER -DSIP_REPLACES
OSX_DEFS += -DSIP_MIME_PARSING -DSIP_DATE -DSIP_ISUP -DSIP_SIPMSGBODY
OSX_DEFS += -DSIP_IMURL -DSIP_AUTHENTICATE -DSIP_CORE_STACK_COMPATIBLE
OSX_DEFS += -DSDF_TXN -DSDF_REFER -DSDF_SERVICE
OSX_DEFS += -DSDF_SESSION_TIMER -DSDF_TEL -DSDF_TLS -DPLCM_TLS
OSX_DEFS += -DWITH_LEANER
OSX_DEFS += -DMP_API_COMPATIBLE -DMP_USE_UINT_DIGIT -DCONFIG_ENABLE_FOLDERS
OSX_DEFS += -DCONFIG_ENABLE_FOLDERS
OSX_DEFS += -DMULTIPROC -DNO_REALTIME
OSX_DEFS += -DHALF_SD -DUI_INTEGRATION -DSIREN_22
OSX_DEFS += -DINCLUDE_RS232 -DPLCM
OSX_DEFS += -DCM_DEBG_FILTERS -DCM_DEBG_HEADERS -DCM_DEBG_TIMESTAMPS
OSX_DEFS += -DSTANDALONE -DPERF_OPTIMIZATION -DSDF_LINUX
OSX_DEFS += -DSIP_TRACE
OSX_DEFS += -DSIP_STATISTICS -DSIP_ERROR
OSX_DEFS += -DRV_DEBUG
LIBS= -L/usr/lib /
-L./lib /
-lssl /
-lsecurity /
-lcrypto /
-lrvh323stack_6_0_0_5 /
ARCH=
MW_DIR=$(PWD)
CC = $(ARCH)gcc
LD = $(ARCH)ld
AS = $(ARCH)as
CPP = $(ARCH)g++
AR = $(ARCH)ar
MW_DIR=.
INCLUDE = -I./src/
SAMDIR=$(MW_DIR)
SAMINCH=$(shell find $(SAMDIR) -name "*.h*")
TMPDIR=$(dir $(SAMINCH))
SAMINCDIR=$(sort $(TMPDIR))
INCLUDE += $(foreach temp, $(SAMINCDIR), -I$(temp))
INCLUDE += -I../MicroSip6.0/comm/sip/sip_stack_5_7_src/stack_headers /
-I../MicroSip6.0/comm/sip/ua_6_0_src/uatk_headers /
-I../MicroSip6.0/comm/sip/extends/h
CFLAGS= -m32 -D_LP64=0 -DCRYPTO_USE_ONLY_OPENSSL -U_LP64 -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -DMAC
LDFLAGS= -Lsrc/libxml -lxml2
INCLUDE+= $(OSX_DEFS) /
$(LIBS)
ifeq ($(HOST_OS),win32)
SRC=$(shell find $(SAMDIR) -path ./src/util/system/mac -prune -name '*.cpp')
else
SRC=$(shell find $(SAMDIR) -path ./src/util/system/win32 -prune -o -name '*.cpp')
endif
APP=$(SRC:%.cpp=%.o)
APP_D=$(SRC:%.cpp=%.d)
#for possible C complie in the future
SRCC+=$(shell find $(SAMDIR) -path ./lib -prune -o -name '*.c')
APPC=$(SRCC:%.c=%.o)
APPC_D=$(SRCC:%.c=%.d)
all: control
$(APP): %.o: %.cpp
$(CC) $(CFLAGS) $(INCLUDE) $< -o $@
#for possible C complie in the future
$(APPC): %.o: %.c
$(CC) -c $(CFLAGS) $(INCLUDE) $< -o $@
control: $(APP) $(APPC)
$(CPP) -m32 -o $@ $(INCLUDE) $(APP) $(APPC) $(LDFLAGS)
clean:
rm -fr $(APP)
rm -fr $(APPC)
rm -fr $(APPC_D)
rm -rf $(APP_D)
rm -f control
相关文章推荐
- 【Linux学习】 包含子目录的makefile简单应用
- 简单工作流引擎是按一个单据的(类型),单据的(主键) 来处理流程步骤的,这个就是工作流设计的核心思想
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
- 简单工作流引擎是按一个单据的(类型),单据的(主键) 来处理流程步骤的,这个就是工作流设计的核心思想
- Json树形结构数据转Java对象并存储到数据库的实现-超简单的JSON复杂数据处理
- 利用Rxjava简单处理复杂请求
- makefile处理多级目录
- 移植C++语言到delphi时,复杂结构体的简单处理
- Makefile学习笔记系列2:一个简单的Makefile(增加子目录结构)
- 简单就是不复杂 转
- 异常处理,简单而又复杂的问题
- 【Linux学习】 包含子目录的makefile简单应用
- 尽量用简单方法处理复杂问题
- Json树形结构数据转Java对象并存储到数据库的实现-超简单的JSON复杂数据处理 .
- 寻求一种尽可能简单处理方式来解决复杂问题
- Hadoop: MapReduce2多个job串行处理 复杂的MapReduce处理中,往往需要将复杂的处理过程,分解成多个简单的Job来执行,第1个Job的输出做为第2个Job的输入,相互之间有一
- ajax简单解析xml文件(复杂的解析可以通过后台程序实现,如一般处理程序)
- RTEMS 应用程序含有多级子目录的Makefile工程文件编写
- 数量周期 复杂现象背后的推动力,可能是极其简单的原理。科学的目标之一就是发现纷 繁复杂的自然现象背后的简单法则。爱因斯坦的相对论是这方面的典范例证。
- asp.net MVC接收前端传递的复杂json对象的简单处理方法