trybuild.html 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  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/features/trybuild">https://xmake.io/#/zh-cn/features/trybuild</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 v2.3.1以上版本直接对接了其他第三方构建系统,即使其他项目中没有使用xmake.lua来维护,xmake也可以直接调用其他构建工具来完成编译。</p>
  86. <p>那用户直接调用使用第三方构建工具来编译不就行了,为啥还要用xmake去调用呢?主要有以下好处:</p>
  87. <ol>
  88. <li>完全的行为一致,简化编译流程,不管用了哪个其他构建系统,都只需要执行xmake这个命令就可以编译,用户不再需要去研究其他工具的不同的编译流程</li>
  89. <li>完全对接<code>xmake config</code>的配置环境,复用xmake的平台探测和sdk环境检测,简化平台配置</li>
  90. <li>对接交叉编译环境,即使是用autotools维护的项目,也能通过xmake快速实现交叉编译</li>
  91. </ol>
  92. <p>目前已支持的构建系统:</p>
  93. <ul>
  94. <li>autotools(已完全对接xmake的交叉编译环境)</li>
  95. <li>xcodebuild</li>
  96. <li>cmake(已完全对接xmake的交叉编译环境)</li>
  97. <li>make</li>
  98. <li>msbuild</li>
  99. <li>scons</li>
  100. <li>meson</li>
  101. <li>bazel</li>
  102. <li>ndkbuild</li>
  103. <li>ninja</li>
  104. </ul>
  105. <h3 id="">自动探测构建系统并编译</h3>
  106. <p>例如,对于一个使用cmake维护的项目,直接在项目根目录执行xmake,就会自动触发探测机制,检测到CMakeLists.txt,然后提示用户是否需要使用cmake来继续完成编译。</p>
  107. <pre><code class="lang-bash">$ xmake
  108. note: CMakeLists.txt found, try building it (pass -y or --confirm=y/n/d to skip confirm)?
  109. please input: y (y/n)
  110. -- Symbol prefix:
  111. -- Configuring done
  112. -- Generating done
  113. -- Build files have been written to: /Users/ruki/Downloads/libpng-1.6.35/build
  114. [ 7%] Built target png-fix-itxt
  115. [ 21%] Built target genfiles
  116. [ 81%] Built target png
  117. [ 83%] Built target png_static
  118. ...
  119. output to /Users/ruki/Downloads/libpng-1.6.35/build/artifacts
  120. build ok!
  121. </code></pre>
  122. <h3 id="xmake">无缝对接xmake命令</h3>
  123. <p>目前支持<code>xmake clean</code>, <code>xmake --rebuild</code>和<code>xmake config</code>等常用命令与第三方系统的无缝对接。</p>
  124. <p>我们可以直接清理cmake维护项目的编译输出文件</p>
  125. <pre><code class="lang-bash">$ xmake clean
  126. $ xmake clean --all
  127. </code></pre>
  128. <p>如果带上<code>--all</code>执行清理,会清除autotools/cmake生成的所有文件,不仅仅只清理对象文件。</p>
  129. <p>默认<code>xmake</code>对接的是增量构建行为,不过我们也可以强制快速重建:</p>
  130. <pre><code class="lang-bash">$ xmake --rebuild
  131. </code></pre>
  132. <h3 id="">手动切换指定构建系统</h3>
  133. <p>如果一个项目下有多个构建系统同时在维护,比如libpng项目,自带autotools/cmake/makefile等构建系统维护,xmake默认优先探测使用了autotools,如果想要强制切换其他构建系统,可以执行:</p>
  134. <pre><code class="lang-bash">$ xmake f --trybuild=[autotools|cmake|make|msbuild| ..]
  135. $ xmake
  136. </code></pre>
  137. <p>另外,配置了<code>--trybuild=</code>参数手动指定了默认的构建系统,后续的build过程就不会额外提示用户选择了。</p>
  138. <h3 id="">实现快速交叉编译</h3>
  139. <p>众所周知,cmake/autotools维护的项目虽然很多都支持交叉编译,但是交叉编译的配置过程很复杂,不同的工具链处理方式还有很多的差异,中途会踩到很多的坑。</p>
  140. <p>即使跑通了一个工具链的交叉编译,如果切到另外一个工具链环境,可能又要折腾好久,而如果使用xmake,通常只需要两条简单的命令即可:</p>
  141. <p>!> 目前cmake/autotools都已对接支持了xmake的交叉编译。</p>
  142. <h4 id="android">交叉编译android平台</h4>
  143. <pre><code class="lang-bash">$ xmake f -p android --trybuild=autotools [--ndk=xxx]
  144. $ xmake
  145. </code></pre>
  146. <p>!> 其中,--ndk参数配置是可选的,如果用户设置了ANDROID_NDK_HOME环境变量,或者ndk放置在~/Library/Android/sdk/ndk-bundle,xmake都能自动检测到。</p>
  147. <p>是不是很简单?如果你觉得这没啥,那么可以对比下直接操作<code>./configure</code>去配置交叉编译,可以看下这篇文档对比下:<a href="https://developer.android.com/ndk/guides/other_build_systems#autoconf">将NDK 与其他编译系统配合使用</a></p>
  148. <p>说白了,你大概得这样,还不一定一次就能搞定:</p>
  149. <pre><code class="lang-bash">$ export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$HOST_TAG
  150. $ export AR=$TOOLCHAIN/bin/aarch64-linux-android-ar
  151. $ export AS=$TOOLCHAIN/bin/aarch64-linux-android-as
  152. $ export CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
  153. $ export CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++
  154. $ export LD=$TOOLCHAIN/bin/aarch64-linux-android-ld
  155. $ export RANLIB=$TOOLCHAIN/bin/aarch64-linux-android-ranlib
  156. $ export STRIP=$TOOLCHAIN/bin/aarch64-linux-android-strip
  157. $ ./configure --host aarch64-linux-android
  158. $ make
  159. </code></pre>
  160. <p>如果是cmake呢,交叉编译也不省事,对于android平台,得这么配置。</p>
  161. <pre><code class="lang-bash">$ cmake \
  162. -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake \
  163. -DANDROID_ABI=$ABI \
  164. -DANDROID_NATIVE_API_LEVEL=$MINSDKVERSION \
  165. $OTHER_ARGS
  166. </code></pre>
  167. <p>而对于 ios 平台,没找到简单的配置方式,就找到个第三方的 ios 工具链配置,很复杂:<a href="https://github.com/leetal/ios-cmake/blob/master/ios.toolchain.cmake">https://github.com/leetal/ios-cmake/blob/master/ios.toolchain.cmake</a></p>
  168. <p>对于 mingw 又是另外一种方式,我又折腾了半天环境,很是折腾。</p>
  169. <p>而对接了xmake后,不管是cmake还是autotools,交叉编译都是非常简单的,而且配置方式也完全一样,精简一致。</p>
  170. <h4 id="iphoneos">交叉编译iphoneos平台</h4>
  171. <pre><code class="lang-bash">$ xmake f -p iphoneos --trybuild=[cmake|autotools]
  172. $ xmake
  173. </code></pre>
  174. <h4 id="mingw">交叉编译mingw平台</h4>
  175. <pre><code class="lang-bash">$ xmake f -p mingw --trybuild=[cmake|autotools] [--mingw=xxx]
  176. $ xmake
  177. </code></pre>
  178. <h4 id="">使用其他交叉编译工具链</h4>
  179. <pre><code class="lang-bash">$ xmake f -p cross --trybuild=[cmake|autotools] --sdk=/xxxx
  180. $ xmake
  181. </code></pre>
  182. <p>关于更多交叉编译的配置细节,请参考文档:<a href="https://xmake.io/#/zh-cn/guide/configuration?id=%e4%ba%a4%e5%8f%89%e7%bc%96%e8%af%91">交叉编译</a>,除了多了一个<code>--trybuild=</code>参数,其他交叉编译配置参数都是完全通用的。</p>
  183. <h3 id="">传递用户配置参数</h3>
  184. <p>我们可以通过<code>--tryconfigs=</code>来传递用户额外的配置参数到对应的第三方构建系统,比如:autotools会传递给<code>./configure</code>,cmake会传递给<code>cmake</code>命令。</p>
  185. <pre><code class="lang-bash">$ xmake f --trybuild=autotools --tryconfigs="--enable-shared=no"
  186. $ xmake
  187. </code></pre>
  188. <p>比如上述命令,传递<code>--enable-shared=no</code>给<code>./configure</code>,来禁用动态库编译。</p>
  189. <p>另外,对于<code>--cflags</code>, <code>--includedirs</code>和<code>--ldflags</code>等参数,不需要通过<code>--tryconfigs</code>,通过<code>xmake config --cflags=</code>等内置参数就可透传过去。</p>
  190. <h3 id="">编译其他构建系统过程示例</h3>
  191. <h4 id="">通用编译方式</h4>
  192. <p>大多数情况下,每个构建系统对接后的编译方式都是一致的,除了<code>--trybuild=</code>配置参数除外。</p>
  193. <pre><code class="lang-bash">$ xmake f --trybuild=[autotools|cmake|meson|ninja|bazel|make|msbuild|xcodebuild]
  194. $ xmake
  195. </code></pre>
  196. <p>!> 我们还需要确保--trybuild指定的构建工具已经安装能够正常使用。</p>
  197. <h4 id="androidjni">构建Android jni程序</h4>
  198. <p>如果当前项目下存在<code>jni/Android.mk</code>,那么xmake可以直接调用ndk-build来构建jni库。</p>
  199. <pre><code class="lang-bash">$ xmake f -p android --trybuild=ndkbuild [--ndk=]
  200. $ xmake
  201. </code></pre>
  202. <p>如果觉得命令行编译jni比较麻烦,xmake也提供了相关的gradle集成插件<a href="https://github.com/xmake-io/xmake-gradle">xmake-gradle</a>,可以无缝集成xmake进行jni库的编译集成,具体详情见:<a href="https://xmake.io/#/zh-cn/plugin/more_plugins?id=gradle%e6%8f%92%e4%bb%b6%ef%bc%88jni%ef%bc%89">使用xmake-gradle插件构建JNI程序</a></p>
  203. </article>
  204. </body>
  205. </html>