青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-90  評(píng)論-947  文章-0  trackbacks-0

背景

事情的起因是,想找個(gè)跨 Windows 和 Mac 的構(gòu)建方案。第一考慮自然是 CMake,畢竟基本上是事實(shí)標(biāo)準(zhǔn)了。

但是研究了一下 Modern CMake,也就是以 target 為核心的理念。但發(fā)現(xiàn)看了好幾天文檔,也折騰出了可用的東西,但仍然是沒梳理清楚什么理念、原理。然后 CMake 本身語法就很復(fù)雜,再加上搞 target 一套概念,要給 target 設(shè)置各種屬性之類的,有點(diǎn)強(qiáng)行 OOP 的感覺……但其實(shí)我們只是需要一個(gè) include_dir 和 lib_dir 而已,其他都是浮云~

但如果退回到傳統(tǒng)模式,不用 Modern 概念呢,好像可以將就,但第一不去用一個(gè)工具的最新模式,好像有點(diǎn)不上進(jìn)的感覺(python 2 除外);第二,CMake 的兩大痛點(diǎn)——語法特立獨(dú)行、文檔晦澀難懂——還是讓人有點(diǎn)不爽。

那跳出來看別的選擇呢?目前相對(duì)成熟的也只有 Google 的 gn+ninja 方案了。gn 這套東西在 Chromium 里是完全配置好的,用起來還算順手,但要是獨(dú)立拿出來呢,就沒那么便宜了。關(guān)鍵是它的 toolchain 是要自己定義的。

之前還在公司搞客戶端的時(shí)候,大家就從 Chromium 里面把 build、build_overrides 等等東西全部拷出來,好家伙,幾百 MB 甚至上 G。但是公司里嘛,沒人管干不干凈,怎么快怎么來。后來又看到 Google 自家的 Crashpad 里面也用了這套構(gòu)建,但工具鏈被簡(jiǎn)化了一下,叫 mini_chromium。這個(gè)比 Chromium 里的小多了,是可以拿過來直接用的,缺少一些配置可以自己加。但是呢,像我們這種潔癖,仍然是受不鳥的。所以呢,我們要干干凈凈的建立一套工具鏈。

構(gòu)建系統(tǒng)安裝

首先,我們明確定位。gn 和 ninja 都是開發(fā)機(jī)上需要預(yù)裝的,不是軟件提供的。Chromium 的搞法是自己提供,gn 的文檔也說讓開發(fā)者提供工具。但這套思路跟傳統(tǒng)的理念是沖突的。同時(shí),自己安裝工具成本是比較低的:

  • linux
    • ninja 在主流包管理系統(tǒng)里已經(jīng)有了,包名可能是 ninja 或 ninja-build,直接安裝就可以
    • gn 在部分包管理系統(tǒng)有,嘗試包名 gn 或 gn-build 等,沒有的話可以下載二進(jìn)制版本,或者從源代碼自行編譯
  • mac
    • ninja 在 brew 里包名叫 ninja,在 MacPorts 里包名叫 ninja-build
    • gn 在 brew 里沒有,可以下載二進(jìn)制版本;在 MacPorts 里叫 gn-devel
  • win

自己下載的設(shè)置到 PATH,測(cè)試 gn --version 以及 ninja --version,能運(yùn)行即可

目標(biāo)

希望做到提供一個(gè) git repo,使用者 clone 到自己項(xiàng)目的 build 目錄,然后使用者只要在 .gn 文件里配置

buildconfig = "//build/BUILDCONFIG.gn"

就可以使用我們提供的工具鏈,在 PC 三端進(jìn)行構(gòu)建。

使用者的唯一負(fù)擔(dān)就是編寫自己的 BUILD.gn

工具鏈搭建

首先我們看 gn 的文檔,以及它的例程 simple_build 里的工具鏈配置:

https://gn.googlesource.com/gn/+/HEAD/examples/simple_build/build/toolchain/BUILD.gn

這個(gè)是可以直接用的,只不過只有 linux 端(當(dāng)然 mac 也能用)。我們?cè)俳Y(jié)合 chrome 里的工具鏈配置,進(jìn)行一些完善。

基礎(chǔ)概念

首先我們了解 gn 體系需要的最小配置是什么。

