import{_ as a,c as s,o as t,ae as e}from"./chunks/framework.l7bN90nj.js";const o=JSON.parse('{"title":"Build from Source","description":"","frontmatter":{},"headers":[],"relativePath":"zh/dev/build.md","filePath":"zh/dev/build.md"}'),l={name:"zh/dev/build.md"};function n(h,i,p,d,r,k){return t(),s("div",null,[...i[0]||(i[0]=[e(`<h1 id="build-from-source" tabindex="-1">Build from Source <a class="header-anchor" href="#build-from-source" aria-label="Permalink to &quot;Build from Source&quot;">​</a></h1><p>clice 依赖 C++23 特性，需要使用高版本的 C++ 编译器。同时，我们需要链接 LLVM/Clang 库来解析 AST。为了加快构建速度，默认配置会下载我们发布的 <a href="https://github.com/clice-io/clice-llvm" target="_blank" rel="noreferrer">clice-llvm</a> 预编译包。这要求你的本地环境与预编译环境保持较高的一致性（尤其是开启 Address Sanitizer 或 LTO 时）。</p><p>为了简化环境设置并保证可复现性，我们<strong>强烈推荐</strong>使用 <a href="https://pixi.prefix.dev/latest" target="_blank" rel="noreferrer">pixi</a> 来管理开发环境。所有的依赖版本均严格定义在 <code>pixi.toml</code> 中。</p><p>如果你不想使用 pixi，请参考下方的 <a href="#manual-build">Manual Build</a> 章节。</p><h2 id="quick-start" tabindex="-1">Quick Start <a class="header-anchor" href="#quick-start" aria-label="Permalink to &quot;Quick Start&quot;">​</a></h2><p>请参考 <a href="https://pixi.prefix.dev/latest/installation" target="_blank" rel="noreferrer">pixi</a> 官方指南安装 pixi。</p><p>我们内置了一系列任务，以下命令可直接完成编译并运行测试：</p><div class="language-shell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># configure &amp;&amp; build (default RelWithDebInfo)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pixi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># unit &amp;&amp; integration</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pixi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> test</span></span></code></pre></div><p>细粒度任务：上述命令由多个子任务组成，你也可以单独运行它们，并支持通过第一个参数指定构建类型：</p><div class="language-shell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pixi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> cmake-config</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> Debug</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pixi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> cmake-build</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> Debug</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pixi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> unit-test</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> Debug</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pixi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> integration-test</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> Debug</span></span></code></pre></div><div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p><p>如果你想直接使用 <code>cmake</code>, <code>ninja</code>, <code>clang++</code> 等命令进行开发，请运行 <code>pixi shell</code> 进入已配置好环境变量的终端</p></div><h3 id="xmake" tabindex="-1">XMake <a class="header-anchor" href="#xmake" aria-label="Permalink to &quot;XMake&quot;">​</a></h3><p>我们同样支持使用 XMake 构建：</p><div class="language-shell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># config &amp; build (default releasedbg)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pixi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> xmake</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># unit &amp; integration</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pixi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> xmake-test</span></span></code></pre></div><h2 id="manual-build" tabindex="-1">Manual Build <a class="header-anchor" href="#manual-build" aria-label="Permalink to &quot;Manual Build&quot;">​</a></h2><p>如果你打算手动构建，请务必先确认你的工具链满足 pixi.toml 中定义的版本要求。</p><blockquote><p>兼容性说明：理论上 clice 不依赖特定编译器的扩展，可以使用主流编译器（GCC/Clang/MSVC）编译。但我们仅在 CI 中保证特定版本的 Clang 能通过测试。对于其他编译器或版本，我们提供<strong>尽力而为 (Best Effort)</strong> 的支持。如果遇到问题，欢迎提交 Issue 或 PR</p></blockquote><h3 id="cmake" tabindex="-1">CMake <a class="header-anchor" href="#cmake" aria-label="Permalink to &quot;CMake&quot;">​</a></h3><div class="language-shell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">cmake</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -B</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -G</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> Ninja</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    -DCMAKE_BUILD_TYPE=RelWithDebInfo</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain.cmake</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    -DCLICE_ENABLE_TEST=ON</span></span></code></pre></div><blockquote><p>注意：<code>CMAKE_TOOLCHAIN_FILE</code> 是可选的。如果你使用的工具链与我们完全一致，可以使用预定义的 <code>cmake/toolchain.cmake</code>，否则请移除该选项</p></blockquote><p>可选的构建选项：</p><table tabindex="0"><thead><tr><th>选项</th><th>默认值</th><th>效果</th></tr></thead><tbody><tr><td>LLVM_INSTALL_PATH</td><td>&quot;&quot;</td><td>使用自定义路径的 LLVM 库来构建 clice</td></tr><tr><td>CLICE_ENABLE_TEST</td><td>OFF</td><td>是否构建 clice 的单元测试</td></tr><tr><td>CLICE_USE_LIBCXX</td><td>OFF</td><td>是否使用 libc++ 来构建 clice（添加 <code>-std=libc++</code>），如果开启，请确保 LLVM 库也是使用 libc++ 编译的</td></tr><tr><td>CLICE_CI_ENVIRONMENT</td><td>OFF</td><td>是否打开 <code>CLICE_CI_ENVIRONMENT</code> 这个宏，有些测试在 CI 环境才会执行</td></tr></tbody></table><h3 id="xmake-1" tabindex="-1">XMake <a class="header-anchor" href="#xmake-1" aria-label="Permalink to &quot;XMake&quot;">​</a></h3><p>使用如下命令即可构建 clice：</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">xmake</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> f</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -c</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --mode=releasedbg</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --toolchain=clang</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">xmake</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --all</span></span></code></pre></div><p>可选的构建选项：</p><table tabindex="0"><thead><tr><th>选项</th><th>默认值</th><th>效果</th></tr></thead><tbody><tr><td>--llvm</td><td>&quot;&quot;</td><td>使用自定义路径的 LLVM 库来构建 clice</td></tr><tr><td>--enable_test</td><td>false</td><td>是否构建 clice 的单元测试</td></tr><tr><td>--ci</td><td>false</td><td>是否打开 <code>CLICE_CI_ENVIRONMENT</code></td></tr></tbody></table><h2 id="about-llvm" tabindex="-1">About LLVM <a class="header-anchor" href="#about-llvm" aria-label="Permalink to &quot;About LLVM&quot;">​</a></h2><p>clice 调用 Clang API 来解析 C++ 代码，因此必须链接 LLVM/Clang 库。由于 clice 使用了 Clang 的私有头文件（这些文件通常不包含在发行版中），不能直接使用系统安装的 LLVM 包。</p><p>主要有两种方式解决这个依赖问题：</p><ol><li>我们在 <a href="https://github.com/clice-io/clice-llvm/releases" target="_blank" rel="noreferrer">clice-llvm</a> 上会发布使用的 LLVM 版本的预编译二进制，用于 CI 或者 release 构建。在构建时 cmake 和 xmake 默认会从此处下载 LLVM 库然后使用。</li></ol><div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p><p></p><p>对于 debug 版本的 LLVM 库，构建的时候我们开启了 address sanitizer，而 address sanitizer 依赖于 compiler rt，它对编译器版本十分敏感。所以如果使用 debug 版本，请确保你的 clang 的 compiler rt 版本与 <code>pixi.toml</code> 中的定义严格一致。</p></div><ol start="2"><li>自行构建一套与当前环境一致的 LLVM/Clang。如果默认的预编译二进制文件在你的系统上因 ABI 或库版本不兼容而运行失败，或者你需要一个自定义的 Debug 版本，那么我们推荐你使用此方法从头编译 LLVM 库。我们提供了一个脚本 <code>scripts/build-llvm.py</code> 用于构建所需要的 LLVM 库，也可以参考 LLVM 的官方构建教程 <a href="https://llvm.org/docs/CMake.html" target="_blank" rel="noreferrer">Building LLVM with CMake</a>。</li></ol>`,33)])])}const F=a(l,[["render",n]]);export{o as __pageData,F as default};
