复杂就是简单的多态叠加--处理多级子目录的Makefile
来源:互联网 发布:淘宝 天衣无缝 墙布 编辑:程序博客网 时间:2024/06/01 17:25
开发中常常有这样的需求:一个不算简单的目录结构,需要一个统一的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
- 复杂就是简单的多态叠加--处理多级子目录的Makefile
- RTEMS 应用程序含有多级子目录的Makefile工程文件编写
- 多子目录的makefile编译库模板
- 编译所有子目录的makefile
- 包含子目录的makefile例子
- 编译所有子目录的makefile
- 主makefile套用子目录下的makefile
- makefile多级目录的编译
- makefile多级目录的调用
- Makefile学习笔记系列2:一个简单的Makefile(增加子目录结构)
- makefile处理多级目录
- makefile子目录,call function, 多rules之间的独立shell
- 异常处理,简单而又复杂的问题
- 异常处理,简单而又复杂的问题
- 异常处理,简单而又复杂的问题
- 润乾--Filefilter过滤含有多级子目录的特定文件
- cornerstone怎样添加有多级子目录的目录
- powershell:Join-Path连接多级子目录的方法
- PB开发笔记
- android Audio 应用接口
- javascript判断字符出现在字符中代码
- 初识----浏览器插件开发
- 在Eclipse3.4中安装Ext和删除Spket以及不能自动提示问题的解决总结
- 复杂就是简单的多态叠加--处理多级子目录的Makefile
- 关于Excel数据导入Mysql的问题
- javascript 支持中英文字符串截取函数
- 山寨是王道--外平台JAVA项目到android的移植
- IBM Lotus Symphony V3 成功发布
- 分布式事务简介
- 信令分析工具,Abis,A口,GB口数据解码,信令流程关联
- CONNECT BY PRIOR... START WITH
- 面向程序员的数据库访问性能优化法则