Xcode中的Target,主要包含下面幾點知識:
Target依賴
Build Phase
Build Rule
Target依賴
Target的依賴關系表示一個Target要構建成功,必先依賴於其他Target的構建成功。
一個Target可以依賴同一個工程里面的另一個Target,也可以依賴不同工程里面的Target。依賴不同工程里面的Target,叫做跨工程依賴(cross-project dependency)。
想要實現跨工程依賴,最簡單的方法是先將被依賴的工程文件(.xcodeproj文件)拖到當前工程中,然后配置被依賴的Target。
Build Phase
Build Phase定義了一個Target需要構建成功,需要經歷的步驟。
一個Target構建的時候,從上到下執行Build Phase。因此Build Phase的順序時很重要的,比如,你不能沒有編譯就鏈接。但是,Xcode也允許我們改變Build Phase的順序,只要將你想調整的Build Phase拖到想要的位置即可。
對於Build Phase,着重介紹一下Run Script。在Run Script中,Input Files並不是傳遞給腳本的參數,Output Files也不是告訴Xcode在哪里產生輸出文件,Input Files和Output Files的作用,僅僅是告訴Xcode,當Input Files修改日期比Output Files新時,就需要運行腳本。如果Input Files和Output Files有一個不指定,那么腳本每次都會執行。因此,指定輸入文件和輸出文件,Xcode並不會自動讀入文件,並輸出文件到指定位置,這些都需要你在腳本里面完成。同時,在腳本里面,可以訪問build settings當中的變量。
Build Rule
Build Rule定義了對於某一個類型的文件,需要進行的特殊處理。比如,你可能需要對於.c文件用自己定義個編譯器編譯,那么,就可以通過Build Rule來達到;如果一中文件類型需要轉換成另一種文件類型,也可以使用Build Rule。
Build Rule分位系統定義的Build Rule和自定義的Build Rule,自定義的Build Rule優先級總是大於系統定義的Build Rule。Xcode在匹配Build Rule時,總是根據Build Rule定義的順序,匹配第一個符合定義的Build Rule,這就是說,如果有兩個完全相同的Build Rule,那么在前的Build Rule將被匹配。
一個Build Rule被同一個Target的所有Build Phase所共享,無法為同一個Target的不同Build Pahse定義不同的Build Rule。
在執行Build Rule的腳本的時候:
1 當前目錄被設置為project folder(即包含工程文件.xcodeproj的文件夾)
2 許多與輸入文件和輸出文件有關的環境變量被設置,可以再腳本中使用,相關環境變量(只是一部分)如下表:
對於Build Rule中的輸出文件,如果你的目的是將輸出文件寫到Target的build產物中,那么輸出文件應該指定為TARGET_BUILD_DIR,如果你的輸出文件只是作為中間文件,那么輸出文件應該指定為 DERIVED_FILES_DIR。指定輸出文件的目的,是為了告訴Xcode到哪里尋找這些輸出文件,以便后續利用。舉個例子,如果一個Build Rule將XML編譯成LEX文件,而后續的Build Rule會降LEX文件編譯成.c文件,那么,Xcode就會根據第一個Build Rule指定的LEX輸出文件位置,作為第二個Build Rule的輸入。