WebRTC現在使用 gn 來生成構建腳本,使用 ninja 來構建。
gn 比 GYP 快多了,太多,你還沒眨個眼,就結束了。
我們來大概介紹下編譯 WebRTC 會用到的 gn 和 ninja 相關的知識。 想看編譯指南的,看這裏:Ubuntu 14.04下編譯WebRTC。
gn
gn 的介紹在這裏:https://www.chromium.org/developers/gn-build-configuration。這個頁面還有到 gn 各種 reference 的鏈接。
使用 gn 生成 ninja 構建文件的常用命令:
// 生成 debug 版本的構建文件,默認配置 gn gen out/Debug // 生成 release 版本的構建文件 gn gen out/Release --args="is_debug=false"
注意,通過 --args 可以傳遞參數給 gn ,具體參數的含義,由 WebRTC 的構建系統來解釋。比如 is_debug 選項,決定構建 debug 還是 release 版本。
如果有多個參數,可以這樣傳遞:
gn gen out/Release --args="is_debug=false proprietary_codecs=true"
通過--args指定多個參數時,參數之間用空格分隔。生成的參數,存放在 out/Release 下的 args.gn 文件中。你可以直接打開該文件查看。
通過--args 指定的參數,會覆蓋 WebRTC 構建系統中同名參數。
gn 支持爲 WebRTC 生成針對某個 IDE 的工程文件,通過 --ide 來指定。具體支持哪些 IDE ,可以使用下列命令查看:
gn gen --help
寫作本文時,支持:
- eclipse, Eclipse CDT settings file
- vs, Visual Studio project/solution files.(default to VS 2015)
- vs2013
- vs2015
- xcode
- qtcreator, QtCreator project files.
- json
比如下列命令,生成支持 QtCreator 的項目文件:
gn gen out/Release --args="is_debug=false" --ide="qtcreator"
我喜歡 Qt ,所以以它爲例了。再多說一句,生成的 QtCreator 項目文件在 out/Release/qtcreator_project 下面,只要打開 QtCreator ,加載 all.creator 文件即可。
如果你已經使用 gn gen 生成過構建文件,想看看這個版本的構建文件都指定了什麼參數,可以使用下面命令:
gn args out/Release --list
它會列出所有的 build arguments 和對應的文檔,以及當前值。
如果你想查看某個參數,可以使用下面的命令:
gn args out/Release --list="is_debug"
好啦, gn 就介紹到這裏,如果想了解更多,可以看下面的鏈接:
- https://www.chromium.org/developers/gn-build-configuration
- https://chromium.googlesource.com/chromium/src/+/master/tools/gn/docs
- https://chromium.googlesource.com/chromium/src/+/master/tools/gn/docs/quick_start.md
- https://chromium.googlesource.com/chromium/src/+/master/tools/gn/docs/reference.md
或者,執行下面的某個命令:
// 顯示 gn 支持的所有命令行選項,比如 --args,-v gn help switches // 你可是對上面命令列出的每個 switch 使用 help 指令, // 比如 gn help --args, // 可以顯示 --args 這個 switch 的詳細幫助信息 gn help --args // 顯示 gn gen 的幫助信息,比如 IDE 選項 gn gen --help
ninja
記得我在編譯 Skia 時介紹過 ninja ,那篇文章在這裏:http://blog.csdn.net/foruok/article/details/50699101。
ninja 的官網在這裏:https://ninja-build.org/。
後綴爲 ninja(*.ninja) 的文件是 ninja 的 構建文件。對 WebRTC 來講,執行完 gn gen 之後,會在 out/Release 下生成 build.ninja 文件,可以把這個文件看做是整個 WebRTC 的“ Makefile ”。它裏面調用了各個模塊的 ninja 文件。
要完整編譯 WebRTC ,只要在 src 目錄執行下列命令:
ninja -C out/Release
-C 選項告訴 ninja ,進入 out/Release 目錄來編譯。所以,它等同於:
cd out/Release ninja
要編譯某個模塊,可以在 ninja 命令後跟模塊名字(build.ninja文件中定義的構建目標,就像 Makefile 中的構建目標一樣)。比如:
// 構建 webrtc/pc ninja pc // 構建 webrtc/media ninja media
使用下列命令可以查看幫助:
ninja --help
ninja 支持子工具,比如 clean ,用來清理一次構建。用法如下:
ninja -t clean
如果要清理某個模塊,可以這樣:
ninja -t clean pc
更多子工具,可以這樣看到:
ninja -t list
就先這樣吧,下次寫寫 gn 的項目文件,再下次寫寫 ninja 文件。