build system

關(guān)于build system

build system將我們的源碼和資源文件轉(zhuǎn)變?yōu)閍pp.
在開發(fā)工程中當(dāng)你進(jìn)行以下行為時都會調(diào)用build system:

  • Build, run, test, profile, analyze, or archive your project.
  • Use Xcode Server to perform continuous integration of your projects.
  • Use the xcodebuild command-line tool outside of Xcode.

每次調(diào)用build system構(gòu)建就是執(zhí)行一系列有序的任務(wù).最常見的就是 調(diào)用命令行工具編譯和link源文件; 執(zhí)行文件操作,例如復(fù)制文件; 或者執(zhí)行自定義的文件處理,例如生成Info.plist文件

工作流程

image.png
  1. 確定build target
  2. 檢索build configurations, build settings, build phases, and build rules.
  3. 檢查有無依賴target 或者 其他需要編譯其他target
  4. 準(zhǔn)備一個完整的構(gòu)建必須執(zhí)行的任務(wù)列表
  5. 如果額外的構(gòu)建任務(wù)是可能的,準(zhǔn)備額外的構(gòu)建任務(wù)
  6. 根據(jù)build phases執(zhí)行構(gòu)建任務(wù),如果有必要可以創(chuàng)建自定義的build rules

交互

有以下幾個部分可以對build system起影響作用.

  • Workspaces:用來管理多個Project.iOS使用Workspace來管理多項目
  • Projects
  • Schemes
  • Actions
  • Targets
  • Build settings
  • Build configurations
  • Build phases
  • Build rules
  • Build configuration (xcconfig) files

Build日志

我隨便找了一個工程編譯了一下, 可以在工程中如圖地方看到log文件,這里包含就是每一個任務(wù)

image.png

默認(rèn)情況下孝偎,上面的 Xcode 界面中隱藏了大量的信息教沾,我們通過選擇任務(wù)抄瓦,然后點擊右邊的展開按鈕宗兼,就能看到每個任務(wù)的詳細(xì)信息。另外一種可選的方案就是選中列表中的一個或者多個任務(wù),然后選擇組合鍵 Cmd-C,這將會把所有的純文本信息拷貝至粘貼板混槐。最后,我們還可以選擇 Editor 菜單中的 "Copy transcript for shown results"轩性,以此將所有的 log 信息拷貝到粘貼板中声登。

注意觀察輸出的 log 信息,首先會發(fā)現(xiàn) log 信息被分為不同的幾大塊,它們與我們工程中的targets相互對應(yīng)著:

Build target FMDB of project Pods with configuration Debug
...
Build target Masonry of project Pods with configuration Debug
...
Build target ReactiveCocoa of project Pods with configuration Debug
...
...
Build target Pods-Text of project Pods with configuration Debug
...
Build target Text of project Text with configuration Debug

針對工程中的每個 target悯嗓,Xcode 都會執(zhí)行一系列的操作件舵,將相關(guān)的源碼,根據(jù)所選定的平臺脯厨,轉(zhuǎn)換為機(jī)器可讀的二進(jìn)制文件铅祸。

接下來分析每個target中的log信息, 每一個任務(wù)都有一個名字

ProcessPCH ...
CompileC ...
Libtool ...
CpHeader ...

顧名思義:ProcessPCH 預(yù)處理頭文件,CompileC 用來編譯 .m 和 .c 文件,Libtool 用來從目標(biāo)文件中構(gòu)建 library合武,CpHeader拷貝頭文件.

將每個任務(wù)在展開詳細(xì)分析,可以了解任務(wù)更多的信息,在這里就不詳細(xì)介紹了.


Xcode 是如何知道哪些任務(wù)需要被執(zhí)行临梗?不要急,接著往下看.

Build過程的控制

image.png

我們選中一個project會在 project editor 頂部顯示出 6 個 tabs:General, Capabilities, Info, Build Settings, Build Phases 以及 Build Rules。
后面的三個選項與build過程緊密相連.

Build Phases

