對本書的贊譽
譯者序
前 言
緻 謝
作者介紹
第一部分 基礎知識
第1章 構造係統概述2
1.1 什麼是構造係統2
1.1.1 編譯型語言3
1.1.2 解釋型語言3
1.1.3 Web應用4
1.1.4 單元測試5
1.1.5 靜態分析5
1.1.6 文檔生成6
1.2 構造係統的各個組成部分6
1.2.1 版本控製工具7
1.2.2 源樹與目標樹7
1.2.3 編譯工具和構造工具8
1.2.4 構造機器9
1.2.5 發布打包與目標機器9
1.3 構造過程和構造描述11
1.4 如何使用構造係統12
構造管理工具12
1.5 構造係統的質量13
本章小結14
第2章 基於Make的構造係統15
2.1 Calculator示例15
2.2 創建一個簡單的makefile17
2.3 對這個makefile進行簡化19
2.4 額外的構造任務20
2.5 框架的運用21
本章小結23
第3章 程序的運行時視圖24
3.1 可執行程序24
3.1.1 原生機器碼25
3.1.2 單體係統鏡像25
3.1.3 程序完全解釋執行26
3.1.4 解釋型字節碼26
3.2 程序庫28
3.2.1 靜態鏈接28
3.2.2 動態鏈接29
3.3 配置文件和數據文件30
3.4 分布式程序30
本章小結31
第4章 文件類型與編譯工具33
4.1 C/C++34
4.1.1 編譯工具34
4.1.2 源文件35
4.1.3 匯編語言文件37
4.1.4 目標文件38
4.1.5 可執行程序40
4.1.6 靜態程序庫40
4.1.7 動態程序庫41
4.1.8 C++編譯42
4.2 Java43
4.2.1 編譯工具43
4.2.2 源文件44
4.2.3 目標文件45
4.2.4 可執行程序47
4.2.5 程序庫48
4.3 C#48
4.3.1 編譯工具49
4.3.2 源文件49
4.3.3 可執行程序51
4.3.4 程序庫53
4.4 其他文件類型55
4.4.1 基於UML的代碼生成56
4.4.2 圖形圖像57
4.4.3 XML配置文件58
4.4.4 國際化與資源綁定58
本章小結59
第5章 子標的與構造變量60
5.1 針對子標的進行構造61
5.2 針對軟件的不同版本進行構造62
5.2.1 指定構造變量63
5.2.2 對代碼的定製調整65
5.3 針對不同的目標係統架構進行構造68
5.3.1 多重編譯器68
5.3.2 麵嚮指定平颱的文件/功能69
5.3.3 多個目標樹69
本章小結71
第二部分 構造工具
現實場景75
場景1:源代碼放在單個目錄中75
場景2:源代碼放在多個目錄中76
場景3:定義新的編譯工具76
場景4:針對多個變量進行構造77
場景5:清除構造樹77
場景6:對不正確的構造結果進行調試78
第6章 Make79
6.1 GNU Make編程語言80
6.1.1 makefile規則:用來建立依賴關係圖80
6.1.2 makefile規則的類型81
6.1.3 makefile變量82
6.1.4 內置變量和規則84
6.1.5 數據結構與函數85
6.1.6 理解程序流程87
6.1.7 進一步閱讀資料90
6.2 現實世界的構造係統場景90
6.2.1 場景1:源代碼放在單個目錄中90
6.2.2 場景2(a):源代碼放在多個目錄中92
6.2.3 場景2(b):對多個目錄進行迭代式Make操作93
6.2.4 場景2(c):對多個目錄進行包含式Make操作96
6.2.5 場景3:定義新的編譯工具101
6.2.6 場景4:針對多個變量進行構造102
6.2.7 場景5:清除構造樹104
6.2.8 場景6:對不正確的構造結果進行調試105
6.3 贊揚與批評107
6.3.1 贊揚107
6.3.2 批評108
6.3.3 評價109
6.4 其他類似工具110
6.4.1 Berkeley Make110
6.4.2 NMake111
6.4.3 ElectricAccelerator和Spark Build111
本章小結113
第7章 Ant115
7.1 Ant編程語言116
7.1.1 比“Hello World”稍多一些116
7.1.2 標的的定義和使用118
7.1.3 Ant的控製流119
7.1.4 屬性的定義120
7.1.5 內置的和可選的任務122
7.1.6 選擇多個文件和目錄125
7.1.7 條件126
7.1.8 擴展Ant語言127
7.1.9 進一步閱讀資料128
7.2 現實世界的構造係統場景129
7.2.1 場景1:源代碼放在單個目錄中129
7.2.2 場景2(a):源代碼放在多個目錄中130
7.2.3 場景2(b):多個目錄,多個build.xml文件130
7.2.4 場景3:定義新的編譯工具133
7.2.5 場景4:針對多個變量進行構造136
7.2.6 場景5:清除構造樹140
7.2.7 場景6:對不正確的構造結果進行調試141
7.3 贊揚與批評142
7.3.1 贊揚143
7.3.2 批評143
7.3.3 評價144
7.4 其他類似工具144
7.4.1 NAnt144
7.4.2 MS Build145
本章小結146
第8章 SCons147
8.1 SCons編程語言148
8.1.1 Python編程語言148
8.1.2 簡單編譯151
8.1.3 管理構造環境154
8.1.4 程序流程和依賴關係分析157
8.1.5 決定何時重新編譯158
8.1.6 擴展該語言160
8.1.7 其他有趣的特性162
8.1.8 進一步閱讀資料163
8.2 現實世界的構造係統場景163
8.2.1 場景1:源代碼放在單個目錄中163
8.2.2 場景2(a):源代碼放在多個目錄中163
8.2.3 場景2(b):多個SConstruct文件164
8.2.4 場景3:定義新的編譯工具165
8.2.5 場景4:針對多個變量進行構造167
8.2.6 場景5:清除構造樹168
8.2.7 場景6:對不正確的構造結果進行調試169
8.3 贊揚與批評171
8.3.1 贊揚171
8.3.2 批評172
8.3.3 評價173
8.4 其他類似工具173
8.4.1 Cons173
8.4.2 Rake174
本章小結176
第9章 CMake177
9.1 CMake編程語言178
9.1.1 CMake語言基礎178
9.1.2 構造可執行程序和程序庫179
9.1.3 控製流182
9.1.4 跨平颱支持184
9.1.5 生成原生構造係統185
9.1.6 其他有趣的特性以及進一步閱讀資料190
9.2 現實世界的構造係統場景191
9.2.1 場景1:源代碼放在單個目錄中191
9.2.2 場景2:源代碼放在多個目錄中191
9.2.3 場景3:定義新的編譯工具192
9.2.4 場景4:針對多個變量進行構造193
9.2.5 場景5:清除構造樹194
9.2.6 場景6:對不正確的構造結果進行調試194
9.3 贊揚與批評195
9.3.1 贊揚195
9.3.2 批評195
9.3.3 評價196
9.4 其他類似工具196
9.4.1 Automake196
9.4.2 Qmake197
本章小結197
第10章 Eclipse199
10.1 Eclipse的概念和GUI199
10.1.1 創建項目200
10.1.2 構造項目206
10.1.3 運行項目210
10.1.4 使用內部項目模型212
10.1.5 其他構造特性213
10.1.6 進一步閱讀資料214
10.2 現實世界的構造係統場景215
10.2.1 場景1:源代碼放在單個目錄中215
10.2.2 場景2:源代碼放在多個目錄中216
10.2.3 場景3:定義新的編譯工具217
10.2.4 場景4:針對多個變量進行構造217
10.2.5 場景5:清除構造樹220
10.2.6 場景6:對不正確的構造結果進行調試220
10.3 贊揚與批評221
10.3.1 贊揚221
10.3.2 批評221
10.3.3 評價222
10.4 其他類似工具222
本章小結224
第三部分 高級主題
第11章 依賴關係226
11.1 依賴關係圖227
11.1.1 增量式編譯228
11.1.2 完全、增量式和子標的構造228
11.2 依賴關係錯誤導緻的問題229
11.2.1 問題:依賴關係缺失導緻運行時錯誤229
11.2.2 問題:依賴關係缺失導緻編譯錯誤230
11.2.3 問題:多餘的依賴關係導緻大量不必要的重新構造231
11.2.4 問題:多餘的依賴關係導緻依賴關係分析失敗231
11.2.5 問題:循環依賴關係232
11.2.6 問題:以隱式隊列順序替代依賴關係232
11.2.7 問題:Clean標的什麼也清除不瞭233
11.3 步驟一:計算依賴關係圖233
11.3.1 獲取確切的依賴關係234
11.3.2 把依賴關係圖緩存起來236
11.3.3 對緩存的依賴關係圖進行更新237
11.4 步驟二:判斷哪些文件已過期239
11.4.1 基於時間戳的方法240
11.4.2 基於校驗和的方法241
11.4.3 標誌參數比較242
11.4.4 其他高級方法243
11.5 步驟三:為編譯步驟排定隊列順序243
本章小結246
第12章 運用元數據進行構造247
12.1 調試支持247
12.2 性能分析支持249
12.3 代碼覆蓋分析支持250
12.4 源代碼文檔化251
12.5 單元測試253
12.6 靜態分析256
12.7 嚮構造係統加入元數據257
本章小結258
第13章 軟件打包與安裝259
13.1 歸檔文件260
13.1.1 用於打包的腳本260
13.1.2 其他歸檔文件格式262
13.1.3 對打包腳本的改進263
13.2 包管理工具265
13.2.1 RPM包管理工具格式265
13.2.2 rpm build過程266
13.2.3 RPM規格文件示例267
13.2.4 根據規格文件創建RPM文件272
13.2.5 安裝RPM示例274
13.3 定製式GUI安裝工具275
13.3.1 Nullsoft Scriptable Install System(NSIS)276
13.3.2 安裝工具腳本277
13.3.3 定義安裝頁麵280
13.3.4 許可授權頁麵281
13.3.5 選擇安裝目錄282
13.3.6 主要組件282
13.3.7 可選組件283
13.3.8 定製頁麵285
13.3.9 安裝頁麵和卸載程序286
本章小結288
第14章 版本管理289
14.1 對哪些東西進行版本控製290
14.1.1 構造描述文件290
14.1.2 對工具的引用292
14.1.3 大型二進製文件296
14.1.4 對源樹的配置296
14.2 哪些東西不應當放到源樹中297
14.2.1 生成的文件被保存到源樹中297
14.2.2 生成的文件被納入到版本控製中299
14.2.3 構造管理腳本299
14.3 版本編號300
14.3.1 版本編號體係300
14.3.2 協調並更新版本號301
14.3.3 版本號的保存與檢索302
本章小結303
第15章 構造機器305
15.1 原生編譯與跨平颱編譯306
15.1.1 原生編譯306
15.1.2 跨平颱編譯306
15.1.3 異構環境307
15.2 集中式開發環境307
15.2.1 構造機器為何有差異308
15.2.2 管理多個構造機器310
15.3 開源開發環境312
15.4 GNU Autoconf315
15.4.1 高層次工作流315
15.4.2 Autoconf示例317
15.4.3 運行autoheader和autoconf319
15.4.4 在構造機器上運行configure腳本320
15.4.5 使用配置信息322
本章小結323
第16章 工具管理324
16.1 工具管理的規則324
16.1.1 規則1:做筆記324
16.1.2 規則2:對源代碼進行版本控製325
16.1.3 規則3:定期升級工具326
16.1.4 規則4:對工具的二進製文件進行版本控製327
16.1.5 對規則的破壞329
16.2 編寫自己的編譯工具329
用Lex和Yacc編寫定製工具330
本章小結332
第四部分 提升規模
第17章 降低最終用戶麵對的復雜性334
17.1 構造框架334
17.1.1 麵嚮開發人員的構造描述335
17.1.2 麵嚮框架的構造描述336
17.1.3 慣例優先於配置336
17.1.4 構造工具示例:Maven337
17.2 避免支持多個構造變量的原因338
17.2.1 需要測試更多的構造變量338
17.2.2 代碼會變得混亂339
17.2.3 構造時間會增多340
17.2.4 需要更多磁盤空間340
17.3 降低復雜性的各種技術方法340
17.3.1 使用現代構造工具340
17.3.2 自動檢測依賴關係341
17.3.3 把生成的文件放在源樹之外341
17.3.4 確保正確清除構造樹341
17.3.5 碰到第一個錯誤即中止構造342
17.3.6 提供有意義的錯誤信息343
17.3.7 校驗輸入參數343
17.3.8 不要把構造腳本搞得過分復雜344
17.3.9 避免使用晦澀的語言特性344
17.3.10 不要用環境變量控製構造過程345
17.3.11 確保構造形成的發布版與調試版保持相似345
17.3.12 準確顯示正在執行的命令346
17.3.13 把對工具的引用納入版本控製347
17.3.14 把構造指令納入版本控製347
17.3.15 自動檢測編譯標誌參數的變化347
17.3.16 不要在構造係統中調用版本控製工具347
17.3.17 盡量頻繁地進行持續集成348
17.3.18 統一使用一種構造機器348
17.3.19 統一使用一種編譯器348
17.3.20 避免遺留#ifdefs的垃圾代碼348
17.3.21 使用有意義的符號名349
17.3.22 刪除垃圾代碼349
17.3.23 不要復製源文件350
17.3.24 使用統一的構造係統350
17.4 對構造係統進行規劃充分、人力充足的改進351
本章小結352
第18章 管理構造規模353
18.1 單體模型構造存在的問題354
18.2 組件式軟件355
18.2.1 使用組件的好處357
18.2.2 組件到底是什麼358
18.2.3 把多個組件集成到單個産品中361
18.3 人員和過程管理364
18.3.1 開發團隊的結構365
18.3.2 組件版本隊列管理367
18.3.3 管理組件緩存368
18.3.4 協調軟件新特性的開發370
18.4 Apache Ivy372
本章小結373
第19章 更快的構造375
19.1 度量構造係統性能375
19.1.1 啓動階段的性能度量375
19.1.2 編譯階段的性能度量382
19.1.3 性能度量工具386
19.1.4 修正問題:改進性能388
19.2 構造減免:消除不必要的重新構造389
19.2.1 目標文件緩存389
19.2.2 智能依賴關係391
19.2.3 構造減免的其他技術方法395
19.3 並行396
19.3.1 構造集群/雲396
19.3.2 並行構造工具397
19.3.3 對可伸縮性的限製398
19.4 減少磁盤使用398
本章小結400
參考文獻401
· · · · · · (
收起)