configuration.html 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>xmake</title>
  6. <link rel="icon" href="/assets/img/favicon.ico">
  7. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
  8. <meta name="description" content="Description">
  9. <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  10. <link href="/assets/npm/github-markdown/github-markdown.min.css" rel="stylesheet">
  11. <style>
  12. .markdown-body {
  13. box-sizing: border-box;
  14. min-width: 200px;
  15. max-width: 980px;
  16. margin: 0 auto;
  17. padding: 45px;
  18. }
  19. @media (max-width: 767px) {
  20. .markdown-body {
  21. padding: 15px;
  22. }
  23. }
  24. </style>
  25. </head>
  26. <body>
  27. <article class="markdown-body">
  28. <h4>This is a mirror page, please see the original page: </h4><a href="https://xmake.io/#/zh-cn/guide/configuration">https://xmake.io/#/zh-cn/guide/configuration</a>
  29. <div id="wwads-panel" class="wwads-cn wwads-vertical wwads-sticky" data-id="239" style="max-width:180px;bottom:20px;right:20px;width:200px;height:260px;background:#fff;position:fixed"></div>
  30. </br>
  31. <script type="text/javascript" charset="UTF-8" src="https://cdn.wwads.cn/js/makemoney.js" async></script>
  32. <script async type="text/javascript" src="//cdn.carbonads.com/carbon.js?serve=CE7I52QU&placement=xmakeio" id="_carbonads_js"></script>
  33. <style>
  34. #carbonads {
  35. font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu,
  36. Cantarell, "Helvetica Neue", Helvetica, Arial, sans-serif;
  37. }
  38. #carbonads {
  39. display: flex;
  40. max-width: 330px;
  41. background-color: hsl(0, 0%, 98%);
  42. box-shadow: 0 1px 4px 1px hsla(0, 0%, 0%, .1);
  43. }
  44. #carbonads a {
  45. color: inherit;
  46. text-decoration: none;
  47. }
  48. #carbonads a:hover {
  49. color: inherit;
  50. }
  51. #carbonads span {
  52. position: relative;
  53. display: block;
  54. overflow: hidden;
  55. }
  56. #carbonads .carbon-wrap {
  57. display: flex;
  58. }
  59. .carbon-img {
  60. display: block;
  61. margin: 0;
  62. line-height: 1;
  63. }
  64. .carbon-img img {
  65. display: block;
  66. }
  67. .carbon-text {
  68. font-size: 13px;
  69. padding: 10px;
  70. line-height: 1.5;
  71. text-align: left;
  72. }
  73. .carbon-poweredby {
  74. display: block;
  75. padding: 8px 10px;
  76. background: repeating-linear-gradient(-45deg, transparent, transparent 5px, hsla(0, 0%, 0%, .025) 5px, hsla(0, 0%, 0%, .025) 10px) hsla(203, 11%, 95%, .4);
  77. text-align: center;
  78. text-transform: uppercase;
  79. letter-spacing: .5px;
  80. font-weight: 600;
  81. font-size: 9px;
  82. line-height: 1;
  83. }
  84. </style>
  85. <p>通过<code>xmake f|config</code>配置命令,设置构建前的相关配置信息,详细参数选项,请运行: <code>xmake f --help</code>。</p>
  86. <p><p class="tip"><br> 你可以使用命令行缩写来简化输入,也可以使用全名,例如: <br><br> <code>xmake f</code> 或者 <code>xmake config</code>.<br><br> <code>xmake f -p linux</code> 或者 <code>xmake config --plat=linux</code>.<br></p>
  87. </p>
  88. <h2 id="">目标平台</h2>
  89. <h3 id="">主机平台</h3>
  90. <pre><code class="lang-bash">$ xmake
  91. </code></pre>
  92. <p>!> xmake将会自动探测当前主机平台,默认自动生成对应的目标程序。</p>
  93. <h3 id="linux">Linux</h3>
  94. <pre><code class="lang-bash">$ xmake f -p linux [-a i386|x86_64]
  95. $ xmake
  96. </code></pre>
  97. <h3 id="android">Android</h3>
  98. <pre><code class="lang-bash">$ xmake f -p android --ndk=~/files/android-ndk-r10e/ [-a armeabi-v7a|arm64-v8a]
  99. $ xmake
  100. </code></pre>
  101. <p>如果要手动指定ndk中具体某个工具链,而不是使用默认检测的配置,可以通过<a href="#-bin">--bin</a>来设置,例如:</p>
  102. <pre><code class="lang-bash">$ xmake f -p android --ndk=~/files/android-ndk-r10e/ -a arm64-v8a --bin=~/files/android-ndk-r10e/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin
  103. </code></pre>
  104. <p><a href="#-bin">--bin</a>主要用于设置选择编译工具的具体bin目录,这个的使用跟<a href="#交叉编译">交叉编译</a>中的<a href="#-bin">--bin</a>的行为是一致的。</p>
  105. <p>!> 如果手动设置了bin目录,没有通过检测,可以看下是否<code>--arch=</code>参数没有匹配对。</p>
  106. <h3 id="iphoneos">iPhoneOS</h3>
  107. <pre><code class="lang-bash">$ xmake f -p iphoneos [-a armv7|armv7s|arm64|i386|x86_64]
  108. $ xmake
  109. </code></pre>
  110. <p>由于 m1 设备上模拟器也支持 arm64 架构,因此之前单纯从 arch 去区分是否为模拟器,已无法满足需求。<br>因此,2.6.5 版本,我们新增了一个参数配置去区分是否为模拟器目标。</p>
  111. <pre><code class="lang-bash">$ xmake f -p iphoneos --appledev=simulator
  112. $ xmake f -p watchos --appledev=simulator
  113. $ xmake f -p appletvos --appledev=simulator
  114. </code></pre>
  115. <h3 id="maccatalyst">Mac Catalyst</h3>
  116. <p>我们也可以指定构建 Mac Catalyst 程序。</p>
  117. <pre><code class="lang-bash">$ xmake f --appledev=catalyst
  118. </code></pre>
  119. <h3 id="windows">Windows</h3>
  120. <pre><code class="lang-bash">$ xmake f -p windows [-a x86|x64]
  121. $ xmake
  122. </code></pre>
  123. <h3 id="mingw">Mingw</h3>
  124. <p>xmake 除了支持 Msys2/MingW, MingW for macOS/linux 之外,还支持 llvm-mingw 工具链,可以切换 arm/arm64 架构来编译。</p>
  125. <pre><code class="lang-bash">$ xmake f -p mingw --sdk=/usr/local/i386-mingw32-4.3.0/ [-a i386|x86_64|arm|arm64]
  126. $ xmake
  127. </code></pre>
  128. <h3 id="applewatchos">Apple WatchOS</h3>
  129. <pre><code class="lang-bash">$ xmake f -p watchos [-a i386|armv7k]
  130. $ xmake
  131. </code></pre>
  132. <h3 id="wasmwebassembly">Wasm (WebAssembly)</h3>
  133. <p>此平台用于编译 WebAssembly 程序(内部会使用emcc工具链),在切换此平台之前,我们需要先进入 Emscripten 工具链环境,确保 emcc 等编译器可用。</p>
  134. <pre><code class="lang-bash">$ xmake f -p wasm
  135. $ xmake
  136. </code></pre>
  137. <p>xmake 也支持 Qt for wasm 编译,只需要:</p>
  138. <pre><code class="lang-bash">$ xmake f -p wasm [--qt=~/Qt]
  139. $ xmake
  140. </code></pre>
  141. <p>其中 <code>--qt</code> 参数设置是可选的,通常xmake都能检测到qt的sdk路径。</p>
  142. <p>需要注意的一点是,Emscripten 和 Qt SDK 的版本是有对应关系的,不匹配的版本,可能会有Qt/Wasm之间的兼容问题。</p>
  143. <p>关于版本对应关系,可以看下:<a href="https://wiki.qt.io/Qt_for_WebAssembly">https://wiki.qt.io/Qt_for_WebAssembly</a></p>
  144. <p>更多详情见:<a href="https://github.com/xmake-io/xmake/issues/956">https://github.com/xmake-io/xmake/issues/956</a></p>
  145. <p>除了 emscripten 以外,还有一个常用的wasm工具链 wasi-sdk,用于构建基于wasi的程序,我们仅仅只需要切换工具链即可。</p>
  146. <pre><code class="lang-bash">$ xmake f -p wasm --toolchain=wasi
  147. $ xmake
  148. </code></pre>
  149. <h3 id="harmonyos">HarmonyOS (鸿蒙)</h3>
  150. <p>2.9.1 版本新增了鸿蒙 OS 平台的 native 工具链编译支持:</p>
  151. <pre><code class="lang-bash">$ xmake f -p harmony
  152. </code></pre>
  153. <p>xmake 会自动探测默认的 SDK 路径,当然我们也可以指定 Harmony SDK 路径。</p>
  154. <pre><code class="lang-bash">$ xmake f -p Harmony --sdk=/Users/ruki/Library/Huawei/Sdk/openharmony/10/native
  155. </code></pre>
  156. <h2 id="">交叉编译配置</h2>
  157. <p>通常,如果我们需要在当前pc环境编译生成其他设备上才能运行的目标文件时候,就需要通过对应的交叉编译工具链来编译生成它们,比如在win/macos上编译linux的程序,或者在linux上编译其他嵌入式设备的目标文件等。</p>
  158. <p>通常的交叉编译工具链都是基于gcc/clang的,大都具有类似如下的结构:</p>
  159. <pre><code>/home/toolchains_sdkdir
  160. - bin
  161. - arm-linux-armeabi-gcc
  162. - arm-linux-armeabi-ld
  163. - ...
  164. - lib
  165. - libxxx.a
  166. - include
  167. - xxx.h
  168. </code></pre><p>每个工具链都有对应的include/lib目录,用于放置一些系统库和头文件,例如libc, stdc++等,而bin目录下放置的就是编译工具链一系列工具。例如:</p>
  169. <pre><code>arm-linux-armeabi-ar
  170. arm-linux-armeabi-as
  171. arm-linux-armeabi-c++
  172. arm-linux-armeabi-cpp
  173. arm-linux-armeabi-g++
  174. arm-linux-armeabi-gcc
  175. arm-linux-armeabi-ld
  176. arm-linux-armeabi-nm
  177. arm-linux-armeabi-strip
  178. </code></pre><p>其中<code>arm-linux-armeabi-</code>前缀就是cross,通过用来标示目标平台和架构,主要用于跟主机自身的gcc/clang进行区分。</p>
  179. <p>里面的gcc/g++就是c/c++的编译器,通常也可以作为链接器使用,链接的时候内部会去调用ld来链接,并且自动追加一些c++库。<br>cpp是预处理器,as是汇编器,ar用于生成静态库,strip用于裁剪掉一些符号信息,使得目标程序会更加的小。nm用于查看导出符号列表。</p>
  180. <h3 id="">自动探测和编译</h3>
  181. <p>如果我们的交叉编译工具链是上文的结构,xmake会自动检测识别这个sdk的结构,提取里面的cross,以及include/lib路径位置,用户通常不需要做额外的参数设置,只需要配置好sdk根目录就可以编译了,例如:</p>
  182. <pre><code class="lang-bash">$ xmake f -p cross --sdk=/home/toolchains_sdkdir
  183. $ xmake
  184. </code></pre>
  185. <p>其中,<code>-p cross</code>用于指定当前的平台是交叉编译平台,<code>--sdk=</code>用于指定交叉工具链的根目录。</p>
  186. <p>注:我们也可以指定<code>-p linux</code>平台来配置交叉编译,效果是一样的,唯一的区别是额外标识了linux平台名,方便xmake.lua里面通过<code>is_plat("linux")</code>来判断平台。</p>
  187. <p>这个时候,xmake会去自动探测gcc等编译器的前缀名cross:<code>arm-linux-armeabi-</code>,并且编译的时候,也会自动加上<code>链接库</code>和<code>头文件</code>的搜索选项,例如:</p>
  188. <pre><code>-I/home/toolchains_sdkdir/include
  189. -L/home/toolchains_sdkdir/lib
  190. </code></pre><p>这些都是xmake自动处理的,不需要手动配置他们。</p>
  191. <h3 id="">手动配置编译</h3>
  192. <p>如果上面的自动检测对某些工具链,还无法完全通过编译,就需要用户自己手动设置一些交叉编译相关的配置参数,来调整适应这些特殊的工具链了,下面我会逐一讲解如何配置。</p>
  193. <h3 id="bin">设置工具链bin目录</h3>
  194. <p>对于不规则工具链目录结构,靠单纯地<a href="https://xmake.io/#/zh-cn/guide/configuration?id=-sdk">--sdk</a>选项设置,没法完全检测通过的情况下,可以通过这个选项继续附加设置工具链的bin目录位置。</p>
  195. <p>例如:一些特殊的交叉工具链的,编译器bin目录,并不在 <code>/home/toolchains_sdkdir/bin</code> 这个位置,而是独立到了 <code>/usr/opt/bin</code></p>
  196. <p>这个时候,我们可以在设置了sdk参数的基础上追加bin目录的参数设置,来调整工具链的bin目录。</p>
  197. <pre><code class="lang-bash">$ xmake f -p cross --sdk=/home/toolchains_sdkdir --bin=/usr/opt/bin
  198. $ xmake
  199. </code></pre>
  200. <h3 id="">设置交叉工具链工具前缀</h3>
  201. <p>像aarch64-linux-android-这种,通常如果你配置了--sdk或者--bin的情况下,xmake会去自动检测的,不需要自己手动设置。</p>
  202. <p>但是对于一些极特殊的工具链,一个目录下同时有多个cross前缀的工具bin混在一起的情况,你需要手动设置这个配置,来区分到底需要选用哪个bin。</p>
  203. <p>例如,toolchains的bin目录下同时存在两个不同的编译器:</p>
  204. <pre><code>/opt/bin
  205. - armv7-linux-gcc
  206. - aarch64-linux-gcc
  207. </code></pre><p>我们现在想要选用armv7的版本,那么我们可以追加<code>--cross=</code>配置编译工具前缀名,例如:</p>
  208. <pre><code class="lang-bash">$ xmake f -p cross --sdk=/usr/toolsdk --bin=/opt/bin --cross=armv7-linux-
  209. </code></pre>
  210. <h3 id="cc">设置c/c++编译器</h3>
  211. <p>如果还要继续细分选择编译器,则继续追加相关编译器选项,例如:</p>
  212. <pre><code class="lang-bash">$ xmake f -p cross --sdk=/user/toolsdk --cc=armv7-linux-clang --cxx=armv7-linux-clang++
  213. </code></pre>
  214. <p>当然,我们也可以指定编译器全路径。</p>
  215. <p><code>--cc</code>用于指定c编译器名,<code>--cxx</code>用于指定c++编译器名。</p>
  216. <p>注:如果存在CC/CXX环境变量的话,会优先使用当前环境变量中指定的值。</p>
  217. <p>如果指定的编译器名不是那些xmake内置可识别的名字(带有gcc, clang等字样),那么编译器工具检测就会失败。</p>
  218. <p>这个时候我们可以通过:</p>
  219. <pre><code class="lang-bash">xmake f --cxx=clang++@/home/xxx/c++mips.exe
  220. </code></pre>
  221. <p>设置c++mips.exe编译器作为类clang++的使用方式来编译。</p>
  222. <p>也就是说,在指定编译器为<code>c++mips.exe</code>的同时,告诉xmake,它跟clang++用法和参数选项基本相同。</p>
  223. <h3 id="cc">设置c/c++链接器</h3>
  224. <p>如果还要继续细分选择链接器,则继续追加相关链接器选项,例如:</p>
  225. <pre><code class="lang-bash">$ xmake f -p cross --sdk=/user/toolsdk --ld=armv7-linux-clang++ --sh=armv7-linux-clang++ --ar=armv7-linux-ar
  226. </code></pre>
  227. <p>ld指定可执行程序链接器,sh指定共享库程序链接器,ar指定生成静态库的归档器。</p>
  228. <p>注:如果存在LD/SH/AR环境变量的话,会优先使用当前环境变量中指定的值。</p>
  229. <h3 id="">设置头文件和库搜索目录</h3>
  230. <p>如果sdk里面还有额外的其他include/lib目录不在标准的结构中,导致交叉编译找不到库和头文件,那么我们可以通过<code>--includedirs</code>和<code>--linkdirs</code>来追加搜索路径,然后通过<code>--links</code>添加额外的链接库。</p>
  231. <pre><code class="lang-bash">$ xmake f -p cross --sdk=/usr/toolsdk --includedirs=/usr/toolsdk/xxx/include --linkdirs=/usr/toolsdk/xxx/lib --links=pthread
  232. </code></pre>
  233. <p>注:如果要指定多个搜索目录,可以通过<code>:</code>或者<code>;</code>来分割,也就是不同主机平台的路径分隔符,linux/macos下用<code>:</code>,win下用<code>;</code>。</p>
  234. <h3 id="">设置编译和链接选项</h3>
  235. <p>我们也可以根据实际情况通过<code>--cflags</code>, <code>--cxxflags</code>,<code>--ldflags</code>,<code>--shflags</code>和<code>--arflags</code>额外配置一些编译和链接选项。</p>
  236. <ul>
  237. <li>cflags: 指定c编译参数</li>
  238. <li>cxxflags:指定c++编译参数</li>
  239. <li>cxflags: 指定c/c++编译参数</li>
  240. <li>asflags: 指定汇编器编译参数</li>
  241. <li>ldflags: 指定可执行程序链接参数</li>
  242. <li>shflags: 指定动态库程序链接参数</li>
  243. <li>arflags: 指定静态库的生成参数</li>
  244. </ul>
  245. <p>例如:</p>
  246. <pre><code class="lang-bash">$ xmake f -p cross --sdk=/usr/toolsdk --cflags="-DTEST -I/xxx/xxx" --ldflags="-lpthread"
  247. </code></pre>
  248. <h3 id="">项目描述设置</h3>
  249. <h4 id="set_toolchains">set_toolchains</h4>
  250. <p>这对某个特定的target单独切换设置不同的工具链,和set_toolset不同的是,此接口是对完整工具链的整体切换,比如cc/ld/sh等一系列工具集。</p>
  251. <p>这也是推荐做法,因为像gcc/clang等大部分编译工具链,编译器和链接器都是配套使用的,要切就得整体切,单独零散的切换设置会很繁琐。</p>
  252. <p>比如我们切换test目标到clang+yasm两个工具链:</p>
  253. <pre><code class="lang-lua">target("test")
  254. set_kind("binary")
  255. add_files("src/*.c")
  256. set_toolchains("clang", "yasm")
  257. </code></pre>
  258. <h4 id="set_toolset">set_toolset</h4>
  259. <p>如果觉得每次通过命令行配置比较繁琐,有些配置可以通过在xmake.lua预先配置好,来简化命令配置,比如编译器的指定,就可以通过<code>set_toolset</code>来对每个target单独设置。</p>
  260. <pre><code class="lang-lua">target("test")
  261. set_kind("binary")
  262. set_toolset("cxx", "clang")
  263. set_toolset("ld", "clang++")
  264. </code></pre>
  265. <p>强制test目标的编译器和链接器使用clang编译器,或者指定交叉编译工具链中的编译器名或者路径。</p>
  266. <h4 id="set_config">set_config</h4>
  267. <p>我们也可以通过<code>set_config</code>来设置在<code>xmake f/config</code>命令中的每个配置参数的默认值,这是个全局api,对每个target都会生效。</p>
  268. <pre><code class="lang-lua">set_config("cflags", "-DTEST")
  269. set_config("sdk", "/home/xxx/tooksdk")
  270. set_config("cc", "gcc")
  271. set_config("ld", "g++")
  272. </code></pre>
  273. <p>不过,我们还是可以通过<code>xmake f --name=value</code>的方式,去修改xmake.lua中的默认配置。</p>
  274. <h3 id="">自定义编译平台</h3>
  275. <p>如果某个交叉工具链编译后目标程序有对应的平台需要指定,并且需要在xmake.lua里面根据不同的交叉编译平台,还需要配置一些额外的编译参数,那么上文的<code>-p cross</code>设置就不能满足需求了。</p>
  276. <p>其实,<code>-p/--plat=</code>参数也可以设置为其他自定义的值,只需要跟<code>is_plat</code>保持对应关系就可以,所有非内置平台名,都会默认采用交叉编译模式,例如:</p>
  277. <pre><code class="lang-bash">$ xmake f -p myplat --sdk=/usr/local/arm-xxx-gcc/
  278. $ xmake
  279. </code></pre>
  280. <p>我们传入了myplat自定义平台名,作为当前交叉工具链的编译平台,然后xmake.lua里面我们对这个平台,配置下对应的设置:</p>
  281. <pre><code class="lang-lua">if is_plat("myplat") then
  282. add_defines("TEST")
  283. end
  284. </code></pre>
  285. <p>通过这种方式,xmake就可以很方便的扩展处理各种编译平台,用户可以自己扩展支持freebsd, netbsd, sunos等其他各种平台的交叉编译。</p>
  286. <p>我摘录一段之前移植libuv写的交叉编译的配置,直观感受下:</p>
  287. <pre><code class="lang-lua">-- for dragonfly/freebsd/netbsd/openbsd platform
  288. if is_plat("dragonfly", "freebsd", "netbsd", "openbsd") then
  289. add_files("src/unix/bsd-ifaddrs.c")
  290. add_files("src/unix/freebsd.c")
  291. add_files("src/unix/kqueue.c")
  292. add_files("src/unix/posix-hrtime.c")
  293. add_headerfiles("(include/uv-bsd.h)")
  294. end
  295. -- for sunos platform
  296. if is_plat("sunos") then
  297. add_files("src/unix/no-proctitle.c")
  298. add_files("src/unix/sunos.c")
  299. add_defines("__EXTENSIONS_", "_XOPEN_SOURCE=600")
  300. add_headerfiles("(include/uv-sunos.h)")
  301. end
  302. </code></pre>
  303. <p>然后,我们就可以切换这些平台来编译:</p>
  304. <pre><code class="lang-bash">$ xmake f -p [dragonfly|freebsd|netbsd|openbsd|sunos] --sdk=/home/arm-xxx-gcc/
  305. $ xmake
  306. </code></pre>
  307. <p>另外,内置的linux平台也是支持交叉编译的哦,如果不想配置其他平台名,统一作为linux平台来交叉编译,也是可以的。</p>
  308. <pre><code class="lang-bash">$ xmake f -p linux --sdk=/usr/local/arm-xxx-gcc/
  309. $ xmake
  310. </code></pre>
  311. <p>只要设置了<code>--sdk=</code>等参数,就会启用linux平台的交叉编译模式。</p>
  312. <h3 id="">常用工具链配置</h3>
  313. <p>完整的工具链列表,请执行下面的命令查看:</p>
  314. <pre><code class="lang-bash">$ xmake show -l toolchains
  315. </code></pre>
  316. <p>!> 此特性需要v2.3.4以上版本才支持</p>
  317. <p>上文讲述的是通用的交叉编译工具链配置,如果一些特定的工具链需要额外传入<code>--ldflags/--includedirs</code>等场景就比较繁琐了,<br>因此xmake也内置了一些常用工具链,可以省去交叉编译工具链复杂的配置过程,只需要执行:</p>
  318. <pre><code class="lang-bash">$ xmake f --toolchain=gnu-rm --sdk=/xxx/
  319. $ xmake
  320. </code></pre>
  321. <p>就可以快速切换的指定的交叉编译工具链,如果这个工具链需要追加一些特定的flags设置,也会自动设置好,简化配置。</p>
  322. <p>其中,gnu-rm就是内置的GNU Arm Embedded Toolchain。</p>
  323. <p>比如,我们也可以快速从gcc工具链整体切换到clang或者llvm工具链,不再需要<code>xmake f --cc=clang --cxx=clang --ld=clang++</code>等挨个配置了。</p>
  324. <pre><code class="lang-bash">$ xmake f --toolchain=clang
  325. $ xmake
  326. </code></pre>
  327. <p>或者</p>
  328. <pre><code class="lang-bash">$ xmake f --toolchain=llvm --sdk=/xxx/llvm
  329. $ xmake
  330. </code></pre>
  331. <p>具体xmake支持哪些工具链,可以通过下面的命令查看:</p>
  332. <pre><code class="lang-bash">$ xmake show -l toolchains
  333. xcode Xcode IDE
  334. vs VisualStudio IDE
  335. yasm The Yasm Modular Assembler
  336. clang A C language family frontend for LLVM
  337. go Go Programming Language Compiler
  338. dlang D Programming Language Compiler
  339. sdcc Small Device C Compiler
  340. cuda CUDA Toolkit
  341. ndk Android NDK
  342. rust Rust Programming Language Compiler
  343. llvm A collection of modular and reusable compiler and toolchain technologies
  344. cross Common cross compilation toolchain
  345. nasm NASM Assembler
  346. gcc GNU Compiler Collection
  347. mingw Minimalist GNU for Windows
  348. gnu-rm GNU Arm Embedded Toolchain
  349. envs Environment variables toolchain
  350. fasm Flat Assembler
  351. </code></pre>
  352. <h4 id="">自定义工具链</h4>
  353. <p>另外,我们也可以在xmake.lua中自定义toolchain,然后通过<code>xmake f --toolchain=myclang</code>指定切换,例如:</p>
  354. <pre><code class="lang-lua">toolchain("myclang")
  355. set_kind("standalone")
  356. set_toolset("cc", "clang")
  357. set_toolset("cxx", "clang", "clang++")
  358. set_toolset("ld", "clang++", "clang")
  359. set_toolset("sh", "clang++", "clang")
  360. set_toolset("ar", "ar")
  361. set_toolset("ex", "ar")
  362. set_toolset("strip", "strip")
  363. set_toolset("mm", "clang")
  364. set_toolset("mxx", "clang", "clang++")
  365. set_toolset("as", "clang")
  366. -- ...
  367. </code></pre>
  368. <p>关于这块的详情介绍,可以到<a href="/mirror/zh-cn/manual/custom_toolchain.html">自定义工具链</a>章节查看</p>
  369. <p>更多详情见:<a href="https://github.com/xmake-io/xmake/issues/780">#780</a></p>
  370. <h4 id="mingw">MingW 工具链</h4>
  371. <p>使用mingw工具链编译,其实也是交叉编译,但是由于这个比较常用,xmake专门增加了一个mingw的平台来快速处理使用mingw工具链的编译。</p>
  372. <p>因此,xmake对mingw的工具链检测会更加完善,在macos下,基本上连sdk路径都不需要配置,也能直接检测到,只需要切到mingw平台编译即可。</p>
  373. <pre><code class="lang-bash">$ xmake f -p mingw
  374. $ xmake -v
  375. configure
  376. {
  377. ld = /usr/local/opt/mingw-w64/bin/x86_64-w64-mingw32-g++
  378. ndk_stdcxx = true
  379. plat = mingw
  380. mingw = /usr/local/opt/mingw-w64
  381. buildir = build
  382. arch = x86_64
  383. xcode = /Applications/Xcode.app
  384. mode = release
  385. cxx = /usr/local/opt/mingw-w64/bin/x86_64-w64-mingw32-gcc
  386. cross = x86_64-w64-mingw32-
  387. theme = default
  388. kind = static
  389. ccache = true
  390. host = macosx
  391. clean = true
  392. bin = /usr/local/opt/mingw-w64/bin
  393. }
  394. [ 0%]: cache compiling.release src/main.cpp
  395. /usr/local/bin/ccache /usr/local/opt/mingw-w64/bin/x86_64-w64-mingw32-gcc -c -fvisibility=hidden -O3 -m64 -o build/.objs/test/mingw/x86_64/release/src/main.cpp.obj src/main.cpp
  396. [100%]: linking.release test.exe
  397. /usr/local/opt/mingw-w64/bin/x86_64-w64-mingw32-g++ -o build/mingw/x86_64/release/test.exe build/.objs/test/mingw/x86_64/release/src/main.cpp.obj -s -fvisibility=hidden -m64
  398. build ok!
  399. </code></pre>
  400. <p>这里我们追加了<code>-v</code>参数,看了下详细的编译命令和检测到的mingw工具链配置值,其中cross被自动检测为:<code>x86_64-w64-mingw32-</code>,bin目录也被自动检测到了,还有编译器和链接器也是。</p>
  401. <p>尽管在linux/win上还没法自动检测到sdk路径,我们也可以手动指定sdk路径,需要注意的是,xmake为mingw专门提供了一个<code>--mingw=</code>参数用来指定mingw的工具链根目录,其效果跟<code>--sdk=</code>是一样的,但是它可以作为全局配置被设置。</p>
  402. <pre><code class="lang-bash">$ xmake g --mingw=/home/mingwsdk
  403. $ xmake f -p mingw
  404. $ xmake
  405. </code></pre>
  406. <p>我们通过<code>xmake g/global</code>命令设置<code>--mingw</code>根目录到全局配置后,之后每次编译和切换编译平台,就不用额外指定mingw工具链路径了,方便使用。</p>
  407. <p>另外,其他的工具链配置参数用法,跟上文描述的没什么区别,像<code>--cross</code>, <code>--bin=</code>等都可以根据实际的环境需要,自己控制是否需要额外追加配置来适配自己的mingw工具链。</p>
  408. <p>xmake 还支持 llvm-mingw 工具链,可以切换到 arm/arm64 架构来编译。</p>
  409. <pre><code class="lang-bash">$ xmake f --mingw=/xxx/llvm-mingw -a arm64
  410. $ xmake
  411. </code></pre>
  412. <h4 id="llvm">LLVM 工具链</h4>
  413. <p>llvm工具链下载地址:<a href="https://releases.llvm.org/">https://releases.llvm.org/</a></p>
  414. <pre><code class="lang-bash">$ xmake f -p cross --toolchain=llvm --sdk="C:\Program Files\LLVM"
  415. $ xmake
  416. </code></pre>
  417. <h4 id="gnurm">GNU-RM 工具链</h4>
  418. <p>工具链地址:<a href="https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads#">https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads#</a></p>
  419. <pre><code class="lang-bash">$ xmake f -p cross --toolchain=gnu-rm --sdk=/xxx/cc-arm-none-eabi-9-2019-q4-major
  420. $ xmake
  421. </code></pre>
  422. <h4 id="tinyc">TinyC 工具链</h4>
  423. <pre><code class="lang-bash">$ xmake f --toolchain=tinyc
  424. $ xmake
  425. </code></pre>
  426. <p>!> Releases目录下,我们还提供了特殊的 xmake-tinyc-vX.X.X.win32.exe 安装包,内置tinyc工具链,无需依赖msvc,也可以编译c代码,开箱即用无依赖。</p>
  427. <h4 id="emcc">Emcc 工具链</h4>
  428. <p>通常只需要切换到 Wasm 平台,里面内置了 emcc 工具链,还会额外调整目标程序的扩展名为 <code>*.html</code> 以及输出 <code>*.wasm</code>。</p>
  429. <pre><code class="lang-bash">$ xmake f -p wasm
  430. $ xmake
  431. </code></pre>
  432. <p>不过我们也能够直接切换到 emcc 工具链,但是后缀名不会被修改。</p>
  433. <pre><code class="lang-bash">$ xmake f --toolchain=emcc
  434. $ xmake
  435. </code></pre>
  436. <h4 id="intelc">Intel C++ 编译工具链</h4>
  437. <pre><code class="lang-bash">$ xmake f --toolchain=icc
  438. $ xmake
  439. </code></pre>
  440. <h4 id="intelfortran">Intel Fortran 编译工具链</h4>
  441. <pre><code class="lang-bash">$ xmake f --toolchain=ifort
  442. $ xmake
  443. </code></pre>
  444. <h3 id="">通用交叉编译配置</h3>
  445. <table>
  446. <thead>
  447. <tr>
  448. <th>参数名</th>
  449. <th>描述</th>
  450. </tr>
  451. </thead>
  452. <tbody>
  453. <tr>
  454. <td><a href="#-sdk">--sdk</a></td>
  455. <td>设置交叉工具链的sdk根目录</td>
  456. </tr>
  457. <tr>
  458. <td><a href="#-bin">--bin</a></td>
  459. <td>设置工具链bin目录</td>
  460. </tr>
  461. <tr>
  462. <td><a href="#-cross">--cross</a></td>
  463. <td>设置交叉工具链工具前缀</td>
  464. </tr>
  465. <tr>
  466. <td><a href="#-as">--as</a></td>
  467. <td>设置<code>asm</code>汇编器</td>
  468. </tr>
  469. <tr>
  470. <td><a href="#-cc">--cc</a></td>
  471. <td>设置<code>c</code>编译器</td>
  472. </tr>
  473. <tr>
  474. <td><a href="#-cxx">--cxx</a></td>
  475. <td>设置<code>c++</code>编译器</td>
  476. </tr>
  477. <tr>
  478. <td><a href="#-mm">--mm</a></td>
  479. <td>设置<code>objc</code>编译器</td>
  480. </tr>
  481. <tr>
  482. <td><a href="#-mxx">--mxx</a></td>
  483. <td>设置<code>objc++</code>编译器</td>
  484. </tr>
  485. <tr>
  486. <td><a href="#-sc">--sc</a></td>
  487. <td>设置<code>swift</code>编译器</td>
  488. </tr>
  489. <tr>
  490. <td><a href="#-gc">--gc</a></td>
  491. <td>设置<code>golang</code>编译器</td>
  492. </tr>
  493. <tr>
  494. <td><a href="#-dc">--dc</a></td>
  495. <td>设置<code>dlang</code>编译器</td>
  496. </tr>
  497. <tr>
  498. <td><a href="#-rc">--rc</a></td>
  499. <td>设置<code>rust</code>编译器</td>
  500. </tr>
  501. <tr>
  502. <td><a href="#-cu">--cu</a></td>
  503. <td>设置<code>cuda</code>编译器</td>
  504. </tr>
  505. <tr>
  506. <td><a href="#-ld">--ld</a></td>
  507. <td>设置<code>c/c++/objc/asm</code>链接器</td>
  508. </tr>
  509. <tr>
  510. <td><a href="#-sh">--sh</a></td>
  511. <td>设置<code>c/c++/objc/asm</code>共享库链接器</td>
  512. </tr>
  513. <tr>
  514. <td><a href="#-ar">--ar</a></td>
  515. <td>设置<code>c/c++/objc/asm</code>静态库归档器</td>
  516. </tr>
  517. <tr>
  518. <td><a href="#-scld">--scld</a></td>
  519. <td>设置<code>swift</code>链接器</td>
  520. </tr>
  521. <tr>
  522. <td><a href="#-scsh">--scsh</a></td>
  523. <td>设置<code>swift</code>共享库链接器</td>
  524. </tr>
  525. <tr>
  526. <td><a href="#-gcld">--gcld</a></td>
  527. <td>设置<code>golang</code>链接器</td>
  528. </tr>
  529. <tr>
  530. <td><a href="#-gcar">--gcar</a></td>
  531. <td>设置<code>golang</code>静态库归档器</td>
  532. </tr>
  533. <tr>
  534. <td><a href="#-dcld">--dcld</a></td>
  535. <td>设置<code>dlang</code>链接器</td>
  536. </tr>
  537. <tr>
  538. <td><a href="#-dcsh">--dcsh</a></td>
  539. <td>设置<code>dlang</code>共享库链接器</td>
  540. </tr>
  541. <tr>
  542. <td><a href="#-dcar">--dcar</a></td>
  543. <td>设置<code>dlang</code>静态库归档器</td>
  544. </tr>
  545. <tr>
  546. <td><a href="#-rcld">--rcld</a></td>
  547. <td>设置<code>rust</code>链接器</td>
  548. </tr>
  549. <tr>
  550. <td><a href="#-rcsh">--rcsh</a></td>
  551. <td>设置<code>rust</code>共享库链接器</td>
  552. </tr>
  553. <tr>
  554. <td><a href="#-rcar">--rcar</a></td>
  555. <td>设置<code>rust</code>静态库归档器</td>
  556. </tr>
  557. <tr>
  558. <td><a href="#-cu-ccbin">--cu-ccbin</a></td>
  559. <td>设置<code>cuda</code> host编译器</td>
  560. </tr>
  561. <tr>
  562. <td><a href="#-culd">--culd</a></td>
  563. <td>设置<code>cuda</code>链接器</td>
  564. </tr>
  565. <tr>
  566. <td><a href="#-asflags">--asflags</a></td>
  567. <td>设置<code>asm</code>汇编编译选项</td>
  568. </tr>
  569. <tr>
  570. <td><a href="#-cflags">--cflags</a></td>
  571. <td>设置<code>c</code>编译选项</td>
  572. </tr>
  573. <tr>
  574. <td><a href="#-cxflags">--cxflags</a></td>
  575. <td>设置<code>c/c++</code>编译选项</td>
  576. </tr>
  577. <tr>
  578. <td><a href="#-cxxflags">--cxxflags</a></td>
  579. <td>设置<code>c++</code>编译选项</td>
  580. </tr>
  581. <tr>
  582. <td><a href="#-mflags">--mflags</a></td>
  583. <td>设置<code>objc</code>编译选项</td>
  584. </tr>
  585. <tr>
  586. <td><a href="#-mxflags">--mxflags</a></td>
  587. <td>设置<code>objc/c++</code>编译选项</td>
  588. </tr>
  589. <tr>
  590. <td><a href="#-mxxflags">--mxxflags</a></td>
  591. <td>设置<code>objc++</code>编译选项</td>
  592. </tr>
  593. <tr>
  594. <td><a href="#-scflags">--scflags</a></td>
  595. <td>设置<code>swift</code>编译选项</td>
  596. </tr>
  597. <tr>
  598. <td><a href="#-gcflags">--gcflags</a></td>
  599. <td>设置<code>golang</code>编译选项</td>
  600. </tr>
  601. <tr>
  602. <td><a href="#-dcflags">--dcflags</a></td>
  603. <td>设置<code>dlang</code>编译选项</td>
  604. </tr>
  605. <tr>
  606. <td><a href="#-rcflags">--rcflags</a></td>
  607. <td>设置<code>rust</code>编译选项</td>
  608. </tr>
  609. <tr>
  610. <td><a href="#-cuflags">--cuflags</a></td>
  611. <td>设置<code>cuda</code>编译选项</td>
  612. </tr>
  613. <tr>
  614. <td><a href="#-ldflags">--ldflags</a></td>
  615. <td>设置链接选项</td>
  616. </tr>
  617. <tr>
  618. <td><a href="#-shflags">--shflags</a></td>
  619. <td>设置共享库链接选项</td>
  620. </tr>
  621. <tr>
  622. <td><a href="#-arflags">--arflags</a></td>
  623. <td>设置静态库归档选项</td>
  624. </tr>
  625. </tbody>
  626. </table>
  627. <p><p class="tip"><br>如果你想要了解更多参数选项,请运行: <code>xmake f --help</code>。<br></p>
  628. </p>
  629. <h4 id="sdk">--sdk</h4>
  630. <ul>
  631. <li>设置交叉工具链的sdk根目录</li>
  632. </ul>
  633. <p>大部分情况下,都不需要配置很复杂的toolchains前缀,例如:<code>arm-linux-</code> 什么的</p>
  634. <p>只要这个工具链的sdk目录满足如下结构(大部分的交叉工具链都是这个结构):</p>
  635. <pre><code>/home/toolchains_sdkdir
  636. - bin
  637. - arm-linux-gcc
  638. - arm-linux-ld
  639. - ...
  640. - lib
  641. - libxxx.a
  642. - include
  643. - xxx.h
  644. </code></pre><p>那么,使用xmake进行交叉编译的时候,只需要进行如下配置和编译:</p>
  645. <pre><code class="lang-bash">$ xmake f -p linux --sdk=/home/toolchains_sdkdir
  646. $ xmake
  647. </code></pre>
  648. <p>这个时候,xmake会去自动探测,gcc等编译器的前缀名:<code>arm-linux-</code>,并且编译的时候,也会自动加上<code>链接库</code>和<code>头文件</code>的搜索选项,例如:</p>
  649. <pre><code>-I/home/toolchains_sdkdir/include -L/home/toolchains_sdkdir/lib
  650. </code></pre><p>这些都是xmake自动处理的,不需要手动配置他们。。</p>
  651. <h4 id="bin">--bin</h4>
  652. <ul>
  653. <li>设置工具链bin目录</li>
  654. </ul>
  655. <p>对于不规则工具链目录结构,靠单纯地<a href="#-sdk">--sdk</a>选项设置,没法完全检测通过的情况下,可以通过这个选项继续附加设置工具链的bin目录位置。</p>
  656. <p>例如:一些特殊的交叉工具链的,编译器bin目录,并不在 <code>/home/toolchains_sdkdir/bin</code> 这个位置,而是独立到了 <code>/usr/opt/bin</code></p>
  657. <pre><code class="lang-bash">$ xmake f -p linux --sdk=/home/toolchains_sdkdir --bin=/usr/opt/bin
  658. $ xmake
  659. </code></pre>
  660. <p><p class="tip"><br>v2.2.1版本之前,这个参数名是<code>--toolchains</code>,比较有歧义,因此新版本中,统一改成<code>--bin=</code>来设置bin目录。<br></p>
  661. </p>
  662. <h4 id="cross">--cross</h4>
  663. <ul>
  664. <li>设置交叉工具链工具前缀</li>
  665. </ul>
  666. <p>像<code>aarch64-linux-android-</code>这种,通常如果你配置了<a href="#-sdk">--sdk</a>或者<a href="#-bin">--bin</a>的情况下,xmake会去自动检测的,不需要自己手动设置。</p>
  667. <p>但是对于一些极特殊的工具链,一个目录下同时有多个cross前缀的工具bin混在一起的情况,你需要手动设置这个配置,来区分到底需要选用哪个bin。</p>
  668. <p>例如,toolchains的bin目录下同时存在两个不同的编译器:</p>
  669. <pre><code>/opt/bin
  670. - armv7-linux-gcc
  671. - aarch64-linux-gcc
  672. </code></pre><p>我们现在想要选用armv7的版本,则配置如下:</p>
  673. <pre><code class="lang-bash">$ xmake f -p linux --sdk=/usr/toolsdk --bin=/opt/bin --cross=armv7-linux-
  674. </code></pre>
  675. <h4 id="as">--as</h4>
  676. <ul>
  677. <li>设置<code>asm</code>汇编器</li>
  678. </ul>
  679. <p>如果还要继续细分选择编译器,则继续追加相关编译器选项,例如:</p>
  680. <pre><code class="lang-bash">$ xmake f -p linux --sdk=/user/toolsdk --as=armv7-linux-as
  681. </code></pre>
  682. <p>如果存在<code>AS</code>环境变量的话,会优先使用当前环境变量中指定的值。</p>
  683. <p><p class="tip"><br>如果指定的编译器名不是那些xmake内置可识别的名字(带有gcc, clang等字样),那么编译器工具检测就会失败。<br>这个时候我们可以通过:<code>xmake f --as=gcc@/home/xxx/asmips.exe</code> 设置ccmips.exe编译器作为类gcc的使用方式来编译。<br>也就是说,在指定编译器为<code>asmips.exe</code>的同时,告诉xmake,它跟gcc用法和参数选项基本相同。<br></p>
  684. </p>
  685. <h4 id="cc">--cc</h4>
  686. <ul>
  687. <li>设置c编译器</li>
  688. </ul>
  689. <p>如果还要继续细分选择编译器,则继续追加相关编译器选项,例如:</p>
  690. <pre><code class="lang-bash">$ xmake f -p linux --sdk=/user/toolsdk --cc=armv7-linux-clang
  691. </code></pre>
  692. <p>如果存在<code>CC</code>环境变量的话,会优先使用当前环境变量中指定的值。</p>
  693. <p><p class="tip"><br>如果指定的编译器名不是那些xmake内置可识别的名字(带有gcc, clang等字样),那么编译器工具检测就会失败。<br>这个时候我们可以通过:<code>xmake f --cc=gcc@/home/xxx/ccmips.exe</code> 设置ccmips.exe编译器作为类gcc的使用方式来编译。<br>也就是说,在指定编译器为<code>ccmips.exe</code>的同时,告诉xmake,它跟gcc用法和参数选项基本相同。<br></p>
  694. </p>
  695. <h4 id="cxx">--cxx</h4>
  696. <ul>
  697. <li>设置<code>c++</code>编译器</li>
  698. </ul>
  699. <p>如果还要继续细分选择编译器,则继续追加相关编译器选项,例如:</p>
  700. <pre><code class="lang-bash">$ xmake f -p linux --sdk=/user/toolsdk --cxx=armv7-linux-clang++
  701. </code></pre>
  702. <p>如果存在<code>CXX</code>环境变量的话,会优先使用当前环境变量中指定的值。</p>
  703. <p><p class="tip"><br>如果指定的编译器名不是那些xmake内置可识别的名字(带有gcc, clang等字样),那么编译器工具检测就会失败。<br>这个时候我们可以通过:<code>xmake f --cxx=clang++@/home/xxx/c++mips.exe</code> 设置c++mips.exe编译器作为类clang++的使用方式来编译。<br>也就是说,在指定编译器为<code>c++mips.exe</code>的同时,告诉xmake,它跟clang++用法和参数选项基本相同。<br></p>
  704. </p>
  705. <h4 id="ld">--ld</h4>
  706. <ul>
  707. <li>设置<code>c/c++/objc/asm</code>链接器</li>
  708. </ul>
  709. <p>如果还要继续细分选择链接器,则继续追加相关编译器选项,例如:</p>
  710. <pre><code class="lang-bash">$ xmake f -p linux --sdk=/user/toolsdk --ld=armv7-linux-clang++
  711. </code></pre>
  712. <p>如果存在<code>LD</code>环境变量的话,会优先使用当前环境变量中指定的值。</p>
  713. <p><p class="tip"><br>如果指定的编译器名不是那些xmake内置可识别的名字(带有gcc, clang等字样),那么链接器工具检测就会失败。<br>这个时候我们可以通过:<code>xmake f --ld=g++@/home/xxx/c++mips.exe</code> 设置c++mips.exe链接器作为类g++的使用方式来编译。<br>也就是说,在指定链接器为<code>c++mips.exe</code>的同时,告诉xmake,它跟g++用法和参数选项基本相同。<br></p>
  714. </p>
  715. <h4 id="sh">--sh</h4>
  716. <ul>
  717. <li>设置<code>c/c++/objc/asm</code>共享库链接器</li>
  718. </ul>
  719. <pre><code class="lang-bash">$ xmake f -p linux --sdk=/user/toolsdk --sh=armv7-linux-clang++
  720. </code></pre>
  721. <p>如果存在<code>SH</code>环境变量的话,会优先使用当前环境变量中指定的值。</p>
  722. <p><p class="tip"><br>如果指定的编译器名不是那些xmake内置可识别的名字(带有gcc, clang等字样),那么链接器工具检测就会失败。<br>这个时候我们可以通过:<code>xmake f --sh=g++@/home/xxx/c++mips.exe</code> 设置c++mips.exe链接器作为类g++的使用方式来编译。<br>也就是说,在指定链接器为<code>c++mips.exe</code>的同时,告诉xmake,它跟g++用法和参数选项基本相同。<br></p>
  723. </p>
  724. <h4 id="ar">--ar</h4>
  725. <ul>
  726. <li>设置<code>c/c++/objc/asm</code>静态库归档器</li>
  727. </ul>
  728. <pre><code class="lang-bash">$ xmake f -p linux --sdk=/user/toolsdk --ar=armv7-linux-ar
  729. </code></pre>
  730. <p>如果存在<code>AR</code>环境变量的话,会优先使用当前环境变量中指定的值。</p>
  731. <p><p class="tip"><br>如果指定的编译器名不是那些xmake内置可识别的名字(带有ar等字样),那么链接器工具检测就会失败。<br>这个时候我们可以通过:<code>xmake f --ar=ar@/home/xxx/armips.exe</code> 设置armips.exe链接器作为类ar的使用方式来编译。<br>也就是说,在指定链接器为<code>armips.exe</code>的同时,告诉xmake,它跟ar用法和参数选项基本相同。<br></p>
  732. </p>
  733. <h2 id="">全局配置</h2>
  734. <p>我们也可以将一些常用配置保存到全局配置中,来简化频繁地输入:</p>
  735. <p>例如:</p>
  736. <pre><code class="lang-bash">$ xmake g --ndk=~/files/android-ndk-r10e/
  737. </code></pre>
  738. <p>现在,我们重新配置和编译<code>android</code>程序:</p>
  739. <pre><code class="lang-bash">$ xmake f -p android
  740. $ xmake
  741. </code></pre>
  742. <p>以后,就不需要每次重复配置<code>--ndk=</code>参数了。</p>
  743. <p><p class="tip"><br> 每个命令都有其简写,例如: <code>xmake g</code> 或者 <code>xmake global</code>.<br><br></p>
  744. </p>
  745. <h2 id="">清除配置</h2>
  746. <p>有时候,配置出了问题编译不过,或者需要重新检测各种依赖库和接口,可以加上<code>-c</code>参数,清除缓存的配置,强制重新检测和配置</p>
  747. <pre><code class="lang-bash">$ xmake f -c
  748. $ xmake
  749. </code></pre>
  750. <p>或者:</p>
  751. <pre><code class="lang-bash">$ xmake f -p iphoneos -c
  752. $ xmake
  753. </code></pre>
  754. <h2 id="">导入导出配置</h2>
  755. <p>2.5.5 之后,我们还可以导入导出已经配置好的配置集,方便配置的快速迁移。</p>
  756. <h3 id="">导出配置</h3>
  757. <pre><code class="lang-bash">$ xmake f --export=/tmp/config.txt
  758. $ xmake f -m debug --xxx=y --export=/tmp/config.txt
  759. </code></pre>
  760. <h3 id="">导入配置</h3>
  761. <pre><code class="lang-bash">$ xmake f --import=/tmp/config.txt
  762. $ xmake f -m debug --xxx=y --import=/tmp/config.txt
  763. </code></pre>
  764. <h3 id="">导出配置(带菜单)</h3>
  765. <pre><code class="lang-bash">$ xmake f --menu --export=/tmp/config.txt
  766. $ xmake f --menu -m debug --xxx=y --export=/tmp/config.txt
  767. </code></pre>
  768. <h3 id="">导入配置(带菜单)</h3>
  769. <pre><code class="lang-bash">$ xmake f --menu --import=/tmp/config.txt
  770. $ xmake f --menu -m debug --xxx=y --import=/tmp/config.txt
  771. </code></pre>
  772. <h2 id="">环境变量</h2>
  773. <p>我们可以执行下面的命令,获取所有 xmake 用到的环境变量,以及当前被设置的值。</p>
  774. <pre><code class="lang-bash">$ xmake show -l envs
  775. XMAKE_RAMDIR Set the ramdisk directory.
  776. <empty>
  777. XMAKE_GLOBALDIR Set the global config directory of xmake.
  778. /Users/ruki
  779. XMAKE_ROOT Allow xmake to run under root.
  780. <empty>
  781. XMAKE_COLORTERM Set the color terminal environment.
  782. <empty>
  783. XMAKE_PKG_INSTALLDIR Set the install directory of packages.
  784. <empty>
  785. XMAKE_TMPDIR Set the temporary directory.
  786. /var/folders/vn/ppcrrcm911v8b4510klg9xw80000gn/T/.xmake501/211104
  787. XMAKE_PKG_CACHEDIR Set the cache directory of packages.
  788. <empty>
  789. XMAKE_PROGRAM_DIR Set the program scripts directory of xmake.
  790. /Users/ruki/.local/share/xmake
  791. XMAKE_PROFILE Start profiler, e.g. perf, trace.
  792. <empty>
  793. XMAKE_RCFILES Set the runtime configuration files.
  794. XMAKE_CONFIGDIR Set the local config directory of project.
  795. /Users/ruki/projects/personal/xmake-docs/.xmake/macosx/x86_64
  796. XMAKE_LOGFILE Set the log output file path.
  797. <empty>
  798. </code></pre>
  799. <h3 id="xmake_ramdir">XMAKE_RAMDIR</h3>
  800. <ul>
  801. <li>设置 ramdisk 目录路径</li>
  802. </ul>
  803. <p>ramdisk 目录是内存文件系统的目录位置,通常 <code>os.tmpdir()</code> 接口会用到,xmake 内部使用的临时文件,如果用户设置 ramdisk 路径,则会优先存储在这个上面,提升整体编译速度。</p>
  804. <h3 id="xmake_tmpdir">XMAKE_TMPDIR</h3>
  805. <ul>
  806. <li>设置用户的临时目录</li>
  807. </ul>
  808. <p>默认 xmake 会使用 <code>/tmp/.xmake</code> 和 <code>%TEMP%/.xmake</code>,当然用户可以通过这个变量去修改默认路径。</p>
  809. <h3 id="xmake_configdir">XMAKE_CONFIGDIR</h3>
  810. <ul>
  811. <li>设置本地工程配置目录</li>
  812. </ul>
  813. <p>每个项目的本地编译配置,默认会存储在当前项目根目录的 <code>.xmake</code> 路径下,然后根据不同的平台,架构区分,例如:</p>
  814. <pre><code class="lang-bash">.xmake/macosx/x86_64
  815. </code></pre>
  816. <p>我们如果不想存储在项目根目录,也可以自己设置到其他路径,比如 build 目录下等等。</p>
  817. <h3 id="xmake_globaldir">XMAKE_GLOBALDIR</h3>
  818. <ul>
  819. <li>设置全局配置文件根目录</li>
  820. </ul>
  821. <p>xmake将在该目录下创建 <code>.xmake</code>,作为 <code>xmake g/global</code> 全局配置的存储目录,还有安装包,缓存等其他全局文件,默认都会存储在这个目录下。</p>
  822. <p>默认路径为:<code>~</code>。</p>
  823. <h3 id="xmake_root">XMAKE_ROOT</h3>
  824. <ul>
  825. <li>允许用户在 root 模式下运行</li>
  826. </ul>
  827. <p>通常 xmake 是默认禁止在 root 下运行,这非常不安全。但是如果用户非要在 root 下运行,也可以设置这个变量,强制开启。</p>
  828. <pre><code class="lang-bash">export XMAKE_ROOT=y
  829. </code></pre>
  830. <h3 id="xmake_colorterm">XMAKE_COLORTERM</h3>
  831. <ul>
  832. <li>设置 Terminal 的色彩输出</li>
  833. </ul>
  834. <p>目前可以设置这几个值:</p>
  835. <table>
  836. <thead>
  837. <tr>
  838. <th>值</th>
  839. <th>描述</th>
  840. </tr>
  841. </thead>
  842. <tbody>
  843. <tr>
  844. <td>nocolor</td>
  845. <td>禁用彩色输出</td>
  846. </tr>
  847. <tr>
  848. <td>color8</td>
  849. <td>8 色输出支持</td>
  850. </tr>
  851. <tr>
  852. <td>color256</td>
  853. <td>256 色输出支持</td>
  854. </tr>
  855. <tr>
  856. <td>truecolor</td>
  857. <td>真彩色输出支持</td>
  858. </tr>
  859. </tbody>
  860. </table>
  861. <p>通常,用户不需要设置它们,xmake 会自动探测用户终端支持的色彩范围,如果用户不想输出色彩,可以设置 nocolor 来全局禁用。</p>
  862. <p>或者用 <code>xmake g --theme=plain</code> 也可以全局禁用。</p>
  863. <h3 id="xmake_pkg_installdir">XMAKE_PKG_INSTALLDIR</h3>
  864. <ul>
  865. <li>设置依赖包的安装根目录</li>
  866. </ul>
  867. <p>xmake 的远程包安装的全局目录默认是 <code>$XMAKE_GLOBALDIR/.xmake/packages</code>,但是用户也可以设置这个变量,去单独修改它。</p>
  868. <p>我们也可以使用 <code>xmake g --pkg_installdir=/xxx</code> 去设置它,效果是一样的。但环境变量的优先级高于此配置。</p>
  869. <h3 id="xmake_pkg_cachedir">XMAKE_PKG_CACHEDIR</h3>
  870. <ul>
  871. <li>设置依赖包的缓存目录</li>
  872. </ul>
  873. <p>默认路径在 <code>$XMAKE_GLOBALDIR/.xmake/cache</code> 目录,存储包安装过程中的各种缓存文件,比较占存储空间,用户也可以单独设置它。</p>
  874. <p>当然,xmake 在每个月都会自动清理上个月的所有缓存文件。</p>
  875. <h3 id="xmake_program_dir">XMAKE_PROGRAM_DIR</h3>
  876. <ul>
  877. <li>设置 xmake 的脚本目录</li>
  878. </ul>
  879. <p>xmake 的所有 lua 脚本随安装程序一起安装,默认都在安装目录下,但是如果想要切到自己下载的脚本目录下,方便本地修改调试,可以设置此变量。</p>
  880. <p>如果要查看当前 xmake 在使用的脚本目录,可以执行:</p>
  881. <pre><code class="lang-bash">$ xmake l os.programdir
  882. /Users/ruki/.local/share/xmake
  883. </code></pre>
  884. <h3 id="xmake_profile">XMAKE_PROFILE</h3>
  885. <ul>
  886. <li>开启性能分析</li>
  887. </ul>
  888. <p>这仅仅对 xmake 的开发者开放,用于分析 xmake 运行过程中的耗时情况,追踪调用过程。</p>
  889. <h4 id="">分析函数调用耗时</h4>
  890. <pre><code class="lang-bash">$ XMAKE_PROFILE=perf:call xmake
  891. [ 25%]: cache compiling.release src/main.cpp
  892. [ 50%]: linking.release test
  893. [100%]: build ok!
  894. 0.238, 97.93%, 1, runloop : @programdir/core/base/scheduler.lua: 805
  895. 0.180, 74.04%, 25, _resume : [C]: -1
  896. 0.015, 6.34%, 50, _co_groups_resume : @programdir/core/base/scheduler.lua: 299
  897. 0.011, 4.37%, 48, wait : @programdir/core/base/poller.lua: 111
  898. 0.004, 1.70%, 62, status : @programdir/core/base/scheduler.lua: 71
  899. 0.004, 1.53%, 38, is_dead : @programdir/core/base/scheduler.lua: 76
  900. 0.003, 1.44%, 50, next : @programdir/core/base/timer.lua: 74
  901. 0.003, 1.33%, 48, delay : @programdir/core/base/timer.lua: 60
  902. 0.002, 1.02%, 24, is_suspended : @programdir/core/base/scheduler.lua: 86
  903. </code></pre>
  904. <h4 id="">分析进程耗时</h4>
  905. <p>可以用于分析每个文件的编译耗时,以及一些运行瓶颈。</p>
  906. <pre><code class="lang-bash">$ XMAKE_PROFILE=perf:process xmake -r
  907. [ 7%]: compiling.release src/header.h
  908. [ 23%]: compiling.release src/test.cpp
  909. [ 30%]: compiling.release src/test8.cpp
  910. [ 38%]: compiling.release src/test4.cpp
  911. [ 46%]: compiling.release src/test5.cpp
  912. [ 53%]: compiling.release src/test7.cpp
  913. [ 61%]: compiling.release src/test6.cpp
  914. [ 69%]: compiling.release src/test2.cpp
  915. [ 76%]: compiling.release src/main.cpp
  916. [ 84%]: compiling.release test3.cpp
  917. [ 84%]: compiling.release src/test.c
  918. [ 92%]: linking.release main
  919. [100%]: build ok, spent 2.754s
  920. 1411.000, 22.19%, 1, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -c -Qunused-arguments -target x86_64-apple-macos15.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.1.sdk -fvisibility=hidden -fvisibility-inlines-hidden -O3 -std=c++11 -DNDEBUG -MMD -MF /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_37317EEDB62F4F3088AF6A2E2A649460 -fdiagnostics-color=always -x c++-header -o build/.objs/main/macosx/x86_64/release/src/cxx/header.h.pch src/header.h
  921. 508.000, 7.99%, 1, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -c -Qunused-arguments -target x86_64-apple-macos15.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.1.sdk -fvisibility=hidden -fvisibility-inlines-hidden -O3 -std=c++11 -include src/header.h -include-pch build/.objs/main/macosx/x86_64/release/src/cxx/header.h.pch -DNDEBUG -MMD -MF /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_1ABAE1FAD68D45008DC76A3A00697820 -fdiagnostics-color=always -o build/.objs/main/macosx/x86_64/release/src/main.cpp.o src/main.cpp
  922. 473.000, 7.44%, 1, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -c -Qunused-arguments -target x86_64-apple-macos15.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.1.sdk -fvisibility=hidden -fvisibility-inlines-hidden -O3 -std=c++11 -include src/header.h -include-pch build/.objs/main/macosx/x86_64/release/src/cxx/header.h.pch -DNDEBUG -MMD -MF /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_1C0BE5280C6F4E208F919577A48AAA40 -fdiagnostics-color=always -o build/.objs/main/macosx/x86_64/release/test3.cpp.o test3.cpp
  923. 451.000, 7.09%, 1, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -c -Qunused-arguments -target x86_64-apple-macos15.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.1.sdk -fvisibility=hidden -fvisibility-inlines-hidden -O3 -std=c++11 -include src/header.h -include-pch build/.objs/main/macosx/x86_64/release/src/cxx/header.h.pch -DNDEBUG -MMD -MF /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_877D3D9B6BBA4D308BFB5E4EBD751340 -fdiagnostics-color=always -o build/.objs/main/macosx/x86_64/release/src/test6.cpp.o src/test6.cpp
  924. 404.000, 6.35%, 1, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -c -Qunused-arguments -target x86_64-apple-macos15.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.1.sdk -fvisibility=hidden -fvisibility-inlines-hidden -O3 -std=c++11 -include src/header.h -include-pch build/.objs/main/macosx/x86_64/release/src/cxx/header.h.pch -DNDEBUG -MMD -MF /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_C9968E2873B648208A8C3F2BA7573640 -fdiagnostics-color=always -o build/.objs/main/macosx/x86_64/release/src/test7.cpp.o src/test7.cpp
  925. 402.000, 6.32%, 1, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -c -Qunused-arguments -target x86_64-apple-macos15.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.1.sdk -fvisibility=hidden -fvisibility-inlines-hidden -O3 -std=c++11 -include src/header.h -include-pch build/.objs/main/macosx/x86_64/release/src/cxx/header.h.pch -DNDEBUG -MMD -MF /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_7F6DFA37FF494D208EADF9737484EC40 -fdiagnostics-color=always -o build/.objs/main/macosx/x86_64/release/src/test2.cpp.o src/test2.cpp
  926. 383.000, 6.02%, 1, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -c -Qunused-arguments -target x86_64-apple-macos15.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.1.sdk -fvisibility=hidden -fvisibility-inlines-hidden -O3 -std=c++11 -include src/header.h -include-pch build/.objs/main/macosx/x86_64/release/src/cxx/header.h.pch -DNDEBUG -MMD -MF /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_63C9E23AE7E047308F762C7C02A56B50 -fdiagnostics-color=always -o build/.objs/main/macosx/x86_64/release/src/test4.cpp.o src/test4.cpp
  927. 374.000, 5.88%, 1, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -c -Qunused-arguments -target x86_64-apple-macos15.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.1.sdk -fvisibility=hidden -fvisibility-inlines-hidden -O3 -std=c++11 -include src/header.h -include-pch build/.objs/main/macosx/x86_64/release/src/cxx/header.h.pch -DNDEBUG -MMD -MF /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_C3A0EF96A7C14D00879BFAEFD26E9D20 -fdiagnostics-color=always -o build/.objs/main/macosx/x86_64/release/src/test8.cpp.o src/test8.cpp
  928. 368.000, 5.79%, 1, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -c -Qunused-arguments -target x86_64-apple-macos15.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.1.sdk -fvisibility=hidden -fvisibility-inlines-hidden -O3 -std=c++11 -include src/header.h -include-pch build/.objs/main/macosx/x86_64/release/src/cxx/header.h.pch -DNDEBUG -MMD -MF /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_BADB46AF75CB4610857EF5083BD54D30 -fdiagnostics-color=always -o build/.objs/main/macosx/x86_64/release/src/test.cpp.o src/test.cpp
  929. 363.000, 5.71%, 1, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -c -Qunused-arguments -target x86_64-apple-macos15.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.1.sdk -fvisibility=hidden -fvisibility-inlines-hidden -O3 -std=c++11 -include src/header.h -include-pch build/.objs/main/macosx/x86_64/release/src/cxx/header.h.pch -DNDEBUG -MMD -MF /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_0247BDB87DD14500816471184D4E8140 -fdiagnostics-color=always -o build/.objs/main/macosx/x86_64/release/src/test5.cpp.o src/test5.cpp
  930. 156.000, 2.45%, 1, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -fPIC -Qunused-arguments -target x86_64-apple-macos15.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.1.sdk -S -o /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_F0FF8220B33B46208D39A98937D55E50 /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_F3443E45635A466AA3BEAE9DE99B4339.c
  931. 133.000, 2.09%, 3, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang --version
  932. 107.000, 1.68%, 1, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -O3 -Qunused-arguments -target x86_64-apple-macos15.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.1.sdk -S -o /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_C8A96266E0034C20898C147FC52F3A40 /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_F3443E45635A466AA3BEAE9DE99B4339.c
  933. 105.000, 1.65%, 1, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -fdiagnostics-color=always -Qunused-arguments -target x86_64-apple-macos15.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.1.sdk -S -o /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_48A2FA7BE7AB44008B60558E412A9D30 /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_F3443E45635A466AA3BEAE9DE99B4339.c
  934. 105.000, 1.65%, 1, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -fPIC -target x86_64-apple-macos15.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.1.sdk -lz -target x86_64-apple-macos15.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.1.sdk -lz -o /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_F510FB15C9A647108111A7010EFED240 /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_F3443E45635A466AA3BEAE9DE99B4339.cpp
  935. 91.000, 1.43%, 3, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ --version
  936. 74.000, 1.16%, 1, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -c -Qunused-arguments -target x86_64-apple-macos15.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.1.sdk -fvisibility=hidden -O3 -DNDEBUG -MMD -MF /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_BF6B4B6DACB843008E822CEFDC711230 -fdiagnostics-color=always -o build/.objs/main/macosx/x86_64/release/src/test.c.o src/test.c
  937. 73.000, 1.15%, 1, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -o build/macosx/x86_64/release/main build/.objs/main/macosx/x86_64/release/src/test.cpp.o build/.objs/main/macosx/x86_64/release/src/test8.cpp.o build/.objs/main/macosx/x86_64/release/src/test4.cpp.o build/.objs/main/macosx/x86_64/release/src/test5.cpp.o build/.objs/main/macosx/x86_64/release/src/test7.cpp.o build/.objs/main/macosx/x86_64/release/src/test6.cpp.o build/.objs/main/macosx/x86_64/release/src/test2.cpp.o build/.objs/main/macosx/x86_64/release/src/main.cpp.o build/.objs/main/macosx/x86_64/release/test3.cpp.o build/.objs/main/macosx/x86_64/release/src/test.c.o -target x86_64-apple-macos15.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.1.sdk -lz -Wl,-x -Wl,-dead_strip
  938. 70.000, 1.10%, 1, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -fPIC -Qunused-arguments -target x86_64-apple-macos15.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.1.sdk -S -o /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_6D0B6327841A47208939EEF194F38B50 /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_F3443E45635A466AA3BEAE9DE99B4339.cpp
  939. 68.000, 1.07%, 1, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -O3 -Qunused-arguments -target x86_64-apple-macos15.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.1.sdk -S -o /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_8AB279F8450D4D108E92951CC9C1C650 /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_F3443E45635A466AA3BEAE9DE99B4339.cpp
  940. 65.000, 1.02%, 1, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -fdiagnostics-color=always -Qunused-arguments -target x86_64-apple-macos15.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.1.sdk -S -o /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_D25F0DB04D6D430084C098F1E1F76C00 /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/241220/_F3443E45635A466AA3BEAE9DE99B4339.cpp
  941. </code></pre>
  942. <h4 id="xmake">追踪 xmake 的运行过程</h4>
  943. <pre><code class="lang-bash">$ XMAKE_PROFILE=trace xmake
  944. func : @programdir/core/base/scheduler.lua: 457
  945. is_suspended : @programdir/core/base/scheduler.lua: 86
  946. status : @programdir/core/base/scheduler.lua: 71
  947. thread : @programdir/core/base/scheduler.lua: 66
  948. thread : @programdir/core/base/scheduler.lua: 66
  949. length : @programdir/core/base/heap.lua: 120
  950. </code></pre>
  951. <h4 id="">分析运行卡死问题</h4>
  952. <p>可以用于获取 xmake 运行卡死时的栈。启用此特性后,通过 Ctrl+C 中断后就能获取栈。</p>
  953. <pre><code class="lang-bash">$ XMAKE_PROFILE=stuck xmake l test.lua
  954. <Ctrl+C>
  955. stack traceback:
  956. [C]: in function &#39;base/io.file_read&#39;
  957. @programdir/core/base/io.lua:177: in method &#39;_read&#39;
  958. @programdir/core/sandbox/modules/io.lua:90: in function <@programdir/core/sandbox/module
  959. s/io.lua:89>
  960. (...tail calls...)
  961. /Users/ruki/share/test.lua:2: in function </Users/ruki/share/test.lua:1>
  962. (...tail calls...)
  963. @programdir/plugins/lua/main.lua:123: in function <@programdir/plugins/lua/main.lua:79>
  964. (...tail calls...)
  965. [C]: in function &#39;xpcall&#39;
  966. @programdir/core/base/utils.lua:280: in function &#39;sandbox/modules/utils.trycall&#39;
  967. (...tail calls...)
  968. @programdir/core/base/task.lua:519: in function &#39;base/task.run&#39;
  969. @programdir/core/main.lua:278: in upvalue &#39;cotask&#39;
  970. @programdir/core/base/scheduler.lua:371: in function <@programdir/core/base/scheduler.lu
  971. a:368>
  972. </code></pre>
  973. <h3 id="xmake_rcfiles">XMAKE_RCFILES</h3>
  974. <ul>
  975. <li>设置全局配置文件</li>
  976. </ul>
  977. <p>我们可以设置一些 xmakerc.lua 全局配置文件,在用户编译项目的时候,全局引入它们,比如全局引入一些用户自定义的帮助脚本,工具链什么的。</p>
  978. <pre><code class="lang-bash">$ export XMAKE_RCFILES=xmakerc.lua
  979. $ xmake
  980. </code></pre>
  981. <p>如果不设置此环境变量,用户可以在<code>/etc/xmakerc.lua</code>、<code>~/xmakerc.lua</code>与<code>$XMAKE_GLOBALDIR/.xmake/xmakerc.lua</code>设置全局配置文件,搜索优先级从高至低排列。</p>
  982. <h3 id="xmake_logfile">XMAKE_LOGFILE</h3>
  983. <ul>
  984. <li>设置日志文件路径</li>
  985. </ul>
  986. <p>默认 xmake 会回显输出到终端,我们在可以通过设置这个路径,开启日志自动存储到指定文件,但它不会影响终端的正常回显输出。</p>
  987. <h3 id="xmake_main_repo">XMAKE_MAIN_REPO</h3>
  988. <ul>
  989. <li>设置官方包主仓库地址</li>
  990. </ul>
  991. <p>xmake 默认内置了三个主仓库地址,它们是完全相同的,xmake 会根据当前网络状态选择最优的地址来使用。</p>
  992. <pre><code>https://github.com/xmake-io/xmake-repo.git
  993. https://gitlab.com/tboox/xmake-repo.git
  994. https://gitee.com/tboox/xmake-repo.git
  995. </code></pre><p>但如果 xmake 选择错误,可能会导致仓库下载失败,而通过这个环境变量,我们可以自己设置固定使用指定的仓库地址,不再进行自动选择。</p>
  996. <pre><code class="lang-bash">$ export XMAKE_MAIN_REPO = https://github.com/xmake-io/xmake-repo.git
  997. </code></pre>
  998. <h3 id="xmake_binary_repo">XMAKE_BINARY_REPO</h3>
  999. <ul>
  1000. <li>设置官方包预编译仓库地址</li>
  1001. </ul>
  1002. <p>类似 <code>XMAKE_MAIN_REPO</code>,唯一的区别是,这个用于切换预编译仓库的地址。</p>
  1003. <pre><code class="lang-bash">$ export XMAKE_BINARY_REPO = https://github.com/xmake-mirror/build-artifacts.git
  1004. </code></pre>
  1005. <h3 id="xmake_theme">XMAKE_THEME</h3>
  1006. <ul>
  1007. <li>设置主题</li>
  1008. </ul>
  1009. <p>通常我们可以通过 <code>xmake g --theme=plain</code> 来设置颜色主题,但是它是全局的,如果想单独对当前终端会话设置,我们就可以使用这个环境变量来设置。</p>
  1010. <pre><code class="lang-bash">$ export XMAKE_THEME=plain
  1011. </code></pre>
  1012. <h3 id="xmake_stats">XMAKE_STATS</h3>
  1013. <ul>
  1014. <li>开启或禁用用户量统计</li>
  1015. </ul>
  1016. <p>由于目前 xmake 还在发展初期,我们需要知道大概的用户量增长情况,以便于提供我们持续更新 xmake 的动力。</p>
  1017. <p>因此 xmake 默认每天的第一次项目构建,会在后台进程自动 git clone 一个空仓库:<a href="https://github.com/xmake-io/xmake-stats">https://github.com/xmake-io/xmake-stats</a></p>
  1018. <p>然后借用 github 自身提供的 Traffic 统计图表来获取大概的用户量。</p>
  1019. <p>对于每个项目,每天只会统计一次,并且不会泄露任何用户隐私,因为仅仅只是多了一次额外的 git clone 操作,另外我们 clone 的是一个空仓库,不会耗费用户多少流量。</p>
  1020. <p>当然,并不是每个用户都希望这么做,用户完全有权利去禁用这个行为,我们只需要设置:</p>
  1021. <pre><code class="lang-bash">export XMAKE_STATS=n
  1022. </code></pre>
  1023. <p>就可以完全禁用它,另外我们也会在 ci 上自动禁用这个行为。</p>
  1024. <p>什么时候移除它?</p>
  1025. <p>这个行为并不会永久存在,等到 xmake 有了足够多的用户量,或者有了其他更好的统计方式,我们会考虑移除相关统计代码。</p>
  1026. <p>当然,如果有非常多的用户反馈不愿意接受它,我们也会考虑移除它。</p>
  1027. <p>关于这个的相关 issues 见:<a href="https://github.com/xmake-io/xmake/issues/1795">#1795</a></p>
  1028. </article>
  1029. </body>
  1030. </html>