custom_toolchain.html 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  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/manual/custom_toolchain">https://xmake.io/#/zh-cn/manual/custom_toolchain</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>在2.3.4版本之后,xmake已经支持在用户的项目xmake.lua中自定义工具链,例如:</p>
  86. <pre><code class="lang-lua">-- define toolchain
  87. toolchain("myclang")
  88. -- mark as standalone toolchain
  89. set_kind("standalone")
  90. -- set toolset
  91. set_toolset("cc", "clang")
  92. set_toolset("cxx", "clang", "clang++")
  93. set_toolset("ld", "clang++", "clang")
  94. set_toolset("sh", "clang++", "clang")
  95. set_toolset("ar", "ar")
  96. set_toolset("ex", "ar")
  97. set_toolset("strip", "strip")
  98. set_toolset("mm", "clang")
  99. set_toolset("mxx", "clang", "clang++")
  100. set_toolset("as", "clang")
  101. add_defines("MYCLANG")
  102. -- check toolchain
  103. on_check(function (toolchain)
  104. return import("lib.detect.find_tool")("clang")
  105. end)
  106. -- on load
  107. on_load(function (toolchain)
  108. -- get march
  109. local march = is_arch("x86_64", "x64") and "-m64" or "-m32"
  110. -- init flags for c/c++
  111. toolchain:add("cxflags", march)
  112. toolchain:add("ldflags", march)
  113. toolchain:add("shflags", march)
  114. if not is_plat("windows") and os.isdir("/usr") then
  115. for _, includedir in ipairs({"/usr/local/include", "/usr/include"}) do
  116. if os.isdir(includedir) then
  117. toolchain:add("includedirs", includedir)
  118. end
  119. end
  120. for _, linkdir in ipairs({"/usr/local/lib", "/usr/lib"}) do
  121. if os.isdir(linkdir) then
  122. toolchain:add("linkdirs", linkdir)
  123. end
  124. end
  125. end
  126. -- init flags for objc/c++ (with ldflags and shflags)
  127. toolchain:add("mxflags", march)
  128. -- init flags for asm
  129. toolchain:add("asflags", march)
  130. end)
  131. </code></pre>
  132. <p>然后通过下面的命令切到自己定义的工具链就行了:</p>
  133. <pre><code class="lang-bash">$ xmake f --toolchain=myclang
  134. </code></pre>
  135. <p>当然,我们也可以通过<code>set_toolchains</code>接口直接对指定target切换设置到自定义工具链。</p>
  136. <p>在自定义工具前,我们可以通过先运行以下命令,查看完整的内置工具链列表,确保xmake没有提供,如果有的话,直接使用就行了,没必要自己定义:</p>
  137. <pre><code class="lang-bash">$ xmake show -l toolchains
  138. </code></pre>
  139. <p>下面是自定义toolchain目前支持的接口列表:</p>
  140. <table>
  141. <thead>
  142. <tr>
  143. <th>接口</th>
  144. <th>描述</th>
  145. <th>支持版本</th>
  146. </tr>
  147. </thead>
  148. <tbody>
  149. <tr>
  150. <td><a href="#toolchain">toolchain</a></td>
  151. <td>定义工具链</td>
  152. <td>>= 2.3.4</td>
  153. </tr>
  154. <tr>
  155. <td><a href="#toolchainset_kind">set_kind</a></td>
  156. <td>设置工具链类型</td>
  157. <td>>= 2.3.4</td>
  158. </tr>
  159. <tr>
  160. <td><a href="#toolchainset_toolset">set_toolset</a></td>
  161. <td>设置工具集</td>
  162. <td>>= 2.3.4</td>
  163. </tr>
  164. <tr>
  165. <td><a href="#toolchainset_sdkdir">set_sdkdir</a></td>
  166. <td>设置工具链sdk目录路径</td>
  167. <td>>= 2.3.4</td>
  168. </tr>
  169. <tr>
  170. <td><a href="#toolchainset_bindir">set_bindir</a></td>
  171. <td>设置工具链bin目录路径</td>
  172. <td>>= 2.3.4</td>
  173. </tr>
  174. <tr>
  175. <td><a href="#toolchainon_check">on_check</a></td>
  176. <td>检测工具链</td>
  177. <td>>= 2.3.4</td>
  178. </tr>
  179. <tr>
  180. <td><a href="#toolchainonon_load">on_load</a></td>
  181. <td>加载工具链</td>
  182. <td>>= 2.3.4</td>
  183. </tr>
  184. <tr>
  185. <td><a href="#toolchain_end">toolchain_end</a></td>
  186. <td>结束定义工具链</td>
  187. <td>>= 2.3.4</td>
  188. </tr>
  189. <tr>
  190. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_includedirs">add_includedirs</a></td>
  191. <td>添加头文件搜索目录</td>
  192. <td>>= 2.3.4</td>
  193. </tr>
  194. <tr>
  195. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_defines">add_defines</a></td>
  196. <td>添加宏定义</td>
  197. <td>>= 2.3.4</td>
  198. </tr>
  199. <tr>
  200. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_undefines">add_undefines</a></td>
  201. <td>取消宏定义</td>
  202. <td>>= 2.3.4</td>
  203. </tr>
  204. <tr>
  205. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_cflags">add_cflags</a></td>
  206. <td>添加c编译选项</td>
  207. <td>>= 2.3.4</td>
  208. </tr>
  209. <tr>
  210. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_cxflags">add_cxflags</a></td>
  211. <td>添加c/c++编译选项</td>
  212. <td>>= 2.3.4</td>
  213. </tr>
  214. <tr>
  215. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_cxxflags">add_cxxflags</a></td>
  216. <td>添加c++编译选项</td>
  217. <td>>= 2.3.4</td>
  218. </tr>
  219. <tr>
  220. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_mflags">add_mflags</a></td>
  221. <td>添加objc编译选项</td>
  222. <td>>= 2.3.4</td>
  223. </tr>
  224. <tr>
  225. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_mxflags">add_mxflags</a></td>
  226. <td>添加objc/objc++编译选项</td>
  227. <td>>= 2.3.4</td>
  228. </tr>
  229. <tr>
  230. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_mxxflags">add_mxxflags</a></td>
  231. <td>添加objc++编译选项</td>
  232. <td>>= 2.3.4</td>
  233. </tr>
  234. <tr>
  235. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_scflags">add_scflags</a></td>
  236. <td>添加swift编译选项</td>
  237. <td>>= 2.3.4</td>
  238. </tr>
  239. <tr>
  240. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_asflags">add_asflags</a></td>
  241. <td>添加汇编编译选项</td>
  242. <td>>= 2.3.4</td>
  243. </tr>
  244. <tr>
  245. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_gcflags">add_gcflags</a></td>
  246. <td>添加go编译选项</td>
  247. <td>>= 2.3.4</td>
  248. </tr>
  249. <tr>
  250. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_dcflags">add_dcflags</a></td>
  251. <td>添加dlang编译选项</td>
  252. <td>>= 2.3.4</td>
  253. </tr>
  254. <tr>
  255. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_rcflags">add_rcflags</a></td>
  256. <td>添加rust编译选项</td>
  257. <td>>= 2.3.4</td>
  258. </tr>
  259. <tr>
  260. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_cuflags">add_cuflags</a></td>
  261. <td>添加cuda编译选项</td>
  262. <td>>= 2.3.4</td>
  263. </tr>
  264. <tr>
  265. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_culdflags">add_culdflags</a></td>
  266. <td>添加cuda设备链接选项</td>
  267. <td>>= 2.3.4</td>
  268. </tr>
  269. <tr>
  270. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_ldflags">add_ldflags</a></td>
  271. <td>添加链接选项</td>
  272. <td>>= 2.3.4</td>
  273. </tr>
  274. <tr>
  275. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_arflags">add_arflags</a></td>
  276. <td>添加静态库归档选项</td>
  277. <td>>= 2.3.4</td>
  278. </tr>
  279. <tr>
  280. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_shflags">add_shflags</a></td>
  281. <td>添加动态库链接选项</td>
  282. <td>>= 2.3.4</td>
  283. </tr>
  284. <tr>
  285. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_languages">add_languages</a></td>
  286. <td>添加语言标准</td>
  287. <td>>= 2.3.4</td>
  288. </tr>
  289. <tr>
  290. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_frameworks">add_frameworks</a></td>
  291. <td>添加链接框架</td>
  292. <td>>= 2.3.4</td>
  293. </tr>
  294. <tr>
  295. <td><a href="/mirror/zh-cn/manual/project_target.html#targetadd_frameworkdirs">add_frameworkdirs</a></td>
  296. <td>添加链接框架</td>
  297. <td>>= 2.3.4</td>
  298. </tr>
  299. </tbody>
  300. </table>
  301. <h3 id="toolchain">toolchain</h3>
  302. <h4 id="">定义工具链</h4>
  303. <p>可以在用户项目xmake.lua中定义,也可以通过includes独立到单独的xmake.lua去专门定义各种工具链</p>
  304. <pre><code class="lang-lua">toolchain("myclang")
  305. set_toolset("cc", "clang")
  306. set_toolset("cxx", "clang", "clang++")
  307. toolchain_end()
  308. </code></pre>
  309. <h4 id="">定义交叉工具链</h4>
  310. <p>我们也可以在 xmake.lua 中针对不同的交叉工具链sdk进行自定义配置,通常只需要指定 sdkdir,xmake就可以自动检测其他的配置,比如 cross 等信息,例如:</p>
  311. <pre><code class="lang-lua">toolchain("my_toolchain")
  312. set_kind("standalone")
  313. set_sdkdir("/tmp/arm-linux-musleabi-cross")
  314. toolchain_end()
  315. target("hello")
  316. set_kind("binary")
  317. add_files("apps/hello/*.c")
  318. </code></pre>
  319. <p>这是一个最精简的交叉工具链配置,仅仅设置了对应的sdk路径,然后通过 <code>set_kind("standalone")</code> 将其标记为完整独立的工具链。</p>
  320. <p>这个时候,我们就可以通过命令行 <code>--toolchain=my_toolchain</code> 去手动切换到此工具链来使用。</p>
  321. <pre><code class="lang-console">xmake f --toolchain=my_toolchain
  322. xmake
  323. </code></pre>
  324. <p>另外,我们还可以直接在 xmake.lua 中通过 <code>set_toolchains</code> 将其绑定到对应的 target 上去,那么仅仅只在编译此 target 时候,才会切换到我们自定义的工具链。</p>
  325. <pre><code class="lang-lua">toolchain("my_toolchain")
  326. set_kind("standalone")
  327. set_sdkdir("/tmp/arm-linux-musleabi-cross")
  328. toolchain_end()
  329. target("hello")
  330. set_kind("binary")
  331. add_files("apps/hello/*.c")
  332. set_toolchains("my_toolchain")
  333. </code></pre>
  334. <p>这样,我们不再需要手动切换工具链了,只需要执行 xmake,就会默认自动切换到 my_toolchain 工具链。</p>
  335. <p>这对于嵌入式开发来讲尤其有用,因为嵌入式平台的交叉编译工具链非常多,我们经常需要各种切换来完成不同平台的编译。</p>
  336. <p>因此,我们可以将所有的工具链定义放置到独立的 lua 文件中去定义,例如:</p>
  337. <pre><code>projectdir
  338. - xmake.lua
  339. - toolchains
  340. - my_toolchain1.lua
  341. - my_toolchain2.lua
  342. - ...
  343. </code></pre><p>然后,我们只需要再 xmake.lua 中通过 includes 去引入它们,并根据不同的自定义平台,绑定不同的工具链:</p>
  344. <pre><code class="lang-lua">includes("toolchains/*.lua")
  345. target("hello")
  346. set_kind("binary")
  347. add_files("apps/hello/*.c")
  348. if is_plat("myplat1") then
  349. set_toolchains("my_toolchain1")
  350. elseif is_plat("myplat2") then
  351. set_toolchains("my_toolchain2")
  352. end
  353. </code></pre>
  354. <p>这样,我们就可以编译的时候,直接快速切换指定平台,来自动切换对应的工具链了。</p>
  355. <pre><code class="lang-console">xmake f -p myplat1
  356. xmake
  357. </code></pre>
  358. <p>如果,有些交叉编译工具链结构复杂,自动检测还不足够,那么可以根据实际情况,使用 <code>set_toolset</code>, <code>set_cross</code> 和 <code>set_bindir</code> 等接口,针对性的配置上其他的设置。</p>
  359. <p>例如下面的例子,我们还额外添加了一些 cxflags/ldflags 以及内置的系统库 links。</p>
  360. <pre><code class="lang-lua">toolchain("my_toolchain")
  361. set_kind("standalone")
  362. set_sdkdir("/tmp/arm-linux-musleabi-cross")
  363. on_load(function (toolchain)
  364. -- add flags for arch
  365. if toolchain:is_arch("arm") then
  366. toolchain:add("cxflags", "-march=armv7-a", "-msoft-float", {force = true})
  367. toolchain:add("ldflags", "-march=armv7-a", "-msoft-float", {force = true})
  368. end
  369. toolchain:add("ldflags", "--static", {force = true})
  370. toolchain:add("syslinks", "gcc", "c")
  371. end)
  372. </code></pre>
  373. <p>更多自定义工具链的例子,我们可以看下面的接口文档,也可以到 xmake 的源码的目录参考内置的工具链定义:<a href="https://github.com/xmake-io/xmake/blob/master/xmake/toolchains/">内部工具链列表</a></p>
  374. <h3 id="toolchainset_kind">toolchain:set_kind</h3>
  375. <h4 id="">设置工具链类型</h4>
  376. <p>目前仅支持设置为<code>standalone</code>类型,表示当前工具链是独立完整的工具链,包括cc/cxx/ld/sh/ar等编译器、归档器、链接器等一整套工具集的配置。</p>
  377. <p>通常用于某个target被同时设置了多个工具链的情况,但同时只能生效一个独立工具链,通过此配置可以保证生效的工具链存在互斥关系,比如gcc/clang工具链不会同时生效。</p>
  378. <p>而像yasm/nasm这种局部工具链,属于附加的局部工具链扩展,不用设置standalone,因为clang/yasm两个工具链有可能同时存在。</p>
  379. <p>!> 只要记住,存在完整编译环境的工具链,都设置为standalone就行了</p>
  380. <h3 id="toolchainset_toolset">toolchain:set_toolset</h3>
  381. <h4 id="">设置工具集</h4>
  382. <p>用于设置每个单独工具名和路径,例如:</p>
  383. <pre><code class="lang-lua">toolchain("myclang")
  384. set_kind("standalone")
  385. set_toolset("cc", "clang")
  386. set_toolset("cxx", "clang", "clang++")
  387. set_toolset("ld", "clang++", "clang")
  388. set_toolset("sh", "clang++", "clang")
  389. set_toolset("ar", "ar")
  390. set_toolset("ex", "ar")
  391. set_toolset("strip", "strip")
  392. set_toolset("mm", "clang")
  393. set_toolset("mxx", "clang", "clang++")
  394. set_toolset("as", "clang")
  395. </code></pre>
  396. <p>关于这个接口的详情,可以看下:<a href="/mirror/zh-cn/manual/project_target.html#targetset_toolset">target.set_toolset</a></p>
  397. <h3 id="toolchainset_sdkdir">toolchain:set_sdkdir</h3>
  398. <h4 id="sdk">设置工具链sdk目录路径</h4>
  399. <p>通常我们可以通过<code>xmake f --toolchain=myclang --sdk=xxx</code>来配置sdk目录,但是每次配置比较繁琐,我们也可以通过此接口预先配置到xmake.lua中去,方便快速切换使用。</p>
  400. <pre><code class="lang-lua">toolchain("myclang")
  401. set_kind("standalone")
  402. set_sdkdir("/tmp/sdkdir")
  403. set_toolset("cc", "clang")
  404. </code></pre>
  405. <h3 id="toolchainset_bindir">toolchain:set_bindir</h3>
  406. <h4 id="bin">设置工具链bin目录路径</h4>
  407. <p>通常我们可以通过<code>xmake f --toolchain=myclang --bin=xxx</code>来配置sdk目录,但是每次配置比较繁琐,我们也可以通过此接口预先配置到xmake.lua中去,方便快速切换使用。</p>
  408. <pre><code class="lang-lua">toolchain("myclang")
  409. set_kind("standalone")
  410. set_bindir("/tmp/sdkdir/bin")
  411. set_toolset("cc", "clang")
  412. </code></pre>
  413. <h3 id="toolchainon_check">toolchain:on_check</h3>
  414. <h4 id="">检测工具链</h4>
  415. <p>用于检测指定工具链所在sdk或者程序在当前系统上是否存在,通常用于多个standalone工具链的情况,进行自动探测和选择有效工具链。</p>
  416. <p>而对于<code>xmake f --toolchain=myclang</code>手动指定的场景,此检测配置不是必须的,可以省略。</p>
  417. <pre><code class="lang-lua">toolchain("myclang")
  418. on_check(function (toolchain)
  419. return import("lib.detect.find_tool")("clang")
  420. end)
  421. </code></pre>
  422. <h3 id="toolchainon_load">toolchain:on_load</h3>
  423. <h4 id="">加载工具链</h4>
  424. <p>对于一些复杂的场景,我们可以在on_load中动态灵活的设置各种工具链配置,比在描述域设置更加灵活,更加强大:</p>
  425. <pre><code class="lang-lua">toolchain("myclang")
  426. set_kind("standalone")
  427. on_load(function (toolchain)
  428. -- set toolset
  429. toolchain:set("toolset", "cc", "clang")
  430. toolchain:set("toolset", "ld", "clang++")
  431. -- init flags
  432. local march = toolchain:is_arch("x86_64", "x64") and "-m64" or "-m32"
  433. toolchain:add("cxflags", march)
  434. toolchain:add("ldflags", march)
  435. toolchain:add("shflags", march)
  436. end)
  437. </code></pre>
  438. <h3 id="toolchain_end">toolchain_end</h3>
  439. <h4 id="">结束定义工具链</h4>
  440. <p>这个是可选的,如果想要手动结束toolchain的定义,可以调用它:</p>
  441. <pre><code class="lang-lua">toolchain("myclang")
  442. -- ..
  443. toolchain_end()
  444. </code></pre>
  445. </article>
  446. </body>
  447. </html>