builtin_variables.html 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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/builtin_variables">https://xmake.io/#/zh-cn/manual/builtin_variables</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>xmake提供了 <code>$(varname)</code> 的语法,来支持内置变量的获取,例如:</p>
  86. <pre><code class="lang-lua">add_cxflags("-I$(buildir)")
  87. </code></pre>
  88. <p>它将会在在实际编译的时候,将内置的 <code>buildir</code> 变量转换为实际的构建输出目录:<code>-I./build</code></p>
  89. <p>一般内置变量可用于在传参时快速获取和拼接变量字符串,例如:</p>
  90. <pre><code class="lang-lua">target("test")
  91. -- 添加工程源码目录下的源文件
  92. add_files("$(projectdir)/src/*.c")
  93. -- 添加构建目录下的头文件搜索路径
  94. add_includedirs("$(buildir)/inc")
  95. </code></pre>
  96. <p>也可以在自定义脚本的模块接口中使用,例如:</p>
  97. <pre><code class="lang-lua">target("test")
  98. on_run(function (target)
  99. -- 复制当前脚本目录下的头文件到输出目录
  100. os.cp("$(scriptdir)/xxx.h", "$(buildir)/inc")
  101. end)
  102. </code></pre>
  103. <p>所有的内置变量,也可以通过<a href="#val">val</a>接口,来获取他们的值。</p>
  104. <p>这种使用内置变量的方式,使得描述编写更加的简洁易读,下面是一些xmake内置的变量,可以直接获取:</p>
  105. <table>
  106. <thead>
  107. <tr>
  108. <th>接口</th>
  109. <th>描述</th>
  110. <th>支持版本</th>
  111. </tr>
  112. </thead>
  113. <tbody>
  114. <tr>
  115. <td><a href="#varos">$(os)</a></td>
  116. <td>获取当前编译平台的操作系统</td>
  117. <td>>= 2.0.1</td>
  118. </tr>
  119. <tr>
  120. <td><a href="#varhost">$(host)</a></td>
  121. <td>获取本机操作系统</td>
  122. <td>>= 2.0.1</td>
  123. </tr>
  124. <tr>
  125. <td><a href="#vartmpdir">$(tmpdir)</a></td>
  126. <td>获取临时目录</td>
  127. <td>>= 2.0.1</td>
  128. </tr>
  129. <tr>
  130. <td><a href="#varcurdir">$(curdir)</a></td>
  131. <td>获取当前目录</td>
  132. <td>>= 2.0.1</td>
  133. </tr>
  134. <tr>
  135. <td><a href="#varbuildir">$(buildir)</a></td>
  136. <td>获取构建输出目录</td>
  137. <td>>= 2.0.1</td>
  138. </tr>
  139. <tr>
  140. <td><a href="#varscriptdir">$(scriptdir)</a></td>
  141. <td>获取工程描述脚本目录</td>
  142. <td>>= 2.1.1</td>
  143. </tr>
  144. <tr>
  145. <td><a href="#varglobaldir">$(globaldir)</a></td>
  146. <td>获取全局配置目录</td>
  147. <td>>= 2.0.1</td>
  148. </tr>
  149. <tr>
  150. <td><a href="#varconfigdir">$(configdir)</a></td>
  151. <td>获取本地工程配置目录</td>
  152. <td>>= 2.0.1</td>
  153. </tr>
  154. <tr>
  155. <td><a href="#varprogramdir">$(programdir)</a></td>
  156. <td>xmake安装脚本目录</td>
  157. <td>>= 2.1.5</td>
  158. </tr>
  159. <tr>
  160. <td><a href="#varprojectdir">$(projectdir)</a></td>
  161. <td>获取工程根目录</td>
  162. <td>>= 2.0.1</td>
  163. </tr>
  164. <tr>
  165. <td><a href="#varshell">$(shell)</a></td>
  166. <td>执行外部shell命令</td>
  167. <td>>= 2.0.1</td>
  168. </tr>
  169. <tr>
  170. <td><a href="#varenv">$(env)</a></td>
  171. <td>获取外部环境变量</td>
  172. <td>>= 2.1.5</td>
  173. </tr>
  174. <tr>
  175. <td><a href="#varreg">$(reg)</a></td>
  176. <td>获取windows注册表配置项的值</td>
  177. <td>>= 2.1.5</td>
  178. </tr>
  179. </tbody>
  180. </table>
  181. <p>当然这种变量模式,也是可以扩展的,默认通过<code>xmake f --var=val</code>命令,配置的参数都是可以直接获取,例如:</p>
  182. <pre><code class="lang-lua">target("test")
  183. add_defines("-DTEST=$(var)")
  184. </code></pre>
  185. <p><p class="tip"><br>所有<code>xmake f --xxx=...</code>配置的参数值,都是可以通过内置变量获取到,例如:<code>xmake f --arch=x86</code>对应<code>$(arch)</code>,其他的还有<code>$(plat)</code>, <code>$(mode)</code>等等。<br>具体有哪些参数,可以通过:<code>xmake f -h</code>才查看。<br></p>
  186. </p>
  187. <p>既然支持直接从配置选项中获取,那么当然也就能很方便的扩展自定义的选项,来获取自定义的变量了,具体如何自定义选项见:<a href="#option">option</a></p>
  188. <h3 id="varos">var.$(os)</h3>
  189. <h4 id="">获取当前编译平台的操作系统</h4>
  190. <p>如果当前编译的是iphoneos,那么这个值就是:<code>ios</code>,以此类推。</p>
  191. <h3 id="varhost">var.$(host)</h3>
  192. <h4 id="">获取本机操作系统</h4>
  193. <p>指的是当前本机环境的主机系统,如果你是在macOS上编译,那么系统就是:<code>macosx</code></p>
  194. <h3 id="vartmpdir">var.$(tmpdir)</h3>
  195. <h4 id="">获取临时目录</h4>
  196. <p>一般用于临时存放一些非永久性文件。</p>
  197. <h3 id="varcurdir">var.$(curdir)</h3>
  198. <h4 id="">获取当前目录</h4>
  199. <p>一般默认是执行<code>xmake</code>命令时的工程根目录,当然如果通过<a href="#os-cd">os.cd</a>改变了目录的话,这个值也会一起改变。</p>
  200. <h3 id="varbuildir">var.$(buildir)</h3>
  201. <h4 id="">获取当前的构建输出目录</h4>
  202. <p>默认一般为当前工程根目录下的:<code>./build</code>目录,也可以通过执行:<code>xmake f -o /tmp/build</code>命令来修改默认的输出目录。</p>
  203. <h3 id="varscriptdir">var.$(scriptdir)</h3>
  204. <h4 id="">获取当前工程描述脚本的目录</h4>
  205. <p>也就是对应<code>xmake.lua</code>所在的目录路径。</p>
  206. <h3 id="varglobaldir">var.$(globaldir)</h3>
  207. <h4 id="">全局配置目录</h4>
  208. <p>xmake的<code>xmake g|global</code>全局配置命令,数据存储的目录路径,在里面可以放置一些自己的插件、平台脚本。</p>
  209. <p>默认为:<code>~/.config</code></p>
  210. <h3 id="varconfigdir">var.$(configdir)</h3>
  211. <h4 id="">当前工程配置目录</h4>
  212. <p>当前工程的配置存储目录,也就是<code>xmake f|config</code>配置命令的存储目录,默认为:<code>projectdir/.config</code></p>
  213. <h3 id="varprogramdir">var.$(programdir)</h3>
  214. <h4 id="xmake">xmake安装脚本目录</h4>
  215. <p>也就是<code>XMAKE_PROGRAM_DIR</code>环境变量所在目录,我们也可以通过设置这个环境量,来修改xmake的加载脚本,实现版本切换。</p>
  216. <h3 id="varprojectdir">var.$(projectdir)</h3>
  217. <h4 id="">工程根目录</h4>
  218. <p>也就是<code>xmake -P xxx</code>命令中指定的目录路径,默认不指定就是<code>xmake</code>命令执行时的当前目录,一般用于定位工程文件。</p>
  219. <h3 id="varshell">var.$(shell)</h3>
  220. <h4 id="shell">执行外部shell命令</h4>
  221. <p>除了内置的变量处理,xmake还支持原生shell的运行,来处理一些xmake内置不支持的功能</p>
  222. <p>例如,现在有个需求,我想用在编译linux程序时,调用<code>pkg-config</code>获取到实际的第三方链接库名,可以这么做:</p>
  223. <pre><code class="lang-lua">target("test")
  224. set_kind("binary")
  225. if is_plat("linux") then
  226. add_ldflags("$(shell pkg-config --libs sqlite3)")
  227. end
  228. </code></pre>
  229. <p>当然,xmake有自己的自动化第三库检测机制,一般情况下不需要这么麻烦,而且lua自身的脚本化已经很不错了。。</p>
  230. <p>但是这个例子可以说明,xmake是完全可以通过原生shell,来与一些第三方的工具进行配合使用。。</p>
  231. <h3 id="varenv">var.$(env)</h3>
  232. <h4 id="">获取外部环境变量</h4>
  233. <p>例如,可以通过获取环境变量中的路径:</p>
  234. <pre><code class="lang-lua">target("test")
  235. add_includedirs("$(env PROGRAMFILES)/OpenSSL/inc")
  236. </code></pre>
  237. <h3 id="varreg">var.$(reg)</h3>
  238. <h4 id="windows">获取windows注册表配置项的值</h4>
  239. <p>通过 <code>regpath; name</code> 的方式获取注册表中某个项的值:</p>
  240. <pre><code class="lang-lua">print("$(reg HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\XXXX;Name)")
  241. </code></pre>
  242. </article>
  243. </body>
  244. </html>