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