xpack.html 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731
  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/xpack">https://xmake.io/#/zh-cn/manual/xpack</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. <h2 id="">打包接口</h2>
  86. <p>xpack 作为插件形式提供,它的所有 API 我们需要通过 <code>includes("@builtin/xpack")</code> 方式来引入。</p>
  87. <pre><code class="lang-lua">includes("@builtin/xpack")
  88. xpack("test")
  89. set_version("1.0")
  90. set_homepage("https://xmake.io")
  91. add_installfiles("...")
  92. </code></pre>
  93. <h3 id="xpackset_version">xpack:set_version</h3>
  94. <h4 id="">设置包版本</h4>
  95. <p>这个接口用于设置生成的安装包的版本:</p>
  96. <pre><code class="lang-lua">xpack("test")
  97. set_version("1.0")
  98. -- ...
  99. </code></pre>
  100. <p>如果我们没有设置,但是通过 <code>set_targets</code> 绑定了安装的目标程序,那么也会使用 target 中的版本配置。</p>
  101. <pre><code class="lang-lua">target("foo")
  102. set_version("1.0")
  103. xpack("test")
  104. set_targets("foo")
  105. -- ...
  106. </code></pre>
  107. <p>我们也可以使用全局工程的版本,如果没有绑定任何 targets。</p>
  108. <pre><code class="lang-lua">set_version("1.0")
  109. xpack("xmake")
  110. -- ...
  111. </code></pre>
  112. <h3 id="xpackset_homepage">xpack:set_homepage</h3>
  113. <h4 id="">设置主页信息</h4>
  114. <pre><code class="lang-lua">xpack("xmake")
  115. set_homepage("https://xmake.io")
  116. </code></pre>
  117. <h3 id="xpackset_title">xpack:set_title</h3>
  118. <h4 id="">设置标题信息</h4>
  119. <p>通常用于配置安装包的简单描述,相比 <code>set_description</code> 更加简短。</p>
  120. <pre><code class="lang-lua">xpack("xmake")
  121. set_title("Xmake build utility ($(arch))")
  122. </code></pre>
  123. <h3 id="xpackset_description">xpack:set_description</h3>
  124. <h4 id="">设置详细描述</h4>
  125. <p>这个接口可以设置安装包更加详细的描述信息,可以用一到两句话详细描述下包。</p>
  126. <pre><code class="lang-lua">xpack("xmake")
  127. set_description("A cross-platform build utility based on Lua.")
  128. </code></pre>
  129. <h3 id="xpackset_author">xpack:set_author</h3>
  130. <h4 id="">设置作者信息</h4>
  131. <p>我们可以设置邮箱,姓名等来描述这个包的作者。</p>
  132. <pre><code class="lang-lua">xpack("xmake")
  133. set_author("[email protected]")
  134. </code></pre>
  135. <h3 id="xpackset_maintainer">xpack:set_maintainer</h3>
  136. <h4 id="">设置维护者信息</h4>
  137. <p>我们可以设置邮箱,姓名等来描述这个包的维护者。</p>
  138. <p>维护者跟作者有可能是同一个人,也可能不是一个人。</p>
  139. <pre><code class="lang-lua">xpack("xmake")
  140. set_maintainer("[email protected]")
  141. </code></pre>
  142. <h3 id="xpackset_copyright">xpack:set_copyright</h3>
  143. <h4 id="">设置包的版权信息</h4>
  144. <pre><code class="lang-lua">xpack("xmake")
  145. set_copyright("Copyright (C) 2015-present, TBOOX Open Source Group")
  146. </code></pre>
  147. <h3 id="xpackset_license">xpack:set_license</h3>
  148. <h4 id="license">设置包的 License</h4>
  149. <p>目前像 srpm/rpm/deb 等包会用到,用于设置 License 名。</p>
  150. <pre><code class="lang-lua">set_license("Apache-2.0")
  151. </code></pre>
  152. <h3 id="xpackset_licensefile">xpack:set_licensefile</h3>
  153. <h4 id="license">设置包的 License 文件</h4>
  154. <p>我们可以设置 LICENSE 所在的文件路径,像 NSIS 的安装包,它还会额外将 LICENSE 页面展示给安装用户。</p>
  155. <pre><code class="lang-lua">xpack("xmake")
  156. set_licensefile("../LICENSE.md")
  157. </code></pre>
  158. <h3 id="xpackset_company">xpack:set_company</h3>
  159. <h4 id="">设置包所属的公司</h4>
  160. <p>我们可以用这个接口设置包所属的公司和组织名。</p>
  161. <pre><code class="lang-lua">xpack("xmake")
  162. set_company("tboox.org")
  163. </code></pre>
  164. <h3 id="xpackset_inputkind">xpack:set_inputkind</h3>
  165. <h4 id="">设置打包的输入源类型</h4>
  166. <p>这是个可选接口,可用于标识当前打包的输入源类型</p>
  167. <ul>
  168. <li>binary: 从二进制文件作为输入源打包,通常使用 <code>add_installfiles</code></li>
  169. <li>source: 从源文件作为输入源开始打包,通常使用 <code>add_sourcefiles</code></li>
  170. </ul>
  171. <p>这一般用于自定义的打包格式,而对于内置的格式,比如: nsis, zip, srczip 等等,<br>其实已经能够判断获取到当前打包的输入源是从源码开始打包,还是直接从二进制源开始打包。</p>
  172. <p>因此,除非必要(比如要自定义打包格式),通常我们不需要设置它。</p>
  173. <p>而我们在脚本域中,也可以通过 <code>package:from_source()</code> 和 <code>package:from_binary()</code> 来判断当前的输入源。</p>
  174. <pre><code class="lang-lua">xpack("test")
  175. set_formats("nsis", "zip", "targz", "srczip", "srctargz", "runself")
  176. add_installfiles("src/(assets/*.png)", {prefixdir = "images"})
  177. add_sourcefiles("(src/**)")
  178. on_load(function (package)
  179. if package:from_source() then
  180. package:set("basename", "test-$(plat)-src-v$(version)")
  181. else
  182. package:set("basename", "test-$(plat)-$(arch)-v$(version)")
  183. end
  184. end)
  185. </code></pre>
  186. <p>如果上面的打包配置,如果是 nsis 包,默认从二进制文件作为输入源,进行打包,会去打包 <code>add_installfiles</code> 配置的文件。</p>
  187. <p>而 <code>srczip</code>, <code>srctargz</code> 和 <code>runself</code> 是从源文件开始打包,会去打包 <code>add_sourcefiles</code> 中的文件,然后再执行打包脚本。</p>
  188. <h3 id="xpackset_formats">xpack:set_formats</h3>
  189. <h4 id="">设置打包格式</h4>
  190. <p>配置当前 XPack 包需要生成的打包格式,可以同时配置多个,<code>xmake pack</code> 命令会一次性全部生成。</p>
  191. <p>!> 有些格式如果当前平台不支持生成,会自动忽略。</p>
  192. <pre><code class="lang-lua">xpack("test")
  193. set_formats("nsis", "zip", "targz", "srczip", "srctargz", "runself")
  194. </code></pre>
  195. <p>我们也可以通过命令,指定生成其中部分格式,而不是一次性全部生成。</p>
  196. <pre><code class="lang-bash">$ xmake pack -f "nsis,zip"
  197. </code></pre>
  198. <p>通过逗号分隔,指定生成 NSIS 和 zip 包,暂时忽略其他格式包。</p>
  199. <p>目前支持的格式有:</p>
  200. <table>
  201. <thead>
  202. <tr>
  203. <th>格式</th>
  204. <th>说明</th>
  205. </tr>
  206. </thead>
  207. <tbody>
  208. <tr>
  209. <td>nsis</td>
  210. <td>Windows NSIS 安装包,二进制安装</td>
  211. </tr>
  212. <tr>
  213. <td>zip</td>
  214. <td>二进制 zip 包,不包含安装脚本</td>
  215. </tr>
  216. <tr>
  217. <td>targz</td>
  218. <td>二进制 tar.gz 包,不包含安装脚本</td>
  219. </tr>
  220. <tr>
  221. <td>srczip</td>
  222. <td>zip 源码包</td>
  223. </tr>
  224. <tr>
  225. <td>srctargz</td>
  226. <td>tar.gz 源码包</td>
  227. </tr>
  228. <tr>
  229. <td>runself</td>
  230. <td>自运行 shell 脚本包,源码编译安装</td>
  231. </tr>
  232. <tr>
  233. <td>rpm</td>
  234. <td>rpm 二进制安装包</td>
  235. </tr>
  236. <tr>
  237. <td>srpm</td>
  238. <td>rpm 源码安装包</td>
  239. </tr>
  240. <tr>
  241. <td>deb</td>
  242. <td>deb 二进制安装包 (待支持)</td>
  243. </tr>
  244. <tr>
  245. <td>其他</td>
  246. <td>可自定义格式和安装脚本</td>
  247. </tr>
  248. </tbody>
  249. </table>
  250. <h3 id="xpackset_basename">xpack:set_basename</h3>
  251. <h4 id="">设置包文件名</h4>
  252. <p>设置生成包的文件名,但不包含后缀名。</p>
  253. <pre><code class="lang-lua">xpack("xmake")
  254. set_basename("xmake-v$(version)")
  255. </code></pre>
  256. <p>我们也可以在其中配置 <code>$(version)</code>, <code>$(plat)</code>, <code>$(arch)</code> 等变量。</p>
  257. <p>另外,想要更灵活的配置,可以再 on_load 脚本中去配置它。</p>
  258. <pre><code class="lang-lua">xpack("xmake")
  259. on_load(function (package)
  260. package:set("basename", "xmake-v" .. package:version())
  261. end)
  262. </code></pre>
  263. <h3 id="xpackset_extension">xpack:set_extension</h3>
  264. <h4 id="">设置安装包的扩展名</h4>
  265. <p>通常我们并不需要修改生成包的扩展名,因为指定了 <code>nsis</code>, <code>zip</code> 等格式后,都会有一个默认的后缀名,例如:<code>.exe</code>, <code>.zip</code>。</p>
  266. <p>但是,如果我们正在自定义包格式,需要生成一个自定义的包,那么我们可能需要配置它。</p>
  267. <pre><code class="lang-lua">xpack("mypack")
  268. set_format("myformat")
  269. set_extension(".myf")
  270. on_package(function (package)
  271. local outputfile = package:outputfile()
  272. -- TODO
  273. end)
  274. </code></pre>
  275. <p>例如,这里我们自定义了一个 myformat 包格式,采用 <code>.myf</code> 的自定义后缀名,然后我们就可以在 on_package 中生成它,</p>
  276. <p><code>package:outputfile()</code> 返回的包输出文件名中就会包含这个后缀名。</p>
  277. <h3 id="xpackadd_targets">xpack:add_targets</h3>
  278. <h4 id="">关联目标程序</h4>
  279. <p>我们可以通过这个接口,配置关联需要被安装的目标 target。</p>
  280. <pre><code class="lang-lua">target("foo")
  281. set_kind("shared")
  282. add_files("src/*.cpp")
  283. add_headerfiles("include/(*.h)")
  284. xpack("test")
  285. set_formats("nsis")
  286. add_targets("foo")
  287. </code></pre>
  288. <p>当生成 test 安装包的时候,被关联的 foo 目标的可执行程序,动态库等待都会被一起打包安装。<br>另外,target 中通过 <code>add_headerfiles</code> 和 <code>add_installfiles</code> 配置的自定义安装文件也会被打入安装包,一起被安装。</p>
  289. <p>而且我们还可以在 target 和它的 rules 中通过 <code>on_installcmd</code>, <code>after_installcmd</code> 等自定义打包安装脚本,也会被一起执行。</p>
  290. <h3 id="xpackadd_components">xpack:add_components</h3>
  291. <h4 id="">添加安装包组件</h4>
  292. <p>我们也支持为安装包添加自定义组件,按组件模式进行选择安装。目前仅仅对 NSIS 包会有比较的支持效果。</p>
  293. <p>我们可以通过 <code>xpack_component()</code> 定义一个组件域,然后使用 <code>add_components()</code> 加指定的组件跟包进行关联绑定。</p>
  294. <p>而在组件中,我们可以通过 <code>on_installcmd()</code> 编写一些自定义的安装脚本,只有当这个组件被启用的情况下,才会被执行安装。</p>
  295. <pre><code class="lang-lua">xpack("test")
  296. add_components("LongPath")
  297. xpack_component("LongPath")
  298. set_default(false)
  299. set_title("Enable Long Path")
  300. set_description("Increases the maximum path length limit, up to 32,767 characters (before 256).")
  301. on_installcmd(function (component, batchcmds)
  302. batchcmds:rawcmd("nsis", [[
  303. ${If} $NoAdmin == "false"
  304. ; Enable long path
  305. WriteRegDWORD ${HKLM} "SYSTEM\CurrentControlSet\Control\FileSystem" "LongPathsEnabled" 1
  306. ${EndIf}]])
  307. end)
  308. </code></pre>
  309. <p>这里,我们使用 <code>batchcmds:rawcmd("nsis", "...")</code> 添加了一个 nsis 特有的安装命令,开启长路径支持。效果如下:</p>
  310. <p><img src="/assets/img/manual/nsis_4.png" alt=""></p>
  311. <p>只有当我们勾选 LongPath 后,才会启用,当然,我们也可以通过 <code>set_default()</code> 配置组件默认是否处于启用状态。</p>
  312. <p>除了 NSIS 包,其他包尽管没有对组件有完善的支持,但是同样会执行组件里面的脚本实现打包,仅仅可能无法显示对应的组件 UI 和勾选框。</p>
  313. <h3 id="xpackset_bindir">xpack:set_bindir</h3>
  314. <h4 id="">设置包的二进制安装目录</h4>
  315. <p>通常生成的安装包都会有一个安装根目录,而我们可以通过这个配置指定安装目录下的 bin 目录位置。</p>
  316. <p>如果没有指定,默认在 <code>installdir/bin</code>。</p>
  317. <p>如果配置了</p>
  318. <pre><code class="lang-lua">xpack("xmake")
  319. set_bindir("mybin")
  320. </code></pre>
  321. <p>那么会将可执行文件安装在 <code>installdir/mybin</code> 下面,如果是 NSIS 包,安装后,还会自动设置此路径到 <code>%PATH%</code>。</p>
  322. <h3 id="xpackset_libdir">xpack:set_libdir</h3>
  323. <h4 id="">设置包的库安装目录</h4>
  324. <p>通常生成的安装包都会有一个安装根目录,而我们可以通过这个配置指定安装目录下的 lib 目录位置。</p>
  325. <p>如果没有指定,默认在 <code>installdir/lib</code>。</p>
  326. <p>如果配置了</p>
  327. <pre><code class="lang-lua">xpack("xmake")
  328. set_libdir("mylib")
  329. </code></pre>
  330. <p>那么会将静态库文件安装在 <code>installdir/mylib</code> 下面。</p>
  331. <h3 id="xpackset_includedir">xpack:set_includedir</h3>
  332. <h4 id="">设置包的头文件安装目录</h4>
  333. <p>通常生成的安装包都会有一个安装根目录,而我们可以通过这个配置指定安装目录下的 include 目录位置。</p>
  334. <p>如果没有指定,默认在 <code>installdir/include</code>。</p>
  335. <p>如果配置了</p>
  336. <pre><code class="lang-lua">xpack("xmake")
  337. set_includedir("myinc")
  338. </code></pre>
  339. <p>那么会将头文件安装在 <code>installdir/myinc</code> 下面。</p>
  340. <h3 id="xpackset_prefixdir">xpack:set_prefixdir</h3>
  341. <h4 id="">设置包的安装前缀目录</h4>
  342. <p>如果配置了</p>
  343. <pre><code class="lang-lua">xpack("xmake")
  344. set_prefixdir("prefix")
  345. </code></pre>
  346. <p>那么会将所有安装文件,安装在 <code>installdir/prefix</code> 下面,例如:</p>
  347. <pre><code>installdir
  348. - prefix
  349. - include
  350. - lib
  351. - bin
  352. </code></pre><h3 id="xpackset_specfile">xpack:set_specfile</h3>
  353. <h4 id="spec">设置包 spec 文件路径</h4>
  354. <p>有些包格式的生成,需要先生成特定的 spec 文件,然后才能调用第三方打包工具去生成包。</p>
  355. <p>比如 NSIS 包,需要先通过 xmake 根据 xpack 配置,生成 NSIS 特有的 <code>.nsi</code> 配置文件,然后 xmake 会再调用 <code>makensis.exe</code> 去根据这个 <code>.nsi</code> 文件生成 NSIS 包。</p>
  356. <p>而 deb/rpm 等包都有特定的 spec 文件。</p>
  357. <p>xmake 在打包的时候,默认会自动生成一个 spec 文件,但是如果我们想更加深度定制化一些特有包的配置,可以通过这个接口,</p>
  358. <p>配置一个自己的 spec 文件,里面用户自己维护了一些包配置定义,然后可以在里面定义一些 <code>${PACKAGE_NAME}</code>, <code>${VERSION}</code> 包特有的内置变量,就可以实现包信息替换。</p>
  359. <pre><code class="lang-lua">xpack("xmake")
  360. set_formats("nsis")
  361. set_specfile("makensis.nsi")
  362. </code></pre>
  363. <p>makensis.nsi</p>
  364. <pre><code>VIProductVersion "${VERSION}.0"
  365. VIFileVersion "${VERSION}.0"
  366. VIAddVersionKey /LANG=0 ProductName "${PACKAGE_NAME}"
  367. VIAddVersionKey /LANG=0 Comments "${PACKAGE_DESCRIPTION}"
  368. VIAddVersionKey /LANG=0 CompanyName "${PACKAGE_COMPANY}"
  369. VIAddVersionKey /LANG=0 LegalCopyright "${PACKAGE_COPYRIGHT}"
  370. VIAddVersionKey /LANG=0 FileDescription "${PACKAGE_NAME} Installer - v${VERSION}"
  371. VIAddVersionKey /LANG=0 OriginalFilename "${PACKAGE_FILENAME}"
  372. </code></pre><p>下面是一些内置的常用包变量:</p>
  373. <table>
  374. <thead>
  375. <tr>
  376. <th>变量名</th>
  377. <th>描述</th>
  378. </tr>
  379. </thead>
  380. <tbody>
  381. <tr>
  382. <td>PACKAGE_ARCH</td>
  383. <td>包二进制文件的架构</td>
  384. </tr>
  385. <tr>
  386. <td>PACKAGE_PLAT</td>
  387. <td>包二进制文件的平台</td>
  388. </tr>
  389. <tr>
  390. <td>PACKAGE_NAME</td>
  391. <td>包名</td>
  392. </tr>
  393. <tr>
  394. <td>PACKAGE_TITLE</td>
  395. <td>包的简单描述</td>
  396. </tr>
  397. <tr>
  398. <td>PACKAGE_DESCRIPTION</td>
  399. <td>包的详细描述</td>
  400. </tr>
  401. <tr>
  402. <td>PACKAGE_FILENAME</td>
  403. <td>包文件名</td>
  404. </tr>
  405. <tr>
  406. <td>PACKAGE_AUTHOR</td>
  407. <td>包作者</td>
  408. </tr>
  409. <tr>
  410. <td>PACKAGE_MAINTAINER</td>
  411. <td>包维护者</td>
  412. </tr>
  413. <tr>
  414. <td>PACKAGE_HOMEPAGE</td>
  415. <td>包主页地址</td>
  416. </tr>
  417. <tr>
  418. <td>PACKAGE_COPYRIGHT</td>
  419. <td>包的版权信息</td>
  420. </tr>
  421. <tr>
  422. <td>PACKAGE_COMPANY</td>
  423. <td>包所属的公司名</td>
  424. </tr>
  425. <tr>
  426. <td>PACKAGE_ICONFILE</td>
  427. <td>包的图标文件路劲</td>
  428. </tr>
  429. <tr>
  430. <td>PACKAGE_LICENSEFILE</td>
  431. <td>包的 LICENSE 文件路径</td>
  432. </tr>
  433. <tr>
  434. <td>PACKAGE_VERSION_MAJOR</td>
  435. <td>包的 major 版本</td>
  436. </tr>
  437. <tr>
  438. <td>PACKAGE_VERSION_MINOR</td>
  439. <td>包的 minor 版本</td>
  440. </tr>
  441. <tr>
  442. <td>PACKAGE_VERSION_ALTER</td>
  443. <td>包的 alter 版本</td>
  444. </tr>
  445. <tr>
  446. <td>PACKAGE_VERSION_BUILD</td>
  447. <td>包的 build 版本</td>
  448. </tr>
  449. </tbody>
  450. </table>
  451. <p>除了内置变量,我们也可以通过 <code>set_specvar</code> 接口去配置一些自定义的模版变量。</p>
  452. <h3 id="xpackset_specvar">xpack:set_specvar</h3>
  453. <h4 id="spec">设置包 spec 文件的自定义变量</h4>
  454. <p>通常配合 <code>set_specfile</code> 接口一起使用,用于在自定义的 spec 模版文件里面,设置一些自定义的包变量。</p>
  455. <pre><code class="lang-lua">xpack("xmake")
  456. set_formats("nsis")
  457. set_specfile("makensis.nsi")
  458. set_specvar("FOO", "hello")
  459. </code></pre>
  460. <p>makensis.nsi</p>
  461. <pre><code>VIAddVersionKey /LANG=0 ProductName "${FOO}"
  462. </code></pre><p>在生成包之前,xmake 会替换 <code>${FOO}</code> 成 hello,然后再调用 <code>makensis.exe</code> 命令根据这个文件生成 NSIS 安装包。</p>
  463. <h3 id="xpackset_iconfile">xpack:set_iconfile</h3>
  464. <h4 id="">设置图标文件路径</h4>
  465. <p>我们可以额外配置一个 ico 的图标文件,可以用于设置 NSIS 等一些支持图标自定义的安装包的图标。</p>
  466. <pre><code class="lang-lua">xpack("xmake")
  467. set_iconfile("xmake.ico")
  468. </code></pre>
  469. <h3 id="xpackadd_sourcefiles">xpack:add_sourcefiles</h3>
  470. <h4 id="">添加源文件</h4>
  471. <p>这通常用于源码包,也就是 <code>srczip</code>, <code>srctargz</code> 这种纯源码包,以及 <code>runself</code> 格式的源码安装包。</p>
  472. <p>如果是自定义的包格式,我们需要配置 <code>set_inputkind("source")</code> 开启源码包。</p>
  473. <p>通过这个接口,可以自定义配置那些源文件需要被打入包中,用于后期的编译安装。</p>
  474. <p>它的详细用法跟 <code>add_installfiles</code> 类似,可以参考它的文档描述。</p>
  475. <h3 id="xpackadd_installfiles">xpack:add_installfiles</h3>
  476. <h4 id="">添加二进制文件</h4>
  477. <p>这通常用于二进制包,也就是 <code>nsis</code>, <code>deb</code> 等格式的包,这些包会直接安装二进制文件。</p>
  478. <p>因此,我们可以通过这个接口额外配置一些需要被安装的二进制文件,比如:可执行文件,资源文件等等。</p>
  479. <p>比如我们可以指定安装各种类型的文件到安装目录:</p>
  480. <pre><code class="lang-lua">xpack("test")
  481. add_installfiles("src/*.h")
  482. add_installfiles("doc/*.md")
  483. </code></pre>
  484. <p>我们也可以指定安装到特定子目录:</p>
  485. <pre><code class="lang-lua">xpack("test")
  486. add_installfiles("src/*.h", {prefixdir = "include"})
  487. add_installfiles("doc/*.md", {prefixdir = "share/doc"})
  488. </code></pre>
  489. <p>上面的设置,我们会安装到<code>installdir/include/*.h</code>, <code>installdir/share/doc/*.md</code>。</p>
  490. <p>注:默认安装不会保留目录结构,会完全展开,当然我们也可以通过<code>()</code>去提取源文件中的子目录结构来安装,例如:</p>
  491. <pre><code class="lang-lua">xpack("test")
  492. add_installfiles("src/(tbox/*.h)", {prefixdir = "include"})
  493. add_installfiles("doc/(tbox/*.md)", {prefixdir = "share/doc"})
  494. </code></pre>
  495. <h3 id="xpackadd_buildrequires">xpack:add_buildrequires</h3>
  496. <h4 id="">添加包的构建依赖</h4>
  497. <p>这通常用于一些源码包,例如 srpm。这些源码包在安装之前,需要先构建源码,而构建源码可能会需要用到一些其他的依赖包。</p>
  498. <p>我们可以通过这个接口去配置它们。</p>
  499. <pre><code class="lang-lua">xpack("test")
  500. set_formats("srpm")
  501. on_load(function (package)
  502. local format = package:format()
  503. if format == "srpm" then
  504. package:add("buildrequires", "make")
  505. package:add("buildrequires", "gcc")
  506. package:add("buildrequires", "gcc-c++")
  507. end
  508. end)
  509. on_buildcmd(function (package, batchcmds)
  510. batchcmds:runv("make")
  511. end)
  512. </code></pre>
  513. <p>由于不同的安装包,它的依赖包名会有一些差异,所以我们需要在 on_load 脚本域针对不同的包格式,去配置它们。</p>
  514. <h3 id="xpackon_load">xpack:on_load</h3>
  515. <h4 id="">自定义加载脚本</h4>
  516. <p>如果在描述域中配置无法满足我们的需求,还可以在 on_load 自定义脚本域中,进一步灵活的配置包。</p>
  517. <p>这个接口会在每个 XPack 包初始化加载期间就被调用,可以在里面做一些基础配置。</p>
  518. <p>例如在里面动态地修改包文件名:</p>
  519. <pre><code class="lang-lua">xpack("test")
  520. on_load(function (package)
  521. package:set("basename", "test-" .. package:version())
  522. end)
  523. </code></pre>
  524. <h3 id="xpackbefore_package">xpack:before_package</h3>
  525. <h4 id="">自定义打包之前的脚本</h4>
  526. <p>我们可以通过这个接口配置打包之前的自定义脚本。</p>
  527. <pre><code class="lang-lua">xpack("test")
  528. before_package(function (package)
  529. -- TODO
  530. end)
  531. </code></pre>
  532. <h3 id="xpackon_package">xpack:on_package</h3>
  533. <h4 id="">自定义打包脚本</h4>
  534. <p>我们可以通过这个接口配置打包自定义脚本,这将会重写整个内置的打包逻辑。通常用于自定义包格式。</p>
  535. <pre><code class="lang-lua">xpack("test")
  536. set_formats("xxx")
  537. on_package(function (package)
  538. -- TODO
  539. end)
  540. </code></pre>
  541. <h3 id="xpackafter_package">xpack:after_package</h3>
  542. <h4 id="">自定义打包之后的脚本</h4>
  543. <p>我们可以通过这个接口配置打包之后的自定义脚本。</p>
  544. <pre><code class="lang-lua">xpack("test")
  545. after_package(function (package)
  546. -- TODO
  547. end)
  548. </code></pre>
  549. <h3 id="xpackbefore_installcmd">xpack:before_installcmd</h3>
  550. <h4 id="">添加安装之前的脚本</h4>
  551. <p>它不会重写整个安装脚本,但是会在现有的安装脚本执行之前,新增一些自定义的安装脚本:</p>
  552. <pre><code class="lang-lua">xpack("test")
  553. before_installcmd(function (package, batchcmds)
  554. batchcmds:mkdir(package:installdir("resources"))
  555. batchcmds:cp("src/assets/*.txt", package:installdir("resources"), {rootdir = "src"})
  556. batchcmds:mkdir(package:installdir("stub"))
  557. end)
  558. </code></pre>
  559. <p>需要注意的是,通过 <code>batchcmds</code> 添加的 cp, mkdir 等命令都不会被立即执行,而是仅仅生成一个命令列表,后面实际生成包的时候,会将这些命令,翻译成打包命令。</p>
  560. <h3 id="xpackon_buildcmd">xpack:on_buildcmd</h3>
  561. <h4 id="">自定义构建脚本</h4>
  562. <p>对于一些源码构建包,在安装之前,我们需要先构建源码,例如 srpm 包。</p>
  563. <p>因此,我们可以通过这个接口,自定义构建脚本,例如:</p>
  564. <pre><code class="lang-lua">xpack("test")
  565. set_formats("srpm")
  566. add_sourcefiles("src/*.c")
  567. add_sourcefiles("./configure")
  568. on_buildcmd(function (package, batchcmds)
  569. batchcmds:runv("./configure")
  570. batchcmds:runv("make")
  571. end)
  572. </code></pre>
  573. <p>如果我们通过 add_targets 关联了目标程序,即使我们没有配置 <code>on_buildcmd</code>,xpack 也会默认执行 <code>xmake build</code> 命令去构建它们。</p>
  574. <pre><code class="lang-lua">xpack("test")
  575. set_formats("srpm")
  576. add_sourcefiles("src/*.c")
  577. add_sourcefiles("./xmake.lua")
  578. </code></pre>
  579. <p>另外,我们也可以使用 <code>add_buildrequires</code> 去配置一些构建依赖。</p>
  580. <h3 id="xpackbefore_buildcmd">xpack:before_buildcmd</h3>
  581. <h4 id="">自定义构建之前的脚本</h4>
  582. <p>通过这个接口,我们可以配置构建之前的脚本。</p>
  583. <pre><code class="lang-lua">xpack("test")
  584. set_formats("srpm")
  585. before_buildcmd(function (package, batchcmds)
  586. -- TODO
  587. end)
  588. </code></pre>
  589. <h3 id="xpackafter_buildcmd">xpack:after_buildcmd</h3>
  590. <h4 id="">自定义构建之后的脚本</h4>
  591. <p>通过这个接口,我们可以配置构建之后的脚本。</p>
  592. <pre><code class="lang-lua">xpack("test")
  593. set_formats("srpm")
  594. after_buildcmd(function (package, batchcmds)
  595. -- TODO
  596. end)
  597. </code></pre>
  598. <h3 id="xpackon_installcmd">xpack:on_installcmd</h3>
  599. <h4 id="">自定义安装脚本</h4>
  600. <p>这回完全重写内置默认的安装脚本,包括内部对 <code>add_installfiles</code> 配置的文件的自动安装,用户需要完全自己处理所有的安装逻辑。</p>
  601. <h3 id="xpackafter_installcmd">xpack:after_installcmd</h3>
  602. <h4 id="">添加安装之后的脚本</h4>
  603. <p>它不会重写整个安装脚本,但是会在现有的安装脚本执行之后,新增一些自定义的安装脚本:</p>
  604. <pre><code class="lang-lua">xpack("test")
  605. after_installcmd(function (package, batchcmds)
  606. batchcmds:mkdir(package:installdir("resources"))
  607. batchcmds:cp("src/assets/*.txt", package:installdir("resources"), {rootdir = "src"})
  608. batchcmds:mkdir(package:installdir("stub"))
  609. end)
  610. </code></pre>
  611. <p>需要注意的是,通过 <code>batchcmds</code> 添加的 cp, mkdir 等命令都不会被立即执行,而是仅仅生成一个命令列表,后面实际生成包的时候,会将这些命令,翻译成打包命令。</p>
  612. <h3 id="xpackbefore_uninstallcmd">xpack:before_uninstallcmd</h3>
  613. <h4 id="">添加卸载之前的脚本</h4>
  614. <p>跟 before_installcmd 类似,请参考 before_installcmd 说明。</p>
  615. <h3 id="xpackon_uninstallcmd">xpack:on_uninstallcmd</h3>
  616. <h4 id="">自定义卸载脚本</h4>
  617. <p>跟 on_installcmd 类似,请参考 on_installcmd 说明。</p>
  618. <h3 id="xpackafter_uninstallcmd">xpack:after_uninstallcmd</h3>
  619. <h4 id="">添加卸载之后的脚本</h4>
  620. <p>跟 after_installcmd 类似,请参考 after_installcmd 说明。</p>
  621. <h3 id="xpackset_nsis_displayicon">xpack:set_nsis_displayicon</h3>
  622. <h4 id="nsis">设置 NSIS 的显示图标</h4>
  623. <p>这是一个 NSIS 专有 API,可以用于配置 NSIS 的显示图标:</p>
  624. <pre><code class="lang-lua">xpack("test")
  625. set_nsis_displayicon("bin/foo.exe")
  626. </code></pre>
  627. <p>我们需要配置带有 icon 的可执行文件路径,这是使得安装包的显示 icon 跟它保持一致。</p>
  628. <p>这是一个可选配置,即使我们不配置它,xmake 也会默认使用被关联的 target 中的可执行文件中图标。</p>
  629. <h2 id="">组件接口</h2>
  630. <h3 id="xpack_componentset_title">xpack_component:set_title</h3>
  631. <h4 id="">设置包组件的简单描述</h4>
  632. <pre><code class="lang-lua">xpack_component("LongPath")
  633. set_title("Enable Long Path")
  634. </code></pre>
  635. <h3 id="xpack_componentset_description">xpack_component:set_description</h3>
  636. <h4 id="">设置包组件的详细描述</h4>
  637. <pre><code class="lang-lua">xpack_component("LongPath")
  638. set_description("Increases the maximum path length limit, up to 32,767 characters (before 256).")
  639. </code></pre>
  640. <h3 id="xpack_componentset_default">xpack_component:set_default</h3>
  641. <h4 id="">设置包组件的默认启用状态</h4>
  642. <p>通常包组件都会被默认启用,但是我们也可以使用这个接口,默认禁用这个组件,仅仅当用户安装包时候,选择勾选此组件,才会被启用安装。</p>
  643. <pre><code class="lang-lua">xpack_component("LongPath")
  644. set_default(false)
  645. set_title("Enable Long Path")
  646. </code></pre>
  647. <h3 id="xpack_componenton_load">xpack_component:on_load</h3>
  648. <h4 id="">自定义加载脚本</h4>
  649. <p>我们可以在 on_load 自定义脚本域中,进一步灵活的配置包组件。</p>
  650. <pre><code class="lang-lua">xpack_component("test")
  651. on_load(function (component)
  652. local package = component:package()
  653. -- TODO
  654. end)
  655. </code></pre>
  656. <h3 id="xpack_componentbefore_installcmd">xpack_component:before_installcmd</h3>
  657. <h4 id="">添加组件安装之前的脚本</h4>
  658. <p>它不会重写整个安装脚本,但是会在现有的安装脚本执行之前,新增一些自定义的安装脚本:</p>
  659. <pre><code class="lang-lua">xpack_component("test")
  660. before_installcmd(function (component, batchcmds)
  661. batchcmds:mkdir(package:installdir("resources"))
  662. batchcmds:cp("src/assets/*.txt", package:installdir("resources"), {rootdir = "src"})
  663. batchcmds:mkdir(package:installdir("stub"))
  664. end)
  665. </code></pre>
  666. <p>需要注意的是,通过 <code>batchcmds</code> 添加的 cp, mkdir 等命令都不会被立即执行,而是仅仅生成一个命令列表,后面实际生成包的时候,会将这些命令,翻译成打包命令。</p>
  667. <p>它跟 xpack 的 before_installcmd 使用是完全一样的,唯一的区别是,仅仅当这个组件被启用时候,才会执行这里的安装脚本。</p>
  668. <h3 id="xpack_componenton_installcmd">xpack_component:on_installcmd</h3>
  669. <h4 id="">重写组件的安装脚本</h4>
  670. <p>这会重写整个组件的安装脚本,类似 xpack 的 on_installcmd。</p>
  671. <pre><code class="lang-lua">xpack_component("test")
  672. on_installcmd(function (component, batchcmds)
  673. -- TODO
  674. end)
  675. </code></pre>
  676. <h3 id="xpack_componentafter_installcmd">xpack_component:after_installcmd</h3>
  677. <h4 id="">添加组件安装之后的脚本</h4>
  678. <p>在组件安装之后,会执行这里的脚本,类似 xpack 的 after_installcmd。</p>
  679. <pre><code class="lang-lua">xpack_component("test")
  680. after_installcmd(function (component, batchcmds)
  681. -- TODO
  682. end)
  683. </code></pre>
  684. <h3 id="xpack_componentbefore_uninstallcmd">xpack_component:before_uninstallcmd</h3>
  685. <h4 id="">添加组件卸载之前的脚本</h4>
  686. <p>在组件安装之后,会执行这里的脚本,类似 xpack 的 before_uninstallcmd。</p>
  687. <pre><code class="lang-lua">xpack_component("test")
  688. before_uninstallcmd(function (component, batchcmds)
  689. -- TODO
  690. end)
  691. </code></pre>
  692. <h3 id="xpack_componenton_uninstallcmd">xpack_component:on_uninstallcmd</h3>
  693. <h4 id="">重写组件卸载的脚本</h4>
  694. <p>这会重写整个组件的卸载脚本,类似 xpack 的 on_uninstallcmd。</p>
  695. <pre><code class="lang-lua">xpack_component("test")
  696. on_uninstallcmd(function (component, batchcmds)
  697. -- TODO
  698. end)
  699. </code></pre>
  700. <h3 id="xpack_componentafter_uninstallcmd">xpack_component:after_uninstallcmd</h3>
  701. <h4 id="">添加组件卸载之后的脚本</h4>
  702. <p>在组件卸载之后,会执行这里的脚本,类似 xpack 的 before_uninstallcmd。</p>
  703. <pre><code class="lang-lua">xpack_component("test")
  704. before_uninstallcmd(function (component, batchcmds)
  705. -- TODO
  706. end)
  707. </code></pre>
  708. <h3 id="xpack_componentadd_sourcefiles">xpack_component:add_sourcefiles</h3>
  709. <h4 id="">添加组件源文件</h4>
  710. <p>这类似于 xpack 的 add_sourcefiles,但这里仅仅当组件被启用后,才会将这些源文件打入安装包。</p>
  711. <h3 id="xpack_componentadd_installfiles">xpack_component:add_installfiles</h3>
  712. <h4 id="">添加组件二进制安装文件</h4>
  713. <p>这类似于 xpack 的 add_installfiles,但这里仅仅当组件被启用后,才会将这些二进制文件打入安装包。</p>
  714. </article>
  715. </body>
  716. </html>