第一,它需要在根目錄寫一個(gè) .gn 文件,在里面定義 buildconfig,指到另一個(gè)文件,一般是

buildconfig = "//build/BUILDCONFIG.gn"

第二、BUILDCONFIG.gn 里面需要設(shè)置默認(rèn)工具鏈,也就是寫一行

set_default_toolchain("//build/toolchain:gcc")

第三、定義工具鏈,如上例的 //build/toolchain:gcc。

需要在 build/toolchain 下建立 BUILD.gn 文件,內(nèi)容是

toolchain("gcc") {
	# ...
}

最后在 toolchain 里定義各種 tool。

工具鏈中的工具

這部分文檔在這里:https://gn.googlesource.com/gn/+/main/docs/reference.md#func_tool

簡(jiǎn)單復(fù)述一下,可被定義的工具有:

  • 編譯工具:
    "cc": C 編譯器
    "cxx": C++ 編譯器
    "cxx_module": 支持 module 的 C++ 編譯器
    "objc": Objective C 編譯器
    "objcxx": Objective C++ 編譯器
    "rc": Windows 資源腳本編譯器
    "asm": 匯編器
    "swift": Swift 編譯器
  • 鏈接工具:
    "alink": 靜態(tài)庫鏈接器
    "solink": 動(dòng)態(tài)庫鏈接器
    "link": 可執(zhí)行文件鏈接器

(其他的就先不看了)

我們來看一下 https://gn.googlesource.com/gn/+/HEAD/examples/simple_build/build/toolchain/BUILD.gn 的一些關(guān)鍵配置:

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}}"
  }
}

可以看到,cc 和 cxx 執(zhí)行 command 后,生成 .o 文件,然后這些 .o 文件可以作為 alink、solink、link 的 inputs,被它們 command 繼續(xù)使用,最后輸出靜態(tài)庫、動(dòng)態(tài)庫以及可執(zhí)行文件。

其余屬性可以查文檔了解含義。

對(duì)比 Chromium 中的配置

Linux

主要配置在這里:https://source.chromium.org/chromium/chromium/src/+/main:build/toolchain/gcc_toolchain.gni

也是 gcc 的,與 simple_build 里的大同小異,沒有特別的。

Mac

主要配置在這里:https://source.chromium.org/chromium/chromium/src/+/main:build/toolchain/apple/toolchain.gni

區(qū)別有:

  • 用 clang 系列編譯工具,而不是 gcc
  • alink 不是用 ar,而使用 libtool
  • solink 的默認(rèn)擴(kuò)展名改成了 dylib
  • 用了一個(gè) linker_driver.py 來支持生成 dSYM,在里面調(diào)用了 dsymutil 和 strip

Win

  • 編譯用 cl,靜態(tài)庫鏈接用 lib,動(dòng)態(tài)庫和可執(zhí)行文件的鏈接用 link
  • lib_switch = "",lib_dir_switch = "/LIBPATH:";前兩者 lib_switch = "-l",lib_dir_switch = "-L"

建立我們的工具鏈

基本上是根據(jù)上面分析的要點(diǎn)配置,最終結(jié)果在此:https://github.com/Streamlet/gn_toolchain

新增的一些差異有:

  • 增加全局參數(shù) is_debug,可以在 gn gen out --args="is_debug=true"傳入。默認(rèn) is_debug 為 false,開啟所有優(yōu)化。

  • mac 下生成 dSYM 不使用 python 腳本,直接是 $ld ... && dsymutil ... && strip

  • mac 下加了一個(gè) template:app_bundle,用來生成 xxx.app,主要配置來自于 create_bundle 文檔里的例子

  • win 下增加了一些配置集

    • 動(dòng)態(tài)/靜態(tài)鏈接 CRT://build/config/win:console_subsystem、//build/config/win:static_runtime

    • 控制臺(tái)程序、Win32 程序://build/config/win:console_subsystem、//build/config/win:windows_subsystem

      這個(gè)其實(shí)一般情況下用不著,只要入口函數(shù)是 main/WinMain,link 默認(rèn)就是控制臺(tái)程序/Win32 程序

    • XP 支持://build/config/win:console_subsystem_xp、//build/config/win:windows_subsystem_xp

      具體實(shí)現(xiàn)是鏈接參數(shù)加 /SUBSYSTEM:CONSOLE,5.01 或 /SUBSYSTEM:WINDOWS,5.01。關(guān)鍵是后面的版本號(hào) 5.01,為了加版本號(hào)則必須指定子系統(tǒng)名稱,所以分了 console_subsystem_xp 和 windows_subsystem_xp。又,xp 這里提供了兩個(gè) subsystem 的配置集,非 xp 也提供兩個(gè)。

      但是我們沒有加 _WIN32_WINNT=0x0501、WINVER=0x0501、_USING_V110_SDK71_,也沒有指定必須使用 7.0 版本的 SDK,這些都是非必須的,只要不用到 XP 以后添加的 API 即可。使用者可以在自己的 target 里面定義這些宏。

