浜嬫儏鐨勮搗鍥犳槸錛屾兂鎵句釜璺?Windows 鍜?Mac 鐨勬瀯寤烘柟妗堛傜涓鑰冭檻鑷劧鏄?CMake錛屾瘯绔熷熀鏈笂鏄簨瀹炴爣鍑嗕簡銆?/p>
浣嗘槸鐮旂┒浜嗕竴涓?Modern CMake錛屼篃灝辨槸浠?target 涓烘牳蹇冪殑鐞嗗康銆備絾鍙戠幇鐪嬩簡濂藉嚑澶╂枃妗o紝涔熸姌鑵懼嚭浜嗗彲鐢ㄧ殑涓滆タ錛屼絾浠嶇劧鏄病姊崇悊娓呮浠涔堢悊蹇點佸師鐞嗐傜劧鍚?CMake 鏈韓璇硶灝卞緢澶嶆潅錛屽啀鍔犱笂鎼?target 涓濂楁蹇碉紝瑕佺粰 target 璁劇疆鍚勭灞炴т箣綾葷殑錛屾湁鐐瑰己琛?OOP 鐨勬劅瑙夆︹︿絾鍏跺疄鎴戜滑鍙槸闇瑕佷竴涓?include_dir 鍜?lib_dir 鑰屽凡錛屽叾浠栭兘鏄誕浜憕
浣嗗鏋滈鍥炲埌浼犵粺妯″紡錛屼笉鐢?Modern 姒傚康鍛紝濂藉儚鍙互灝嗗氨錛屼絾絎竴涓嶅幓鐢ㄤ竴涓伐鍏風殑鏈鏂版ā寮忥紝濂藉儚鏈夌偣涓嶄笂榪涚殑鎰熻錛坧ython 2 闄ゅ錛夛紱絎簩錛孋Make 鐨勪袱澶х棝鐐光斺旇娉曠壒绔嬬嫭琛屻佹枃妗f櫐娑╅毦鎳傗斺旇繕鏄浜烘湁鐐逛笉鐖姐?/p>
閭h煩鍑烘潵鐪嬪埆鐨勯夋嫨鍛紵鐩墠鐩稿鎴愮啛鐨勪篃鍙湁 Google 鐨?gn+ninja 鏂規浜嗐俫n 榪欏涓滆タ鍦?Chromium 閲屾槸瀹屽叏閰嶇疆濂界殑錛岀敤璧鋒潵榪樼畻欏烘墜錛屼絾瑕佹槸鐙珛鎷垮嚭鏉ュ憿錛屽氨娌¢偅涔堜究瀹滀簡銆傚叧閿槸瀹冪殑 toolchain 鏄鑷繁瀹氫箟鐨勩?/p>
涔嬪墠榪樺湪鍏徃鎼炲鎴風鐨勬椂鍊欙紝澶у灝變粠 Chromium 閲岄潰鎶?build銆乥uild_overrides 絳夌瓑涓滆タ鍏ㄩ儴鎷峰嚭鏉ワ紝濂藉浼欙紝鍑犵櫨 MB 鐢氳嚦涓?G銆備絾鏄叕鍙擱噷鍢涳紝娌′漢綆″共涓嶅共鍑錛屾庝箞蹇庝箞鏉ャ傚悗鏉ュ張鐪嬪埌 Google 鑷鐨?Crashpad 閲岄潰涔熺敤浜嗚繖濂楁瀯寤猴紝浣嗗伐鍏烽摼琚畝鍖栦簡涓涓嬶紝鍙?mini_chromium銆傝繖涓瘮 Chromium 閲岀殑灝忓浜嗭紝鏄彲浠ユ嬁榪囨潵鐩存帴鐢ㄧ殑錛岀己灝戜竴浜涢厤緗彲浠ヨ嚜宸卞姞銆備絾鏄憿錛屽儚鎴戜滑榪欑媧佺櫀錛屼粛鐒舵槸鍙椾笉楦熺殑銆傛墍浠ュ憿錛屾垜浠騫插共鍑鍑鐨勫緩绔嬩竴濂楀伐鍏烽摼銆?/p>
棣栧厛錛屾垜浠槑紜畾浣嶃俫n 鍜?ninja 閮芥槸寮鍙戞満涓婇渶瑕侀瑁呯殑錛屼笉鏄蔣浠舵彁渚涚殑銆侰hromium 鐨勬悶娉曟槸鑷繁鎻愪緵錛実n 鐨勬枃妗d篃璇磋寮鍙戣呮彁渚涘伐鍏楓備絾榪欏鎬濊礬璺熶紶緇熺殑鐞嗗康鏄啿紿佺殑銆傚悓鏃訛紝鑷繁瀹夎宸ュ叿鎴愭湰鏄瘮杈冧綆鐨勶細
鑷繁涓嬭澆鐨勮緗埌 PATH錛屾祴璇?gn --version
浠ュ強 ninja --version
錛岃兘榪愯鍗沖彲
甯屾湜鍋氬埌鎻愪緵涓涓?git repo錛屼嬌鐢ㄨ?clone 鍒拌嚜宸遍」鐩殑 build 鐩綍錛岀劧鍚庝嬌鐢ㄨ呭彧瑕佸湪 .gn 鏂囦歡閲岄厤緗?/p>
buildconfig = "//build/BUILDCONFIG.gn"
灝卞彲浠ヤ嬌鐢ㄦ垜浠彁渚涚殑宸ュ叿閾撅紝鍦?PC 涓夌榪涜鏋勫緩銆?/p>
浣跨敤鑰呯殑鍞竴璐熸媴灝辨槸緙栧啓鑷繁鐨?BUILD.gn
棣栧厛鎴戜滑鐪?gn 鐨勬枃妗o紝浠ュ強瀹冪殑渚嬬▼ simple_build 閲岀殑宸ュ叿閾鵑厤緗細
https://gn.googlesource.com/gn/+/HEAD/examples/simple_build/build/toolchain/BUILD.gn
榪欎釜鏄彲浠ョ洿鎺ョ敤鐨勶紝鍙笉榪囧彧鏈?linux 绔紙褰撶劧 mac 涔熻兘鐢級銆傛垜浠啀緇撳悎 chrome 閲岀殑宸ュ叿閾鵑厤緗紝榪涜涓浜涘畬鍠勩?/p>
棣栧厛鎴戜滑浜嗚В gn 浣撶郴闇瑕佺殑鏈灝忛厤緗槸浠涔堛?/p>
絎竴錛屽畠闇瑕佸湪鏍圭洰褰曞啓涓涓?.gn 鏂囦歡錛屽湪閲岄潰瀹氫箟 buildconfig錛屾寚鍒板彟涓涓枃浠訛紝涓鑸槸
buildconfig = "//build/BUILDCONFIG.gn"
絎簩銆丅UILDCONFIG.gn 閲岄潰闇瑕佽緗粯璁ゅ伐鍏烽摼錛屼篃灝辨槸鍐欎竴琛?/p>
set_default_toolchain("//build/toolchain:gcc")
絎笁銆佸畾涔夊伐鍏烽摼錛屽涓婁緥鐨?//build/toolchain:gcc銆?/p>
闇瑕佸湪 build/toolchain 涓嬪緩绔?BUILD.gn 鏂囦歡錛屽唴瀹規槸
toolchain("gcc") {
# ...
}
鏈鍚庡湪 toolchain 閲屽畾涔夊悇縐?tool銆?/p>
榪欓儴鍒嗘枃妗e湪榪欓噷錛歨ttps://gn.googlesource.com/gn/+/main/docs/reference.md#func_tool
綆鍗曞榪頒竴涓嬶紝鍙瀹氫箟鐨勫伐鍏鋒湁錛?/p>
錛堝叾浠栫殑灝卞厛涓嶇湅浜嗭級
鎴戜滑鏉ョ湅涓涓?https://gn.googlesource.com/gn/+/HEAD/examples/simple_build/build/toolchain/BUILD.gn 鐨勪竴浜涘叧閿厤緗細
toolchain("gcc") {
tool("cc") {
command = "gcc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
outputs = [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
# ...
}
tool("cxx") {
command = "g++ -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}"
outputs = [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
# ...
}
tool("alink") {
command = "rm -f {{output}} && ar rcs {{output}} {{inputs}}"
outputs = [ "{{target_out_dir}}/{{target_output_name}}{{output_extension}}" ]
# ...
}
tool("solink") {
command = "g++ -shared {{ldflags}} -o $sofile $os_specific_option @$rspfile"
outputs = [ sofile ]
# ...
}
tool("link") {
command = "g++ {{ldflags}} -o $outfile -Wl,--start-group @$rspfile {{solibs}} -Wl,--end-group {{libs}}"
outputs = [ outfile ]
# ...
}
tool("stamp") {
command = "touch {{output}}"
}
tool("copy") {
command = "cp -af {{source}} {{output}}"
}
}
鍙互鐪嬪埌錛宑c 鍜?cxx 鎵ц command 鍚庯紝鐢熸垚 .o 鏂囦歡錛岀劧鍚庤繖浜?.o 鏂囦歡鍙互浣滀負 alink銆乻olink銆乴ink 鐨?inputs錛岃瀹冧滑 command 緇х畫浣跨敤錛屾渶鍚庤緭鍑洪潤鎬佸簱銆佸姩鎬佸簱浠ュ強鍙墽琛屾枃浠躲?/p>
鍏朵綑灞炴у彲浠ユ煡鏂囨。浜嗚В鍚箟銆?/p>
涓昏閰嶇疆鍦ㄨ繖閲岋細https://source.chromium.org/chromium/chromium/src/+/main:build/toolchain/gcc_toolchain.gni
涔熸槸 gcc 鐨勶紝涓?simple_build 閲岀殑澶у悓灝忓紓錛屾病鏈夌壒鍒殑銆?/p>
涓昏閰嶇疆鍦ㄨ繖閲岋細https://source.chromium.org/chromium/chromium/src/+/main:build/toolchain/apple/toolchain.gni
鍖哄埆鏈夛細
鍩烘湰涓婃槸鏍規嵁涓婇潰鍒嗘瀽鐨勮鐐歸厤緗紝鏈緇堢粨鏋滃湪姝わ細https://github.com/Streamlet/gn_toolchain
鏂板鐨勪竴浜涘樊寮傛湁錛?/p>
澧炲姞鍏ㄥ眬鍙傛暟 is_debug錛屽彲浠ュ湪 gn gen out --args="is_debug=true"
浼犲叆銆傞粯璁?is_debug 涓?false錛屽紑鍚墍鏈変紭鍖栥?/p>
mac 涓嬬敓鎴?dSYM 涓嶄嬌鐢?python 鑴氭湰錛岀洿鎺ユ槸 $ld ... && dsymutil ... && strip
mac 涓嬪姞浜嗕竴涓?template錛歛pp_bundle錛岀敤鏉ョ敓鎴?xxx.app錛屼富瑕侀厤緗潵鑷簬 create_bundle 鏂囨。閲岀殑渚嬪瓙
win 涓嬪鍔犱簡涓浜涢厤緗泦
鍔ㄦ?闈欐侀摼鎺?CRT錛?/build/config/win:console_subsystem銆?/build/config/win:static_runtime
鎺у埗鍙扮▼搴忋乄in32 紼嬪簭錛?/build/config/win:console_subsystem銆?/build/config/win:windows_subsystem
榪欎釜鍏跺疄涓鑸儏鍐典笅鐢ㄤ笉鐫錛屽彧瑕佸叆鍙e嚱鏁版槸 main/WinMain錛宭ink 榛樿灝辨槸鎺у埗鍙扮▼搴?Win32 紼嬪簭
XP 鏀寔錛?/build/config/win:console_subsystem_xp銆?/build/config/win:windows_subsystem_xp
鍏蜂綋瀹炵幇鏄摼鎺ュ弬鏁板姞 /SUBSYSTEM:CONSOLE,5.01 鎴?/SUBSYSTEM:WINDOWS,5.01銆傚叧閿槸鍚庨潰鐨勭増鏈彿 5.01錛屼負浜嗗姞鐗堟湰鍙峰垯蹇呴』鎸囧畾瀛愮郴緇熷悕縐幫紝鎵浠ュ垎浜?console_subsystem_xp 鍜?windows_subsystem_xp銆傚張錛寈p 榪欓噷鎻愪緵浜嗕袱涓?subsystem 鐨勯厤緗泦錛岄潪 xp 涔熸彁渚涗袱涓?/p>
浣嗘槸鎴戜滑娌℃湁鍔?_WIN32_WINNT=0x0501銆乄INVER=0x0501銆乢USING_V110_SDK71_錛屼篃娌℃湁鎸囧畾蹇呴』浣跨敤 7.0 鐗堟湰鐨?SDK錛岃繖浜涢兘鏄潪蹇呴』鐨勶紝鍙涓嶇敤鍒?XP 浠ュ悗娣誨姞鐨?API 鍗沖彲銆備嬌鐢ㄨ呭彲浠ュ湪鑷繁鐨?target 閲岄潰瀹氫箟榪欎簺瀹忋?/p>
鎻愪緵涓涓嬌鐢ㄦ渚嬶細https://github.com/Streamlet/gn_toolchain_sample
鍥犱負瀹冧互 git submodule 褰㈠紡寮曠敤浜?https://github.com/Streamlet/gn_toolchain錛屾墍浠?git clone 浠ュ悗錛岄渶瑕?git submodule update --init
涓涓嬨?/p>
鐒跺悗鍦ㄦ牴鐩綍鎵ц錛氾紙紜繚 gn 鍜?ninja 宸茬粡鍦?PATH 涓級
gn gen out
ninja -C out
鍗沖彲銆?/p>
Mac 涓嬩細棰濆鐢熸垚涓涓?objc 欏圭洰 objc_console_application 浠ュ強涓涓?app_bundle錛歯s_application.app銆?/p>
Win 浼氶澶栫敓鎴愪竴涓?Win32 欏圭洰 win32_application銆?/p>
Win 涓嬮渶瑕佸厛鎵ц涓涓?Visual Studio 甯︾殑鍛戒護琛岀幆澧冿紝濡?VS 2022 Community 鐨?鈥渪64 Native Tools Command Prompt for VS 2022鈥濓紝cl 絳夊伐鍏鋒墠浼氬彲鐢ㄣ?/p>
濡傛灉瑕佹祴璇?XP錛?2浣嶏級錛岀敤鈥渪86 Native Tools Command Prompt for VS 2022鈥濊繘鍏ワ紝CD 鍒伴」鐩洰褰曪紝鎵ц錛?/p>
gn gen out --args="target_cpu=\"x86\""
ninja -C out
鎴戜滑鍙敤鍑犲崄 KB 鐨勫ぇ灝忓畬鎴愪簡璺ㄧ鏀寔錛屾槸寰堣交閲忕殑涓涓厤緗傚鏋滄偍瑙夊緱瀹炵敤騫惰鍙繖縐嶆柟寮忥紝嬈㈣繋涓璧鋒潵緇存姢銆佸畬鍠勩?/p>