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)