Build Phases 代表著將代碼轉(zhuǎn)變?yōu)榭蓤?zhí)行文件的最高級別規(guī)則稼跳。里面描述了 build 過程中必須執(zhí)行的不同類型規(guī)則:

  • Compile sources. 關(guān)聯(lián)可編譯的源文件.這個階段每個target只能執(zhí)行一次.
  • Headers. 為target關(guān)聯(lián)公共和私有的頭文件.如果構(gòu)建目標(biāo)是framework頭文件會被復(fù)制到product中,否則會不復(fù)制到product中.這個階段每個target只能執(zhí)行一次.
  • Link binary with libraries. 這里面列出了所有的靜態(tài)庫和動態(tài)庫.
  • Copy bundle resources. 關(guān)聯(lián)資源,拷貝到product文件夾下.這個階段每個target只能執(zhí)行一次且這個target支持嵌入資源.
  • Copy files. 拷貝文件到product指定的路徑下.這個階段可被執(zhí)行多次
  • Run script. 執(zhí)行一個指定的腳本文件在構(gòu)建過程中.這個階段可被執(zhí)行多次
  • Target dependencies. target 依賴項的構(gòu)建盟庞。這里會告訴 build 系統(tǒng),build 當(dāng)前的 target 之前汤善,必須先對這里的依賴性進(jìn)行 build

Build Rules

Build rules 指定了不同的文件類型該如何編譯什猖。一般來說,開發(fā)者并不需要修改這里面的內(nèi)容红淡。如果你需要對特定類型的文件添加處理方法不狮,那么可以在此處添加一條新的規(guī)則。

Build Settings

至此锉屈,我們已經(jīng)了解到在 build phases 中是如何定義 build 處理的過程荤傲,以及 build rules 是如何指定哪些文件類型在編譯階段需要被預(yù)處理。在 build settings 中颈渊,我們可以配置每個任務(wù)(之前在 build log 輸出中看到的任務(wù))的詳細(xì)內(nèi)容。

你會發(fā)現(xiàn) build 過程的每一個階段终佛,都有許多選項:從編譯俊嗽、鏈接一直到 code signing 和 packaging。注意铃彰,settings 是如何被分割為不同的部分 -- 其實這大部分會與 build phases 有關(guān)聯(lián)绍豁,有時候也會指定編譯的文件類型。

這些選項基本都有很好的文檔介紹牙捉,你可以在右邊面板中的 quick help inspector 或者 Build Setting Reference 中查看到竹揍。


Reference:

Build 過程
Build Setting Reference

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市邪铲,隨后出現(xiàn)的幾起案子芬位,更是在濱河造成了極大的恐慌,老刑警劉巖带到,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昧碉,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)被饿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門四康,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人狭握,你說我怎么就攤上這事“タ眩” “怎么了嗅辣?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長愿题。 經(jīng)常有香客問我蛙奖,道長,這世上最難降的妖魔是什么雁仲? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任攒砖,我火速辦了婚禮,結(jié)果婚禮上吹艇,老公的妹妹穿的比我還像新娘。我一直安慰自己抛猖,他們只是感情好鼻听,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撑教,像睡著了一般灰羽。 火紅的嫁衣襯著肌膚如雪鱼辙。 梳的紋絲不亂的頭發(fā)上玫镐,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機(jī)與錄音恐似,去河邊找鬼。 笑死葛闷,一個胖子當(dāng)著我的面吹牛双藕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忧陪,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嘶摊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了叶堆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤沥匈,失蹤者是張志新(化名)和其女友劉穎忘渔,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡锈玉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年义起,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椅棺。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖床估,靈堂內(nèi)的尸體忽然破棺而出诱渤,到底是詐尸還是另有隱情,我是刑警寧澤勺美,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布赡茸,位于F島的核電站,受9級特大地震影響占卧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舷蒲,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一友多、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧域滥,春花似錦、人聲如沸昂儒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拾酝。三九已至卡者,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間崇决,已是汗流浹背底挫。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工建邓, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留湿痢,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓拒逮,卻偏偏與公主長得像臀规,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子塔嬉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容