使用案例

提供一個(gè)使用案例:https://github.com/Streamlet/gn_toolchain_sample

因?yàn)樗?git submodule 形式引用了 https://github.com/Streamlet/gn_toolchain,所以 git clone 以后,需要 git submodule update --init一下。

然后在根目錄執(zhí)行:(確保 gn 和 ninja 已經(jīng)在 PATH 中)

gn gen out
ninja -C out

即可。

Mac 下會(huì)額外生成一個(gè) objc 項(xiàng)目 objc_console_application 以及一個(gè) app_bundle:ns_application.app。

Win 會(huì)額外生成一個(gè) Win32 項(xiàng)目 win32_application。

Win 下需要先執(zhí)行一下 Visual Studio 帶的命令行環(huán)境,如 VS 2022 Community 的 “x64 Native Tools Command Prompt for VS 2022”,cl 等工具才會(huì)可用。

如果要測(cè)試 XP(32位),用“x86 Native Tools Command Prompt for VS 2022”進(jìn)入,CD 到項(xiàng)目目錄,執(zhí)行:

gn gen out --args="target_cpu=\"x86\""
ninja -C out

總結(jié)

我們只用幾十 KB 的大小完成了跨端支持,是很輕量的一個(gè)配置。如果您覺得實(shí)用并認(rèn)可這種方式,歡迎一起來維護(hù)、完善。

