剖析iPhone項目中的Makefile文件

 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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章