轉(zhuǎn)載自:http://lianliuwei.github.io/tools/2012/09/10/gyp-misc/
GYP簡(jiǎn)介
Again,這又是一個(gè)Google創(chuàng)造的編程工具,現(xiàn)在已經(jīng)用在了Chomium和其相關(guān)的工程中,使用是越來(lái)越廣泛。GYP是Generate Your Projects的縮寫,你可能會(huì)問,“又一個(gè)?,為什么?”,是的,這個(gè)世界上已經(jīng)有很多的工程生成工具,Automake, make, CMake, Visual Studio, Scons。GYP對(duì)比這些工具有這些優(yōu)點(diǎn):
-
各平臺(tái)下使用主流的構(gòu)建系統(tǒng)
看似沒什么,但這是一個(gè)相當(dāng)重要的特性,程序員都是懶惰的,提供的工具鏈最好是相應(yīng)平臺(tái)主流的開發(fā)工具,比如Windows下必然要用Visual Studio,不要搞什么Cgywin,msys之類的編譯鏈,也不要如Scons那樣,編譯還要用命令行,而且這樣有一個(gè)好處,就是速度問題不用自己考慮了,由相關(guān)的構(gòu)建系統(tǒng)負(fù)責(zé)。
-
不用在特定平臺(tái)上生成構(gòu)建系統(tǒng)文件
GYP生成相關(guān)的文件是不需要在特定的平臺(tái)下,因?yàn)樗募袷剑姹镜刃畔⒍甲约好枋龊昧耍華utomake生成Visual C++工程還要用調(diào)用Visual Studio好多了(沒有核實(shí)過)
-
生成的文件跟手工創(chuàng)建的文件沒有區(qū)別
這意味著你可以用到一半不用GYP了,直接用生成的工程文件繼續(xù)項(xiàng)目,或者提交工程文件到版本庫(kù)中,項(xiàng)目其他成員就不用學(xué)習(xí)GYP,Automake生成的工程就屬于機(jī)器代碼,各種間接調(diào)用,各種神秘的宏。
-
生成工程后就無(wú)需GYP
可以看出GYP就是以Automake為競(jìng)爭(zhēng)對(duì)手,解決的也是Automake中設(shè)計(jì)失誤,使得這個(gè)工具專注生成工程。
chromium工程09年以前用的Scons構(gòu)建工具,后來(lái)改成GYP的方法,當(dāng)初開發(fā)者抱怨最多的就是不熟悉構(gòu)建系統(tǒng),使用不方便,速度慢,可以看出使用native的工具鏈?zhǔn)嵌嗝粗匾?/p>
git倉(cāng)庫(kù)
官網(wǎng)給出的是SVN倉(cāng)庫(kù),不過就如同chromium的其他工程,都有一個(gè)對(duì)應(yīng)的git工程,git倉(cāng)庫(kù)比SVN倉(cāng)庫(kù)好就不說(shuō)了,直接上地址http://git.chromium.org/external/gyp.git,博主上傳了一份到github上https://github.com/lianliuwei/gyp (不保證是同步的)
GYP結(jié)構(gòu)
GYP的輸入是.gyp和.gypi文件,.gypi文件是用于.gyp文件include使用的。.gyp文件就是符合特定格式的json文件。
gyp文件中包含target,Visual C++下,gyp生成sln,target生成vcproj或vxcproj。
chromium中GYP結(jié)構(gòu)是,通過命令行統(tǒng)一使用build/common.gypi的公共文件,工程的配置,選項(xiàng)的處理,編譯選項(xiàng)的使用,都是在這個(gè)文件中配置,所有造成了這個(gè)文件超級(jí)大,129KB。生成一個(gè)總工程all.gyp
,這個(gè)工程依賴于其他所有的工程,這個(gè)工程生成,所有工程都生成完成。而且有一個(gè)總工程也方便開發(fā)。
如果要使用GYP,建議依照chromium的結(jié)構(gòu),common.gypi也用chromium的進(jìn)行裁剪,畢竟各種選項(xiàng)的選擇也是需要經(jīng)驗(yàn)的。
使用GYP
chromium工程中的方法是使用build/gyp_chromium這個(gè)Python腳本來(lái)調(diào)用,這個(gè)腳本實(shí)現(xiàn)添加公共配置,偵測(cè)附加配置,添加需要的編譯選項(xiàng)。
一般使用沒必要使用這么復(fù)雜的腳本,直接使用一個(gè)bat文件就都搞定。
chromium_base工程示例
build_proj.bat
call setup_env.bat
tools\gyp\gyp.bat --depth . -D component=shared_library --no-circular-check -G msvs_version=2008 -Ibuild/common.gypi build_add/all.gyp
setup_env.bat
:: This script adds python to the path
@echo OFF
set PATH=C:\Python\Python27;%PATH%
setup_env.bat的作用就是設(shè)置Python路徑,單獨(dú)分離出來(lái)不但是為了更方便的修改,而且是以后工程中VS調(diào)用Python命令行用(這個(gè)之后再解釋)
關(guān)機(jī)的是build_proj.bat。使用了GYP調(diào)用的總?cè)肟冢?code style="border-bottom: #e1e1e8 1px solid; border-left: #e1e1e8 1px solid; padding-bottom: 3px; background-color: #f7f7f9; padding-left: 4px; padding-right: 4px; font-family: Menlo, Monaco, 'Courier New', monospace; color: #dd1144; font-size: 12px; border-top: #e1e1e8 1px solid; border-right: #e1e1e8 1px solid; padding-top: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px">gyp/gyp.bat。--depth
是為了定義工程的根目錄在哪里,需要給出。-D
設(shè)置GYP中的參數(shù), --no-circular-check
是chromium代碼中的問題,一般GYP文件是不允許環(huán)形依賴的,但是由于歷史原因chromium中的依賴關(guān)系還沒有解決,如果你使用chromium中的GYP,建議加上這個(gè)選項(xiàng),不然就得自己解決環(huán)形依賴。-Ibuild/common.gypi
用來(lái)加載所有工程的公用文件。build_add/all.gyp
是總的工程文件。
定制生成工程
現(xiàn)在默認(rèn)GYP在Windows下生成Visual Studio 2010工程,但是使用2008的同學(xué)還是很多的,改變生成工程很簡(jiǎn)單。
-
使用環(huán)境變量,GYP_MSVS_VERSION=2008
-
使用命令行參數(shù), -G msvs_version=2008
相關(guān)的版本可以填2005, 2008, 2010, 2005e, 2008e等,(支持的版本還是很多的,連express版本都有!)
定制相關(guān)參數(shù)
構(gòu)建系統(tǒng)的一大任務(wù)就是根據(jù)不同需要確定編譯參數(shù),需要編譯的子工程,設(shè)置相關(guān)的宏參數(shù)使得C或者C++代碼正確編譯。GYP在選項(xiàng)相關(guān)的管理是自己做的,也就是說(shuō)如果要改變相關(guān)的選項(xiàng),就要更新生成的工程。不過看源代碼可以知道,GYP選項(xiàng)這部分相當(dāng)?shù)娜酰褂孟喈?dāng)古怪的語(yǔ)法。這個(gè)之后慢慢說(shuō)明,同樣的,定制參數(shù)也有兩種方法
-
環(huán)境變量法, 如GYP_DEFINES=windows_sdk_path="path to sdk"
,不過在cmd下環(huán)境變量的方法只能定義一個(gè),而且不能包含空格,不推薦使用這個(gè)方法
-
命令行參數(shù),-D XXX -D YYY=ZZZ
GYP代碼分析
博主尚未研究透,后續(xù)再說(shuō)