posted on 2022-11-06 02:05 溪流 閱讀(15288) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++WindowsLinuxMac
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一区中文字幕| 久久人人爽人人爽爽久久| 欧美精品一区二| 欧美1区3d| 欧美看片网站| 欧美色中文字幕| 国产精品国产自产拍高清av王其| 欧美精品在线一区二区三区| 欧美日韩福利在线观看| 欧美三级不卡| 国产精品一区视频网站| 国产在线播放一区二区三区| 国产一区二区高清视频| 亚洲国产精品电影| 一区二区久久久久| 欧美在线网站| 亚洲国产日韩精品| 亚洲高清视频在线观看| 99精品热视频只有精品10| 亚洲综合欧美| 欧美1区视频| 国产日韩精品一区二区| 亚洲欧洲精品成人久久奇米网 | 老鸭窝亚洲一区二区三区| 欧美wwwwww| 一区二区三区视频观看| 久久久精品免费视频| 欧美日韩福利在线观看| 狠狠色综合色区| 亚洲无线视频| 女人香蕉久久**毛片精品| 99这里有精品| 麻豆91精品| 国产欧美日韩在线观看| 日韩小视频在线观看| 久久天堂精品| 亚洲永久免费精品| 欧美日韩国产丝袜另类| 在线 亚洲欧美在线综合一区| 国产精品99久久久久久宅男 | 亚洲视频在线一区观看| 久久九九有精品国产23| 最新精品在线| 久久性天堂网| 国内一区二区在线视频观看| 亚洲女爱视频在线| 亚洲老板91色精品久久| 免费久久99精品国产| 国产主播在线一区| 久久国产日韩欧美| 亚洲欧美国产精品va在线观看| 欧美国产日韩视频| 91久久极品少妇xxxxⅹ软件| 另类亚洲自拍| 久久蜜臀精品av| 精品成人在线| 欧美+日本+国产+在线a∨观看| 欧美一区国产一区| 国产一区二区欧美| 久久se精品一区二区| 亚洲午夜精品久久| 国产精品欧美一区喷水| 亚洲淫性视频| 亚洲图色在线| 国产欧美日韩一区二区三区| 先锋亚洲精品| 欧美在线观看日本一区| 狠狠久久五月精品中文字幕| 久久午夜精品| 免费中文日韩| 在线午夜精品| 亚洲网址在线| 国内精品久久久久久久影视麻豆| 久久久另类综合| 免费不卡在线视频| 日韩午夜视频在线观看| 一本色道久久99精品综合 | 性一交一乱一区二区洋洋av| 国产欧美精品一区aⅴ影院| 久久精品一区蜜桃臀影院 | 国产精品视频精品视频| 欧美在线视频免费观看| 久久精品夜夜夜夜久久| 亚洲国产免费| 一区二区三区精品| 国产综合香蕉五月婷在线| 欧美福利网址| 国产精品成人一区二区网站软件 | 亚洲乱码久久| 亚洲一区二区少妇| 一区二区三区在线免费视频 | 亚洲国产一区二区视频| 亚洲电影成人| 欧美日韩在线观看一区二区| 香蕉久久一区二区不卡无毒影院| 欧美中文字幕在线| 99国产精品99久久久久久粉嫩| 一区二区三区|亚洲午夜| 国产日韩欧美一区二区三区在线观看| 久久午夜电影网| 国产精品黄色| 欧美激情国产精品| 国产精品综合视频| 最新日韩中文字幕| 韩国成人福利片在线播放| 91久久精品日日躁夜夜躁欧美| 国产精品视频久久久| 欧美黄色日本| 国语精品一区| 亚洲一区国产一区| 亚洲伦理在线| 久久九九热re6这里有精品| 一本综合精品| 麻豆精品视频在线观看| 久久国产精品一区二区| 欧美日韩国产一中文字不卡 | 久久久免费精品视频| 欧美日韩ab| 亚洲高清不卡在线观看| 国产一区二区毛片| 亚洲男同1069视频| 亚洲一区二区三区成人在线视频精品| 久久夜色精品国产亚洲aⅴ| 久久国产日韩| 国产亚洲激情在线| 亚洲欧美视频在线| 亚洲欧美在线aaa| 欧美日韩综合| 99热这里只有精品8| 99视频精品全部免费在线| 男人的天堂亚洲| 欧美激情一区二区三区不卡| 一区二区在线视频观看| 欧美一区二区三区视频| 欧美伊人影院| 国产婷婷97碰碰久久人人蜜臀| 亚洲午夜精品久久| 欧美在线免费观看亚洲| 国产精品一区二区三区四区| 一区二区三区日韩精品| 亚洲新中文字幕| 国产精品盗摄一区二区三区| av成人免费| 性色av一区二区怡红| 国产日本欧美一区二区三区| 香蕉久久久久久久av网站| 久久精品中文字幕免费mv| 国内在线观看一区二区三区| 久久久久9999亚洲精品| 农夫在线精品视频免费观看| 亚洲国产一区二区精品专区| 蜜桃av综合| 亚洲精一区二区三区| 亚洲一区区二区| 国产日本欧美一区二区三区在线| 蜜桃av一区二区| 欧美jizz19性欧美| 亚洲福利电影| 欧美高清一区二区| 中日韩在线视频| 久久久久久久久一区二区| 国产一区二区成人| 欧美大片在线影院| 在线视频一区二区| 久久精品视频网| 亚洲欧洲精品天堂一级| 国产精品久久久久三级| 欧美专区日韩专区| 91久久精品美女高潮| 欧美影片第一页| 亚洲激情在线视频| 国产精品第一区| 久久久免费精品视频| 99人久久精品视频最新地址| 久久成人av少妇免费| 亚洲国产一区二区精品专区| 国产精品xxxxx| 久久久91精品国产| 99re6这里只有精品视频在线观看| 欧美亚洲专区| 亚洲伦理在线免费看| 国产视频一区二区在线观看| 欧美.日韩.国产.一区.二区| 一区二区三区色| 亚洲国产精品女人久久久| 久久国产免费| 亚洲免费婷婷| 日韩视频免费观看高清完整版| 国产精品一区二区三区成人| 欧美jizz19hd性欧美| 欧美一区二区视频在线| 日韩一级在线| 亚洲成人自拍视频| 久久久精彩视频| 亚洲一区在线视频| 一本久久综合| 亚洲精品自在久久| 亚洲国产精品一区二区尤物区| 国产小视频国产精品| 国产精品美女久久久久久2018|