INFOPLIST_FILE=Info.plist
Plist是property list的缩写,plist文件中包含一些命名值和使用Core Foundation类型创建的值的列表。这些类型包括CFString、CFNumber、CFBoolean、CFData、CFArray及CFDictionary等。
SOURCES=/
main.m /
NetServicesApp.m
定义变量SOURCES,用来指定源文件目标。
CC=/usr/local/arm-apple-darwin/bin/gcc
定义变量CC,指定编译器为gcc。
CFLAGS=-g -O2 -Wall
CFLAGS为传递给编译器的编译参数,如果没有定义则参数为空。
LD=$(CC)
LD变量被赋值为gcc的目录。
LDFLAGS=-Wl,-syslibroot,/usr/local/arm-apple-darwin/heavenly -lobjc -ObjC -framework CoreFoundation -framework Foundation -framework CoreGraphics -framework GraphicsServices -framework UIKit -framework LayerKit -framework CFNetwork
LDFLAGS用来指定动态Library调用的参数集合。
WRAPPER_NAME=$(PRODUCT_NAME).app
定义变量WRAPPER_NAME为项目名字.app。
EXECUTABLE_NAME=$(PRODUCT_NAME)
定义变量EXECUTABLE_NAME为项目名字。
SOURCES_ABS=$(addprefix $(SRCROOT)/,$(SOURCES))
在SOURCES里的所有文件前面添加前缀SRCROOT并赋值给SOURCES_ABS。
INFOPLIST_ABS=$(addprefix $(SRCROOT)/,$(INFOPLIST_FILE))
在INFOPLIST_FILE里的所有文件前面添加前缀SRCROOT并赋值给INFOPLIST_ABS。
OBJECTS=/
$(patsubst %.c,%.o,$(filter %.c,$(SOURCES))) /
$(patsubst %.cc,%.o,$(filter %.cc,$(SOURCES))) /
$(patsubst %.cpp,%.o,$(filter %.cpp,$(SOURCES))) /
$(patsubst %.m,%.o,$(filter %.m,$(SOURCES))) /
$(patsubst %.mm,%.o,$(filter %.mm,$(SOURCES)))
首先$(filter %.c,$(SOURCES))把SOURCES里所有后缀为*.c的文件过滤出来,然后把所有的后缀名*.c改为*.o,下面分别把*.cc、*.cpp、*.m、*mm等文件的后缀名改为*.o。
OBJECTS_ABS=$(addprefix $(CONFIGURATION_TEMP_DIR)/,$(OBJECTS))
在所有的目标文件前面添加前缀$(CONFIGURATION_TEMP_DIR)。
APP_ABS=$(BUILT_PRODUCTS_DIR)/$(WRAPPER_NAME)
从上面我们知道变量WRAPPER_NAME为$(PRODUCT_NAME).app,那么APP_ABS就为最终release的产品名字的绝对路径了。
PRODUCT_ABS=$(APP_ABS)/$(EXECUTABLE_NAME)
定义PRODUCT_ABS变量为release产品的绝对路径或直接为产品名字。
all: $(PRODUCT_ABS)
定位伪目标all为最终产品的绝对路径。
$(PRODUCT_ABS): $(APP_ABS) $(OBJECTS_ABS)
$(LD) $(LDFLAGS) -o $(PRODUCT_ABS) $(OBJECTS_ABS)
调用gcc编译器,并设置动态调用Library为LDFLAGS里的参数集合,编译最终的产品PRODUCT_ABS。下面都是这些编译过程的依赖关系了。
$(APP_ABS): $(INFOPLIST_ABS)
mkdir -p $(APP_ABS)
cp $(INFOPLIST_ABS) $(APP_ABS)/
$(CONFIGURATION_TEMP_DIR)/%.o: $(SRCROOT)/%.m
mkdir -p $(dir $@)
$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
clean:
echo rm -f $(OBJECTS_ABS)
echo rm -rf $(APP_ABS)