您的位置:首页 > 运维架构 > Shell

复杂就是简单的多态叠加--处理多级子目录的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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