基本思路:
最外层有三个文件: Makefile, Make.share, Make.include.
每个工程目录中都有一个Makefile文件.
其中最外层的Makefile是外壳部分.需要调用者修改里面的某些参数,例如编译平台,要编译的子目录集合,每个工程都要用到的头文件,编译参数等,设置完成后,会进入每个子目录,执行当前子目录中的Makefile文件.
Make.shareMake.include是供每个工程目中Makefile来包含的,里面包含标准Makefile机制所需要文件的代码.
工程目录下的Makefile : 设置每个工程自己的项目类型(可执行程序,静态库,动态库)和工程模块的名字,自己独特的头文件目录,编译、链接参数.在文件的开头包含最外层的Makefile.include,在文件结尾包含最外层的Makefile.share.
最外层的Makefile文件 :
##################################################################################################<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

##################################################################################################

# The target platform information.

# You can change the MACRO 'PLATFORM' or use make : make PLATFORM=[IOS, LINUX, MACOS]

# LINUX MACOS IOS

PLATFORM = LINUX

export PLATFORM

# SUB DIRS

SUBDIRS := \

./hello/hellostaticlib \

./hello/hellodynamiclib \

./hello

# ROOT DIR

ROOTDIR := $(shell pwd)

export ROOTDIR

# Global includes

GLOBAL_INCLUDES := -I$(ROOTDIR)/hello/include

export GLOBAL_INCLUDES

# Global flags for compile

GLOBAL_CCXXFLAGS := -g -DUNICODE -D_UNICODE

export GLOBAL_CCXXFLAGS

# Target path

TARGET_PATH := $(ROOTDIR)/target

export TARGET_PATH

# IOS SDK Version

IOSSDK_V= 5.0

export IOSSDK_V

#IOS CPU

IOS_ARCH = armv6 armv7 i386

export IOS_ARCH

##################################################################################################

##################################################################################################

SUPPORTCMDS := all objs clean cleanall rebuild

export SUPPORTCMDS

.PHONY : SUPPORTCMDS ioscombine

$(SUPPORTCMDS):

ifeq ($(PLATFORM), IOS)

for subdir in $(SUBDIRS); do \

echo "Making " $$subdir; \

for arch in $(IOS_ARCH); do \

echo "For " $$arch; \

(cd $$subdir && make clean && make $@ ARCH=$$arch ); \

done; \

done;

else

for subdir in $(SUBDIRS); do \

echo "Making " $$subdir; \

(cd $$subdir && make $@); \

done;

endif

TS = $(notdir $(wildcard $(TARGET_PATH)/$(firstword $(IOS_ARCH))/*))

TSA = $(foreach arch, $(IOS_ARCH), $(foreach ts, $(TS), $(TARGET_PATH)/$(arch)/$(ts)))

ioscombine:

for ts in $(TS); do \

echo "Make " $$ts; \

echo $(TSA) | tr ' ' '\n'| grep $$ts | tr '\n' ' ' | xargs echo; \

echo $(TSA) | tr ' ' '\n'| grep $$ts | tr '\n' ' ' | xargs lipo -create -output $(TARGET_PATH)/$$ts; \

done;

最外层的Makefile文件需要修改的有这几个地方:

PLATFORM : 设置目标的平台. LINUX 代表通用linux系统; MACOS 代表mac系统; IOS 代表IPhone,IPad等IOS设备.

SUBDIRS : 设置工程包含的子模块,每个子模块目录下都有自己的Makefile文件.

GLOBAL_INCLUDES : 项目中各模块都会用到的头文件.

GLOBAL_CCXXFLAGS : 项目中各个模块都会用到的编译连接标志.

TARGET_PATH : 如果有必要,可以修改目标binarary的输出路径.

IOSSDK_V : 如果是IOS系统,需要设置编译IOS程序需要的SDK版本号.

IOS_ARCH : 如果是IOS系统,需要设置编译IOS程序需要支持的CPU类型.最后要调用build ioscombine来生成最终目标文件.

最外层的Make.include文件:
##################################################################################################

##################################################################################################

ifneq ($(ARCH), "")

TARGET_PATH_R := $(TARGET_PATH)/$(ARCH)

endif

最外层的Make.include文件只是修正TARGET_PATH(即目标路径),如果设置了ARCH(CPU类型),依次把不同类型CPU的输入文件放入各自对应的目录中.只是对IOS类型有效.因此暂时IOS才会用到多CPU支持.