From 08c87d45c761cf1953564c0b05228ba12c97e567 Mon Sep 17 00:00:00 2001 From: qjivy Date: Sat, 9 Dec 2023 13:47:25 +0000 Subject: [PATCH] deploy: b5d4d994d1441a64896d86c98bdbd05eecc51883 --- 404.html | 4 +- assets/{app.4e63494a.js => app.a97a291d.js} | 2 +- .../chunks/@localSearchIndexroot.7529f5f0.js | 1 + .../chunks/@localSearchIndexroot.a78eca85.js | 1 - ...db4070.js => VPLocalSearchBox.ac629888.js} | 2 +- .../{theme.c491cd3e.js => theme.120ea6ca.js} | 2 +- assets/zh_benchmark_coremark.md.40178108.js | 7 - .../zh_benchmark_coremark.md.40178108.lean.js | 1 - assets/zh_benchmark_coremark.md.8bb24a44.js | 29 +++ .../zh_benchmark_coremark.md.8bb24a44.lean.js | 1 + ...vironment_gnu-generic_index.md.0cd998a2.js | 77 ++++++++ ...ment_gnu-generic_index.md.0cd998a2.lean.js | 1 + ...ironment_llvm-generic_index.md.22159a68.js | 133 +++++++++++++ ...ent_llvm-generic_index.md.22159a68.lean.js | 1 + ...onment_plct-milkv-duo_index.md.3a67286f.js | 73 +++++++ ...t_plct-milkv-duo_index.md.3a67286f.lean.js | 1 + ...t_xthead-sipeed-lpi4a_index.md.1e5178cf.js | 163 +++++++++++++++ ...ead-sipeed-lpi4a_index.md.1e5178cf.lean.js | 1 + ...md.d295970d.js => zh_index.md.05afa7cc.js} | 2 +- ...d.lean.js => zh_index.md.05afa7cc.lean.js} | 2 +- ...02ef3b95.js => zh_index_en.md.a6c3ff8b.js} | 2 +- ...ean.js => zh_index_en.md.a6c3ff8b.lean.js} | 2 +- ...s => zh_introduction_index.md.90a7a037.js} | 2 +- ...zh_introduction_index.md.90a7a037.lean.js} | 2 +- assets/zh_mirror_index.md.4268033b.js | 21 ++ assets/zh_mirror_index.md.4268033b.lean.js | 1 + ...a93df9.js => zh_plan_index.md.08fbf5a0.js} | 2 +- ...n.js => zh_plan_index.md.08fbf5a0.lean.js} | 2 +- assets/zh_ruyi-package_index.md.26b856ed.js | 125 ++++++++++++ .../zh_ruyi-package_index.md.26b856ed.lean.js | 1 + assets/zh_ruyi-package_index.md.ef248f25.js | 5 - .../zh_ruyi-package_index.md.ef248f25.lean.js | 1 - ...564.js => zh_sdk_gnu_index.md.e15bc5c0.js} | 2 +- ...s => zh_sdk_gnu_index.md.e15bc5c0.lean.js} | 2 +- ...05.js => zh_sdk_llvm_index.md.0cfe75f5.js} | 2 +- ... => zh_sdk_llvm_index.md.0cfe75f5.lean.js} | 2 +- ...machine_qemu-upstream_index.md.d5187c21.js | 109 +++++++++++ ...ne_qemu-upstream_index.md.d5187c21.lean.js | 1 + ...l_machine_qemu-xthead_index.md.4d101c53.js | 115 +++++++++++ ...hine_qemu-xthead_index.md.4d101c53.lean.js | 1 + hashmap.json | 2 +- zh/benchmark/coremark.html | 46 +++-- zh/environment/gnu-generic/index.html | 99 ++++++++++ zh/environment/llvm-generic/index.html | 155 +++++++++++++++ zh/environment/plct-milkv-duo/index.html | 95 +++++++++ zh/environment/xthead-sipeed-lpi4a/index.html | 185 ++++++++++++++++++ zh/index.html | 8 +- zh/index_en.html | 8 +- zh/introduction/index.html | 10 +- zh/mirror/index.html | 43 ++++ zh/plan/index.html | 10 +- zh/ruyi-package/index.html | 138 ++++++++++++- zh/sdk/gnu/index.html | 10 +- zh/sdk/llvm/index.html | 10 +- zh/virtual_machine/qemu-upstream/index.html | 131 +++++++++++++ zh/virtual_machine/qemu-xthead/index.html | 137 +++++++++++++ 56 files changed, 1909 insertions(+), 82 deletions(-) rename assets/{app.4e63494a.js => app.a97a291d.js} (95%) create mode 100644 assets/chunks/@localSearchIndexroot.7529f5f0.js delete mode 100644 assets/chunks/@localSearchIndexroot.a78eca85.js rename assets/chunks/{VPLocalSearchBox.36db4070.js => VPLocalSearchBox.ac629888.js} (99%) rename assets/chunks/{theme.c491cd3e.js => theme.120ea6ca.js} (99%) delete mode 100644 assets/zh_benchmark_coremark.md.40178108.js delete mode 100644 assets/zh_benchmark_coremark.md.40178108.lean.js create mode 100644 assets/zh_benchmark_coremark.md.8bb24a44.js create mode 100644 assets/zh_benchmark_coremark.md.8bb24a44.lean.js create mode 100644 assets/zh_environment_gnu-generic_index.md.0cd998a2.js create mode 100644 assets/zh_environment_gnu-generic_index.md.0cd998a2.lean.js create mode 100644 assets/zh_environment_llvm-generic_index.md.22159a68.js create mode 100644 assets/zh_environment_llvm-generic_index.md.22159a68.lean.js create mode 100644 assets/zh_environment_plct-milkv-duo_index.md.3a67286f.js create mode 100644 assets/zh_environment_plct-milkv-duo_index.md.3a67286f.lean.js create mode 100644 assets/zh_environment_xthead-sipeed-lpi4a_index.md.1e5178cf.js create mode 100644 assets/zh_environment_xthead-sipeed-lpi4a_index.md.1e5178cf.lean.js rename assets/{zh_index.md.d295970d.js => zh_index.md.05afa7cc.js} (91%) rename assets/{zh_index.md.d295970d.lean.js => zh_index.md.05afa7cc.lean.js} (91%) rename assets/{zh_index_en.md.02ef3b95.js => zh_index_en.md.a6c3ff8b.js} (93%) rename assets/{zh_index_en.md.02ef3b95.lean.js => zh_index_en.md.a6c3ff8b.lean.js} (93%) rename assets/{zh_introduction_index.md.275fcd50.js => zh_introduction_index.md.90a7a037.js} (97%) rename assets/{zh_introduction_index.md.275fcd50.lean.js => zh_introduction_index.md.90a7a037.lean.js} (86%) create mode 100644 assets/zh_mirror_index.md.4268033b.js create mode 100644 assets/zh_mirror_index.md.4268033b.lean.js rename assets/{zh_plan_index.md.8fa93df9.js => zh_plan_index.md.08fbf5a0.js} (89%) rename assets/{zh_plan_index.md.8fa93df9.lean.js => zh_plan_index.md.08fbf5a0.lean.js} (89%) create mode 100644 assets/zh_ruyi-package_index.md.26b856ed.js create mode 100644 assets/zh_ruyi-package_index.md.26b856ed.lean.js delete mode 100644 assets/zh_ruyi-package_index.md.ef248f25.js delete mode 100644 assets/zh_ruyi-package_index.md.ef248f25.lean.js rename assets/{zh_sdk_gnu_index.md.b7287564.js => zh_sdk_gnu_index.md.e15bc5c0.js} (99%) rename assets/{zh_sdk_gnu_index.md.b7287564.lean.js => zh_sdk_gnu_index.md.e15bc5c0.lean.js} (86%) rename assets/{zh_sdk_llvm_index.md.63a36805.js => zh_sdk_llvm_index.md.0cfe75f5.js} (96%) rename assets/{zh_sdk_llvm_index.md.63a36805.lean.js => zh_sdk_llvm_index.md.0cfe75f5.lean.js} (86%) create mode 100644 assets/zh_virtual_machine_qemu-upstream_index.md.d5187c21.js create mode 100644 assets/zh_virtual_machine_qemu-upstream_index.md.d5187c21.lean.js create mode 100644 assets/zh_virtual_machine_qemu-xthead_index.md.4d101c53.js create mode 100644 assets/zh_virtual_machine_qemu-xthead_index.md.4d101c53.lean.js create mode 100644 zh/environment/gnu-generic/index.html create mode 100644 zh/environment/llvm-generic/index.html create mode 100644 zh/environment/plct-milkv-duo/index.html create mode 100644 zh/environment/xthead-sipeed-lpi4a/index.html create mode 100644 zh/mirror/index.html create mode 100644 zh/virtual_machine/qemu-upstream/index.html create mode 100644 zh/virtual_machine/qemu-xthead/index.html diff --git a/404.html b/404.html index 677c4466..51b58d60 100644 --- a/404.html +++ b/404.html @@ -7,14 +7,14 @@ - +
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.
- + \ No newline at end of file diff --git a/assets/app.4e63494a.js b/assets/app.a97a291d.js similarity index 95% rename from assets/app.4e63494a.js rename to assets/app.a97a291d.js index f2e1977d..9fb2f79b 100644 --- a/assets/app.4e63494a.js +++ b/assets/app.a97a291d.js @@ -1 +1 @@ -import{s,a3 as i,a4 as u,a5 as c,a6 as l,a7 as d,a8 as f,a9 as m,aa as h,ab as A,ac as g,X as P,d as v,u as y,j as C,y as w,ad as _,ae as b,af as E,ag as R}from"./chunks/framework.76cb5871.js";import{t as D}from"./chunks/theme.c491cd3e.js";function p(e){if(e.extends){const a=p(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const o=p(D),j=v({name:"VitePressApp",setup(){const{site:e}=y();return C(()=>{w(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),_(),b(),E(),o.setup&&o.setup(),()=>R(o.Layout)}});async function O(){const e=T(),a=S();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",d),a.component("ClientOnly",f),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),o.enhanceApp&&await o.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function S(){return h(j)}function T(){let e=s,a;return A(t=>{let n=g(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=P(()=>import(n),[])),s&&(e=!1),r},o.NotFound)}s&&O().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{O as createApp}; +import{s,a3 as i,a4 as u,a5 as c,a6 as l,a7 as d,a8 as f,a9 as m,aa as h,ab as A,ac as g,X as P,d as v,u as y,j as C,y as w,ad as _,ae as b,af as E,ag as R}from"./chunks/framework.76cb5871.js";import{t as D}from"./chunks/theme.120ea6ca.js";function p(e){if(e.extends){const a=p(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const o=p(D),j=v({name:"VitePressApp",setup(){const{site:e}=y();return C(()=>{w(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),_(),b(),E(),o.setup&&o.setup(),()=>R(o.Layout)}});async function O(){const e=T(),a=S();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",d),a.component("ClientOnly",f),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),o.enhanceApp&&await o.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function S(){return h(j)}function T(){let e=s,a;return A(t=>{let n=g(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=P(()=>import(n),[])),s&&(e=!1),r},o.NotFound)}s&&O().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{O as createApp}; diff --git a/assets/chunks/@localSearchIndexroot.7529f5f0.js b/assets/chunks/@localSearchIndexroot.7529f5f0.js new file mode 100644 index 00000000..73409980 --- /dev/null +++ b/assets/chunks/@localSearchIndexroot.7529f5f0.js @@ -0,0 +1 @@ +const e='{"documentCount":26,"nextId":26,"documentIds":{"0":"/docs/zh/benchmark/coremark.html#使用编译环境进行-coremark-构建","1":"/docs/zh/environment/gnu-generic/#使用-gnu-上游工具链配置-risc-v-编译环境","2":"/docs/zh/environment/llvm-generic/#使用-llvm-上游工具链配置-risc-v-编译环境","3":"/docs/zh/environment/plct-milkv-duo/#使用-plct-工具链配置-milkv-duo-编译环境","4":"/docs/zh/environment/xthead-sipeed-lpi4a/#使用平头哥工具链配置荔枝派-4a-编译环境","5":"/docs/zh/introduction/#介绍","6":"/docs/zh/introduction/#ruyisdk-的目标","7":"/docs/zh/introduction/#ruyisdk-架构示意图","8":"/docs/zh/introduction/#ruyisdk-包含的内容","9":"/docs/zh/introduction/#ruyisdk-包管理器","10":"/docs/zh/mirror/#用户软件源搭建","11":"/docs/zh/plan/#版本规划路线图","12":"/docs/zh/ruyi-package/#ruyi-包管理器","13":"/docs/zh/ruyi-package/#支持的发行版平台","14":"/docs/zh/ruyi-package/#命令","15":"/docs/zh/ruyi-package/#依赖软件","16":"/docs/zh/ruyi-package/#安装-ruyi-包管理器","17":"/docs/zh/ruyi-package/#刷新软件包缓存","18":"/docs/zh/ruyi-package/#卸载-ruyi-包管理器","19":"/docs/zh/sdk/gnu/#使用-gnu-上游工具链配置-risc-v-编译环境","20":"/docs/zh/sdk/gnu/#安装","21":"/docs/zh/sdk/gnu/#创建虚拟环境","22":"/docs/zh/sdk/gnu/#使用","23":"/docs/zh/sdk/llvm/#使用-llvm-上游工具链配置-risc-v-编译环境","24":"/docs/zh/virtual_machine/qemu-upstream/#使用上游-qemu-模拟器运行交叉编译的-risc-v-二进制","25":"/docs/zh/virtual_machine/qemu-xthead/#使用平头哥-qemu-模拟器运行交叉编译的-risc-v-二进制"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[3,1,158],"1":[6,1,236],"2":[6,1,331],"3":[6,1,194],"4":[3,1,243],"5":[1,1,11],"6":[2,1,36],"7":[2,1,1],"8":[2,1,1],"9":[2,3,4],"10":[1,1,29],"11":[1,1,1],"12":[2,1,8],"13":[1,2,21],"14":[1,2,26],"15":[1,2,21],"16":[3,2,124],"17":[1,2,87],"18":[3,3,52],"19":[6,1,1],"20":[1,6,91],"21":[1,6,135],"22":[1,6,55],"23":[6,1,28],"24":[6,1,208],"25":[6,1,209]},"averageFieldLength":[2.8461538461538463,1.9230769230769236,88.88461538461539],"storedFields":{"0":{"title":"使用编译环境进行 Coremark 构建","titles":[]},"1":{"title":"使用 GNU 上游工具链配置 RISC-V 编译环境","titles":[]},"2":{"title":"使用 LLVM 上游工具链配置 RISC-V 编译环境","titles":[]},"3":{"title":"使用 PLCT 工具链配置 Milkv-Duo 编译环境","titles":[]},"4":{"title":"使用平头哥工具链配置荔枝派 4A 编译环境","titles":[]},"5":{"title":"介绍","titles":[]},"6":{"title":"RUYISDK 的目标","titles":["介绍"]},"7":{"title":"RUYISDK 架构示意图","titles":["介绍"]},"8":{"title":"RuyiSDK 包含的内容","titles":["介绍"]},"9":{"title":"RuyiSDK 包管理器","titles":["介绍","RuyiSDK 包含的内容"]},"10":{"title":"用户软件源搭建","titles":[]},"11":{"title":"版本规划路线图","titles":[]},"12":{"title":"Ruyi 包管理器","titles":[]},"13":{"title":"支持的发行版平台","titles":["Ruyi 包管理器"]},"14":{"title":"命令","titles":["Ruyi 包管理器"]},"15":{"title":"依赖软件","titles":["Ruyi 包管理器"]},"16":{"title":"安装 RUYI 包管理器","titles":["Ruyi 包管理器"]},"17":{"title":"刷新软件包缓存","titles":["Ruyi 包管理器"]},"18":{"title":"卸载 RUYI 包管理器","titles":["Ruyi 包管理器","刷新软件包缓存"]},"19":{"title":"使用 GNU 上游工具链配置 RISC-V 编译环境","titles":[]},"20":{"title":"安装","titles":["使用 GNU 上游工具链配置 RISC-V 编译环境"]},"21":{"title":"创建虚拟环境","titles":["使用 GNU 上游工具链配置 RISC-V 编译环境"]},"22":{"title":"使用","titles":["使用 GNU 上游工具链配置 RISC-V 编译环境"]},"23":{"title":"使用 LLVM 上游工具链配置 RISC-V 编译环境","titles":[]},"24":{"title":"使用上游 QEMU 模拟器运行交叉编译的 RISC-V 二进制","titles":[]},"25":{"title":"使用平头哥 QEMU 模拟器运行交叉编译的 RISC-V 二进制","titles":[]}},"dirtCount":0,"index":[["编译一个简单的",{"2":{"24":1,"25":1}}],["编译环境",{"0":{"1":1,"2":1,"3":1,"4":1,"19":1,"23":1},"1":{"20":1,"21":1,"22":1},"2":{"0":2,"2":1,"24":1,"25":1}}],["运行",{"2":{"24":1,"25":1}}],["运行构建出的",{"2":{"24":1,"25":1}}],["运行时或虚拟机",{"2":{"6":1}}],["支持的荔枝派",{"2":{"25":1}}],["支持的发行版平台",{"0":{"13":1}}],["支持",{"2":{"24":1}}],["二进制",{"0":{"24":1,"25":1},"2":{"24":1,"25":1}}],["创建虚拟环境",{"0":{"21":1}}],["务必提前确认您的操作会得到预期效果",{"2":{"18":1}}],["手动执行删除软件包操作时",{"2":{"18":1}}],["下对应的",{"2":{"18":1}}],["下载并解包指定的源码包",{"2":{"14":2}}],["下载并安装指定的软件包",{"2":{"14":2}}],["此时您可以尝试删除",{"2":{"18":1}}],["此时应当可以正常调用工具链",{"2":{"3":1}}],["此时应当可以正常调用",{"2":{"2":1}}],["可能会导致软件包无法重新安装",{"2":{"18":1}}],["可以看到",{"2":{"24":1,"25":1}}],["可以看到成功构建",{"2":{"0":1}}],["可以从",{"2":{"1":1,"20":1}}],["再执行安装",{"2":{"18":1}}],["即首先卸载",{"2":{"18":1}}],["而",{"2":{"18":1}}],["实现",{"2":{"18":1}}],["同样的这个命令将会询问您以二次确认该操作",{"2":{"18":1}}],["并使用平头哥",{"2":{"25":1}}],["并使用上游",{"2":{"24":1}}],["并不会删除软件包缓存和安装的",{"2":{"18":1}}],["并且改变",{"2":{"1":1,"21":1}}],["本身",{"2":{"18":1}}],["上面的命令只是删除",{"2":{"18":1}}],["上游工具链软件包名为",{"2":{"1":1,"2":1,"20":1,"23":1}}],["上游工具链配置",{"0":{"1":1,"2":1,"19":1,"23":1},"1":{"20":1,"21":1,"22":1}}],["如果希望删除所有缓存和安装了的软件包以实现干净的卸载",{"2":{"18":1}}],["如果希望",{"2":{"18":2}}],["如果软件包显示",{"2":{"17":1}}],["则该软件包的当前版本不支持本机架构",{"2":{"17":1}}],["代表了模拟器二进制包",{"2":{"17":1}}],["代表了工具链二进制包",{"2":{"17":1}}],["代表了软件源码包",{"2":{"17":1}}],["其中",{"2":{"17":1}}],["其他均为工具链二进制",{"2":{"1":1,"3":1,"21":1}}],["8",{"2":{"17":2,"24":12}}],["8m",{"2":{"4":2}}],["qemu",{"0":{"24":1,"25":1},"2":{"17":4,"24":49,"25":49}}],["query",{"2":{"2":2}}],["quot",{"2":{"0":8,"10":32,"24":4,"25":4}}],["查看可用的二进制",{"2":{"24":1,"25":1}}],["查看可用的软件包",{"2":{"17":1}}],["查看可用的工具链二进制",{"2":{"1":1,"2":1,"3":1,"4":1,"21":1}}],["通常为",{"2":{"17":1}}],["更新软件包缓存",{"2":{"17":1}}],["刷新软件包缓存",{"0":{"17":1},"1":{"18":1}}],["列出已知编译环境配置",{"2":{"17":1}}],["列出已安装的配置",{"2":{"14":2}}],["列出所有软件包的详细信息",{"2":{"17":1}}],["列出帮助信息",{"2":{"16":1}}],["应当可以正常打印版本信息",{"2":{"16":1}}],["应用框架等",{"2":{"6":1}}],["+x",{"2":{"16":2}}],["需要手动安装",{"2":{"15":1}}],["需要编辑构建脚本",{"2":{"0":1}}],["依赖软件",{"0":{"15":1}}],["卸载",{"0":{"18":1},"2":{"14":2}}],["完善中",{"2":{"14":2}}],["镜像搭建工具",{"2":{"14":2}}],["虚拟环境",{"2":{"14":2}}],["虚拟环境类似",{"2":{"1":1,"21":1}}],["目前支持的命令如下",{"2":{"14":1}}],["目录建立编译环境",{"2":{"3":1}}],["目录为",{"2":{"1":1,"17":1,"20":1}}],["模拟器的命令为",{"2":{"24":1,"25":1}}],["模拟器运行交叉编译的",{"0":{"24":1,"25":1}}],["模拟器",{"2":{"12":1}}],["用于管理工具链",{"2":{"12":1}}],["用户软件源搭建",{"0":{"10":1}}],["版本",{"2":{"16":1}}],["版本的稳定二进制为",{"2":{"16":1}}],["版本在以下平台进行了测试",{"2":{"13":1}}],["版本规划路线图",{"0":{"11":1}}],["版本中",{"2":{"2":1,"23":1}}],["9212d87c63a2da4e5355a7a1c75380aeba40fbd0ea3d71d3784cb3eac94237f9bea2a1b7993a08f39d4197725c4c133087d3a9d213d3944aa48a7559de2be920",{"2":{"10":2}}],["9m",{"2":{"2":2,"3":2,"4":2,"25":2}}],["zlib",{"2":{"10":4}}],["zstd",{"2":{"15":2}}],["zstd$",{"2":{"15":2}}],["zst",{"2":{"2":6,"24":6,"25":6}}],["建立",{"2":{"10":1}}],["建立编译环境",{"2":{"4":1,"24":1,"25":1}}],["仅有建立",{"2":{"10":1}}],["尚未开发完全",{"2":{"10":1}}],["文档",{"2":{"9":1}}],["项目",{"2":{"9":1}}],["包管理时您需要手动进行该操作",{"2":{"18":1}}],["包管理被设计为避免进行需要超级用户权限的操作",{"2":{"18":1}}],["包管理自身的升级可能会需要超级用户权限",{"2":{"18":1}}],["包管理不询问而直接执行",{"2":{"18":2}}],["包管理支持",{"2":{"16":1}}],["包管理是",{"2":{"12":1}}],["包管理器也没有实现卸载",{"2":{"18":1}}],["包管理器的过程",{"2":{"18":1}}],["包管理器依赖一些外部工具",{"2":{"15":1}}],["包管理器ruyi",{"2":{"14":1}}],["包管理器",{"0":{"9":1,"12":1,"16":1,"18":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1},"2":{"13":1,"14":1,"18":2}}],["包含的内容",{"0":{"8":1},"1":{"9":1}}],["包括",{"2":{"2":1}}],["架构环境为例进行安装",{"2":{"16":1}}],["架构编译环境",{"2":{"16":1}}],["架构示意图",{"0":{"7":1}}],["架构的二进制",{"2":{"0":1,"4":1}}],["培育运营一个活跃全面的开发者交流社区",{"2":{"6":1}}],["厂商定制扩展",{"2":{"6":1}}],["标准",{"2":{"6":1}}],["等已经大规模硅化的草案",{"2":{"6":1}}],["7218k",{"2":{"24":2}}],["7217k",{"2":{"24":2}}],["7",{"2":{"6":1}}],["7m",{"2":{"2":2}}],["将完全支持",{"2":{"6":1}}],["将自动选择具体的工具链版本",{"2":{"1":1,"21":1}}],["尤其强调",{"2":{"6":1}}],["计算库",{"2":{"6":1}}],["计划用三年时间为",{"2":{"5":1}}],["语言执行环境",{"2":{"6":1}}],["系统生成客户所需的操作系统",{"2":{"6":1}}],["系统获得硬件资料说明",{"2":{"6":1}}],["扩展指令集架构组合",{"2":{"6":1}}],["调试支持等",{"2":{"6":1}}],["调用工具链",{"2":{"1":1,"22":1}}],["固件",{"2":{"6":1}}],["都可以通过",{"2":{"6":2}}],["开发中的包管理器",{"2":{"12":1}}],["开发板或模组",{"2":{"6":1}}],["开发者可以指定任何常用的",{"2":{"6":1}}],["开发者购买了",{"2":{"6":1}}],["开发者提供一个完整的",{"2":{"5":1}}],["任何一款",{"2":{"6":1}}],["几乎",{"2":{"6":1}}],["的功能",{"2":{"10":1}}],["的目标",{"0":{"6":1}}],["的输出可以看到",{"2":{"4":1}}],["的输出中获取",{"2":{"1":1,"20":1}}],["全家桶式的全功能开发环境",{"2":{"5":1}}],["年开始筹备",{"2":{"5":1}}],["是一个旨在提供给一个一体化集成开发环境的产品计划",{"2":{"5":1}}],["介绍",{"0":{"5":1},"1":{"6":1,"7":1,"8":1,"9":1}}],["成功编译并生成",{"2":{"4":1}}],["=a6c6dcc8a7565fc17427d8ece055874c9bbf6a7a",{"2":{"4":2}}],["=d9dbc7115d07d1953087dd2c1e5d46adc2ab0d4f",{"2":{"0":2}}],["程序并使用",{"2":{"24":1,"25":1}}],["程序",{"2":{"4":1}}],["平头哥工具链软件包名为",{"2":{"4":1}}],["中可以看到",{"2":{"4":1}}],["但是在构建过程中将会报错",{"2":{"4":1}}],["但是实际上并不存在该",{"2":{"2":1}}],["若指定不支持该特性的工具链建立虚拟环境并不会报错",{"2":{"4":1}}],["若使用包名则",{"2":{"1":1,"21":1}}],["特性的工具链包",{"2":{"4":1}}],["预置的",{"2":{"4":1}}],["从输出可以看到软件包共分为三种",{"2":{"17":1}}],["从发布镜像中选择合适架构的预编译二进制下载",{"2":{"16":1}}],["从配置的软件源更新本地软件包缓存",{"2":{"14":2}}],["从本地软件包缓存中列出可用软件包",{"2":{"14":2}}],["从",{"2":{"4":2,"5":1}}],["从远端软件源获取软件包",{"2":{"1":1,"20":1}}],["6104k",{"2":{"25":2}}],["6110k",{"2":{"25":2}}],["6",{"2":{"4":2,"17":2,"25":12}}],["6m",{"2":{"3":2}}],["64",{"2":{"0":2,"1":2,"2":7,"3":2,"4":4,"13":3,"20":2,"23":1,"24":4,"25":4}}],["进入编译环境",{"2":{"24":1,"25":1}}],["进入编译环境并编译一个简单的",{"2":{"4":1}}],["进入",{"2":{"2":1}}],["y",{"2":{"18":2}}],["y$",{"2":{"18":2}}],["yaml",{"2":{"2":2}}],["yaml2obj",{"2":{"2":2}}],["youmu",{"2":{"21":8,"22":6}}],["you",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["jitlink",{"2":{"2":4}}],["join",{"2":{"0":2}}],["和",{"2":{"2":1,"6":1,"16":1}}],["库",{"2":{"2":1}}],["获取",{"2":{"2":1}}],["指定从",{"2":{"2":1}}],["38",{"2":{"13":1}}],["3f6576971397b379d4205ae5451ff5a68edf6c103b2f03c4188ed7075fbb5f04",{"2":{"10":2}}],["33",{"2":{"4":2}}],["3577k",{"2":{"25":4}}],["35",{"2":{"4":2}}],["36",{"2":{"2":4}}],["398m",{"2":{"2":4}}],["39",{"2":{"0":4,"4":16,"17":4,"24":4,"25":4}}],["391k",{"2":{"0":4}}],["5",{"2":{"2":16,"6":1,"10":4,"17":2}}],["安装",{"0":{"16":1,"20":1},"2":{"2":1}}],["故在需要升级",{"2":{"18":1}}],["故不能指定",{"2":{"2":1}}],["故同时需要安装",{"2":{"2":1,"23":1}}],["信息",{"2":{"2":1}}],["另外尽管",{"2":{"2":1}}],["工具链是支持该特性的",{"2":{"4":1}}],["工具链软件包名为",{"2":{"3":1}}],["工具链",{"2":{"2":1,"6":1,"23":1}}],["工具链环境依赖",{"2":{"2":1,"23":1}}],["工具链配置",{"0":{"3":1},"2":{"0":1}}],["配置需要支持",{"2":{"4":1}}],["配置在",{"2":{"3":1,"4":1}}],["配置交叉编译环境",{"2":{"2":1,"23":1}}],["配置建立编译环境",{"2":{"1":1,"2":1,"21":1}}],["该命令将列出所有可用的软件包",{"2":{"17":1}}],["该命令将调用",{"2":{"1":1,"20":1}}],["该部分只适用于在",{"2":{"2":1,"23":1}}],["退出编译环境",{"2":{"1":1,"2":1,"3":1,"4":1,"22":1,"24":1,"25":1}}],["退出虚拟环境",{"2":{"0":1}}],["命令中打印了",{"2":{"2":1}}],["命令",{"0":{"14":1},"2":{"1":1,"21":1}}],["也可以使用",{"2":{"1":1,"21":1}}],["也可以使用如下命令让",{"2":{"1":1,"20":1}}],["以提示当前进入编译环境中",{"2":{"1":1,"21":1}}],["以后的未测试版本",{"2":{"1":1,"20":1}}],["激活编译环境",{"2":{"3":1}}],["激活方式与",{"2":{"1":1,"21":1}}],["激活构建环境",{"2":{"1":1,"21":1}}],["为激活编译环境用的脚本",{"2":{"1":1,"3":1,"21":1}}],["为如上选择的环境",{"2":{"1":1,"21":1}}],["除了",{"2":{"1":1,"3":1,"21":1}}],["n",{"2":{"24":2,"25":2}}],["needs",{"2":{"17":2}}],["ng",{"2":{"10":4}}],["nvptx",{"2":{"2":2}}],["name",{"2":{"2":2,"10":2}}],["namespace",{"2":{"2":2}}],["nm",{"2":{"1":4,"2":6,"3":4,"4":4,"21":4,"24":4,"25":4}}],["no",{"2":{"1":2,"3":2,"17":1,"22":2}}],["now",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["not",{"2":{"0":2,"1":2,"2":2,"3":2,"4":2,"16":2,"22":2}}],["参数指定工具链",{"2":{"1":1,"21":1}}],["`ruyi",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["由指定的工具链和配置建立",{"2":{"14":2}}],["由于配置",{"2":{"2":1,"23":1}}],["由于使用的工具链为",{"2":{"0":1}}],["由预置的",{"2":{"1":1,"2":1,"3":1,"4":1,"21":1}}],["注意",{"2":{"18":1}}],["注意二进制的文件名必须为",{"2":{"16":1}}],["注意在",{"2":{"2":1,"23":1}}],["注意所安装的版本可能是",{"2":{"1":1,"20":1}}],["注意这整个过程如果在",{"2":{"0":1}}],["自动选择最新版本安装",{"2":{"1":1,"20":1}}],["环境",{"2":{"2":1,"23":1}}],["环境将被还原",{"2":{"1":1,"22":1}}],["环境变量被设置时",{"2":{"1":1,"17":1,"20":1}}],["环境则不是交叉编译",{"2":{"0":1}}],["在本文档中家目录为",{"2":{"17":1}}],["在",{"2":{"1":1,"2":1,"17":1,"20":1}}],["~",{"2":{"1":1,"17":1,"18":1,"20":1}}],["解压并安装到用户目录",{"2":{"1":1,"20":1}}],["或",{"2":{"1":1,"18":1,"20":1}}],["变为正确的格式",{"2":{"1":1,"20":1}}],["之间的空格",{"2":{"1":1,"20":1}}],["且拷贝时应删除",{"2":{"1":1,"20":1}}],["xthead",{"2":{"4":18,"17":8,"25":26}}],["xray",{"2":{"2":2}}],["xdg",{"2":{"1":1,"17":1,"18":1,"20":1}}],["x86",{"2":{"1":2,"2":7,"3":2,"4":2,"13":3,"20":2,"23":1,"24":4,"25":4}}],["xz",{"2":{"1":6,"2":6,"3":6,"4":6,"15":4,"20":6,"24":6,"25":6}}],["xferd",{"2":{"0":2,"1":2,"2":4,"3":2,"4":2,"20":2,"24":4,"25":4}}],["最新版本二进制为",{"2":{"1":1,"2":1,"3":1,"4":1,"20":1,"23":1}}],["最新的源码版本为",{"2":{"0":1}}],["4m",{"2":{"24":4}}],["4a",{"0":{"4":1},"2":{"25":1}}],["4",{"2":{"0":2,"4":4}}],["e",{"2":{"24":2,"25":2}}],["emulator",{"2":{"17":5}}],["eof",{"2":{"4":4,"24":4,"25":4}}],["error",{"2":{"4":4}}],["even",{"2":{"1":2,"3":2,"22":2}}],["environment",{"2":{"1":10,"2":10,"3":10,"4":20,"16":2,"21":10,"24":10,"25":10}}],["elfedit",{"2":{"1":2,"3":2,"4":2,"21":2,"24":2,"25":2}}],["elf",{"2":{"0":2,"4":2}}],["exit",{"2":{"16":2}}],["extdef",{"2":{"2":2}}],["extracted",{"2":{"0":2}}],["extracting",{"2":{"0":2,"1":2,"2":4,"3":2,"4":2,"20":2,"24":4,"25":4}}],["extract",{"2":{"0":2,"2":2,"14":2,"16":8}}],["executor",{"2":{"2":2}}],["executable",{"2":{"0":2,"4":2}}],["exegesis",{"2":{"2":2}}],["exe",{"2":{"0":6}}],["fetch",{"2":{"16":2}}],["fedora",{"2":{"13":1,"15":1}}],["flavor",{"2":{"17":2}}],["flavors",{"2":{"4":2}}],["float",{"2":{"0":2,"4":2}}],["from",{"2":{"2":3,"16":2}}],["free",{"2":{"1":4,"3":4,"22":4}}],["fresh",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["fields",{"2":{"2":2}}],["fixer",{"2":{"2":2}}],["find",{"2":{"2":4}}],["fitness",{"2":{"1":2,"3":2,"22":2}}],["filecheck",{"2":{"2":2}}],["files",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["file",{"2":{"0":2,"1":4,"2":6,"3":4,"4":10,"21":4,"24":4,"25":4}}],["foundation",{"2":{"1":2,"3":2,"22":2}}],["following",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["format",{"2":{"2":4}}],["for",{"2":{"0":4,"1":10,"2":6,"3":10,"4":10,"16":4,"17":1,"20":2,"21":2,"22":6,"24":6,"25":6}}],["work",{"2":{"21":8,"22":6}}],["working",{"2":{"0":2}}],["www",{"2":{"16":2}}],["wasm",{"2":{"2":2}}],["warranty",{"2":{"1":2,"3":2,"22":2}}],["windres",{"2":{"2":2}}],["with",{"2":{"0":4,"1":2,"2":2,"3":2,"4":6,"21":2,"24":2,"25":2}}],["wrapper",{"2":{"2":2}}],["wget",{"2":{"1":1,"15":4,"16":2,"20":1}}],["o3",{"2":{"24":2,"25":2}}],["of",{"2":{"16":4,"17":2}}],["offload",{"2":{"2":4}}],["openeuler",{"2":{"13":2,"15":1}}],["options",{"2":{"16":2}}],["opt",{"2":{"2":4}}],["out",{"2":{"4":4}}],["otool",{"2":{"2":2}}],["org",{"2":{"16":2}}],["or",{"2":{"1":2,"3":2,"6":1,"22":2}}],["obj2yaml",{"2":{"2":2}}],["objdump",{"2":{"1":1,"2":4,"3":1,"4":2,"21":1,"24":1,"25":2}}],["objdump$",{"2":{"1":1,"3":1,"21":1,"24":1}}],["objcopy",{"2":{"1":2,"2":4,"3":2,"4":2,"21":2,"24":2,"25":2}}],["o",{"2":{"0":2,"24":2,"25":2}}],["o2",{"2":{"0":4}}],["ubuntu",{"2":{"13":1,"15":1}}],["user",{"2":{"17":4,"24":16,"25":16}}],["users",{"2":{"16":2}}],["uselistorder",{"2":{"2":2}}],["usr",{"2":{"16":2}}],["usage",{"2":{"1":2,"2":2,"3":2,"4":4,"16":2,"21":2,"24":2,"25":2}}],["uninstall$",{"2":{"18":1}}],["uninstall",{"2":{"14":2,"18":7}}],["unicodenamemappinggenerator",{"2":{"2":2}}],["undname",{"2":{"2":2}}],["unknown",{"2":{"1":74,"2":50,"4":4,"20":6,"21":64,"22":4}}],["update$",{"2":{"17":1}}],["update",{"2":{"14":2,"16":8,"17":1}}],["upstreamruyi",{"2":{"20":1}}],["upstream$",{"2":{"1":1}}],["upstream",{"2":{"1":27,"2":34,"17":10,"20":19,"21":6,"22":2,"23":6,"24":10}}],["upload",{"2":{"0":2,"1":2,"2":4,"3":2,"4":2,"20":2,"24":4,"25":4}}],["ucb",{"2":{"0":2,"4":2}}],["utils",{"2":{"15":2}}],["util",{"2":{"0":2}}],["subcommands",{"2":{"16":4}}],["sudo",{"2":{"15":4,"16":2}}],["show",{"2":{"16":2}}],["sha256",{"2":{"10":2}}],["sha512",{"2":{"10":2}}],["share",{"2":{"1":3,"2":6,"3":2,"4":2,"18":1,"20":3,"24":4,"25":4}}],["sha1",{"2":{"0":2,"4":2}}],["sciences",{"2":{"16":2}}],["scan",{"2":{"2":8}}],["script",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["sanstats",{"2":{"2":2}}],["sancov",{"2":{"2":2}}],["split",{"2":{"2":4}}],["spent",{"2":{"0":2,"1":2,"2":4,"3":2,"4":2,"20":2,"24":4,"25":4}}],["speed",{"2":{"0":4,"1":4,"2":8,"3":4,"4":4,"20":4,"24":8,"25":8}}],["sipeed",{"2":{"4":29,"17":2,"25":2}}],["sim",{"2":{"2":2}}],["size",{"2":{"1":2,"2":6,"3":2,"4":2,"10":2,"21":2,"24":2,"25":2}}],["symbolizer",{"2":{"2":2}}],["symbols",{"2":{"2":2}}],["sysroot",{"2":{"1":4,"2":8,"3":4,"4":8,"21":4,"24":4,"25":4}}],["sysv",{"2":{"0":2,"4":2}}],["self",{"2":{"14":2,"16":6,"18":8}}],["see",{"2":{"1":2,"3":2,"22":2}}],["sed",{"2":{"0":2}}],["slug",{"2":{"1":9,"2":5,"3":4,"4":6,"17":8,"20":5,"21":4,"23":4,"24":2,"25":2}}],["software",{"2":{"1":4,"3":4,"16":2,"22":4}}],["source",{"2":{"1":5,"3":2,"10":2,"17":5,"21":3,"22":2}}],["sources",{"2":{"1":8,"2":6,"3":8,"4":6,"20":6,"22":2,"24":6,"25":6}}],["sourcing",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["so",{"2":{"0":2,"4":2}}],["stdio",{"2":{"24":2,"25":2}}],["stress",{"2":{"2":2}}],["strip",{"2":{"1":2,"2":6,"3":2,"4":2,"21":2,"24":2,"25":2}}],["stripped$",{"2":{"4":1}}],["stripped",{"2":{"0":2,"4":1}}],["strings",{"2":{"1":2,"2":4,"3":2,"4":2,"21":2,"24":2,"25":2}}],["str=",{"2":{"0":2}}],["state",{"2":{"0":2}}],["s",{"2":{"0":2,"16":2,"17":2}}],["generate",{"2":{"16":2}}],["generic",{"2":{"1":8,"2":3,"17":2,"21":8,"24":2}}],["get",{"2":{"15":4}}],["gt",{"2":{"4":2,"16":2,"24":4,"25":4}}],["glibc",{"2":{"4":2}}],["gsymutil",{"2":{"2":2}}],["github",{"2":{"9":1}}],["git",{"2":{"2":2,"15":4}}],["g++",{"2":{"1":2,"2":2,"3":2,"4":2,"21":2,"24":2,"25":2}}],["gdb",{"2":{"1":4,"3":4,"4":6,"21":4,"24":4,"25":4}}],["gcov",{"2":{"1":6,"3":6,"4":6,"21":6,"24":6,"25":6}}],["gcc",{"2":{"0":5,"1":12,"2":11,"3":12,"4":14,"21":8,"22":4,"23":2,"24":10,"25":10}}],["gprof",{"2":{"1":2,"3":2,"4":2,"21":2,"24":2,"25":2}}],["gfortran",{"2":{"1":2,"3":2,"4":2,"21":2,"24":2,"25":2}}],["g",{"2":{"0":2}}],["gnu",{"0":{"1":1,"19":1},"1":{"20":1,"21":1,"22":1},"2":{"0":7,"1":95,"2":62,"3":86,"4":95,"17":12,"20":21,"21":70,"22":4,"23":2,"24":82,"25":82}}],["gz",{"2":{"0":6,"10":4}}],["latest",{"2":{"17":18}}],["lts",{"2":{"13":1}}],["lt",{"2":{"4":4,"16":2,"24":6,"25":6}}],["lto2",{"2":{"2":2}}],["lto",{"2":{"1":2,"2":2,"3":2,"4":2,"21":2,"24":2,"25":2}}],["lpi4a",{"2":{"4":6,"17":2,"25":2}}],["lp64d",{"2":{"0":2,"4":2}}],["lli",{"2":{"2":4}}],["llc",{"2":{"2":2}}],["lld",{"2":{"2":8}}],["llvm",{"0":{"2":1,"23":1},"2":{"2":184,"17":4,"23":6}}],["ls",{"2":{"1":2,"2":2,"3":2,"4":2,"21":2,"24":2,"25":2}}],["lsb",{"2":{"0":2,"4":2}}],["local",{"2":{"1":3,"2":6,"3":2,"4":2,"16":2,"18":1,"20":3,"24":4,"25":4}}],["ld64",{"2":{"2":2}}],["ldd",{"2":{"1":2,"3":2,"4":2,"21":2,"24":2,"25":2}}],["ld",{"2":{"0":2,"1":4,"2":6,"3":4,"4":6,"21":4,"24":4,"25":4}}],["licenses",{"2":{"16":2}}],["license",{"2":{"16":4}}],["lipo",{"2":{"2":2}}],["libtool",{"2":{"2":2}}],["lib",{"2":{"0":2,"2":2,"4":2}}],["list",{"2":{"0":2,"1":1,"2":1,"4":4,"14":4,"16":8,"17":8,"20":1}}],["linker",{"2":{"2":2}}],["linked",{"2":{"0":2,"4":2}}],["link",{"2":{"0":4,"2":4}}],["linux64",{"2":{"0":4}}],["linux",{"2":{"0":9,"1":74,"2":50,"3":74,"4":82,"20":6,"21":64,"22":4,"24":72,"25":72}}],["lrt",{"2":{"0":4}}],["left",{"2":{"0":2,"1":2,"2":4,"3":2,"4":2,"20":2,"24":4,"25":4}}],["源码等各种二进制软件包和源码包",{"2":{"12":1}}],["源码并解包到当前目录",{"2":{"0":1}}],["源码可以直接从",{"2":{"0":1}}],["软件包安装目录后再重试安装",{"2":{"18":1}}],["软件包安装目录默认为",{"2":{"1":1,"20":1}}],["软件包安装进程或做了其他非预期操作时",{"2":{"18":1}}],["软件包的功能",{"2":{"18":1}}],["软件包",{"2":{"18":2}}],["软件包缓存将存放在用户目录中",{"2":{"17":1}}],["软件源搭建功能在",{"2":{"10":1}}],["软件源中下载",{"2":{"0":1}}],["软件更新",{"2":{"6":1}}],["软件仓库中下载",{"2":{"0":1}}],["这在您强制中断",{"2":{"18":1}}],["这个过程中您可以自主选择是否保留旧的软件包缓存和",{"2":{"18":1}}],["这个命令将会询问您以二次确认该操作",{"2":{"18":1}}],["这个操作将从",{"2":{"0":1}}],["这些预置的配置可以用于编译环境的搭建",{"2":{"17":1}}],["这是由于",{"2":{"2":1}}],["这里使用平头哥工具链配置带",{"2":{"25":1}}],["这里使用上游工具链配置带",{"2":{"24":1}}],["这里以",{"2":{"16":1}}],["这里命令",{"2":{"1":1,"21":1}}],["这里用",{"2":{"0":1}}],["putchar",{"2":{"24":2,"25":2}}],["purge",{"2":{"18":3}}],["purge$",{"2":{"18":1}}],["purpose",{"2":{"1":2,"3":2,"22":2}}],["posix",{"2":{"2":2}}],["port",{"2":{"0":2}}],["portme",{"2":{"0":4}}],["perfectshuffle",{"2":{"2":2}}],["performed",{"2":{"0":2}}],["pdbutil",{"2":{"2":2}}],["pp",{"2":{"2":2}}],["pseudo",{"2":{"2":2}}],["ps1",{"2":{"1":1,"21":1}}],["py",{"2":{"2":2}}],["python",{"2":{"1":1,"21":1}}],["particular",{"2":{"1":2,"3":2,"22":2}}],["path",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["packages",{"2":{"16":4,"17":2}}],["packager",{"2":{"2":2}}],["package",{"2":{"0":4,"1":4,"2":8,"3":4,"4":4,"16":6,"20":4,"24":8,"25":8}}],["prerelease",{"2":{"17":4}}],["pre",{"2":{"17":2}}],["prefix",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["printf",{"2":{"24":2,"25":2}}],["print",{"2":{"16":4}}],["profile",{"2":{"16":2}}],["profiles",{"2":{"4":1,"14":2,"17":2}}],["profgen",{"2":{"2":2}}],["profdata",{"2":{"2":2}}],["provisioned",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["plctxthead",{"2":{"4":74,"25":72}}],["plct",{"0":{"3":1},"2":{"0":6,"3":95,"4":19,"17":8,"24":88,"25":10}}],["apache",{"2":{"16":4}}],["apt",{"2":{"15":4}}],["apply",{"2":{"2":2}}],["appropriate",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["adapted",{"2":{"16":2}}],["admin",{"2":{"10":2,"14":2,"16":6}}],["add",{"2":{"1":2,"3":2,"4":2,"21":2,"24":2,"25":2}}],["addr2line",{"2":{"1":2,"2":4,"3":2,"4":2,"21":2,"24":2,"25":2}}],["analyzer",{"2":{"2":2}}],["analyze",{"2":{"2":2}}],["and",{"2":{"1":4,"2":4,"3":4,"4":8,"16":6,"21":4,"24":4,"25":4}}],["amdgpu",{"2":{"2":2}}],["amd64",{"2":{"2":6,"16":8,"24":6,"25":6}}],["as",{"2":{"1":2,"2":4,"3":2,"4":2,"21":2,"24":2,"25":2}}],["arch",{"2":{"2":4}}],["ar",{"2":{"1":4,"2":6,"3":4,"4":4,"21":4,"24":4,"25":4}}],["available",{"2":{"1":2,"2":2,"3":2,"4":4,"16":2,"17":2,"21":2,"24":2,"25":2}}],["average",{"2":{"0":2,"1":2,"2":4,"3":2,"4":2,"20":2,"24":4,"25":4}}],["all",{"2":{"2":2,"16":2}}],["also",{"2":{"1":4,"2":4,"3":4,"4":8,"21":4,"24":4,"25":4}}],["along",{"2":{"0":2}}],["at",{"2":{"1":4,"2":4,"3":4,"4":8,"21":4,"24":4,"25":4}}],["a",{"2":{"1":6,"2":4,"3":6,"4":12,"16":2,"21":4,"22":2,"24":4,"25":4}}],["abi",{"2":{"0":2,"4":2}}],["academy",{"2":{"16":2}}],["activation",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["activate$",{"2":{"4":1}}],["activate",{"2":{"0":2,"1":9,"2":6,"3":7,"4":9,"21":9,"24":6,"25":6}}],["ac",{"2":{"0":2,"1":2,"2":4,"3":2,"4":2,"16":2,"20":2,"24":4,"25":4}}],["rights",{"2":{"16":2}}],["riscv",{"2":{"17":4,"24":16,"25":16}}],["riscv64xthead",{"2":{"4":2}}],["riscv64",{"2":{"0":8,"1":74,"2":50,"3":74,"4":76,"13":2,"16":1,"20":6,"21":64,"22":4,"24":72,"25":72}}],["risc",{"0":{"1":1,"2":1,"19":1,"23":1,"24":1,"25":1},"1":{"20":1,"21":1,"22":1},"2":{"0":3,"4":3,"5":1,"6":2,"24":2,"25":1}}],["rvp",{"2":{"6":1}}],["rvc",{"2":{"0":2,"4":2}}],["run",{"2":{"2":2}}],["ruyisdk",{"0":{"6":1,"7":1,"8":1,"9":1},"1":{"9":1},"2":{"0":2,"1":12,"2":12,"3":12,"4":12,"5":1,"6":3,"12":1,"16":6,"17":2,"20":8,"21":2,"22":2,"24":12,"25":12}}],["ruyi",{"0":{"12":1,"16":1,"18":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1},"2":{"0":26,"1":40,"2":44,"3":25,"4":41,"10":2,"12":1,"13":1,"14":21,"15":1,"16":25,"17":16,"18":25,"20":10,"21":28,"22":12,"24":55,"25":55}}],["rtdyld",{"2":{"2":2}}],["rc",{"2":{"2":2}}],["ranlib",{"2":{"1":4,"2":6,"3":4,"4":4,"21":4,"24":4,"25":4}}],["root",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["regular",{"2":{"16":2}}],["reserved",{"2":{"16":2}}],["revyos",{"2":{"13":1}}],["return",{"2":{"4":2,"24":2,"25":2}}],["repos",{"2":{"16":2}}],["repository",{"2":{"16":4}}],["repo",{"2":{"16":2}}],["report",{"2":{"2":2}}],["repl",{"2":{"2":2}}],["replacements",{"2":{"2":2}}],["reorder",{"2":{"2":2}}],["rename",{"2":{"2":2}}],["refactor",{"2":{"2":2}}],["remarkutil",{"2":{"2":2}}],["remark",{"2":{"2":2}}],["reduce",{"2":{"2":2}}],["readobj",{"2":{"2":2}}],["readelf",{"2":{"1":2,"2":4,"3":2,"4":2,"21":2,"24":2,"25":2}}],["ready",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["received",{"2":{"0":2,"1":2,"2":4,"3":2,"4":2,"20":2,"24":4,"25":4}}],["h",{"2":{"16":4,"24":2,"25":2}}],["hello",{"2":{"24":4,"25":4}}],["help",{"2":{"16":6}}],["head",{"2":{"4":6,"25":6}}],["headers",{"2":{"4":2}}],["hmaptool",{"2":{"2":2}}],["host",{"2":{"2":1,"17":1,"23":1}}],["home",{"2":{"0":2,"1":8,"2":12,"3":6,"4":8,"17":3,"18":1,"20":6,"21":2,"24":10,"25":10}}],["https",{"2":{"0":2,"1":2,"2":4,"3":2,"4":2,"16":4,"20":2,"24":4,"25":4}}],["trace",{"2":{"2":2}}],["tli",{"2":{"2":2}}],["tidy",{"2":{"2":4}}],["time",{"2":{"0":6,"1":6,"2":12,"3":6,"4":6,"20":6,"24":12,"25":12}}],["tblgen",{"2":{"2":4}}],["tapi",{"2":{"2":2}}],["target",{"2":{"2":4,"4":2}}],["tarball",{"2":{"1":1,"20":1}}],["tar",{"2":{"0":6,"1":6,"2":12,"3":6,"4":6,"10":4,"15":4,"20":6,"24":12,"25":12}}],["testing",{"2":{"16":2}}],["test",{"2":{"2":4,"4":6,"24":8,"25":8}}],["thread",{"2":{"2":2}}],["this",{"2":{"1":2,"3":2,"16":4,"22":2}}],["those",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["then",{"2":{"16":2}}],["there",{"2":{"1":2,"3":2,"22":2}}],["the",{"2":{"1":18,"2":16,"3":18,"4":32,"16":2,"21":16,"22":2,"24":16,"25":16}}],["t",{"2":{"1":7,"2":2,"3":2,"4":10,"21":7,"24":2,"25":8}}],["tool",{"2":{"1":2,"2":2,"3":2,"4":2,"21":2,"24":2,"25":2}}],["toolchain",{"2":{"1":2,"2":2,"3":2,"4":8,"16":2,"17":9,"21":2,"24":2,"25":2}}],["total",{"2":{"0":4,"1":4,"2":8,"3":4,"4":4,"20":4,"24":8,"25":8}}],["to",{"2":{"0":4,"1":4,"2":8,"3":4,"4":4,"16":4,"20":4,"24":8,"25":8}}],["ifs",{"2":{"2":2}}],["it",{"2":{"1":4,"2":4,"3":4,"4":8,"21":4,"24":4,"25":4}}],["is",{"2":{"1":10,"2":6,"3":10,"4":12,"21":6,"22":4,"24":6,"25":6}}],["iscas",{"2":{"0":2,"1":2,"2":4,"3":2,"4":2,"16":4,"20":2,"24":4,"25":4}}],["int",{"2":{"4":2,"24":2,"25":2}}],["intercept",{"2":{"2":2}}],["interpreter",{"2":{"0":2,"4":2}}],["include",{"2":{"2":4,"24":2,"25":2}}],["inc",{"2":{"1":2,"3":2,"22":2}}],["index",{"2":{"1":2,"2":2,"3":2,"4":2,"21":2,"24":2,"25":2}}],["institute",{"2":{"16":2}}],["instructions",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["installation",{"2":{"16":2}}],["installeddir",{"2":{"2":2}}],["installed",{"2":{"1":2,"2":4,"3":2,"4":2,"20":2,"24":4,"25":4}}],["install",{"2":{"1":4,"2":4,"3":2,"4":2,"14":2,"15":4,"16":8,"20":4,"23":2,"24":2,"25":2}}],["invoking",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["in",{"2":{"1":6,"2":6,"3":6,"4":12,"16":2,"21":6,"24":6,"25":6}}],["information$",{"2":{"16":1}}],["information",{"2":{"16":3}}],["info",{"2":{"0":8,"1":10,"2":16,"3":10,"4":16,"20":6,"21":4,"24":16,"25":16}}],["ilinux64",{"2":{"0":2}}],["i",{"2":{"0":4,"16":6}}],["darwin",{"2":{"2":2}}],["data",{"2":{"1":2,"18":1,"20":2}}],["dwp",{"2":{"2":2}}],["dwarfutil",{"2":{"2":2}}],["dwarfdump",{"2":{"2":2}}],["dlltool",{"2":{"2":2}}],["dload",{"2":{"0":2,"1":2,"2":4,"3":2,"4":2,"20":2,"24":4,"25":4}}],["dsymutil",{"2":{"2":2}}],["dump$",{"2":{"25":1}}],["dump",{"2":{"1":4,"3":4,"4":4,"21":4,"24":4,"25":3}}],["duo$",{"2":{"17":1}}],["duo",{"0":{"3":1},"2":{"0":2,"3":3,"17":1}}],["demo",{"2":{"17":2}}],["debian",{"2":{"15":1}}],["debuginfod",{"2":{"2":4}}],["debuginfo",{"2":{"2":2}}],["debug",{"2":{"0":2,"4":2}}],["deps",{"2":{"2":2}}],["deactivate`",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["deactivate",{"2":{"0":2,"1":4,"2":4,"3":4,"4":6,"21":2,"22":2,"24":4,"25":4}}],["dynamically",{"2":{"0":2,"4":2}}],["doc",{"2":{"2":2}}],["double",{"2":{"0":2,"4":2}}],["downloading",{"2":{"0":2,"1":2,"2":4,"3":2,"4":2,"20":2,"24":4,"25":4}}],["dflags",{"2":{"0":2}}],["dis",{"2":{"2":2}}],["distfiles",{"2":{"0":2,"1":2,"2":4,"3":2,"4":2,"20":2,"24":4,"25":4}}],["dist",{"2":{"0":2,"1":2,"2":4,"3":2,"4":2,"20":2,"24":4,"25":4}}],["diagtool",{"2":{"2":2}}],["diff",{"2":{"2":6}}],["diterations=0",{"2":{"0":2}}],["dir=linux64",{"2":{"0":2}}],["directory",{"2":{"0":2,"1":2,"2":2,"3":2,"4":4,"16":2,"21":2,"24":2,"25":2}}],["c910",{"2":{"4":2}}],["cp",{"2":{"16":2}}],["cpu",{"2":{"4":4}}],["cpp",{"2":{"1":2,"2":4,"3":2,"4":2,"21":2,"24":2,"25":2}}],["cxxmap",{"2":{"2":2}}],["cxxfilt",{"2":{"2":2}}],["cxxdump",{"2":{"2":2}}],["cvtres",{"2":{"2":2}}],["cfi",{"2":{"2":2}}],["cat",{"2":{"2":2,"4":2,"24":2,"25":2}}],["cache",{"2":{"0":2,"1":2,"2":4,"3":2,"4":2,"17":3,"20":2,"24":4,"25":4}}],["cleaner",{"2":{"2":2}}],["cl",{"2":{"2":2}}],["clangd",{"2":{"2":2}}],["clang++",{"2":{"2":2}}],["clang",{"2":{"2":57}}],["chosen",{"2":{"16":2}}],["chinese",{"2":{"16":2}}],["child",{"2":{"2":2}}],["chmod",{"2":{"16":2}}],["change",{"2":{"2":2}}],["checksums",{"2":{"10":2}}],["checker",{"2":{"2":2}}],["check",{"2":{"1":2,"2":4,"3":2,"4":4,"21":2,"24":2,"25":2}}],["cc1",{"2":{"4":4}}],["cc",{"2":{"1":2,"2":2,"3":2,"4":2,"21":2,"24":2,"25":2}}],["c++filt$",{"2":{"2":1}}],["c++filt",{"2":{"1":2,"2":1,"3":2,"4":2,"21":2,"24":2,"25":2}}],["c++",{"2":{"1":2,"2":2,"3":2,"4":2,"21":2,"24":2,"25":2}}],["cross",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["created",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["creating",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["cmake",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["curl",{"2":{"1":1,"20":1}}],["current",{"2":{"0":4,"1":2,"2":4,"3":2,"4":2,"16":2,"17":1,"20":2,"24":4,"25":4}}],["count",{"2":{"2":2}}],["cov",{"2":{"2":2}}],["configured",{"2":{"16":4}}],["config",{"2":{"2":2}}],["conditions",{"2":{"1":2,"3":2,"22":2}}],["contain",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["copying",{"2":{"1":2,"3":2,"22":2}}],["copyright",{"2":{"1":2,"3":2,"16":2,"22":2}}],["components",{"2":{"4":2}}],["compile",{"2":{"0":2}}],["comments",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["comes",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["core",{"2":{"0":14}}],["coremark",{"0":{"0":1},"2":{"0":26,"17":2}}],["c",{"2":{"0":12,"1":2,"2":4,"3":2,"4":7,"16":2,"22":2,"24":5,"25":5}}],["cn",{"2":{"0":2,"1":2,"2":4,"3":2,"4":2,"16":2,"20":2,"24":4,"25":4}}],["cd",{"2":{"0":2,"4":2,"24":2,"25":2}}],["mtune",{"2":{"4":2}}],["mt",{"2":{"2":2}}],["model",{"2":{"2":2}}],["modextract",{"2":{"2":2}}],["modularize",{"2":{"2":2}}],["move",{"2":{"2":2}}],["ml",{"2":{"2":2}}],["mcpu=c910",{"2":{"4":2}}],["mca",{"2":{"2":2}}],["mc",{"2":{"2":2}}],["message",{"2":{"16":2}}],["meson",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["metadata",{"2":{"4":2}}],["merchantability",{"2":{"1":2,"3":2,"22":2}}],["manage",{"2":{"16":2}}],["manager",{"2":{"16":2}}],["managing",{"2":{"16":2}}],["manifest",{"2":{"10":4}}],["mapping",{"2":{"2":2}}],["made",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["may",{"2":{"1":2,"2":2,"3":2,"4":4,"21":2,"24":2,"25":2}}],["matrix",{"2":{"0":2}}],["main",{"2":{"0":2,"4":2,"24":2,"25":2}}],["make",{"2":{"0":2}}],["mak",{"2":{"0":2}}],["myon",{"2":{"0":2,"1":6,"2":12,"3":6,"4":8,"17":1,"20":4,"21":10,"22":6,"24":10,"25":10}}],["mirror",{"2":{"0":2,"1":2,"2":4,"3":2,"4":2,"16":2,"20":2,"24":4,"25":4}}],["milkv",{"0":{"3":1},"2":{"0":20,"3":16,"17":2}}],["mkdir",{"2":{"0":2}}],["09",{"2":{"13":2}}],["04",{"2":{"13":1}}],["0m",{"2":{"2":4,"24":2}}],["00",{"2":{"2":8,"3":4,"4":4,"24":8,"25":4}}],["0$",{"2":{"1":1,"2":1,"3":1,"4":1,"20":1,"24":1,"25":1}}],["02",{"2":{"1":8,"20":8,"24":4}}],["01",{"2":{"0":6}}],["0",{"2":{"0":13,"1":23,"2":47,"3":23,"4":33,"6":2,"16":12,"17":24,"20":21,"22":2,"24":33,"25":41}}],["1m",{"2":{"24":2}}],["14",{"2":{"24":4}}],["1404k",{"2":{"0":2}}],["1400k",{"2":{"0":2}}],["11",{"2":{"2":2,"24":2}}],["10",{"2":{"2":6,"3":4,"4":8,"24":2,"25":4}}],["100",{"2":{"0":4,"1":4,"2":8,"3":4,"4":4,"20":4,"24":8,"25":8}}],["17",{"2":{"2":16,"17":2}}],["13",{"2":{"1":2,"3":2,"22":2}}],["1924k",{"2":{"1":2,"20":2}}],["1936k",{"2":{"1":2,"20":2}}],["15",{"2":{"0":2,"4":2}}],["1",{"2":{"0":20,"3":2,"4":4,"6":1,"10":4,"17":10,"24":12,"25":12}}],["26",{"2":{"25":4}}],["2m",{"2":{"25":2}}],["22",{"2":{"13":1,"24":4}}],["2410601",{"2":{"10":2}}],["25",{"2":{"4":4}}],["273m",{"2":{"4":4,"25":4}}],["21",{"2":{"3":4}}],["23",{"2":{"2":4,"13":2}}],["232m",{"2":{"1":4,"2":4,"3":4,"20":4,"24":4}}],["20230125",{"2":{"17":2}}],["20231207",{"2":{"25":6}}],["20231207+g03813c9fe8",{"2":{"17":2,"25":6}}],["20231204",{"2":{"16":11}}],["20231026",{"2":{"13":1}}],["20231114",{"2":{"17":2}}],["20231118ruyi",{"2":{"23":1}}],["20231118",{"2":{"1":23,"2":14,"3":19,"4":21,"17":12,"20":17,"21":4,"22":2,"23":1,"24":14,"25":14}}],["20231121$",{"2":{"17":1}}],["20231121",{"2":{"2":15,"17":5,"23":3,"24":12}}],["2023",{"2":{"1":2,"3":2,"5":1,"16":2,"22":2}}],["2",{"2":{"0":1,"1":4,"2":2,"3":1,"4":7,"6":1,"10":5,"13":1,"16":9,"17":4,"20":2,"22":2,"23":2,"24":12}}],["v$",{"2":{"17":1}}],["view",{"2":{"2":2}}],["virtual",{"2":{"1":10,"2":10,"3":10,"4":20,"16":2,"21":10,"24":10,"25":10}}],["vector",{"2":{"6":1}}],["verify",{"2":{"2":4}}],["version",{"2":{"0":2,"1":2,"2":4,"3":2,"4":2,"16":15,"22":2}}],["venvruyi",{"2":{"21":1}}],["venv$",{"2":{"1":1}}],["venv为自定义的相对路径",{"2":{"1":1,"21":1}}],["venv",{"2":{"0":18,"1":29,"2":18,"3":19,"4":37,"14":2,"16":6,"21":25,"22":4,"24":26,"25":26}}],["v",{"0":{"1":1,"2":1,"19":1,"23":1,"24":1,"25":1},"1":{"20":1,"21":1,"22":1},"2":{"0":3,"4":6,"5":1,"6":2,"16":4,"17":1,"24":2,"25":1}}],["v0",{"2":{"0":1,"1":2,"2":2,"3":1,"4":1,"10":1,"13":1,"16":1,"20":2,"23":2}}],["当前",{"2":{"0":1,"13":1,"16":1}}],["$xdg",{"2":{"1":1,"17":1,"20":1}}],["$",{"2":{"0":17,"1":9,"2":8,"3":8,"4":19,"10":1,"16":7,"18":1,"21":9,"22":6,"24":14,"25":14}}],["$$",{"2":{"0":1,"1":2,"2":1,"3":1,"24":1,"25":1}}],["beta",{"2":{"16":4}}],["bench",{"2":{"2":2}}],["bzip2",{"2":{"15":4}}],["bcanalyzer",{"2":{"2":2}}],["bundler",{"2":{"2":2}}],["bugpoint",{"2":{"2":2}}],["build",{"2":{"2":8}}],["buildid",{"2":{"0":2,"4":2}}],["bfd",{"2":{"1":2,"3":2,"4":2,"21":2,"24":2,"25":2}}],["by",{"2":{"1":4,"2":4,"3":4,"4":8,"21":4,"24":4,"25":4}}],["bitcode",{"2":{"2":2}}],["bit",{"2":{"0":2,"4":2}}],["binary",{"2":{"17":1}}],["binaries",{"2":{"1":2,"2":6,"3":2,"4":2,"18":2,"20":2,"24":4,"25":4}}],["binutils",{"2":{"4":2}}],["bin",{"2":{"0":2,"1":8,"2":8,"3":6,"4":10,"16":2,"21":8,"24":6,"25":6}}],["b",{"2":{"0":2}}],["bgcc",{"2":{"0":2}}],["bashruyi",{"2":{"14":1,"20":1,"21":1,"23":1}}],["bash",{"2":{"0":4,"1":2,"2":2,"3":2,"4":1,"21":2,"22":2,"24":2,"25":2}}],["bash$",{"2":{"0":1,"1":7,"2":4,"3":4,"4":6,"10":1,"15":2,"16":2,"17":4,"18":4,"20":1,"21":2,"24":4,"25":4}}],["首先进入编译环境",{"2":{"0":1}}],["一节中的",{"2":{"0":1}}],["使用平头哥",{"0":{"25":1}}],["使用平头哥工具链配置荔枝派",{"0":{"4":1}}],["使用上游",{"0":{"24":1}}],["使用下面的命令卸载",{"2":{"18":1}}],["使用默认镜像即可",{"2":{"17":1}}],["使用",{"0":{"1":1,"2":1,"3":1,"19":1,"22":1,"23":1},"1":{"20":1,"21":1,"22":1},"2":{"0":1,"1":1,"21":1}}],["使用编译环境进行",{"0":{"0":1}}],["构建依赖一些",{"2":{"2":1}}],["构建",{"0":{"0":1},"2":{"0":2}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/@localSearchIndexroot.a78eca85.js b/assets/chunks/@localSearchIndexroot.a78eca85.js deleted file mode 100644 index a6bb5543..00000000 --- a/assets/chunks/@localSearchIndexroot.a78eca85.js +++ /dev/null @@ -1 +0,0 @@ -const t='{"documentCount":23,"nextId":23,"documentIds":{"0":"/docs/zh/benchmark/coremark.html#运行-coremark","1":"/docs/zh/benchmark/coremark.html#安装-ruyi","2":"/docs/zh/benchmark/coremark.html#下载工具链","3":"/docs/zh/benchmark/coremark.html#交叉编译-coremark","4":"/docs/zh/introduction/#介绍","5":"/docs/zh/introduction/#ruyisdk-的目标","6":"/docs/zh/introduction/#ruyisdk-架构示意图","7":"/docs/zh/introduction/#ruyisdk-包含的内容","8":"/docs/zh/introduction/#ruyisdk-包管理器","9":"/docs/zh/plan/#版本规划路线图","10":"/docs/zh/ruyi-package/#ruyi-包管理器","11":"/docs/zh/ruyi-package/#安装包管理器","12":"/docs/zh/ruyi-package/#命令","13":"/docs/zh/ruyi-package/#update","14":"/docs/zh/ruyi-package/#list","15":"/docs/zh/ruyi-package/#install","16":"/docs/zh/ruyi-package/#移除一个包","17":"/docs/zh/ruyi-package/#列出可用的-profiles","18":"/docs/zh/sdk/gnu/#使用-gnu-上游工具链配置-risc-v-编译环境","19":"/docs/zh/sdk/gnu/#安装","20":"/docs/zh/sdk/gnu/#创建虚拟环境","21":"/docs/zh/sdk/gnu/#使用","22":"/docs/zh/sdk/llvm/#使用-llvm-上游工具链配置-risc-v-编译环境"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[2,1,10],"1":[2,2,1],"2":[1,2,1],"3":[2,2,56],"4":[1,1,11],"5":[2,1,36],"6":[2,1,1],"7":[2,1,1],"8":[2,3,4],"9":[1,1,1],"10":[2,1,6],"11":[1,2,28],"12":[1,2,1],"13":[1,3,20],"14":[1,3,5],"15":[1,3,7],"16":[1,3,7],"17":[2,3,7],"18":[6,1,1],"19":[1,6,91],"20":[1,6,135],"21":[1,6,55],"22":[6,1,28]},"averageFieldLength":[1.826086956521739,2.391304347826087,22.304347826086957],"storedFields":{"0":{"title":"运行 Coremark","titles":[]},"1":{"title":"安装 ruyi","titles":["运行 Coremark"]},"2":{"title":"下载工具链","titles":["运行 Coremark"]},"3":{"title":"交叉编译 Coremark","titles":["运行 Coremark"]},"4":{"title":"介绍","titles":[]},"5":{"title":"RUYISDK 的目标","titles":["介绍"]},"6":{"title":"RUYISDK 架构示意图","titles":["介绍"]},"7":{"title":"RuyiSDK 包含的内容","titles":["介绍"]},"8":{"title":"RuyiSDK 包管理器","titles":["介绍","RuyiSDK 包含的内容"]},"9":{"title":"版本规划路线图","titles":[]},"10":{"title":"Ruyi 包管理器","titles":[]},"11":{"title":"安装包管理器","titles":["Ruyi 包管理器"]},"12":{"title":"命令","titles":["Ruyi 包管理器"]},"13":{"title":"Update","titles":["Ruyi 包管理器","命令"]},"14":{"title":"List","titles":["Ruyi 包管理器","命令"]},"15":{"title":"Install","titles":["Ruyi 包管理器","命令"]},"16":{"title":"移除一个包","titles":["Ruyi 包管理器","命令"]},"17":{"title":"列出可用的 Profiles","titles":["Ruyi 包管理器","命令"]},"18":{"title":"使用 GNU 上游工具链配置 RISC-V 编译环境","titles":[]},"19":{"title":"安装","titles":["使用 GNU 上游工具链配置 RISC-V 编译环境"]},"20":{"title":"创建虚拟环境","titles":["使用 GNU 上游工具链配置 RISC-V 编译环境"]},"21":{"title":"使用","titles":["使用 GNU 上游工具链配置 RISC-V 编译环境"]},"22":{"title":"使用 LLVM 上游工具链配置 RISC-V 编译环境","titles":[]}},"dirtCount":0,"index":[["故同时需要安装",{"2":{"22":1}}],["由于配置",{"2":{"22":1}}],["由预置的",{"2":{"20":1}}],["配置交叉编译环境",{"2":{"22":1}}],["配置建立编译环境",{"2":{"20":1}}],["该部分只适用于在",{"2":{"22":1}}],["该命令将调用",{"2":{"19":1}}],["版本中",{"2":{"22":1}}],["版本规划路线图",{"0":{"9":1}}],["注意在",{"2":{"22":1}}],["注意所安装的版本可能是",{"2":{"19":1}}],["环境",{"2":{"22":1}}],["环境将被还原",{"2":{"21":1}}],["环境变量被设置时",{"2":{"19":1}}],["退出编译环境",{"2":{"21":1}}],["调用工具链",{"2":{"21":1}}],["调试支持等",{"2":{"5":1}}],["也可以使用",{"2":{"20":1}}],["也可以使用如下命令让",{"2":{"19":1}}],["以提示当前进入编译环境中",{"2":{"20":1}}],["以后的未测试版本",{"2":{"19":1}}],["并且改变",{"2":{"20":1}}],["并编译运行",{"2":{"0":1}}],["虚拟环境类似",{"2":{"20":1}}],["激活方式与",{"2":{"20":1}}],["激活构建环境",{"2":{"20":1}}],["其他均为工具链二进制",{"2":{"20":1}}],["为激活编译环境用的脚本",{"2":{"20":1}}],["为如上选择的环境",{"2":{"20":1}}],["除了",{"2":{"20":1}}],["objdump",{"2":{"20":1}}],["objdump$",{"2":{"20":1}}],["objcopy",{"2":{"20":2}}],["or",{"2":{"5":1,"21":2}}],["not",{"2":{"21":2}}],["no",{"2":{"21":2}}],["now",{"2":{"20":2}}],["nm",{"2":{"20":4}}],["查看可用的工具链二进制",{"2":{"20":1}}],["若使用包名则",{"2":{"20":1}}],["参数指定工具链",{"2":{"20":1}}],["这里命令",{"2":{"20":1}}],["这里我们介绍使用",{"2":{"0":1}}],["这里我们从零开始",{"2":{"0":1}}],["warranty",{"2":{"21":2}}],["work",{"2":{"20":8,"21":6}}],["with",{"2":{"20":2}}],["wget",{"2":{"19":1}}],["fitness",{"2":{"21":2}}],["files",{"2":{"20":2}}],["file",{"2":{"20":4}}],["free",{"2":{"21":4}}],["fresh",{"2":{"20":2}}],["foundation",{"2":{"21":2}}],["following",{"2":{"20":2}}],["for",{"2":{"19":2,"20":2,"21":6}}],["`ruyi",{"2":{"20":2}}],["youmu",{"2":{"20":8,"21":6}}],["you",{"2":{"20":2}}],["创建虚拟环境",{"0":{"20":1}}],["自动选择最新版本安装",{"2":{"19":1}}],["在",{"2":{"19":1}}],["软件包安装目录默认为",{"2":{"19":1}}],["软件更新",{"2":{"5":1}}],["解压并安装到用户目录",{"2":{"19":1}}],["或",{"2":{"19":1}}],["变为正确的格式",{"2":{"19":1}}],["之间的空格",{"2":{"19":1}}],["且拷贝时应删除",{"2":{"19":1}}],["可以从",{"2":{"19":1}}],["可执行文件加入",{"2":{"11":1}}],["64",{"2":{"19":2,"22":1}}],["bfd",{"2":{"20":2}}],["bin",{"2":{"20":8}}],["binaries",{"2":{"19":2}}],["by",{"2":{"20":4}}],["bash",{"2":{"20":2,"21":2}}],["bash$",{"2":{"19":1,"20":2}}],["bashruyi",{"2":{"13":1,"14":1,"15":1,"16":1,"17":1,"19":1,"20":1,"22":1}}],["bashexport",{"2":{"11":1}}],["bashwget",{"2":{"11":1}}],["bashcd",{"2":{"3":1}}],["bashgit",{"2":{"3":1}}],["xdg",{"2":{"19":1}}],["x86",{"2":{"19":2,"22":1}}],["xferd",{"2":{"19":2}}],["xz",{"2":{"19":6}}],["xcflags=",{"2":{"3":2}}],["this",{"2":{"21":2}}],["those",{"2":{"20":2}}],["there",{"2":{"21":2}}],["the",{"2":{"20":16,"21":2}}],["t",{"2":{"20":7}}],["time",{"2":{"19":6}}],["tool",{"2":{"20":2}}],["toolchain",{"2":{"20":2}}],["total",{"2":{"19":4}}],["to",{"2":{"19":4}}],["tarball",{"2":{"19":1}}],["tar",{"2":{"19":6}}],["testing",{"2":{"11":2}}],["dump",{"2":{"20":4}}],["deactivate`",{"2":{"20":2}}],["deactivate",{"2":{"20":2,"21":2}}],["data",{"2":{"19":2}}],["dload",{"2":{"19":2}}],["directory",{"2":{"20":2}}],["dir=rv64",{"2":{"3":2}}],["distfiles",{"2":{"19":2}}],["dist",{"2":{"19":2}}],["downloading",{"2":{"19":2}}],["最新版本二进制为",{"2":{"19":1,"22":1}}],["编译环境",{"0":{"18":1,"22":1},"1":{"19":1,"20":1,"21":1}}],["编译成功会看到",{"2":{"3":1}}],["上游工具链软件包名为",{"2":{"19":1,"22":1}}],["上游工具链配置",{"0":{"18":1,"22":1},"1":{"19":1,"20":1,"21":1}}],["上就可以运行了",{"2":{"3":1}}],["使用",{"0":{"18":1,"21":1,"22":1},"1":{"19":1,"20":1,"21":1},"2":{"20":1}}],["列出所有可用的",{"2":{"17":1}}],["列出可用的",{"0":{"17":1}}],["列出可用的工具链",{"2":{"14":1}}],["移除一个选定的包",{"2":{"16":1}}],["移除一个包",{"0":{"16":1}}],["~",{"2":{"13":1,"19":1}}],["则默认为",{"2":{"13":1}}],["未设置",{"2":{"13":1}}],["如果",{"2":{"13":1}}],["$",{"2":{"20":9,"21":6}}],["$xdg",{"2":{"13":2,"19":1}}],["$path",{"2":{"11":3}}],["存储库克隆到",{"2":{"13":1}}],["默认情况下",{"2":{"13":1}}],["元数据同步到本地存储",{"2":{"13":1}}],["命令",{"0":{"12":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1},"2":{"20":1}}],["然后将",{"2":{"11":1}}],["+x",{"2":{"11":2}}],["add",{"2":{"20":2}}],["addr2line",{"2":{"20":2}}],["as",{"2":{"20":2}}],["ar",{"2":{"20":4}}],["available",{"2":{"20":2}}],["average",{"2":{"19":2}}],["also",{"2":{"20":4}}],["and",{"2":{"20":4}}],["appropriate",{"2":{"20":2}}],["at",{"2":{"20":4}}],["a",{"2":{"20":4,"21":2}}],["activation",{"2":{"20":2}}],["activate",{"2":{"20":9}}],["ac",{"2":{"11":2,"19":2}}],["amp",{"2":{"3":4}}],["您可以从",{"2":{"11":1}}],["目录为",{"2":{"19":1}}],["目录下生成了",{"2":{"3":1}}],["目前",{"2":{"11":1}}],["用于管理工具链",{"2":{"10":1}}],["文档",{"2":{"8":1}}],["项目",{"2":{"8":1}}],["包管理器是设计为用于",{"2":{"10":1}}],["包管理器",{"0":{"8":1,"10":1},"1":{"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1}}],["包含的内容",{"0":{"7":1},"1":{"8":1}}],["架构示意图",{"0":{"6":1}}],["培育运营一个活跃全面的开发者交流社区",{"2":{"5":1}}],["厂商定制扩展",{"2":{"5":1}}],["标准",{"2":{"5":1}}],["等已经大规模硅化的草案",{"2":{"5":1}}],["232m",{"2":{"19":4}}],["2",{"2":{"5":1,"19":2,"21":2,"22":2}}],["20231121",{"2":{"22":3}}],["20231118ruyi",{"2":{"22":1}}],["20231118",{"2":{"19":17,"20":4,"21":2,"22":1}}],["20231026",{"2":{"15":1,"16":1}}],["20231026ruyi",{"2":{"15":1,"16":1}}],["20231030",{"2":{"11":4}}],["2023",{"2":{"4":1,"21":2}}],["5",{"2":{"5":1}}],["和",{"2":{"5":1}}],["13",{"2":{"21":2}}],["1924k",{"2":{"19":2}}],["1936k",{"2":{"19":2}}],["100",{"2":{"19":4}}],["1",{"2":{"5":1}}],["7",{"2":{"5":1}}],["0$",{"2":{"19":1}}],["02",{"2":{"19":8}}],["0",{"2":{"5":2,"19":21,"21":2}}],["尤其强调",{"2":{"5":1}}],["应用框架等",{"2":{"5":1}}],["计算库",{"2":{"5":1}}],["计划用三年时间为",{"2":{"4":1}}],["语言执行环境",{"2":{"5":1}}],["工具链环境依赖",{"2":{"22":1}}],["工具链",{"2":{"5":1,"22":1}}],["系统生成客户所需的操作系统",{"2":{"5":1}}],["系统获得硬件资料说明",{"2":{"5":1}}],["扩展指令集架构组合",{"2":{"5":1}}],["固件",{"2":{"5":1}}],["都可以通过",{"2":{"5":2}}],["任何一款",{"2":{"5":1}}],["几乎",{"2":{"5":1}}],["的输出中获取",{"2":{"19":1}}],["的包管理器",{"2":{"10":1}}],["的目标",{"0":{"5":1}}],["的步骤",{"2":{"0":1}}],["全家桶式的全功能开发环境",{"2":{"4":1}}],["开发板或模组",{"2":{"5":1}}],["开发板或者",{"2":{"3":1}}],["开发者可以指定任何常用的",{"2":{"5":1}}],["开发者购买了",{"2":{"5":1}}],["开发者提供一个完整的",{"2":{"4":1}}],["virtual",{"2":{"20":10}}],["version",{"2":{"21":2}}],["venvruyi",{"2":{"20":1}}],["venv为自定义的相对路径",{"2":{"20":1}}],["venv",{"2":{"20":25,"21":4}}],["vector",{"2":{"5":1}}],["v0",{"2":{"19":2,"22":2}}],["v",{"0":{"18":1,"22":1},"1":{"19":1,"20":1,"21":1},"2":{"4":1,"5":2}}],["年开始筹备",{"2":{"4":1}}],["从远端软件源获取软件包",{"2":{"19":1}}],["从",{"2":{"4":1}}],["是一个旨在提供给一个一体化集成开发环境的产品计划",{"2":{"4":1}}],["介绍",{"0":{"4":1},"1":{"5":1,"6":1,"7":1,"8":1}}],["qemu",{"2":{"3":1}}],["quot",{"2":{"3":4,"11":4}}],["拷贝到我们的",{"2":{"3":1}}],["将自动选择具体的工具链版本",{"2":{"20":1}}],["将完全支持",{"2":{"5":1}}],["将",{"2":{"3":1,"13":1}}],["even",{"2":{"21":2}}],["elfedit",{"2":{"20":2}}],["environment",{"2":{"20":10}}],["extracting",{"2":{"19":2}}],["export",{"2":{"11":1}}],["exe",{"2":{"3":2}}],["ee",{"2":{"3":6}}],["eembc",{"2":{"3":2}}],["llvm",{"0":{"22":1},"2":{"22":6}}],["lto",{"2":{"20":2}}],["ldd",{"2":{"20":2}}],["ld",{"2":{"20":4}}],["ld=$riscv64",{"2":{"3":2}}],["ls",{"2":{"20":2}}],["local",{"2":{"19":3}}],["long",{"2":{"3":4}}],["left",{"2":{"19":2}}],["listruyi",{"2":{"14":1}}],["list",{"0":{"14":1},"2":{"14":1,"17":2,"19":1}}],["linux",{"2":{"3":4,"19":6,"20":64,"21":4}}],["merchantability",{"2":{"21":2}}],["meson",{"2":{"20":2}}],["myon",{"2":{"19":4,"20":10,"21":6}}],["mv",{"2":{"11":2}}],["mirror",{"2":{"11":3,"19":2}}],["made",{"2":{"20":2}}],["may",{"2":{"20":2}}],["march=$rv64gc",{"2":{"3":2}}],["make",{"2":{"3":2}}],["mkdir",{"2":{"3":2}}],["host",{"2":{"22":1}}],["home",{"2":{"11":2,"13":2,"19":6,"20":2}}],["h",{"2":{"3":2}}],["https",{"2":{"3":2,"11":2,"19":2}}],["purpose",{"2":{"21":2}}],["ps1",{"2":{"20":1}}],["python",{"2":{"20":1}}],["provisioned",{"2":{"20":2}}],["profilesruyi",{"2":{"17":1}}],["profiles",{"0":{"17":1},"2":{"17":2}}],["prefix",{"2":{"20":2}}],["plct",{"2":{"15":2,"16":2}}],["particular",{"2":{"21":2}}],["path",{"2":{"20":2}}],["path=",{"2":{"11":2}}],["package",{"2":{"19":4}}],["packages",{"2":{"13":1}}],["port",{"2":{"3":2}}],["portme",{"2":{"3":2}}],["ptr",{"2":{"3":4}}],["g++",{"2":{"20":2}}],["gdb",{"2":{"20":4}}],["gcov",{"2":{"20":6}}],["gcc",{"2":{"3":4,"20":8,"21":4,"22":2}}],["gprof",{"2":{"20":2}}],["gfortran",{"2":{"20":2}}],["generic",{"2":{"20":8}}],["gnu",{"0":{"18":1},"1":{"19":1,"20":1,"21":1},"2":{"3":4,"19":21,"20":70,"21":4,"22":2}}],["g",{"2":{"3":2}}],["git",{"2":{"3":1}}],["gitgit",{"2":{"3":1}}],["github",{"2":{"3":2,"8":1}}],["usage",{"2":{"20":2}}],["upload",{"2":{"19":2}}],["upstreamruyi",{"2":{"19":1}}],["upstream",{"2":{"19":19,"20":6,"21":2,"22":6}}],["updateruyi",{"2":{"13":1}}],["update",{"0":{"13":1},"2":{"13":1}}],["unknown",{"2":{"19":6,"20":64,"21":4}}],["uninstall",{"2":{"16":2}}],["unsigned",{"2":{"3":2}}],["u32",{"2":{"3":2}}],["39",{"2":{"3":4}}],["it",{"2":{"20":4}}],["is",{"2":{"20":6,"21":4}}],["iscas",{"2":{"11":2,"19":2}}],["inc",{"2":{"21":2}}],["instructions",{"2":{"20":2}}],["installed",{"2":{"19":2}}],["install",{"0":{"15":1},"2":{"15":2,"19":4,"22":2}}],["invoking",{"2":{"20":2}}],["in",{"2":{"20":6}}],["info",{"2":{"19":6,"20":4}}],["index",{"2":{"13":1,"20":2}}],["int",{"2":{"3":4}}],["i",{"2":{"3":2}}],["see",{"2":{"21":2}}],["sed",{"2":{"3":2}}],["software",{"2":{"21":4}}],["source",{"2":{"20":3,"21":2}}],["sources",{"2":{"19":6,"21":2}}],["sourcing",{"2":{"20":2}}],["strip",{"2":{"20":2}}],["strings",{"2":{"20":2}}],["size",{"2":{"20":2}}],["simple",{"2":{"3":2}}],["sysroot",{"2":{"20":4}}],["script",{"2":{"20":2}}],["share",{"2":{"19":3}}],["spent",{"2":{"19":2}}],["speed",{"2":{"19":4}}],["slug",{"2":{"19":5,"20":4,"22":4}}],["s",{"2":{"3":2}}],["ranlib",{"2":{"20":4}}],["root",{"2":{"20":2}}],["readelf",{"2":{"20":2}}],["ready",{"2":{"20":2}}],["received",{"2":{"19":2}}],["rvp",{"2":{"5":1}}],["rv64",{"2":{"3":6}}],["risc",{"0":{"18":1,"22":1},"1":{"19":1,"20":1,"21":1},"2":{"4":1,"5":2}}],["riscv64",{"2":{"19":6,"20":64,"21":4}}],["riscv",{"2":{"3":1}}],["ruyiwget",{"2":{"11":1}}],["ruyi",{"0":{"1":1,"10":1},"1":{"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1},"2":{"0":1,"3":4,"10":1,"11":14,"13":1,"19":10,"20":28,"21":12}}],["ruyisdk",{"0":{"5":1,"6":1,"7":1,"8":1},"1":{"8":1},"2":{"0":1,"4":1,"5":3,"10":1,"11":2,"13":1,"19":8,"20":2,"21":2}}],["c",{"2":{"21":2}}],["cc",{"2":{"20":2}}],["cc=$riscv64",{"2":{"3":2}}],["c++filt",{"2":{"20":2}}],["c++",{"2":{"20":2}}],["check",{"2":{"20":2}}],["chmod",{"2":{"11":2}}],["cross",{"2":{"20":2}}],["created",{"2":{"20":2}}],["creating",{"2":{"20":2}}],["cmake",{"2":{"20":2}}],["curl",{"2":{"19":1}}],["current",{"2":{"19":2}}],["cache",{"2":{"13":3,"19":2}}],["cn",{"2":{"11":2,"19":2}}],["cd",{"2":{"3":1}}],["cpp",{"2":{"20":2}}],["cp",{"2":{"3":2}}],["conditions",{"2":{"21":2}}],["contain",{"2":{"20":2}}],["copying",{"2":{"21":2}}],["copyright",{"2":{"21":2}}],["core",{"2":{"3":2}}],["coremark",{"0":{"0":1,"3":1},"1":{"1":1,"2":1,"3":1},"2":{"0":2,"3":9}}],["comments",{"2":{"20":2}}],["comes",{"2":{"20":2}}],["compile",{"2":{"3":2}}],["com",{"2":{"3":2}}],["clone",{"2":{"3":2}}],["下载预编译二进制文件并将其重命名为",{"2":{"11":1}}],["下载",{"2":{"3":1}}],["下载工具链",{"0":{"2":1}}],["交叉编译",{"0":{"3":1},"2":{"0":1,"3":1}}],["安装一个选定的包",{"2":{"15":1}}],["安装包管理器",{"0":{"11":1}}],["安装",{"0":{"1":1,"19":1},"2":{"0":1}}],["运行时或虚拟机",{"2":{"5":1}}],["运行",{"0":{"0":1},"1":{"1":1,"2":1,"3":1}}]],"serializationVersion":2}';export{t as default}; diff --git a/assets/chunks/VPLocalSearchBox.36db4070.js b/assets/chunks/VPLocalSearchBox.ac629888.js similarity index 99% rename from assets/chunks/VPLocalSearchBox.36db4070.js rename to assets/chunks/VPLocalSearchBox.ac629888.js index 908f2414..9ccfa287 100644 --- a/assets/chunks/VPLocalSearchBox.36db4070.js +++ b/assets/chunks/VPLocalSearchBox.ac629888.js @@ -1,4 +1,4 @@ -import{X as pt,h as ie,x as Be,ah as kt,ai as Nt,d as It,E as be,aj as et,g as we,ak as Dt,al as _t,y as Ot,am as Rt,j as De,O as he,V as xe,an as Mt,S as Lt,U as Pt,ao as zt,Y as Bt,s as Vt,ap as $t,o as X,b as Wt,k as F,a1 as jt,l as U,aq as Kt,ar as Jt,as as Ut,c as te,n as tt,e as Fe,D as rt,F as at,a as de,t as ve,at as Ht,p as Gt,m as qt,au as nt,av as Qt,a6 as Yt,ac as Zt,_ as Xt}from"./framework.76cb5871.js";import{u as er,c as tr}from"./theme.c491cd3e.js";const rr={root:()=>pt(()=>import("./@localSearchIndexroot.a78eca85.js"),[])};/*! +import{X as pt,h as ie,x as Be,ah as kt,ai as Nt,d as It,E as be,aj as et,g as we,ak as Dt,al as _t,y as Ot,am as Rt,j as De,O as he,V as xe,an as Mt,S as Lt,U as Pt,ao as zt,Y as Bt,s as Vt,ap as $t,o as X,b as Wt,k as F,a1 as jt,l as U,aq as Kt,ar as Jt,as as Ut,c as te,n as tt,e as Fe,D as rt,F as at,a as de,t as ve,at as Ht,p as Gt,m as qt,au as nt,av as Qt,a6 as Yt,ac as Zt,_ as Xt}from"./framework.76cb5871.js";import{u as er,c as tr}from"./theme.120ea6ca.js";const rr={root:()=>pt(()=>import("./@localSearchIndexroot.7529f5f0.js"),[])};/*! * tabbable 6.2.0 * @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE */var yt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Ae=yt.join(","),mt=typeof Element>"u",se=mt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Ce=!mt&&Element.prototype.getRootNode?function(o){var e;return o==null||(e=o.getRootNode)===null||e===void 0?void 0:e.call(o)}:function(o){return o==null?void 0:o.ownerDocument},Te=function o(e,t){var r;t===void 0&&(t=!0);var n=e==null||(r=e.getAttribute)===null||r===void 0?void 0:r.call(e,"inert"),a=n===""||n==="true",i=a||t&&e&&o(e.parentNode);return i},ar=function(e){var t,r=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return r===""||r==="true"},gt=function(e,t,r){if(Te(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Ae));return t&&se.call(e,Ae)&&n.unshift(e),n=n.filter(r),n},bt=function o(e,t,r){for(var n=[],a=Array.from(e);a.length;){var i=a.shift();if(!Te(i,!1))if(i.tagName==="SLOT"){var s=i.assignedElements(),u=s.length?s:i.children,l=o(u,!0,r);r.flatten?n.push.apply(n,l):n.push({scopeParent:i,candidates:l})}else{var h=se.call(i,Ae);h&&r.filter(i)&&(t||!e.includes(i))&&n.push(i);var d=i.shadowRoot||typeof r.getShadowRoot=="function"&&r.getShadowRoot(i),v=!Te(d,!1)&&(!r.shadowRootFilter||r.shadowRootFilter(i));if(d&&v){var m=o(d===!0?i.children:d.children,!0,r);r.flatten?n.push.apply(n,m):n.push({scopeParent:i,candidates:m})}else a.unshift.apply(a,i.children)}}return n},wt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},oe=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||ar(e))&&!wt(e)?0:e.tabIndex},nr=function(e,t){var r=oe(e);return r<0&&t&&!wt(e)?0:r},ir=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},xt=function(e){return e.tagName==="INPUT"},or=function(e){return xt(e)&&e.type==="hidden"},sr=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(r){return r.tagName==="SUMMARY"});return t},ur=function(e,t){for(var r=0;rsummary:first-of-type"),i=a?e.parentElement:e;if(se.call(i,"details:not([open]) *"))return!0;if(!r||r==="full"||r==="legacy-full"){if(typeof n=="function"){for(var s=e;e;){var u=e.parentElement,l=Ce(e);if(u&&!u.shadowRoot&&n(u)===!0)return it(e);e.assignedSlot?e=e.assignedSlot:!u&&l!==e.ownerDocument?e=l.host:e=u}e=s}if(hr(e))return!e.getClientRects().length;if(r!=="legacy-full")return!0}else if(r==="non-zero-area")return it(e);return!1},vr=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var r=0;r=0)},yr=function o(e){var t=[],r=[];return e.forEach(function(n,a){var i=!!n.scopeParent,s=i?n.scopeParent:n,u=nr(s,i),l=i?o(n.candidates):s;u===0?i?t.push.apply(t,l):t.push(s):r.push({documentOrder:a,tabIndex:u,item:n,isScope:i,content:l})}),r.sort(ir).reduce(function(n,a){return a.isScope?n.push.apply(n,a.content):n.push(a.content),n},[]).concat(t)},mr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=bt([e],t.includeContainer,{filter:Ve.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:pr}):r=gt(e,t.includeContainer,Ve.bind(null,t)),yr(r)},gr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=bt([e],t.includeContainer,{filter:ke.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):r=gt(e,t.includeContainer,ke.bind(null,t)),r},ue=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return se.call(e,Ae)===!1?!1:Ve(t,e)},br=yt.concat("iframe").join(","),_e=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return se.call(e,br)===!1?!1:ke(t,e)};/*! diff --git a/assets/chunks/theme.c491cd3e.js b/assets/chunks/theme.120ea6ca.js similarity index 99% rename from assets/chunks/theme.c491cd3e.js rename to assets/chunks/theme.120ea6ca.js index cd125fda..d03e583b 100644 --- a/assets/chunks/theme.c491cd3e.js +++ b/assets/chunks/theme.120ea6ca.js @@ -1 +1 @@ -import{d as b,o as a,c as i,r as u,n as T,a as x,t as L,_ as m,b as $,w as v,T as ce,e as f,u as ze,i as De,f as ue,g as k,h as M,j as G,k as c,l,p as H,m as z,q as O,s as q,v as re,x as U,y as te,z as de,A as Ve,B as Ee,C as j,F as N,D as A,E as _e,G as Y,H as h,I as F,J as we,K as se,L as Z,M as ne,N as Fe,O as Oe,P as Le,Q as Ge,R as Ue,S as je,U as Ke,V as ke,W as Re,X as qe,Y as Se,Z as Me,$ as We,a0 as Ye,a1 as Je,a2 as Xe}from"./framework.76cb5871.js";const Ze=b({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(s){return(e,t)=>(a(),i("span",{class:T(["VPBadge",e.type])},[u(e.$slots,"default",{},()=>[x(L(e.text),1)],!0)],2))}});const Qe=m(Ze,[["__scopeId","data-v-ea5b2908"]]),et={key:0,class:"VPBackdrop"},tt=b({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(s){return(e,t)=>(a(),$(ce,{name:"fade"},{default:v(()=>[e.show?(a(),i("div",et)):f("",!0)]),_:1}))}});const st=m(tt,[["__scopeId","data-v-54a304ca"]]),P=ze;function nt(s,e){let t,n=!1;return()=>{t&&clearTimeout(t),n?t=setTimeout(s,e):(s(),(n=!0)&&setTimeout(()=>n=!1,e))}}function le(s){return/^\//.test(s)?s:`/${s}`}function J(s){const{pathname:e,search:t,hash:n,protocol:o}=new URL(s,"http://a.com");if(De(s)||s.startsWith("#")||!o.startsWith("http")||/\.(?!html|md)\w+($|\?)/i.test(s))return s;const{site:r}=P(),d=e.endsWith("/")||e.endsWith(".html")?s:s.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${t}${n}`);return ue(d)}function X({removeCurrent:s=!0,correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:o,theme:r}=P(),d=k(()=>{var _,g;return{label:(_=t.value.locales[n.value])==null?void 0:_.label,link:((g=t.value.locales[n.value])==null?void 0:g.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:k(()=>Object.entries(t.value.locales).flatMap(([_,g])=>s&&d.value.label===g.label?[]:{text:g.label,link:ot(g.link||(_==="root"?"/":`/${_}/`),r.value.i18nRouting!==!1&&e,o.value.relativePath.slice(d.value.link.length-1),!t.value.cleanUrls)})),currentLang:d}}function ot(s,e,t,n){return e?s.replace(/\/$/,"")+le(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,n?".html":"")):s}const at=s=>(H("data-v-b9c0c15a"),s=s(),z(),s),rt={class:"NotFound"},lt={class:"code"},it={class:"title"},ct=at(()=>c("div",{class:"divider"},null,-1)),ut={class:"quote"},dt={class:"action"},_t=["href","aria-label"],vt=b({__name:"NotFound",setup(s){const{site:e,theme:t}=P(),{localeLinks:n}=X({removeCurrent:!1}),o=M("/");return G(()=>{var d;const r=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(o.value=((d=n.value.find(({link:p})=>p.startsWith(r)))==null?void 0:d.link)||n.value[0].link)}),(r,d)=>{var p,_,g,V,y;return a(),i("div",rt,[c("p",lt,L(((p=l(t).notFound)==null?void 0:p.code)??"404"),1),c("h1",it,L(((_=l(t).notFound)==null?void 0:_.title)??"PAGE NOT FOUND"),1),ct,c("blockquote",ut,L(((g=l(t).notFound)==null?void 0:g.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),c("div",dt,[c("a",{class:"link",href:l(ue)(o.value),"aria-label":((V=l(t).notFound)==null?void 0:V.linkLabel)??"go to home"},L(((y=l(t).notFound)==null?void 0:y.linkText)??"Take me home"),9,_t)])])}}});const pt=m(vt,[["__scopeId","data-v-b9c0c15a"]]);function Ne(s,e){if(Array.isArray(s))return Q(s);if(s==null)return[];e=le(e);const t=Object.keys(s).sort((o,r)=>r.split("/").length-o.split("/").length).find(o=>e.startsWith(le(o))),n=t?s[t]:[];return Array.isArray(n)?Q(n):Q(n.items,n.base)}function ht(s){const e=[];let t=0;for(const n in s){const o=s[n];if(o.items){t=e.push(o);continue}e[t]||e.push({items:[]}),e[t].items.push(o)}return e}function ft(s){const e=[];function t(n){for(const o of n)o.text&&o.link&&e.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&t(o.items)}return t(s),e}function ie(s,e){return Array.isArray(e)?e.some(t=>ie(s,t)):O(s,e.link)?!0:e.items?ie(s,e.items):!1}function Q(s,e){return[...s].map(t=>{const n={...t},o=n.base||e;return o&&n.link&&(n.link=o+n.link),n.items&&(n.items=Q(n.items,o)),n})}function D(){const{frontmatter:s,page:e,theme:t}=P(),n=re("(min-width: 960px)"),o=M(!1),r=k(()=>{const B=t.value.sidebar,w=e.value.relativePath;return B?Ne(B,w):[]}),d=M(r.value);U(r,(B,w)=>{JSON.stringify(B)!==JSON.stringify(w)&&(d.value=r.value)});const p=k(()=>s.value.sidebar!==!1&&d.value.length>0&&s.value.layout!=="home"),_=k(()=>g?s.value.aside==null?t.value.aside==="left":s.value.aside==="left":!1),g=k(()=>s.value.layout==="home"?!1:s.value.aside!=null?!!s.value.aside:t.value.aside!==!1),V=k(()=>p.value&&n.value),y=k(()=>p.value?ht(d.value):[]);function I(){o.value=!0}function S(){o.value=!1}function C(){o.value?S():I()}return{isOpen:o,sidebar:d,sidebarGroups:y,hasSidebar:p,hasAside:g,leftAside:_,isSidebarEnabled:V,open:I,close:S,toggle:C}}function mt(s,e){let t;te(()=>{t=s.value?document.activeElement:void 0}),G(()=>{window.addEventListener("keyup",n)}),de(()=>{window.removeEventListener("keyup",n)});function n(o){o.key==="Escape"&&s.value&&(e(),t==null||t.focus())}}const Ie=M(q?location.hash:"");q&&window.addEventListener("hashchange",()=>{Ie.value=location.hash});function gt(s){const{page:e}=P(),t=M(!1),n=k(()=>s.value.collapsed!=null),o=k(()=>!!s.value.link),r=M(!1),d=()=>{r.value=O(e.value.relativePath,s.value.link)};U([e,s,Ie],d),G(d);const p=k(()=>r.value?!0:s.value.items?ie(e.value.relativePath,s.value.items):!1),_=k(()=>!!(s.value.items&&s.value.items.length));te(()=>{t.value=!!(n.value&&s.value.collapsed)}),Ve(()=>{(r.value||p.value)&&(t.value=!1)});function g(){n.value&&(t.value=!t.value)}return{collapsed:t,collapsible:n,isLink:o,isActiveLink:r,hasActiveLink:p,hasChildren:_,toggle:g}}function bt(){const{hasSidebar:s}=D(),e=re("(min-width: 960px)"),t=re("(min-width: 1280px)");return{isAsideEnabled:k(()=>!t.value&&!e.value?!1:s.value?t.value:e.value)}}const $t=71;function ve(s){return typeof s.outline=="object"&&!Array.isArray(s.outline)&&s.outline.label||s.outlineTitle||"On this page"}function pe(s){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const n=Number(t.tagName[1]);return{title:kt(t),link:"#"+t.id,level:n}});return yt(e,s)}function kt(s){let e="";for(const t of s.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function yt(s,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[n,o]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;s=s.filter(d=>d.level>=n&&d.level<=o);const r=[];e:for(let d=0;d=0;_--){const g=s[_];if(g.level{requestAnimationFrame(r),window.addEventListener("scroll",n)}),Ee(()=>{d(location.hash)}),de(()=>{window.removeEventListener("scroll",n)});function r(){if(!t.value)return;const p=[].slice.call(s.value.querySelectorAll(".outline-link")),_=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(S=>p.some(C=>C.hash===S.hash&&S.offsetParent!==null)),g=window.scrollY,V=window.innerHeight,y=document.body.offsetHeight,I=Math.abs(g+V-y)<1;if(_.length&&I){d(_[_.length-1].hash);return}for(let S=0;S<_.length;S++){const C=_[S],B=_[S+1],[w,K]=Vt(S,C,B);if(w){d(K);return}}}function d(p){o&&o.classList.remove("active"),p==null?o=null:o=s.value.querySelector(`a[href="${decodeURIComponent(p)}"]`);const _=o;_?(_.classList.add("active"),e.value.style.top=_.offsetTop+33+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function ye(s){return s.parentElement.offsetTop-$t}function Vt(s,e,t){const n=window.scrollY;return s===0&&n===0?[!0,null]:n{const o=j("VPDocOutlineItem",!0);return a(),i("ul",{class:T(t.root?"root":"nested")},[(a(!0),i(N,null,A(t.headers,({children:r,link:d,title:p})=>(a(),i("li",null,[c("a",{class:"outline-link",href:d,onClick:e,title:p},L(p),9,wt),r!=null&&r.length?(a(),$(o,{key:0,headers:r},null,8,["headers"])):f("",!0)]))),256))],2)}}});const he=m(Lt,[["__scopeId","data-v-463da30f"]]),St=s=>(H("data-v-3a6c4994"),s=s(),z(),s),Mt={class:"content"},Nt={class:"outline-title",role:"heading","aria-level":"2"},It={"aria-labelledby":"doc-outline-aria-label"},Tt=St(()=>c("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),Ct=b({__name:"VPDocAsideOutline",setup(s){const{frontmatter:e,theme:t}=P(),n=_e([]);Y(()=>{n.value=pe(e.value.outline??t.value.outline)});const o=M(),r=M();return Pt(o,r),(d,p)=>(a(),i("div",{class:T(["VPDocAsideOutline",{"has-outline":n.value.length>0}]),ref_key:"container",ref:o,role:"navigation"},[c("div",Mt,[c("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),c("div",Nt,L(l(ve)(l(t))),1),c("nav",It,[Tt,h(he,{headers:n.value,root:!0},null,8,["headers"])])])],2))}});const Bt=m(Ct,[["__scopeId","data-v-3a6c4994"]]),At={class:"VPDocAsideCarbonAds"},xt=b({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(s){const e=()=>null;return(t,n)=>(a(),i("div",At,[h(l(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),Ht=s=>(H("data-v-cb998dce"),s=s(),z(),s),zt={class:"VPDocAside"},Dt=Ht(()=>c("div",{class:"spacer"},null,-1)),Et=b({__name:"VPDocAside",setup(s){const{theme:e}=P();return(t,n)=>(a(),i("div",zt,[u(t.$slots,"aside-top",{},void 0,!0),u(t.$slots,"aside-outline-before",{},void 0,!0),h(Bt),u(t.$slots,"aside-outline-after",{},void 0,!0),Dt,u(t.$slots,"aside-ads-before",{},void 0,!0),l(e).carbonAds?(a(),$(xt,{key:0,"carbon-ads":l(e).carbonAds},null,8,["carbon-ads"])):f("",!0),u(t.$slots,"aside-ads-after",{},void 0,!0),u(t.$slots,"aside-bottom",{},void 0,!0)]))}});const Ft=m(Et,[["__scopeId","data-v-cb998dce"]]);function Ot(){const{theme:s,page:e}=P();return k(()=>{const{text:t="Edit this page",pattern:n=""}=s.value.editLink||{};let o;return typeof n=="function"?o=n(e.value):o=n.replace(/:path/g,e.value.filePath),{url:o,text:t}})}function Gt(){const{page:s,theme:e,frontmatter:t}=P();return k(()=>{var _,g,V,y,I,S,C,B;const n=Ne(e.value.sidebar,s.value.relativePath),o=ft(n),r=o.findIndex(w=>O(s.value.relativePath,w.link)),d=((_=e.value.docFooter)==null?void 0:_.prev)===!1&&!t.value.prev||t.value.prev===!1,p=((g=e.value.docFooter)==null?void 0:g.next)===!1&&!t.value.next||t.value.next===!1;return{prev:d?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((V=o[r-1])==null?void 0:V.docFooterText)??((y=o[r-1])==null?void 0:y.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((I=o[r-1])==null?void 0:I.link)},next:p?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((S=o[r+1])==null?void 0:S.docFooterText)??((C=o[r+1])==null?void 0:C.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((B=o[r+1])==null?void 0:B.link)}}})}const Ut={},jt={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Kt=c("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),Rt=c("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),qt=[Kt,Rt];function Wt(s,e){return a(),i("svg",jt,qt)}const Yt=m(Ut,[["render",Wt]]),E=b({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(s){const e=s,t=k(()=>e.tag??(e.href?"a":"span")),n=k(()=>e.href&&we.test(e.href));return(o,r)=>(a(),$(F(t.value),{class:T(["VPLink",{link:o.href,"vp-external-link-icon":n.value,"no-icon":o.noIcon}]),href:o.href?l(J)(o.href):void 0,target:o.target??(n.value?"_blank":void 0),rel:o.rel??(n.value?"noreferrer":void 0)},{default:v(()=>[u(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Jt={class:"VPLastUpdated"},Xt=["datetime"],Zt=b({__name:"VPDocFooterLastUpdated",setup(s){const{theme:e,page:t,frontmatter:n,lang:o}=P(),r=k(()=>new Date(n.value.lastUpdated??t.value.lastUpdated)),d=k(()=>r.value.toISOString()),p=M("");return G(()=>{te(()=>{var _,g,V;p.value=new Intl.DateTimeFormat((g=(_=e.value.lastUpdated)==null?void 0:_.formatOptions)!=null&&g.forceLocale?o.value:void 0,((V=e.value.lastUpdated)==null?void 0:V.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(r.value)})}),(_,g)=>{var V;return a(),i("p",Jt,[x(L(((V=l(e).lastUpdated)==null?void 0:V.text)||l(e).lastUpdatedText||"Last updated")+": ",1),c("time",{datetime:d.value},L(p.value),9,Xt)])}}});const Qt=m(Zt,[["__scopeId","data-v-19a7ae4e"]]),es={key:0,class:"VPDocFooter"},ts={key:0,class:"edit-info"},ss={key:0,class:"edit-link"},ns={key:1,class:"last-updated"},os={key:1,class:"prev-next"},as={class:"pager"},rs=["href"],ls=["innerHTML"],is=["innerHTML"],cs={class:"pager"},us=["href"],ds=["innerHTML"],_s=["innerHTML"],vs=b({__name:"VPDocFooter",setup(s){const{theme:e,page:t,frontmatter:n}=P(),o=Ot(),r=Gt(),d=k(()=>e.value.editLink&&n.value.editLink!==!1),p=k(()=>t.value.lastUpdated&&n.value.lastUpdated!==!1),_=k(()=>d.value||p.value||r.value.prev||r.value.next);return(g,V)=>{var y,I,S,C,B,w;return _.value?(a(),i("footer",es,[u(g.$slots,"doc-footer-before",{},void 0,!0),d.value||p.value?(a(),i("div",ts,[d.value?(a(),i("div",ss,[h(E,{class:"edit-link-button",href:l(o).url,"no-icon":!0},{default:v(()=>[h(Yt,{class:"edit-link-icon","aria-label":"edit icon"}),x(" "+L(l(o).text),1)]),_:1},8,["href"])])):f("",!0),p.value?(a(),i("div",ns,[h(Qt)])):f("",!0)])):f("",!0),(y=l(r).prev)!=null&&y.link||(I=l(r).next)!=null&&I.link?(a(),i("nav",os,[c("div",as,[(S=l(r).prev)!=null&&S.link?(a(),i("a",{key:0,class:"pager-link prev",href:l(J)(l(r).prev.link)},[c("span",{class:"desc",innerHTML:((C=l(e).docFooter)==null?void 0:C.prev)||"Previous page"},null,8,ls),c("span",{class:"title",innerHTML:l(r).prev.text},null,8,is)],8,rs)):f("",!0)]),c("div",cs,[(B=l(r).next)!=null&&B.link?(a(),i("a",{key:0,class:"pager-link next",href:l(J)(l(r).next.link)},[c("span",{class:"desc",innerHTML:((w=l(e).docFooter)==null?void 0:w.next)||"Next page"},null,8,ds),c("span",{class:"title",innerHTML:l(r).next.text},null,8,_s)],8,us)):f("",!0)])])):f("",!0)])):f("",!0)}}});const ps=m(vs,[["__scopeId","data-v-a2d931e4"]]),hs={},fs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ms=c("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),gs=[ms];function bs(s,e){return a(),i("svg",fs,gs)}const fe=m(hs,[["render",bs]]),$s={key:0,class:"VPDocOutlineDropdown"},ks={key:0,class:"items"},ys=b({__name:"VPDocOutlineDropdown",setup(s){const{frontmatter:e,theme:t}=P(),n=M(!1);Y(()=>{n.value=!1});const o=_e([]);return Y(()=>{o.value=pe(e.value.outline??t.value.outline)}),(r,d)=>o.value.length>0?(a(),i("div",$s,[c("button",{onClick:d[0]||(d[0]=p=>n.value=!n.value),class:T({open:n.value})},[x(L(l(ve)(l(t)))+" ",1),h(fe,{class:"icon"})],2),n.value?(a(),i("div",ks,[h(he,{headers:o.value},null,8,["headers"])])):f("",!0)])):f("",!0)}});const Ps=m(ys,[["__scopeId","data-v-95bb0785"]]),Vs=s=>(H("data-v-a3c25e27"),s=s(),z(),s),ws={class:"container"},Ls=Vs(()=>c("div",{class:"aside-curtain"},null,-1)),Ss={class:"aside-container"},Ms={class:"aside-content"},Ns={class:"content"},Is={class:"content-container"},Ts={class:"main"},Cs=b({__name:"VPDoc",setup(s){const{theme:e}=P(),t=se(),{hasSidebar:n,hasAside:o,leftAside:r}=D(),d=k(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(p,_)=>{const g=j("Content");return a(),i("div",{class:T(["VPDoc",{"has-sidebar":l(n),"has-aside":l(o)}])},[u(p.$slots,"doc-top",{},void 0,!0),c("div",ws,[l(o)?(a(),i("div",{key:0,class:T(["aside",{"left-aside":l(r)}])},[Ls,c("div",Ss,[c("div",Ms,[h(Ft,null,{"aside-top":v(()=>[u(p.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(p.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(p.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(p.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(p.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(p.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):f("",!0),c("div",Ns,[c("div",Is,[u(p.$slots,"doc-before",{},void 0,!0),h(Ps),c("main",Ts,[h(g,{class:T(["vp-doc",[d.value,l(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),h(ps,null,{"doc-footer-before":v(()=>[u(p.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),u(p.$slots,"doc-after",{},void 0,!0)])])]),u(p.$slots,"doc-bottom",{},void 0,!0)],2)}}});const Bs=m(Cs,[["__scopeId","data-v-a3c25e27"]]),As=b({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(s){const e=s,t=k(()=>e.href&&we.test(e.href)),n=k(()=>e.tag||e.href?"a":"button");return(o,r)=>(a(),$(F(n.value),{class:T(["VPButton",[o.size,o.theme]]),href:o.href?l(J)(o.href):void 0,target:t.value?"_blank":void 0,rel:t.value?"noreferrer":void 0},{default:v(()=>[x(L(o.text),1)]),_:1},8,["class","href","target","rel"]))}});const xs=m(As,[["__scopeId","data-v-1e76fe75"]]),Hs=["src","alt"],zs=b({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(s){return(e,t)=>{const n=j("VPImage",!0);return e.image?(a(),i(N,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),i("img",Z({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:l(ue)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,Hs)):(a(),i(N,{key:1},[h(n,Z({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),h(n,Z({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):f("",!0)}}});const ee=m(zs,[["__scopeId","data-v-ab19afbb"]]),Ds=s=>(H("data-v-5a3e9999"),s=s(),z(),s),Es={class:"container"},Fs={class:"main"},Os={key:0,class:"name"},Gs=["innerHTML"],Us=["innerHTML"],js=["innerHTML"],Ks={key:0,class:"actions"},Rs={key:0,class:"image"},qs={class:"image-container"},Ws=Ds(()=>c("div",{class:"image-bg"},null,-1)),Ys=b({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(s){const e=ne("hero-image-slot-exists");return(t,n)=>(a(),i("div",{class:T(["VPHero",{"has-image":t.image||l(e)}])},[c("div",Es,[c("div",Fs,[u(t.$slots,"home-hero-info",{},()=>[t.name?(a(),i("h1",Os,[c("span",{innerHTML:t.name,class:"clip"},null,8,Gs)])):f("",!0),t.text?(a(),i("p",{key:1,innerHTML:t.text,class:"text"},null,8,Us)):f("",!0),t.tagline?(a(),i("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,js)):f("",!0)],!0),t.actions?(a(),i("div",Ks,[(a(!0),i(N,null,A(t.actions,o=>(a(),i("div",{key:o.link,class:"action"},[h(xs,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link},null,8,["theme","text","href"])]))),128))])):f("",!0)]),t.image||l(e)?(a(),i("div",Rs,[c("div",qs,[Ws,u(t.$slots,"home-hero-image",{},()=>[t.image?(a(),$(ee,{key:0,class:"image-src",image:t.image},null,8,["image"])):f("",!0)],!0)])])):f("",!0)])],2))}});const Js=m(Ys,[["__scopeId","data-v-5a3e9999"]]),Xs=b({__name:"VPHomeHero",setup(s){const{frontmatter:e}=P();return(t,n)=>l(e).hero?(a(),$(Js,{key:0,class:"VPHomeHero",name:l(e).hero.name,text:l(e).hero.text,tagline:l(e).hero.tagline,image:l(e).hero.image,actions:l(e).hero.actions},{"home-hero-info":v(()=>[u(t.$slots,"home-hero-info")]),"home-hero-image":v(()=>[u(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):f("",!0)}}),Zs={},Qs={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},en=c("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),tn=[en];function sn(s,e){return a(),i("svg",Qs,tn)}const nn=m(Zs,[["render",sn]]),on={class:"box"},an={key:0,class:"icon"},rn=["innerHTML"],ln=["innerHTML"],cn=["innerHTML"],un={key:4,class:"link-text"},dn={class:"link-text-value"},_n=b({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(s){return(e,t)=>(a(),$(E,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:v(()=>[c("article",on,[typeof e.icon=="object"&&e.icon.wrap?(a(),i("div",an,[h(ee,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),$(ee,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),i("div",{key:2,class:"icon",innerHTML:e.icon},null,8,rn)):f("",!0),c("h2",{class:"title",innerHTML:e.title},null,8,ln),e.details?(a(),i("p",{key:3,class:"details",innerHTML:e.details},null,8,cn)):f("",!0),e.linkText?(a(),i("div",un,[c("p",dn,[x(L(e.linkText)+" ",1),h(nn,{class:"link-text-icon"})])])):f("",!0)])]),_:1},8,["href","rel","target","tag"]))}});const vn=m(_n,[["__scopeId","data-v-ee984185"]]),pn={key:0,class:"VPFeatures"},hn={class:"container"},fn={class:"items"},mn=b({__name:"VPFeatures",props:{features:{}},setup(s){const e=s,t=k(()=>{const n=e.features.length;if(n){if(n===2)return"grid-2";if(n===3)return"grid-3";if(n%3===0)return"grid-6";if(n>3)return"grid-4"}else return});return(n,o)=>n.features?(a(),i("div",pn,[c("div",hn,[c("div",fn,[(a(!0),i(N,null,A(n.features,r=>(a(),i("div",{key:r.title,class:T(["item",[t.value]])},[h(vn,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):f("",!0)}});const gn=m(mn,[["__scopeId","data-v-b1eea84a"]]),bn=b({__name:"VPHomeFeatures",setup(s){const{frontmatter:e}=P();return(t,n)=>l(e).features?(a(),$(gn,{key:0,class:"VPHomeFeatures",features:l(e).features},null,8,["features"])):f("",!0)}}),$n={class:"VPHome"},kn=b({__name:"VPHome",setup(s){return(e,t)=>{const n=j("Content");return a(),i("div",$n,[u(e.$slots,"home-hero-before",{},void 0,!0),h(Xs,null,{"home-hero-info":v(()=>[u(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),u(e.$slots,"home-hero-after",{},void 0,!0),u(e.$slots,"home-features-before",{},void 0,!0),h(bn),u(e.$slots,"home-features-after",{},void 0,!0),h(n)])}}});const yn=m(kn,[["__scopeId","data-v-20eabd3a"]]),Pn={},Vn={class:"VPPage"};function wn(s,e){const t=j("Content");return a(),i("div",Vn,[u(s.$slots,"page-top"),h(t),u(s.$slots,"page-bottom")])}const Ln=m(Pn,[["render",wn]]),Sn=b({__name:"VPContent",setup(s){const{page:e,frontmatter:t}=P(),{hasSidebar:n}=D();return(o,r)=>(a(),i("div",{class:T(["VPContent",{"has-sidebar":l(n),"is-home":l(t).layout==="home"}]),id:"VPContent"},[l(e).isNotFound?u(o.$slots,"not-found",{key:0},()=>[h(pt)],!0):l(t).layout==="page"?(a(),$(Ln,{key:1},{"page-top":v(()=>[u(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):l(t).layout==="home"?(a(),$(yn,{key:2},{"home-hero-before":v(()=>[u(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):l(t).layout&&l(t).layout!=="doc"?(a(),$(F(l(t).layout),{key:3})):(a(),$(Bs,{key:4},{"doc-top":v(()=>[u(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":v(()=>[u(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":v(()=>[u(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":v(()=>[u(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":v(()=>[u(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const Mn=m(Sn,[["__scopeId","data-v-3cf691b6"]]),Nn={class:"container"},In=["innerHTML"],Tn=["innerHTML"],Cn=b({__name:"VPFooter",setup(s){const{theme:e,frontmatter:t}=P(),{hasSidebar:n}=D();return(o,r)=>l(e).footer&&l(t).footer!==!1?(a(),i("footer",{key:0,class:T(["VPFooter",{"has-sidebar":l(n)}])},[c("div",Nn,[l(e).footer.message?(a(),i("p",{key:0,class:"message",innerHTML:l(e).footer.message},null,8,In)):f("",!0),l(e).footer.copyright?(a(),i("p",{key:1,class:"copyright",innerHTML:l(e).footer.copyright},null,8,Tn)):f("",!0)])],2)):f("",!0)}});const Bn=m(Cn,[["__scopeId","data-v-e4279f1c"]]),An={class:"header"},xn={class:"outline"},Hn=b({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(s){const e=s,{theme:t}=P(),n=M(!1),o=M(0),r=M();Y(()=>{n.value=!1});function d(){n.value=!n.value,o.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function p(g){g.target.classList.contains("outline-link")&&(r.value&&(r.value.style.transition="none"),Oe(()=>{n.value=!1}))}function _(){n.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(g,V)=>(a(),i("div",{class:"VPLocalNavOutlineDropdown",style:Fe({"--vp-vh":o.value+"px"})},[g.headers.length>0?(a(),i("button",{key:0,onClick:d,class:T({open:n.value})},[x(L(l(ve)(l(t)))+" ",1),h(fe,{class:"icon"})],2)):(a(),i("button",{key:1,onClick:_},L(l(t).returnToTopLabel||"Return to top"),1)),h(ce,{name:"flyout"},{default:v(()=>[n.value?(a(),i("div",{key:0,ref_key:"items",ref:r,class:"items",onClick:p},[c("div",An,[c("a",{class:"top-link",href:"#",onClick:_},L(l(t).returnToTopLabel||"Return to top"),1)]),c("div",xn,[h(he,{headers:g.headers},null,8,["headers"])])],512)):f("",!0)]),_:1})],4))}});const zn=m(Hn,[["__scopeId","data-v-24251f6f"]]),Dn={},En={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Fn=c("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),On=c("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),Gn=c("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),Un=c("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),jn=[Fn,On,Gn,Un];function Kn(s,e){return a(),i("svg",En,jn)}const Rn=m(Dn,[["render",Kn]]),qn=["aria-expanded"],Wn={class:"menu-text"},Yn=b({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(s){const{theme:e,frontmatter:t}=P(),{hasSidebar:n}=D(),{y:o}=Le(),r=_e([]),d=M(0);G(()=>{d.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Y(()=>{r.value=pe(t.value.outline??e.value.outline)});const p=k(()=>r.value.length===0&&!n.value),_=k(()=>({VPLocalNav:!0,fixed:p.value,"reached-top":o.value>=d.value}));return(g,V)=>l(t).layout!=="home"&&(!p.value||l(o)>=d.value)?(a(),i("div",{key:0,class:T(_.value)},[l(n)?(a(),i("button",{key:0,class:"menu","aria-expanded":g.open,"aria-controls":"VPSidebarNav",onClick:V[0]||(V[0]=y=>g.$emit("open-menu"))},[h(Rn,{class:"menu-icon"}),c("span",Wn,L(l(e).sidebarMenuLabel||"Menu"),1)],8,qn)):f("",!0),h(zn,{headers:r.value,navHeight:d.value},null,8,["headers","navHeight"])],2)):f("",!0)}});const Jn=m(Yn,[["__scopeId","data-v-9e669cc1"]]);function Xn(){const s=M(!1);function e(){s.value=!0,window.addEventListener("resize",o)}function t(){s.value=!1,window.removeEventListener("resize",o)}function n(){s.value?t():e()}function o(){window.outerWidth>=768&&t()}const r=se();return U(()=>r.path,t),{isScreenOpen:s,openScreen:e,closeScreen:t,toggleScreen:n}}const Zn={},Qn={class:"VPSwitch",type:"button",role:"switch"},eo={class:"check"},to={key:0,class:"icon"};function so(s,e){return a(),i("button",Qn,[c("span",eo,[s.$slots.default?(a(),i("span",to,[u(s.$slots,"default",{},void 0,!0)])):f("",!0)])])}const no=m(Zn,[["render",so],["__scopeId","data-v-1c29e291"]]),oo={},ao={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ro=c("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),lo=[ro];function io(s,e){return a(),i("svg",ao,lo)}const co=m(oo,[["render",io]]),uo={},_o={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},vo=Ge('',9),po=[vo];function ho(s,e){return a(),i("svg",_o,po)}const fo=m(uo,[["render",ho]]),mo=b({__name:"VPSwitchAppearance",setup(s){const{isDark:e}=P(),t=ne("toggle-appearance",()=>{e.value=!e.value});return(n,o)=>(a(),$(no,{title:"toggle dark mode",class:"VPSwitchAppearance","aria-checked":l(e),onClick:l(t)},{default:v(()=>[h(fo,{class:"sun"}),h(co,{class:"moon"})]),_:1},8,["aria-checked","onClick"]))}});const me=m(mo,[["__scopeId","data-v-3329432d"]]),go={key:0,class:"VPNavBarAppearance"},bo=b({__name:"VPNavBarAppearance",setup(s){const{site:e}=P();return(t,n)=>l(e).appearance&&l(e).appearance!=="force-dark"?(a(),i("div",go,[h(me)])):f("",!0)}});const $o=m(bo,[["__scopeId","data-v-283b26e9"]]),ge=M();let Te=!1,ae=0;function ko(s){const e=M(!1);if(q){!Te&&yo(),ae++;const t=U(ge,n=>{var o,r,d;n===s.el.value||(o=s.el.value)!=null&&o.contains(n)?(e.value=!0,(r=s.onFocus)==null||r.call(s)):(e.value=!1,(d=s.onBlur)==null||d.call(s))});de(()=>{t(),ae--,ae||Po()})}return Ue(e)}function yo(){document.addEventListener("focusin",Ce),Te=!0,ge.value=document.activeElement}function Po(){document.removeEventListener("focusin",Ce)}function Ce(){ge.value=document.activeElement}const Vo={},wo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Lo=c("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),So=[Lo];function Mo(s,e){return a(),i("svg",wo,So)}const Be=m(Vo,[["render",Mo]]),No={},Io={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},To=c("circle",{cx:"12",cy:"12",r:"2"},null,-1),Co=c("circle",{cx:"19",cy:"12",r:"2"},null,-1),Bo=c("circle",{cx:"5",cy:"12",r:"2"},null,-1),Ao=[To,Co,Bo];function xo(s,e){return a(),i("svg",Io,Ao)}const Ho=m(No,[["render",xo]]),zo={class:"VPMenuLink"},Do=b({__name:"VPMenuLink",props:{item:{}},setup(s){const{page:e}=P();return(t,n)=>(a(),i("div",zo,[h(E,{class:T({active:l(O)(l(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:v(()=>[x(L(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const oe=m(Do,[["__scopeId","data-v-f51f088d"]]),Eo={class:"VPMenuGroup"},Fo={key:0,class:"title"},Oo=b({__name:"VPMenuGroup",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),i("div",Eo,[e.text?(a(),i("p",Fo,L(e.text),1)):f("",!0),(a(!0),i(N,null,A(e.items,n=>(a(),i(N,null,["link"in n?(a(),$(oe,{key:0,item:n},null,8,["item"])):f("",!0)],64))),256))]))}});const Go=m(Oo,[["__scopeId","data-v-a6b0397c"]]),Uo={class:"VPMenu"},jo={key:0,class:"items"},Ko=b({__name:"VPMenu",props:{items:{}},setup(s){return(e,t)=>(a(),i("div",Uo,[e.items?(a(),i("div",jo,[(a(!0),i(N,null,A(e.items,n=>(a(),i(N,{key:n.text},["link"in n?(a(),$(oe,{key:0,item:n},null,8,["item"])):(a(),$(Go,{key:1,text:n.text,items:n.items},null,8,["text","items"]))],64))),128))])):f("",!0),u(e.$slots,"default",{},void 0,!0)]))}});const Ro=m(Ko,[["__scopeId","data-v-e42ed9b3"]]),qo=["aria-expanded","aria-label"],Wo={key:0,class:"text"},Yo=["innerHTML"],Jo={class:"menu"},Xo=b({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(s){const e=M(!1),t=M();ko({el:t,onBlur:n});function n(){e.value=!1}return(o,r)=>(a(),i("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:r[1]||(r[1]=d=>e.value=!0),onMouseleave:r[2]||(r[2]=d=>e.value=!1)},[c("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":o.label,onClick:r[0]||(r[0]=d=>e.value=!e.value)},[o.button||o.icon?(a(),i("span",Wo,[o.icon?(a(),$(F(o.icon),{key:0,class:"option-icon"})):f("",!0),o.button?(a(),i("span",{key:1,innerHTML:o.button},null,8,Yo)):f("",!0),h(Be,{class:"text-icon"})])):(a(),$(Ho,{key:1,class:"icon"}))],8,qo),c("div",Jo,[h(Ro,{items:o.items},{default:v(()=>[u(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const be=m(Xo,[["__scopeId","data-v-aa8de344"]]),Zo={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},Qo=["href","aria-label","innerHTML"],ea=b({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(s){const e=s,t=k(()=>typeof e.icon=="object"?e.icon.svg:Zo[e.icon]);return(n,o)=>(a(),i("a",{class:"VPSocialLink no-icon",href:n.link,"aria-label":n.ariaLabel??(typeof n.icon=="string"?n.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,Qo))}});const ta=m(ea,[["__scopeId","data-v-16cf740a"]]),sa={class:"VPSocialLinks"},na=b({__name:"VPSocialLinks",props:{links:{}},setup(s){return(e,t)=>(a(),i("div",sa,[(a(!0),i(N,null,A(e.links,({link:n,icon:o,ariaLabel:r})=>(a(),$(ta,{key:n,icon:o,link:n,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}});const $e=m(na,[["__scopeId","data-v-e71e869c"]]),oa={key:0,class:"group translations"},aa={class:"trans-title"},ra={key:1,class:"group"},la={class:"item appearance"},ia={class:"label"},ca={class:"appearance-action"},ua={key:2,class:"group"},da={class:"item social-links"},_a=b({__name:"VPNavBarExtra",setup(s){const{site:e,theme:t}=P(),{localeLinks:n,currentLang:o}=X({correspondingLink:!0}),r=k(()=>n.value.length&&o.value.label||e.value.appearance||t.value.socialLinks);return(d,p)=>r.value?(a(),$(be,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:v(()=>[l(n).length&&l(o).label?(a(),i("div",oa,[c("p",aa,L(l(o).label),1),(a(!0),i(N,null,A(l(n),_=>(a(),$(oe,{key:_.link,item:_},null,8,["item"]))),128))])):f("",!0),l(e).appearance?(a(),i("div",ra,[c("div",la,[c("p",ia,L(l(t).darkModeSwitchLabel||"Appearance"),1),c("div",ca,[h(me)])])])):f("",!0),l(t).socialLinks?(a(),i("div",ua,[c("div",da,[h($e,{class:"social-links-list",links:l(t).socialLinks},null,8,["links"])])])):f("",!0)]),_:1})):f("",!0)}});const va=m(_a,[["__scopeId","data-v-c8c2ae4b"]]),pa=s=>(H("data-v-6bee1efd"),s=s(),z(),s),ha=["aria-expanded"],fa=pa(()=>c("span",{class:"container"},[c("span",{class:"top"}),c("span",{class:"middle"}),c("span",{class:"bottom"})],-1)),ma=[fa],ga=b({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(s){return(e,t)=>(a(),i("button",{type:"button",class:T(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=n=>e.$emit("click"))},ma,10,ha))}});const ba=m(ga,[["__scopeId","data-v-6bee1efd"]]),$a=["innerHTML"],ka=b({__name:"VPNavBarMenuLink",props:{item:{}},setup(s){const{page:e}=P();return(t,n)=>(a(),$(E,{class:T({VPNavBarMenuLink:!0,active:l(O)(l(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:v(()=>[c("span",{innerHTML:t.item.text},null,8,$a)]),_:1},8,["class","href","target","rel"]))}});const ya=m(ka,[["__scopeId","data-v-cb318fec"]]),Pa=b({__name:"VPNavBarMenuGroup",props:{item:{}},setup(s){const e=s,{page:t}=P(),n=r=>"link"in r?O(t.value.relativePath,r.link,!!e.item.activeMatch):r.items.some(n),o=k(()=>n(e.item));return(r,d)=>(a(),$(be,{class:T({VPNavBarMenuGroup:!0,active:l(O)(l(t).relativePath,r.item.activeMatch,!!r.item.activeMatch)||o.value}),button:r.item.text,items:r.item.items},null,8,["class","button","items"]))}}),Va=s=>(H("data-v-f732b5d0"),s=s(),z(),s),wa={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},La=Va(()=>c("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),Sa=b({__name:"VPNavBarMenu",setup(s){const{theme:e}=P();return(t,n)=>l(e).nav?(a(),i("nav",wa,[La,(a(!0),i(N,null,A(l(e).nav,o=>(a(),i(N,{key:o.text},["link"in o?(a(),$(ya,{key:0,item:o},null,8,["item"])):(a(),$(Pa,{key:1,item:o},null,8,["item"]))],64))),128))])):f("",!0)}});const Ma=m(Sa,[["__scopeId","data-v-f732b5d0"]]);function Na(s,e){const{localeIndex:t}=P();function n(o){var S,C;const r=o.split("."),d=s&&typeof s=="object",p=d&&((C=(S=s.locales)==null?void 0:S[t.value])==null?void 0:C.translations)||null,_=d&&s.translations||null;let g=p,V=_,y=e;const I=r.pop();for(const B of r){let w=null;const K=y==null?void 0:y[B];K&&(w=y=K);const W=V==null?void 0:V[B];W&&(w=V=W);const R=g==null?void 0:g[B];R&&(w=g=R),K||(y=w),W||(V=w),R||(g=w)}return(g==null?void 0:g[I])??(V==null?void 0:V[I])??(y==null?void 0:y[I])??""}return n}const Ia=["aria-label"],Ta={class:"DocSearch-Button-Container"},Ca=c("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[c("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),Ba={class:"DocSearch-Button-Placeholder"},Aa=c("span",{class:"DocSearch-Button-Keys"},[c("kbd",{class:"DocSearch-Button-Key"}),c("kbd",{class:"DocSearch-Button-Key"},"K")],-1),Pe=b({__name:"VPNavBarSearchButton",setup(s){const{theme:e}=P(),t={button:{buttonText:"Search",buttonAriaLabel:"Search"}},n=je(Na)(Ke(()=>{var o;return(o=e.value.search)==null?void 0:o.options}),t);return(o,r)=>(a(),i("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":l(n)("button.buttonAriaLabel")},[c("span",Ta,[Ca,c("span",Ba,L(l(n)("button.buttonText")),1)]),Aa],8,Ia))}});const xa={class:"VPNavBarSearch"},Ha={id:"local-search"},za={key:1,id:"docsearch"},Da=b({__name:"VPNavBarSearch",setup(s){const e=Re(()=>qe(()=>import("./VPLocalSearchBox.36db4070.js"),["assets/chunks/VPLocalSearchBox.36db4070.js","assets/chunks/framework.76cb5871.js"])),t=()=>null,{theme:n}=P(),o=M(!1),r=M(!1);G(()=>{});function d(){o.value||(o.value=!0,setTimeout(p,16))}function p(){const y=new Event("keydown");y.key="k",y.metaKey=!0,window.dispatchEvent(y),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||p()},16)}function _(y){const I=y.target,S=I.tagName;return I.isContentEditable||S==="INPUT"||S==="SELECT"||S==="TEXTAREA"}const g=M(!1);ke("k",y=>{(y.ctrlKey||y.metaKey)&&(y.preventDefault(),g.value=!0)}),ke("/",y=>{_(y)||(y.preventDefault(),g.value=!0)});const V="local";return(y,I)=>{var S;return a(),i("div",xa,[l(V)==="local"?(a(),i(N,{key:0},[g.value?(a(),$(l(e),{key:0,onClose:I[0]||(I[0]=C=>g.value=!1)})):f("",!0),c("div",Ha,[h(Pe,{onClick:I[1]||(I[1]=C=>g.value=!0)})])],64)):l(V)==="algolia"?(a(),i(N,{key:1},[o.value?(a(),$(l(t),{key:0,algolia:((S=l(n).search)==null?void 0:S.options)??l(n).algolia,onVnodeBeforeMount:I[2]||(I[2]=C=>r.value=!0)},null,8,["algolia"])):f("",!0),r.value?f("",!0):(a(),i("div",za,[h(Pe,{onClick:d})]))],64)):f("",!0)])}}});const Ea=b({__name:"VPNavBarSocialLinks",setup(s){const{theme:e}=P();return(t,n)=>l(e).socialLinks?(a(),$($e,{key:0,class:"VPNavBarSocialLinks",links:l(e).socialLinks},null,8,["links"])):f("",!0)}});const Fa=m(Ea,[["__scopeId","data-v-ef6192dc"]]),Oa=["href"],Ga=b({__name:"VPNavBarTitle",setup(s){const{site:e,theme:t}=P(),{hasSidebar:n}=D(),{currentLang:o}=X();return(r,d)=>(a(),i("div",{class:T(["VPNavBarTitle",{"has-sidebar":l(n)}])},[c("a",{class:"title",href:l(t).logoLink??l(J)(l(o).link)},[u(r.$slots,"nav-bar-title-before",{},void 0,!0),l(t).logo?(a(),$(ee,{key:0,class:"logo",image:l(t).logo},null,8,["image"])):f("",!0),l(t).siteTitle?(a(),i(N,{key:1},[x(L(l(t).siteTitle),1)],64)):l(t).siteTitle===void 0?(a(),i(N,{key:2},[x(L(l(e).title),1)],64)):f("",!0),u(r.$slots,"nav-bar-title-after",{},void 0,!0)],8,Oa)],2))}});const Ua=m(Ga,[["__scopeId","data-v-2973dbb4"]]),ja={},Ka={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ra=c("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),qa=c("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),Wa=[Ra,qa];function Ya(s,e){return a(),i("svg",Ka,Wa)}const Ae=m(ja,[["render",Ya]]),Ja={class:"items"},Xa={class:"title"},Za=b({__name:"VPNavBarTranslations",setup(s){const{theme:e}=P(),{localeLinks:t,currentLang:n}=X({correspondingLink:!0});return(o,r)=>l(t).length&&l(n).label?(a(),$(be,{key:0,class:"VPNavBarTranslations",icon:Ae,label:l(e).langMenuLabel||"Change language"},{default:v(()=>[c("div",Ja,[c("p",Xa,L(l(n).label),1),(a(!0),i(N,null,A(l(t),d=>(a(),$(oe,{key:d.link,item:d},null,8,["item"]))),128))])]),_:1},8,["label"])):f("",!0)}});const Qa=m(Za,[["__scopeId","data-v-ff4524ae"]]),er=s=>(H("data-v-f1abbc6e"),s=s(),z(),s),tr={class:"container"},sr={class:"title"},nr={class:"content"},or=er(()=>c("div",{class:"curtain"},null,-1)),ar={class:"content-body"},rr=b({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(s){const{y:e}=Le(),{hasSidebar:t}=D(),{frontmatter:n}=P(),o=M({});return Ve(()=>{o.value={"has-sidebar":t.value,top:n.value.layout==="home"&&e.value===0}}),(r,d)=>(a(),i("div",{class:T(["VPNavBar",o.value])},[c("div",tr,[c("div",sr,[h(Ua,null,{"nav-bar-title-before":v(()=>[u(r.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(r.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),c("div",nr,[or,c("div",ar,[u(r.$slots,"nav-bar-content-before",{},void 0,!0),h(Da,{class:"search"}),h(Ma,{class:"menu"}),h(Qa,{class:"translations"}),h($o,{class:"appearance"}),h(Fa,{class:"social-links"}),h(va,{class:"extra"}),u(r.$slots,"nav-bar-content-after",{},void 0,!0),h(ba,{class:"hamburger",active:r.isScreenOpen,onClick:d[0]||(d[0]=p=>r.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const lr=m(rr,[["__scopeId","data-v-f1abbc6e"]]),ir={key:0,class:"VPNavScreenAppearance"},cr={class:"text"},ur=b({__name:"VPNavScreenAppearance",setup(s){const{site:e,theme:t}=P();return(n,o)=>l(e).appearance?(a(),i("div",ir,[c("p",cr,L(l(t).darkModeSwitchLabel||"Appearance"),1),h(me)])):f("",!0)}});const dr=m(ur,[["__scopeId","data-v-0dc5cf49"]]),_r=b({__name:"VPNavScreenMenuLink",props:{item:{}},setup(s){const e=ne("close-screen");return(t,n)=>(a(),$(E,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:l(e)},{default:v(()=>[x(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const vr=m(_r,[["__scopeId","data-v-fe523e3d"]]),pr={},hr={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},fr=c("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),mr=[fr];function gr(s,e){return a(),i("svg",hr,mr)}const br=m(pr,[["render",gr]]),$r=b({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(s){const e=ne("close-screen");return(t,n)=>(a(),$(E,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:l(e)},{default:v(()=>[x(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const xe=m($r,[["__scopeId","data-v-aea78dd1"]]),kr={class:"VPNavScreenMenuGroupSection"},yr={key:0,class:"title"},Pr=b({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),i("div",kr,[e.text?(a(),i("p",yr,L(e.text),1)):f("",!0),(a(!0),i(N,null,A(e.items,n=>(a(),$(xe,{key:n.text,item:n},null,8,["item"]))),128))]))}});const Vr=m(Pr,[["__scopeId","data-v-f60dbfa7"]]),wr=["aria-controls","aria-expanded"],Lr={class:"button-text"},Sr=["id"],Mr={key:1,class:"group"},Nr=b({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(s){const e=s,t=M(!1),n=k(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function o(){t.value=!t.value}return(r,d)=>(a(),i("div",{class:T(["VPNavScreenMenuGroup",{open:t.value}])},[c("button",{class:"button","aria-controls":n.value,"aria-expanded":t.value,onClick:o},[c("span",Lr,L(r.text),1),h(br,{class:"button-icon"})],8,wr),c("div",{id:n.value,class:"items"},[(a(!0),i(N,null,A(r.items,p=>(a(),i(N,{key:p.text},["link"in p?(a(),i("div",{key:p.text,class:"item"},[h(xe,{item:p},null,8,["item"])])):(a(),i("div",Mr,[h(Vr,{text:p.text,items:p.items},null,8,["text","items"])]))],64))),128))],8,Sr)],2))}});const Ir=m(Nr,[["__scopeId","data-v-c2c554ed"]]),Tr={key:0,class:"VPNavScreenMenu"},Cr=b({__name:"VPNavScreenMenu",setup(s){const{theme:e}=P();return(t,n)=>l(e).nav?(a(),i("nav",Tr,[(a(!0),i(N,null,A(l(e).nav,o=>(a(),i(N,{key:o.text},["link"in o?(a(),$(vr,{key:0,item:o},null,8,["item"])):(a(),$(Ir,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):f("",!0)}}),Br=b({__name:"VPNavScreenSocialLinks",setup(s){const{theme:e}=P();return(t,n)=>l(e).socialLinks?(a(),$($e,{key:0,class:"VPNavScreenSocialLinks",links:l(e).socialLinks},null,8,["links"])):f("",!0)}}),Ar={class:"list"},xr=b({__name:"VPNavScreenTranslations",setup(s){const{localeLinks:e,currentLang:t}=X({correspondingLink:!0}),n=M(!1);function o(){n.value=!n.value}return(r,d)=>l(e).length&&l(t).label?(a(),i("div",{key:0,class:T(["VPNavScreenTranslations",{open:n.value}])},[c("button",{class:"title",onClick:o},[h(Ae,{class:"icon lang"}),x(" "+L(l(t).label)+" ",1),h(Be,{class:"icon chevron"})]),c("ul",Ar,[(a(!0),i(N,null,A(l(e),p=>(a(),i("li",{key:p.link,class:"item"},[h(E,{class:"link",href:p.link},{default:v(()=>[x(L(p.text),1)]),_:2},1032,["href"])]))),128))])],2)):f("",!0)}});const Hr=m(xr,[["__scopeId","data-v-41505286"]]),zr={class:"container"},Dr=b({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(s){const e=M(null),t=Se(q?document.body:null);return(n,o)=>(a(),$(ce,{name:"fade",onEnter:o[0]||(o[0]=r=>t.value=!0),onAfterLeave:o[1]||(o[1]=r=>t.value=!1)},{default:v(()=>[n.open?(a(),i("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[c("div",zr,[u(n.$slots,"nav-screen-content-before",{},void 0,!0),h(Cr,{class:"menu"}),h(Hr,{class:"translations"}),h(dr,{class:"appearance"}),h(Br,{class:"social-links"}),u(n.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):f("",!0)]),_:3}))}});const Er=m(Dr,[["__scopeId","data-v-57cce842"]]),Fr={key:0,class:"VPNav"},Or=b({__name:"VPNav",setup(s){const{isScreenOpen:e,closeScreen:t,toggleScreen:n}=Xn(),{frontmatter:o}=P(),r=k(()=>o.value.navbar!==!1);return Me("close-screen",t),te(()=>{q&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(d,p)=>r.value?(a(),i("header",Fr,[h(lr,{"is-screen-open":l(e),onToggleScreen:l(n)},{"nav-bar-title-before":v(()=>[u(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(d.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),h(Er,{open:l(e)},{"nav-screen-content-before":v(()=>[u(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):f("",!0)}});const Gr=m(Or,[["__scopeId","data-v-7ad780c2"]]),Ur=s=>(H("data-v-bd01e0d5"),s=s(),z(),s),jr=["role","tabindex"],Kr=Ur(()=>c("div",{class:"indicator"},null,-1)),Rr=["onKeydown"],qr={key:1,class:"items"},Wr=b({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(s){const e=s,{collapsed:t,collapsible:n,isLink:o,isActiveLink:r,hasActiveLink:d,hasChildren:p,toggle:_}=gt(k(()=>e.item)),g=k(()=>p.value?"section":"div"),V=k(()=>o.value?"a":"div"),y=k(()=>p.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),I=k(()=>o.value?void 0:"button"),S=k(()=>[[`level-${e.depth}`],{collapsible:n.value},{collapsed:t.value},{"is-link":o.value},{"is-active":r.value},{"has-active":d.value}]);function C(w){"key"in w&&w.key!=="Enter"||!e.item.link&&_()}function B(){e.item.link&&_()}return(w,K)=>{const W=j("VPSidebarItem",!0);return a(),$(F(g.value),{class:T(["VPSidebarItem",S.value])},{default:v(()=>[w.item.text?(a(),i("div",Z({key:0,class:"item",role:I.value},Ye(w.item.items?{click:C,keydown:C}:{},!0),{tabindex:w.item.items&&0}),[Kr,w.item.link?(a(),$(E,{key:0,tag:V.value,class:"link",href:w.item.link,rel:w.item.rel,target:w.item.target},{default:v(()=>[(a(),$(F(y.value),{class:"text",innerHTML:w.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),$(F(y.value),{key:1,class:"text",innerHTML:w.item.text},null,8,["innerHTML"])),w.item.collapsed!=null?(a(),i("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:B,onKeydown:We(B,["enter"]),tabindex:"0"},[h(fe,{class:"caret-icon"})],40,Rr)):f("",!0)],16,jr)):f("",!0),w.item.items&&w.item.items.length?(a(),i("div",qr,[w.depth<5?(a(!0),i(N,{key:0},A(w.item.items,R=>(a(),$(W,{key:R.text,item:R,depth:w.depth+1},null,8,["item","depth"]))),128)):f("",!0)])):f("",!0)]),_:1},8,["class"])}}});const Yr=m(Wr,[["__scopeId","data-v-bd01e0d5"]]),He=s=>(H("data-v-ee2efba5"),s=s(),z(),s),Jr=He(()=>c("div",{class:"curtain"},null,-1)),Xr={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Zr=He(()=>c("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Qr=b({__name:"VPSidebar",props:{open:{type:Boolean}},setup(s){const{sidebarGroups:e,hasSidebar:t}=D(),n=s,o=M(null),r=Se(q?document.body:null);return U([n,o],()=>{var d;n.open?(r.value=!0,(d=o.value)==null||d.focus()):r.value=!1},{immediate:!0,flush:"post"}),(d,p)=>l(t)?(a(),i("aside",{key:0,class:T(["VPSidebar",{open:d.open}]),ref_key:"navEl",ref:o,onClick:p[0]||(p[0]=Je(()=>{},["stop"]))},[Jr,c("nav",Xr,[Zr,u(d.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),i(N,null,A(l(e),_=>(a(),i("div",{key:_.text,class:"group"},[h(Yr,{item:_,depth:0},null,8,["item"])]))),128)),u(d.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):f("",!0)}});const el=m(Qr,[["__scopeId","data-v-ee2efba5"]]),tl=b({__name:"VPSkipLink",setup(s){const e=se(),t=M();U(()=>e.path,()=>t.value.focus());function n({target:o}){const r=document.getElementById(decodeURIComponent(o.hash).slice(1));if(r){const d=()=>{r.removeAttribute("tabindex"),r.removeEventListener("blur",d)};r.setAttribute("tabindex","-1"),r.addEventListener("blur",d),r.focus(),window.scrollTo(0,0)}}return(o,r)=>(a(),i(N,null,[c("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),c("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:n}," Skip to content ")],64))}});const sl=m(tl,[["__scopeId","data-v-c8291ffa"]]),nl=b({__name:"Layout",setup(s){const{isOpen:e,open:t,close:n}=D(),o=se();U(()=>o.path,n),mt(e,n);const{frontmatter:r}=P(),d=Xe(),p=k(()=>!!d["home-hero-image"]);return Me("hero-image-slot-exists",p),(_,g)=>{const V=j("Content");return l(r).layout!==!1?(a(),i("div",{key:0,class:T(["Layout",l(r).pageClass])},[u(_.$slots,"layout-top",{},void 0,!0),h(sl),h(st,{class:"backdrop",show:l(e),onClick:l(n)},null,8,["show","onClick"]),h(Gr,null,{"nav-bar-title-before":v(()=>[u(_.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(_.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(_.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(_.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":v(()=>[u(_.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(_.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),h(Jn,{open:l(e),onOpenMenu:l(t)},null,8,["open","onOpenMenu"]),h(el,{open:l(e)},{"sidebar-nav-before":v(()=>[u(_.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":v(()=>[u(_.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),h(Mn,null,{"page-top":v(()=>[u(_.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(_.$slots,"page-bottom",{},void 0,!0)]),"not-found":v(()=>[u(_.$slots,"not-found",{},void 0,!0)]),"home-hero-before":v(()=>[u(_.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(_.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(_.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(_.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(_.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(_.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":v(()=>[u(_.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(_.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(_.$slots,"doc-after",{},void 0,!0)]),"doc-top":v(()=>[u(_.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(_.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":v(()=>[u(_.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(_.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(_.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(_.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(_.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(_.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),h(Bn),u(_.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),$(V,{key:1}))}}});const ol=m(nl,[["__scopeId","data-v-9d8abc1e"]]);const rl={Layout:ol,enhanceApp:({app:s})=>{s.component("Badge",Qe)}};export{Na as c,rl as t,P as u}; +import{d as b,o as a,c as i,r as u,n as T,a as x,t as L,_ as m,b as $,w as v,T as ce,e as f,u as ze,i as De,f as ue,g as k,h as M,j as G,k as c,l,p as H,m as z,q as O,s as q,v as re,x as U,y as te,z as de,A as Ve,B as Ee,C as j,F as N,D as A,E as _e,G as Y,H as h,I as F,J as we,K as se,L as Z,M as ne,N as Fe,O as Oe,P as Le,Q as Ge,R as Ue,S as je,U as Ke,V as ke,W as Re,X as qe,Y as Se,Z as Me,$ as We,a0 as Ye,a1 as Je,a2 as Xe}from"./framework.76cb5871.js";const Ze=b({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(s){return(e,t)=>(a(),i("span",{class:T(["VPBadge",e.type])},[u(e.$slots,"default",{},()=>[x(L(e.text),1)],!0)],2))}});const Qe=m(Ze,[["__scopeId","data-v-ea5b2908"]]),et={key:0,class:"VPBackdrop"},tt=b({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(s){return(e,t)=>(a(),$(ce,{name:"fade"},{default:v(()=>[e.show?(a(),i("div",et)):f("",!0)]),_:1}))}});const st=m(tt,[["__scopeId","data-v-54a304ca"]]),P=ze;function nt(s,e){let t,n=!1;return()=>{t&&clearTimeout(t),n?t=setTimeout(s,e):(s(),(n=!0)&&setTimeout(()=>n=!1,e))}}function le(s){return/^\//.test(s)?s:`/${s}`}function J(s){const{pathname:e,search:t,hash:n,protocol:o}=new URL(s,"http://a.com");if(De(s)||s.startsWith("#")||!o.startsWith("http")||/\.(?!html|md)\w+($|\?)/i.test(s))return s;const{site:r}=P(),d=e.endsWith("/")||e.endsWith(".html")?s:s.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${t}${n}`);return ue(d)}function X({removeCurrent:s=!0,correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:o,theme:r}=P(),d=k(()=>{var _,g;return{label:(_=t.value.locales[n.value])==null?void 0:_.label,link:((g=t.value.locales[n.value])==null?void 0:g.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:k(()=>Object.entries(t.value.locales).flatMap(([_,g])=>s&&d.value.label===g.label?[]:{text:g.label,link:ot(g.link||(_==="root"?"/":`/${_}/`),r.value.i18nRouting!==!1&&e,o.value.relativePath.slice(d.value.link.length-1),!t.value.cleanUrls)})),currentLang:d}}function ot(s,e,t,n){return e?s.replace(/\/$/,"")+le(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,n?".html":"")):s}const at=s=>(H("data-v-b9c0c15a"),s=s(),z(),s),rt={class:"NotFound"},lt={class:"code"},it={class:"title"},ct=at(()=>c("div",{class:"divider"},null,-1)),ut={class:"quote"},dt={class:"action"},_t=["href","aria-label"],vt=b({__name:"NotFound",setup(s){const{site:e,theme:t}=P(),{localeLinks:n}=X({removeCurrent:!1}),o=M("/");return G(()=>{var d;const r=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(o.value=((d=n.value.find(({link:p})=>p.startsWith(r)))==null?void 0:d.link)||n.value[0].link)}),(r,d)=>{var p,_,g,V,y;return a(),i("div",rt,[c("p",lt,L(((p=l(t).notFound)==null?void 0:p.code)??"404"),1),c("h1",it,L(((_=l(t).notFound)==null?void 0:_.title)??"PAGE NOT FOUND"),1),ct,c("blockquote",ut,L(((g=l(t).notFound)==null?void 0:g.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),c("div",dt,[c("a",{class:"link",href:l(ue)(o.value),"aria-label":((V=l(t).notFound)==null?void 0:V.linkLabel)??"go to home"},L(((y=l(t).notFound)==null?void 0:y.linkText)??"Take me home"),9,_t)])])}}});const pt=m(vt,[["__scopeId","data-v-b9c0c15a"]]);function Ne(s,e){if(Array.isArray(s))return Q(s);if(s==null)return[];e=le(e);const t=Object.keys(s).sort((o,r)=>r.split("/").length-o.split("/").length).find(o=>e.startsWith(le(o))),n=t?s[t]:[];return Array.isArray(n)?Q(n):Q(n.items,n.base)}function ht(s){const e=[];let t=0;for(const n in s){const o=s[n];if(o.items){t=e.push(o);continue}e[t]||e.push({items:[]}),e[t].items.push(o)}return e}function ft(s){const e=[];function t(n){for(const o of n)o.text&&o.link&&e.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&t(o.items)}return t(s),e}function ie(s,e){return Array.isArray(e)?e.some(t=>ie(s,t)):O(s,e.link)?!0:e.items?ie(s,e.items):!1}function Q(s,e){return[...s].map(t=>{const n={...t},o=n.base||e;return o&&n.link&&(n.link=o+n.link),n.items&&(n.items=Q(n.items,o)),n})}function D(){const{frontmatter:s,page:e,theme:t}=P(),n=re("(min-width: 960px)"),o=M(!1),r=k(()=>{const B=t.value.sidebar,w=e.value.relativePath;return B?Ne(B,w):[]}),d=M(r.value);U(r,(B,w)=>{JSON.stringify(B)!==JSON.stringify(w)&&(d.value=r.value)});const p=k(()=>s.value.sidebar!==!1&&d.value.length>0&&s.value.layout!=="home"),_=k(()=>g?s.value.aside==null?t.value.aside==="left":s.value.aside==="left":!1),g=k(()=>s.value.layout==="home"?!1:s.value.aside!=null?!!s.value.aside:t.value.aside!==!1),V=k(()=>p.value&&n.value),y=k(()=>p.value?ht(d.value):[]);function I(){o.value=!0}function S(){o.value=!1}function C(){o.value?S():I()}return{isOpen:o,sidebar:d,sidebarGroups:y,hasSidebar:p,hasAside:g,leftAside:_,isSidebarEnabled:V,open:I,close:S,toggle:C}}function mt(s,e){let t;te(()=>{t=s.value?document.activeElement:void 0}),G(()=>{window.addEventListener("keyup",n)}),de(()=>{window.removeEventListener("keyup",n)});function n(o){o.key==="Escape"&&s.value&&(e(),t==null||t.focus())}}const Ie=M(q?location.hash:"");q&&window.addEventListener("hashchange",()=>{Ie.value=location.hash});function gt(s){const{page:e}=P(),t=M(!1),n=k(()=>s.value.collapsed!=null),o=k(()=>!!s.value.link),r=M(!1),d=()=>{r.value=O(e.value.relativePath,s.value.link)};U([e,s,Ie],d),G(d);const p=k(()=>r.value?!0:s.value.items?ie(e.value.relativePath,s.value.items):!1),_=k(()=>!!(s.value.items&&s.value.items.length));te(()=>{t.value=!!(n.value&&s.value.collapsed)}),Ve(()=>{(r.value||p.value)&&(t.value=!1)});function g(){n.value&&(t.value=!t.value)}return{collapsed:t,collapsible:n,isLink:o,isActiveLink:r,hasActiveLink:p,hasChildren:_,toggle:g}}function bt(){const{hasSidebar:s}=D(),e=re("(min-width: 960px)"),t=re("(min-width: 1280px)");return{isAsideEnabled:k(()=>!t.value&&!e.value?!1:s.value?t.value:e.value)}}const $t=71;function ve(s){return typeof s.outline=="object"&&!Array.isArray(s.outline)&&s.outline.label||s.outlineTitle||"On this page"}function pe(s){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const n=Number(t.tagName[1]);return{title:kt(t),link:"#"+t.id,level:n}});return yt(e,s)}function kt(s){let e="";for(const t of s.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function yt(s,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[n,o]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;s=s.filter(d=>d.level>=n&&d.level<=o);const r=[];e:for(let d=0;d=0;_--){const g=s[_];if(g.level{requestAnimationFrame(r),window.addEventListener("scroll",n)}),Ee(()=>{d(location.hash)}),de(()=>{window.removeEventListener("scroll",n)});function r(){if(!t.value)return;const p=[].slice.call(s.value.querySelectorAll(".outline-link")),_=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(S=>p.some(C=>C.hash===S.hash&&S.offsetParent!==null)),g=window.scrollY,V=window.innerHeight,y=document.body.offsetHeight,I=Math.abs(g+V-y)<1;if(_.length&&I){d(_[_.length-1].hash);return}for(let S=0;S<_.length;S++){const C=_[S],B=_[S+1],[w,K]=Vt(S,C,B);if(w){d(K);return}}}function d(p){o&&o.classList.remove("active"),p==null?o=null:o=s.value.querySelector(`a[href="${decodeURIComponent(p)}"]`);const _=o;_?(_.classList.add("active"),e.value.style.top=_.offsetTop+33+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function ye(s){return s.parentElement.offsetTop-$t}function Vt(s,e,t){const n=window.scrollY;return s===0&&n===0?[!0,null]:n{const o=j("VPDocOutlineItem",!0);return a(),i("ul",{class:T(t.root?"root":"nested")},[(a(!0),i(N,null,A(t.headers,({children:r,link:d,title:p})=>(a(),i("li",null,[c("a",{class:"outline-link",href:d,onClick:e,title:p},L(p),9,wt),r!=null&&r.length?(a(),$(o,{key:0,headers:r},null,8,["headers"])):f("",!0)]))),256))],2)}}});const he=m(Lt,[["__scopeId","data-v-463da30f"]]),St=s=>(H("data-v-3a6c4994"),s=s(),z(),s),Mt={class:"content"},Nt={class:"outline-title",role:"heading","aria-level":"2"},It={"aria-labelledby":"doc-outline-aria-label"},Tt=St(()=>c("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),Ct=b({__name:"VPDocAsideOutline",setup(s){const{frontmatter:e,theme:t}=P(),n=_e([]);Y(()=>{n.value=pe(e.value.outline??t.value.outline)});const o=M(),r=M();return Pt(o,r),(d,p)=>(a(),i("div",{class:T(["VPDocAsideOutline",{"has-outline":n.value.length>0}]),ref_key:"container",ref:o,role:"navigation"},[c("div",Mt,[c("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),c("div",Nt,L(l(ve)(l(t))),1),c("nav",It,[Tt,h(he,{headers:n.value,root:!0},null,8,["headers"])])])],2))}});const Bt=m(Ct,[["__scopeId","data-v-3a6c4994"]]),At={class:"VPDocAsideCarbonAds"},xt=b({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(s){const e=()=>null;return(t,n)=>(a(),i("div",At,[h(l(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),Ht=s=>(H("data-v-cb998dce"),s=s(),z(),s),zt={class:"VPDocAside"},Dt=Ht(()=>c("div",{class:"spacer"},null,-1)),Et=b({__name:"VPDocAside",setup(s){const{theme:e}=P();return(t,n)=>(a(),i("div",zt,[u(t.$slots,"aside-top",{},void 0,!0),u(t.$slots,"aside-outline-before",{},void 0,!0),h(Bt),u(t.$slots,"aside-outline-after",{},void 0,!0),Dt,u(t.$slots,"aside-ads-before",{},void 0,!0),l(e).carbonAds?(a(),$(xt,{key:0,"carbon-ads":l(e).carbonAds},null,8,["carbon-ads"])):f("",!0),u(t.$slots,"aside-ads-after",{},void 0,!0),u(t.$slots,"aside-bottom",{},void 0,!0)]))}});const Ft=m(Et,[["__scopeId","data-v-cb998dce"]]);function Ot(){const{theme:s,page:e}=P();return k(()=>{const{text:t="Edit this page",pattern:n=""}=s.value.editLink||{};let o;return typeof n=="function"?o=n(e.value):o=n.replace(/:path/g,e.value.filePath),{url:o,text:t}})}function Gt(){const{page:s,theme:e,frontmatter:t}=P();return k(()=>{var _,g,V,y,I,S,C,B;const n=Ne(e.value.sidebar,s.value.relativePath),o=ft(n),r=o.findIndex(w=>O(s.value.relativePath,w.link)),d=((_=e.value.docFooter)==null?void 0:_.prev)===!1&&!t.value.prev||t.value.prev===!1,p=((g=e.value.docFooter)==null?void 0:g.next)===!1&&!t.value.next||t.value.next===!1;return{prev:d?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((V=o[r-1])==null?void 0:V.docFooterText)??((y=o[r-1])==null?void 0:y.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((I=o[r-1])==null?void 0:I.link)},next:p?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((S=o[r+1])==null?void 0:S.docFooterText)??((C=o[r+1])==null?void 0:C.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((B=o[r+1])==null?void 0:B.link)}}})}const Ut={},jt={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Kt=c("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),Rt=c("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),qt=[Kt,Rt];function Wt(s,e){return a(),i("svg",jt,qt)}const Yt=m(Ut,[["render",Wt]]),E=b({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(s){const e=s,t=k(()=>e.tag??(e.href?"a":"span")),n=k(()=>e.href&&we.test(e.href));return(o,r)=>(a(),$(F(t.value),{class:T(["VPLink",{link:o.href,"vp-external-link-icon":n.value,"no-icon":o.noIcon}]),href:o.href?l(J)(o.href):void 0,target:o.target??(n.value?"_blank":void 0),rel:o.rel??(n.value?"noreferrer":void 0)},{default:v(()=>[u(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Jt={class:"VPLastUpdated"},Xt=["datetime"],Zt=b({__name:"VPDocFooterLastUpdated",setup(s){const{theme:e,page:t,frontmatter:n,lang:o}=P(),r=k(()=>new Date(n.value.lastUpdated??t.value.lastUpdated)),d=k(()=>r.value.toISOString()),p=M("");return G(()=>{te(()=>{var _,g,V;p.value=new Intl.DateTimeFormat((g=(_=e.value.lastUpdated)==null?void 0:_.formatOptions)!=null&&g.forceLocale?o.value:void 0,((V=e.value.lastUpdated)==null?void 0:V.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(r.value)})}),(_,g)=>{var V;return a(),i("p",Jt,[x(L(((V=l(e).lastUpdated)==null?void 0:V.text)||l(e).lastUpdatedText||"Last updated")+": ",1),c("time",{datetime:d.value},L(p.value),9,Xt)])}}});const Qt=m(Zt,[["__scopeId","data-v-19a7ae4e"]]),es={key:0,class:"VPDocFooter"},ts={key:0,class:"edit-info"},ss={key:0,class:"edit-link"},ns={key:1,class:"last-updated"},os={key:1,class:"prev-next"},as={class:"pager"},rs=["href"],ls=["innerHTML"],is=["innerHTML"],cs={class:"pager"},us=["href"],ds=["innerHTML"],_s=["innerHTML"],vs=b({__name:"VPDocFooter",setup(s){const{theme:e,page:t,frontmatter:n}=P(),o=Ot(),r=Gt(),d=k(()=>e.value.editLink&&n.value.editLink!==!1),p=k(()=>t.value.lastUpdated&&n.value.lastUpdated!==!1),_=k(()=>d.value||p.value||r.value.prev||r.value.next);return(g,V)=>{var y,I,S,C,B,w;return _.value?(a(),i("footer",es,[u(g.$slots,"doc-footer-before",{},void 0,!0),d.value||p.value?(a(),i("div",ts,[d.value?(a(),i("div",ss,[h(E,{class:"edit-link-button",href:l(o).url,"no-icon":!0},{default:v(()=>[h(Yt,{class:"edit-link-icon","aria-label":"edit icon"}),x(" "+L(l(o).text),1)]),_:1},8,["href"])])):f("",!0),p.value?(a(),i("div",ns,[h(Qt)])):f("",!0)])):f("",!0),(y=l(r).prev)!=null&&y.link||(I=l(r).next)!=null&&I.link?(a(),i("nav",os,[c("div",as,[(S=l(r).prev)!=null&&S.link?(a(),i("a",{key:0,class:"pager-link prev",href:l(J)(l(r).prev.link)},[c("span",{class:"desc",innerHTML:((C=l(e).docFooter)==null?void 0:C.prev)||"Previous page"},null,8,ls),c("span",{class:"title",innerHTML:l(r).prev.text},null,8,is)],8,rs)):f("",!0)]),c("div",cs,[(B=l(r).next)!=null&&B.link?(a(),i("a",{key:0,class:"pager-link next",href:l(J)(l(r).next.link)},[c("span",{class:"desc",innerHTML:((w=l(e).docFooter)==null?void 0:w.next)||"Next page"},null,8,ds),c("span",{class:"title",innerHTML:l(r).next.text},null,8,_s)],8,us)):f("",!0)])])):f("",!0)])):f("",!0)}}});const ps=m(vs,[["__scopeId","data-v-a2d931e4"]]),hs={},fs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ms=c("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),gs=[ms];function bs(s,e){return a(),i("svg",fs,gs)}const fe=m(hs,[["render",bs]]),$s={key:0,class:"VPDocOutlineDropdown"},ks={key:0,class:"items"},ys=b({__name:"VPDocOutlineDropdown",setup(s){const{frontmatter:e,theme:t}=P(),n=M(!1);Y(()=>{n.value=!1});const o=_e([]);return Y(()=>{o.value=pe(e.value.outline??t.value.outline)}),(r,d)=>o.value.length>0?(a(),i("div",$s,[c("button",{onClick:d[0]||(d[0]=p=>n.value=!n.value),class:T({open:n.value})},[x(L(l(ve)(l(t)))+" ",1),h(fe,{class:"icon"})],2),n.value?(a(),i("div",ks,[h(he,{headers:o.value},null,8,["headers"])])):f("",!0)])):f("",!0)}});const Ps=m(ys,[["__scopeId","data-v-95bb0785"]]),Vs=s=>(H("data-v-a3c25e27"),s=s(),z(),s),ws={class:"container"},Ls=Vs(()=>c("div",{class:"aside-curtain"},null,-1)),Ss={class:"aside-container"},Ms={class:"aside-content"},Ns={class:"content"},Is={class:"content-container"},Ts={class:"main"},Cs=b({__name:"VPDoc",setup(s){const{theme:e}=P(),t=se(),{hasSidebar:n,hasAside:o,leftAside:r}=D(),d=k(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(p,_)=>{const g=j("Content");return a(),i("div",{class:T(["VPDoc",{"has-sidebar":l(n),"has-aside":l(o)}])},[u(p.$slots,"doc-top",{},void 0,!0),c("div",ws,[l(o)?(a(),i("div",{key:0,class:T(["aside",{"left-aside":l(r)}])},[Ls,c("div",Ss,[c("div",Ms,[h(Ft,null,{"aside-top":v(()=>[u(p.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(p.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(p.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(p.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(p.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(p.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):f("",!0),c("div",Ns,[c("div",Is,[u(p.$slots,"doc-before",{},void 0,!0),h(Ps),c("main",Ts,[h(g,{class:T(["vp-doc",[d.value,l(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),h(ps,null,{"doc-footer-before":v(()=>[u(p.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),u(p.$slots,"doc-after",{},void 0,!0)])])]),u(p.$slots,"doc-bottom",{},void 0,!0)],2)}}});const Bs=m(Cs,[["__scopeId","data-v-a3c25e27"]]),As=b({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(s){const e=s,t=k(()=>e.href&&we.test(e.href)),n=k(()=>e.tag||e.href?"a":"button");return(o,r)=>(a(),$(F(n.value),{class:T(["VPButton",[o.size,o.theme]]),href:o.href?l(J)(o.href):void 0,target:t.value?"_blank":void 0,rel:t.value?"noreferrer":void 0},{default:v(()=>[x(L(o.text),1)]),_:1},8,["class","href","target","rel"]))}});const xs=m(As,[["__scopeId","data-v-1e76fe75"]]),Hs=["src","alt"],zs=b({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(s){return(e,t)=>{const n=j("VPImage",!0);return e.image?(a(),i(N,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),i("img",Z({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:l(ue)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,Hs)):(a(),i(N,{key:1},[h(n,Z({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),h(n,Z({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):f("",!0)}}});const ee=m(zs,[["__scopeId","data-v-ab19afbb"]]),Ds=s=>(H("data-v-5a3e9999"),s=s(),z(),s),Es={class:"container"},Fs={class:"main"},Os={key:0,class:"name"},Gs=["innerHTML"],Us=["innerHTML"],js=["innerHTML"],Ks={key:0,class:"actions"},Rs={key:0,class:"image"},qs={class:"image-container"},Ws=Ds(()=>c("div",{class:"image-bg"},null,-1)),Ys=b({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(s){const e=ne("hero-image-slot-exists");return(t,n)=>(a(),i("div",{class:T(["VPHero",{"has-image":t.image||l(e)}])},[c("div",Es,[c("div",Fs,[u(t.$slots,"home-hero-info",{},()=>[t.name?(a(),i("h1",Os,[c("span",{innerHTML:t.name,class:"clip"},null,8,Gs)])):f("",!0),t.text?(a(),i("p",{key:1,innerHTML:t.text,class:"text"},null,8,Us)):f("",!0),t.tagline?(a(),i("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,js)):f("",!0)],!0),t.actions?(a(),i("div",Ks,[(a(!0),i(N,null,A(t.actions,o=>(a(),i("div",{key:o.link,class:"action"},[h(xs,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link},null,8,["theme","text","href"])]))),128))])):f("",!0)]),t.image||l(e)?(a(),i("div",Rs,[c("div",qs,[Ws,u(t.$slots,"home-hero-image",{},()=>[t.image?(a(),$(ee,{key:0,class:"image-src",image:t.image},null,8,["image"])):f("",!0)],!0)])])):f("",!0)])],2))}});const Js=m(Ys,[["__scopeId","data-v-5a3e9999"]]),Xs=b({__name:"VPHomeHero",setup(s){const{frontmatter:e}=P();return(t,n)=>l(e).hero?(a(),$(Js,{key:0,class:"VPHomeHero",name:l(e).hero.name,text:l(e).hero.text,tagline:l(e).hero.tagline,image:l(e).hero.image,actions:l(e).hero.actions},{"home-hero-info":v(()=>[u(t.$slots,"home-hero-info")]),"home-hero-image":v(()=>[u(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):f("",!0)}}),Zs={},Qs={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},en=c("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),tn=[en];function sn(s,e){return a(),i("svg",Qs,tn)}const nn=m(Zs,[["render",sn]]),on={class:"box"},an={key:0,class:"icon"},rn=["innerHTML"],ln=["innerHTML"],cn=["innerHTML"],un={key:4,class:"link-text"},dn={class:"link-text-value"},_n=b({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(s){return(e,t)=>(a(),$(E,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:v(()=>[c("article",on,[typeof e.icon=="object"&&e.icon.wrap?(a(),i("div",an,[h(ee,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),$(ee,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),i("div",{key:2,class:"icon",innerHTML:e.icon},null,8,rn)):f("",!0),c("h2",{class:"title",innerHTML:e.title},null,8,ln),e.details?(a(),i("p",{key:3,class:"details",innerHTML:e.details},null,8,cn)):f("",!0),e.linkText?(a(),i("div",un,[c("p",dn,[x(L(e.linkText)+" ",1),h(nn,{class:"link-text-icon"})])])):f("",!0)])]),_:1},8,["href","rel","target","tag"]))}});const vn=m(_n,[["__scopeId","data-v-ee984185"]]),pn={key:0,class:"VPFeatures"},hn={class:"container"},fn={class:"items"},mn=b({__name:"VPFeatures",props:{features:{}},setup(s){const e=s,t=k(()=>{const n=e.features.length;if(n){if(n===2)return"grid-2";if(n===3)return"grid-3";if(n%3===0)return"grid-6";if(n>3)return"grid-4"}else return});return(n,o)=>n.features?(a(),i("div",pn,[c("div",hn,[c("div",fn,[(a(!0),i(N,null,A(n.features,r=>(a(),i("div",{key:r.title,class:T(["item",[t.value]])},[h(vn,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):f("",!0)}});const gn=m(mn,[["__scopeId","data-v-b1eea84a"]]),bn=b({__name:"VPHomeFeatures",setup(s){const{frontmatter:e}=P();return(t,n)=>l(e).features?(a(),$(gn,{key:0,class:"VPHomeFeatures",features:l(e).features},null,8,["features"])):f("",!0)}}),$n={class:"VPHome"},kn=b({__name:"VPHome",setup(s){return(e,t)=>{const n=j("Content");return a(),i("div",$n,[u(e.$slots,"home-hero-before",{},void 0,!0),h(Xs,null,{"home-hero-info":v(()=>[u(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),u(e.$slots,"home-hero-after",{},void 0,!0),u(e.$slots,"home-features-before",{},void 0,!0),h(bn),u(e.$slots,"home-features-after",{},void 0,!0),h(n)])}}});const yn=m(kn,[["__scopeId","data-v-20eabd3a"]]),Pn={},Vn={class:"VPPage"};function wn(s,e){const t=j("Content");return a(),i("div",Vn,[u(s.$slots,"page-top"),h(t),u(s.$slots,"page-bottom")])}const Ln=m(Pn,[["render",wn]]),Sn=b({__name:"VPContent",setup(s){const{page:e,frontmatter:t}=P(),{hasSidebar:n}=D();return(o,r)=>(a(),i("div",{class:T(["VPContent",{"has-sidebar":l(n),"is-home":l(t).layout==="home"}]),id:"VPContent"},[l(e).isNotFound?u(o.$slots,"not-found",{key:0},()=>[h(pt)],!0):l(t).layout==="page"?(a(),$(Ln,{key:1},{"page-top":v(()=>[u(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):l(t).layout==="home"?(a(),$(yn,{key:2},{"home-hero-before":v(()=>[u(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):l(t).layout&&l(t).layout!=="doc"?(a(),$(F(l(t).layout),{key:3})):(a(),$(Bs,{key:4},{"doc-top":v(()=>[u(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":v(()=>[u(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":v(()=>[u(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":v(()=>[u(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":v(()=>[u(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const Mn=m(Sn,[["__scopeId","data-v-3cf691b6"]]),Nn={class:"container"},In=["innerHTML"],Tn=["innerHTML"],Cn=b({__name:"VPFooter",setup(s){const{theme:e,frontmatter:t}=P(),{hasSidebar:n}=D();return(o,r)=>l(e).footer&&l(t).footer!==!1?(a(),i("footer",{key:0,class:T(["VPFooter",{"has-sidebar":l(n)}])},[c("div",Nn,[l(e).footer.message?(a(),i("p",{key:0,class:"message",innerHTML:l(e).footer.message},null,8,In)):f("",!0),l(e).footer.copyright?(a(),i("p",{key:1,class:"copyright",innerHTML:l(e).footer.copyright},null,8,Tn)):f("",!0)])],2)):f("",!0)}});const Bn=m(Cn,[["__scopeId","data-v-e4279f1c"]]),An={class:"header"},xn={class:"outline"},Hn=b({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(s){const e=s,{theme:t}=P(),n=M(!1),o=M(0),r=M();Y(()=>{n.value=!1});function d(){n.value=!n.value,o.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function p(g){g.target.classList.contains("outline-link")&&(r.value&&(r.value.style.transition="none"),Oe(()=>{n.value=!1}))}function _(){n.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(g,V)=>(a(),i("div",{class:"VPLocalNavOutlineDropdown",style:Fe({"--vp-vh":o.value+"px"})},[g.headers.length>0?(a(),i("button",{key:0,onClick:d,class:T({open:n.value})},[x(L(l(ve)(l(t)))+" ",1),h(fe,{class:"icon"})],2)):(a(),i("button",{key:1,onClick:_},L(l(t).returnToTopLabel||"Return to top"),1)),h(ce,{name:"flyout"},{default:v(()=>[n.value?(a(),i("div",{key:0,ref_key:"items",ref:r,class:"items",onClick:p},[c("div",An,[c("a",{class:"top-link",href:"#",onClick:_},L(l(t).returnToTopLabel||"Return to top"),1)]),c("div",xn,[h(he,{headers:g.headers},null,8,["headers"])])],512)):f("",!0)]),_:1})],4))}});const zn=m(Hn,[["__scopeId","data-v-24251f6f"]]),Dn={},En={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Fn=c("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),On=c("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),Gn=c("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),Un=c("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),jn=[Fn,On,Gn,Un];function Kn(s,e){return a(),i("svg",En,jn)}const Rn=m(Dn,[["render",Kn]]),qn=["aria-expanded"],Wn={class:"menu-text"},Yn=b({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(s){const{theme:e,frontmatter:t}=P(),{hasSidebar:n}=D(),{y:o}=Le(),r=_e([]),d=M(0);G(()=>{d.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Y(()=>{r.value=pe(t.value.outline??e.value.outline)});const p=k(()=>r.value.length===0&&!n.value),_=k(()=>({VPLocalNav:!0,fixed:p.value,"reached-top":o.value>=d.value}));return(g,V)=>l(t).layout!=="home"&&(!p.value||l(o)>=d.value)?(a(),i("div",{key:0,class:T(_.value)},[l(n)?(a(),i("button",{key:0,class:"menu","aria-expanded":g.open,"aria-controls":"VPSidebarNav",onClick:V[0]||(V[0]=y=>g.$emit("open-menu"))},[h(Rn,{class:"menu-icon"}),c("span",Wn,L(l(e).sidebarMenuLabel||"Menu"),1)],8,qn)):f("",!0),h(zn,{headers:r.value,navHeight:d.value},null,8,["headers","navHeight"])],2)):f("",!0)}});const Jn=m(Yn,[["__scopeId","data-v-9e669cc1"]]);function Xn(){const s=M(!1);function e(){s.value=!0,window.addEventListener("resize",o)}function t(){s.value=!1,window.removeEventListener("resize",o)}function n(){s.value?t():e()}function o(){window.outerWidth>=768&&t()}const r=se();return U(()=>r.path,t),{isScreenOpen:s,openScreen:e,closeScreen:t,toggleScreen:n}}const Zn={},Qn={class:"VPSwitch",type:"button",role:"switch"},eo={class:"check"},to={key:0,class:"icon"};function so(s,e){return a(),i("button",Qn,[c("span",eo,[s.$slots.default?(a(),i("span",to,[u(s.$slots,"default",{},void 0,!0)])):f("",!0)])])}const no=m(Zn,[["render",so],["__scopeId","data-v-1c29e291"]]),oo={},ao={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ro=c("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),lo=[ro];function io(s,e){return a(),i("svg",ao,lo)}const co=m(oo,[["render",io]]),uo={},_o={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},vo=Ge('',9),po=[vo];function ho(s,e){return a(),i("svg",_o,po)}const fo=m(uo,[["render",ho]]),mo=b({__name:"VPSwitchAppearance",setup(s){const{isDark:e}=P(),t=ne("toggle-appearance",()=>{e.value=!e.value});return(n,o)=>(a(),$(no,{title:"toggle dark mode",class:"VPSwitchAppearance","aria-checked":l(e),onClick:l(t)},{default:v(()=>[h(fo,{class:"sun"}),h(co,{class:"moon"})]),_:1},8,["aria-checked","onClick"]))}});const me=m(mo,[["__scopeId","data-v-3329432d"]]),go={key:0,class:"VPNavBarAppearance"},bo=b({__name:"VPNavBarAppearance",setup(s){const{site:e}=P();return(t,n)=>l(e).appearance&&l(e).appearance!=="force-dark"?(a(),i("div",go,[h(me)])):f("",!0)}});const $o=m(bo,[["__scopeId","data-v-283b26e9"]]),ge=M();let Te=!1,ae=0;function ko(s){const e=M(!1);if(q){!Te&&yo(),ae++;const t=U(ge,n=>{var o,r,d;n===s.el.value||(o=s.el.value)!=null&&o.contains(n)?(e.value=!0,(r=s.onFocus)==null||r.call(s)):(e.value=!1,(d=s.onBlur)==null||d.call(s))});de(()=>{t(),ae--,ae||Po()})}return Ue(e)}function yo(){document.addEventListener("focusin",Ce),Te=!0,ge.value=document.activeElement}function Po(){document.removeEventListener("focusin",Ce)}function Ce(){ge.value=document.activeElement}const Vo={},wo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Lo=c("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),So=[Lo];function Mo(s,e){return a(),i("svg",wo,So)}const Be=m(Vo,[["render",Mo]]),No={},Io={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},To=c("circle",{cx:"12",cy:"12",r:"2"},null,-1),Co=c("circle",{cx:"19",cy:"12",r:"2"},null,-1),Bo=c("circle",{cx:"5",cy:"12",r:"2"},null,-1),Ao=[To,Co,Bo];function xo(s,e){return a(),i("svg",Io,Ao)}const Ho=m(No,[["render",xo]]),zo={class:"VPMenuLink"},Do=b({__name:"VPMenuLink",props:{item:{}},setup(s){const{page:e}=P();return(t,n)=>(a(),i("div",zo,[h(E,{class:T({active:l(O)(l(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:v(()=>[x(L(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const oe=m(Do,[["__scopeId","data-v-f51f088d"]]),Eo={class:"VPMenuGroup"},Fo={key:0,class:"title"},Oo=b({__name:"VPMenuGroup",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),i("div",Eo,[e.text?(a(),i("p",Fo,L(e.text),1)):f("",!0),(a(!0),i(N,null,A(e.items,n=>(a(),i(N,null,["link"in n?(a(),$(oe,{key:0,item:n},null,8,["item"])):f("",!0)],64))),256))]))}});const Go=m(Oo,[["__scopeId","data-v-a6b0397c"]]),Uo={class:"VPMenu"},jo={key:0,class:"items"},Ko=b({__name:"VPMenu",props:{items:{}},setup(s){return(e,t)=>(a(),i("div",Uo,[e.items?(a(),i("div",jo,[(a(!0),i(N,null,A(e.items,n=>(a(),i(N,{key:n.text},["link"in n?(a(),$(oe,{key:0,item:n},null,8,["item"])):(a(),$(Go,{key:1,text:n.text,items:n.items},null,8,["text","items"]))],64))),128))])):f("",!0),u(e.$slots,"default",{},void 0,!0)]))}});const Ro=m(Ko,[["__scopeId","data-v-e42ed9b3"]]),qo=["aria-expanded","aria-label"],Wo={key:0,class:"text"},Yo=["innerHTML"],Jo={class:"menu"},Xo=b({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(s){const e=M(!1),t=M();ko({el:t,onBlur:n});function n(){e.value=!1}return(o,r)=>(a(),i("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:r[1]||(r[1]=d=>e.value=!0),onMouseleave:r[2]||(r[2]=d=>e.value=!1)},[c("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":o.label,onClick:r[0]||(r[0]=d=>e.value=!e.value)},[o.button||o.icon?(a(),i("span",Wo,[o.icon?(a(),$(F(o.icon),{key:0,class:"option-icon"})):f("",!0),o.button?(a(),i("span",{key:1,innerHTML:o.button},null,8,Yo)):f("",!0),h(Be,{class:"text-icon"})])):(a(),$(Ho,{key:1,class:"icon"}))],8,qo),c("div",Jo,[h(Ro,{items:o.items},{default:v(()=>[u(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const be=m(Xo,[["__scopeId","data-v-aa8de344"]]),Zo={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},Qo=["href","aria-label","innerHTML"],ea=b({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(s){const e=s,t=k(()=>typeof e.icon=="object"?e.icon.svg:Zo[e.icon]);return(n,o)=>(a(),i("a",{class:"VPSocialLink no-icon",href:n.link,"aria-label":n.ariaLabel??(typeof n.icon=="string"?n.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,Qo))}});const ta=m(ea,[["__scopeId","data-v-16cf740a"]]),sa={class:"VPSocialLinks"},na=b({__name:"VPSocialLinks",props:{links:{}},setup(s){return(e,t)=>(a(),i("div",sa,[(a(!0),i(N,null,A(e.links,({link:n,icon:o,ariaLabel:r})=>(a(),$(ta,{key:n,icon:o,link:n,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}});const $e=m(na,[["__scopeId","data-v-e71e869c"]]),oa={key:0,class:"group translations"},aa={class:"trans-title"},ra={key:1,class:"group"},la={class:"item appearance"},ia={class:"label"},ca={class:"appearance-action"},ua={key:2,class:"group"},da={class:"item social-links"},_a=b({__name:"VPNavBarExtra",setup(s){const{site:e,theme:t}=P(),{localeLinks:n,currentLang:o}=X({correspondingLink:!0}),r=k(()=>n.value.length&&o.value.label||e.value.appearance||t.value.socialLinks);return(d,p)=>r.value?(a(),$(be,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:v(()=>[l(n).length&&l(o).label?(a(),i("div",oa,[c("p",aa,L(l(o).label),1),(a(!0),i(N,null,A(l(n),_=>(a(),$(oe,{key:_.link,item:_},null,8,["item"]))),128))])):f("",!0),l(e).appearance?(a(),i("div",ra,[c("div",la,[c("p",ia,L(l(t).darkModeSwitchLabel||"Appearance"),1),c("div",ca,[h(me)])])])):f("",!0),l(t).socialLinks?(a(),i("div",ua,[c("div",da,[h($e,{class:"social-links-list",links:l(t).socialLinks},null,8,["links"])])])):f("",!0)]),_:1})):f("",!0)}});const va=m(_a,[["__scopeId","data-v-c8c2ae4b"]]),pa=s=>(H("data-v-6bee1efd"),s=s(),z(),s),ha=["aria-expanded"],fa=pa(()=>c("span",{class:"container"},[c("span",{class:"top"}),c("span",{class:"middle"}),c("span",{class:"bottom"})],-1)),ma=[fa],ga=b({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(s){return(e,t)=>(a(),i("button",{type:"button",class:T(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=n=>e.$emit("click"))},ma,10,ha))}});const ba=m(ga,[["__scopeId","data-v-6bee1efd"]]),$a=["innerHTML"],ka=b({__name:"VPNavBarMenuLink",props:{item:{}},setup(s){const{page:e}=P();return(t,n)=>(a(),$(E,{class:T({VPNavBarMenuLink:!0,active:l(O)(l(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:v(()=>[c("span",{innerHTML:t.item.text},null,8,$a)]),_:1},8,["class","href","target","rel"]))}});const ya=m(ka,[["__scopeId","data-v-cb318fec"]]),Pa=b({__name:"VPNavBarMenuGroup",props:{item:{}},setup(s){const e=s,{page:t}=P(),n=r=>"link"in r?O(t.value.relativePath,r.link,!!e.item.activeMatch):r.items.some(n),o=k(()=>n(e.item));return(r,d)=>(a(),$(be,{class:T({VPNavBarMenuGroup:!0,active:l(O)(l(t).relativePath,r.item.activeMatch,!!r.item.activeMatch)||o.value}),button:r.item.text,items:r.item.items},null,8,["class","button","items"]))}}),Va=s=>(H("data-v-f732b5d0"),s=s(),z(),s),wa={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},La=Va(()=>c("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),Sa=b({__name:"VPNavBarMenu",setup(s){const{theme:e}=P();return(t,n)=>l(e).nav?(a(),i("nav",wa,[La,(a(!0),i(N,null,A(l(e).nav,o=>(a(),i(N,{key:o.text},["link"in o?(a(),$(ya,{key:0,item:o},null,8,["item"])):(a(),$(Pa,{key:1,item:o},null,8,["item"]))],64))),128))])):f("",!0)}});const Ma=m(Sa,[["__scopeId","data-v-f732b5d0"]]);function Na(s,e){const{localeIndex:t}=P();function n(o){var S,C;const r=o.split("."),d=s&&typeof s=="object",p=d&&((C=(S=s.locales)==null?void 0:S[t.value])==null?void 0:C.translations)||null,_=d&&s.translations||null;let g=p,V=_,y=e;const I=r.pop();for(const B of r){let w=null;const K=y==null?void 0:y[B];K&&(w=y=K);const W=V==null?void 0:V[B];W&&(w=V=W);const R=g==null?void 0:g[B];R&&(w=g=R),K||(y=w),W||(V=w),R||(g=w)}return(g==null?void 0:g[I])??(V==null?void 0:V[I])??(y==null?void 0:y[I])??""}return n}const Ia=["aria-label"],Ta={class:"DocSearch-Button-Container"},Ca=c("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[c("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),Ba={class:"DocSearch-Button-Placeholder"},Aa=c("span",{class:"DocSearch-Button-Keys"},[c("kbd",{class:"DocSearch-Button-Key"}),c("kbd",{class:"DocSearch-Button-Key"},"K")],-1),Pe=b({__name:"VPNavBarSearchButton",setup(s){const{theme:e}=P(),t={button:{buttonText:"Search",buttonAriaLabel:"Search"}},n=je(Na)(Ke(()=>{var o;return(o=e.value.search)==null?void 0:o.options}),t);return(o,r)=>(a(),i("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":l(n)("button.buttonAriaLabel")},[c("span",Ta,[Ca,c("span",Ba,L(l(n)("button.buttonText")),1)]),Aa],8,Ia))}});const xa={class:"VPNavBarSearch"},Ha={id:"local-search"},za={key:1,id:"docsearch"},Da=b({__name:"VPNavBarSearch",setup(s){const e=Re(()=>qe(()=>import("./VPLocalSearchBox.ac629888.js"),["assets/chunks/VPLocalSearchBox.ac629888.js","assets/chunks/framework.76cb5871.js"])),t=()=>null,{theme:n}=P(),o=M(!1),r=M(!1);G(()=>{});function d(){o.value||(o.value=!0,setTimeout(p,16))}function p(){const y=new Event("keydown");y.key="k",y.metaKey=!0,window.dispatchEvent(y),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||p()},16)}function _(y){const I=y.target,S=I.tagName;return I.isContentEditable||S==="INPUT"||S==="SELECT"||S==="TEXTAREA"}const g=M(!1);ke("k",y=>{(y.ctrlKey||y.metaKey)&&(y.preventDefault(),g.value=!0)}),ke("/",y=>{_(y)||(y.preventDefault(),g.value=!0)});const V="local";return(y,I)=>{var S;return a(),i("div",xa,[l(V)==="local"?(a(),i(N,{key:0},[g.value?(a(),$(l(e),{key:0,onClose:I[0]||(I[0]=C=>g.value=!1)})):f("",!0),c("div",Ha,[h(Pe,{onClick:I[1]||(I[1]=C=>g.value=!0)})])],64)):l(V)==="algolia"?(a(),i(N,{key:1},[o.value?(a(),$(l(t),{key:0,algolia:((S=l(n).search)==null?void 0:S.options)??l(n).algolia,onVnodeBeforeMount:I[2]||(I[2]=C=>r.value=!0)},null,8,["algolia"])):f("",!0),r.value?f("",!0):(a(),i("div",za,[h(Pe,{onClick:d})]))],64)):f("",!0)])}}});const Ea=b({__name:"VPNavBarSocialLinks",setup(s){const{theme:e}=P();return(t,n)=>l(e).socialLinks?(a(),$($e,{key:0,class:"VPNavBarSocialLinks",links:l(e).socialLinks},null,8,["links"])):f("",!0)}});const Fa=m(Ea,[["__scopeId","data-v-ef6192dc"]]),Oa=["href"],Ga=b({__name:"VPNavBarTitle",setup(s){const{site:e,theme:t}=P(),{hasSidebar:n}=D(),{currentLang:o}=X();return(r,d)=>(a(),i("div",{class:T(["VPNavBarTitle",{"has-sidebar":l(n)}])},[c("a",{class:"title",href:l(t).logoLink??l(J)(l(o).link)},[u(r.$slots,"nav-bar-title-before",{},void 0,!0),l(t).logo?(a(),$(ee,{key:0,class:"logo",image:l(t).logo},null,8,["image"])):f("",!0),l(t).siteTitle?(a(),i(N,{key:1},[x(L(l(t).siteTitle),1)],64)):l(t).siteTitle===void 0?(a(),i(N,{key:2},[x(L(l(e).title),1)],64)):f("",!0),u(r.$slots,"nav-bar-title-after",{},void 0,!0)],8,Oa)],2))}});const Ua=m(Ga,[["__scopeId","data-v-2973dbb4"]]),ja={},Ka={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ra=c("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),qa=c("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),Wa=[Ra,qa];function Ya(s,e){return a(),i("svg",Ka,Wa)}const Ae=m(ja,[["render",Ya]]),Ja={class:"items"},Xa={class:"title"},Za=b({__name:"VPNavBarTranslations",setup(s){const{theme:e}=P(),{localeLinks:t,currentLang:n}=X({correspondingLink:!0});return(o,r)=>l(t).length&&l(n).label?(a(),$(be,{key:0,class:"VPNavBarTranslations",icon:Ae,label:l(e).langMenuLabel||"Change language"},{default:v(()=>[c("div",Ja,[c("p",Xa,L(l(n).label),1),(a(!0),i(N,null,A(l(t),d=>(a(),$(oe,{key:d.link,item:d},null,8,["item"]))),128))])]),_:1},8,["label"])):f("",!0)}});const Qa=m(Za,[["__scopeId","data-v-ff4524ae"]]),er=s=>(H("data-v-f1abbc6e"),s=s(),z(),s),tr={class:"container"},sr={class:"title"},nr={class:"content"},or=er(()=>c("div",{class:"curtain"},null,-1)),ar={class:"content-body"},rr=b({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(s){const{y:e}=Le(),{hasSidebar:t}=D(),{frontmatter:n}=P(),o=M({});return Ve(()=>{o.value={"has-sidebar":t.value,top:n.value.layout==="home"&&e.value===0}}),(r,d)=>(a(),i("div",{class:T(["VPNavBar",o.value])},[c("div",tr,[c("div",sr,[h(Ua,null,{"nav-bar-title-before":v(()=>[u(r.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(r.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),c("div",nr,[or,c("div",ar,[u(r.$slots,"nav-bar-content-before",{},void 0,!0),h(Da,{class:"search"}),h(Ma,{class:"menu"}),h(Qa,{class:"translations"}),h($o,{class:"appearance"}),h(Fa,{class:"social-links"}),h(va,{class:"extra"}),u(r.$slots,"nav-bar-content-after",{},void 0,!0),h(ba,{class:"hamburger",active:r.isScreenOpen,onClick:d[0]||(d[0]=p=>r.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const lr=m(rr,[["__scopeId","data-v-f1abbc6e"]]),ir={key:0,class:"VPNavScreenAppearance"},cr={class:"text"},ur=b({__name:"VPNavScreenAppearance",setup(s){const{site:e,theme:t}=P();return(n,o)=>l(e).appearance?(a(),i("div",ir,[c("p",cr,L(l(t).darkModeSwitchLabel||"Appearance"),1),h(me)])):f("",!0)}});const dr=m(ur,[["__scopeId","data-v-0dc5cf49"]]),_r=b({__name:"VPNavScreenMenuLink",props:{item:{}},setup(s){const e=ne("close-screen");return(t,n)=>(a(),$(E,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:l(e)},{default:v(()=>[x(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const vr=m(_r,[["__scopeId","data-v-fe523e3d"]]),pr={},hr={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},fr=c("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),mr=[fr];function gr(s,e){return a(),i("svg",hr,mr)}const br=m(pr,[["render",gr]]),$r=b({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(s){const e=ne("close-screen");return(t,n)=>(a(),$(E,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:l(e)},{default:v(()=>[x(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const xe=m($r,[["__scopeId","data-v-aea78dd1"]]),kr={class:"VPNavScreenMenuGroupSection"},yr={key:0,class:"title"},Pr=b({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),i("div",kr,[e.text?(a(),i("p",yr,L(e.text),1)):f("",!0),(a(!0),i(N,null,A(e.items,n=>(a(),$(xe,{key:n.text,item:n},null,8,["item"]))),128))]))}});const Vr=m(Pr,[["__scopeId","data-v-f60dbfa7"]]),wr=["aria-controls","aria-expanded"],Lr={class:"button-text"},Sr=["id"],Mr={key:1,class:"group"},Nr=b({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(s){const e=s,t=M(!1),n=k(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function o(){t.value=!t.value}return(r,d)=>(a(),i("div",{class:T(["VPNavScreenMenuGroup",{open:t.value}])},[c("button",{class:"button","aria-controls":n.value,"aria-expanded":t.value,onClick:o},[c("span",Lr,L(r.text),1),h(br,{class:"button-icon"})],8,wr),c("div",{id:n.value,class:"items"},[(a(!0),i(N,null,A(r.items,p=>(a(),i(N,{key:p.text},["link"in p?(a(),i("div",{key:p.text,class:"item"},[h(xe,{item:p},null,8,["item"])])):(a(),i("div",Mr,[h(Vr,{text:p.text,items:p.items},null,8,["text","items"])]))],64))),128))],8,Sr)],2))}});const Ir=m(Nr,[["__scopeId","data-v-c2c554ed"]]),Tr={key:0,class:"VPNavScreenMenu"},Cr=b({__name:"VPNavScreenMenu",setup(s){const{theme:e}=P();return(t,n)=>l(e).nav?(a(),i("nav",Tr,[(a(!0),i(N,null,A(l(e).nav,o=>(a(),i(N,{key:o.text},["link"in o?(a(),$(vr,{key:0,item:o},null,8,["item"])):(a(),$(Ir,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):f("",!0)}}),Br=b({__name:"VPNavScreenSocialLinks",setup(s){const{theme:e}=P();return(t,n)=>l(e).socialLinks?(a(),$($e,{key:0,class:"VPNavScreenSocialLinks",links:l(e).socialLinks},null,8,["links"])):f("",!0)}}),Ar={class:"list"},xr=b({__name:"VPNavScreenTranslations",setup(s){const{localeLinks:e,currentLang:t}=X({correspondingLink:!0}),n=M(!1);function o(){n.value=!n.value}return(r,d)=>l(e).length&&l(t).label?(a(),i("div",{key:0,class:T(["VPNavScreenTranslations",{open:n.value}])},[c("button",{class:"title",onClick:o},[h(Ae,{class:"icon lang"}),x(" "+L(l(t).label)+" ",1),h(Be,{class:"icon chevron"})]),c("ul",Ar,[(a(!0),i(N,null,A(l(e),p=>(a(),i("li",{key:p.link,class:"item"},[h(E,{class:"link",href:p.link},{default:v(()=>[x(L(p.text),1)]),_:2},1032,["href"])]))),128))])],2)):f("",!0)}});const Hr=m(xr,[["__scopeId","data-v-41505286"]]),zr={class:"container"},Dr=b({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(s){const e=M(null),t=Se(q?document.body:null);return(n,o)=>(a(),$(ce,{name:"fade",onEnter:o[0]||(o[0]=r=>t.value=!0),onAfterLeave:o[1]||(o[1]=r=>t.value=!1)},{default:v(()=>[n.open?(a(),i("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[c("div",zr,[u(n.$slots,"nav-screen-content-before",{},void 0,!0),h(Cr,{class:"menu"}),h(Hr,{class:"translations"}),h(dr,{class:"appearance"}),h(Br,{class:"social-links"}),u(n.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):f("",!0)]),_:3}))}});const Er=m(Dr,[["__scopeId","data-v-57cce842"]]),Fr={key:0,class:"VPNav"},Or=b({__name:"VPNav",setup(s){const{isScreenOpen:e,closeScreen:t,toggleScreen:n}=Xn(),{frontmatter:o}=P(),r=k(()=>o.value.navbar!==!1);return Me("close-screen",t),te(()=>{q&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(d,p)=>r.value?(a(),i("header",Fr,[h(lr,{"is-screen-open":l(e),onToggleScreen:l(n)},{"nav-bar-title-before":v(()=>[u(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(d.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),h(Er,{open:l(e)},{"nav-screen-content-before":v(()=>[u(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):f("",!0)}});const Gr=m(Or,[["__scopeId","data-v-7ad780c2"]]),Ur=s=>(H("data-v-bd01e0d5"),s=s(),z(),s),jr=["role","tabindex"],Kr=Ur(()=>c("div",{class:"indicator"},null,-1)),Rr=["onKeydown"],qr={key:1,class:"items"},Wr=b({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(s){const e=s,{collapsed:t,collapsible:n,isLink:o,isActiveLink:r,hasActiveLink:d,hasChildren:p,toggle:_}=gt(k(()=>e.item)),g=k(()=>p.value?"section":"div"),V=k(()=>o.value?"a":"div"),y=k(()=>p.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),I=k(()=>o.value?void 0:"button"),S=k(()=>[[`level-${e.depth}`],{collapsible:n.value},{collapsed:t.value},{"is-link":o.value},{"is-active":r.value},{"has-active":d.value}]);function C(w){"key"in w&&w.key!=="Enter"||!e.item.link&&_()}function B(){e.item.link&&_()}return(w,K)=>{const W=j("VPSidebarItem",!0);return a(),$(F(g.value),{class:T(["VPSidebarItem",S.value])},{default:v(()=>[w.item.text?(a(),i("div",Z({key:0,class:"item",role:I.value},Ye(w.item.items?{click:C,keydown:C}:{},!0),{tabindex:w.item.items&&0}),[Kr,w.item.link?(a(),$(E,{key:0,tag:V.value,class:"link",href:w.item.link,rel:w.item.rel,target:w.item.target},{default:v(()=>[(a(),$(F(y.value),{class:"text",innerHTML:w.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),$(F(y.value),{key:1,class:"text",innerHTML:w.item.text},null,8,["innerHTML"])),w.item.collapsed!=null?(a(),i("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:B,onKeydown:We(B,["enter"]),tabindex:"0"},[h(fe,{class:"caret-icon"})],40,Rr)):f("",!0)],16,jr)):f("",!0),w.item.items&&w.item.items.length?(a(),i("div",qr,[w.depth<5?(a(!0),i(N,{key:0},A(w.item.items,R=>(a(),$(W,{key:R.text,item:R,depth:w.depth+1},null,8,["item","depth"]))),128)):f("",!0)])):f("",!0)]),_:1},8,["class"])}}});const Yr=m(Wr,[["__scopeId","data-v-bd01e0d5"]]),He=s=>(H("data-v-ee2efba5"),s=s(),z(),s),Jr=He(()=>c("div",{class:"curtain"},null,-1)),Xr={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Zr=He(()=>c("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Qr=b({__name:"VPSidebar",props:{open:{type:Boolean}},setup(s){const{sidebarGroups:e,hasSidebar:t}=D(),n=s,o=M(null),r=Se(q?document.body:null);return U([n,o],()=>{var d;n.open?(r.value=!0,(d=o.value)==null||d.focus()):r.value=!1},{immediate:!0,flush:"post"}),(d,p)=>l(t)?(a(),i("aside",{key:0,class:T(["VPSidebar",{open:d.open}]),ref_key:"navEl",ref:o,onClick:p[0]||(p[0]=Je(()=>{},["stop"]))},[Jr,c("nav",Xr,[Zr,u(d.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),i(N,null,A(l(e),_=>(a(),i("div",{key:_.text,class:"group"},[h(Yr,{item:_,depth:0},null,8,["item"])]))),128)),u(d.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):f("",!0)}});const el=m(Qr,[["__scopeId","data-v-ee2efba5"]]),tl=b({__name:"VPSkipLink",setup(s){const e=se(),t=M();U(()=>e.path,()=>t.value.focus());function n({target:o}){const r=document.getElementById(decodeURIComponent(o.hash).slice(1));if(r){const d=()=>{r.removeAttribute("tabindex"),r.removeEventListener("blur",d)};r.setAttribute("tabindex","-1"),r.addEventListener("blur",d),r.focus(),window.scrollTo(0,0)}}return(o,r)=>(a(),i(N,null,[c("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),c("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:n}," Skip to content ")],64))}});const sl=m(tl,[["__scopeId","data-v-c8291ffa"]]),nl=b({__name:"Layout",setup(s){const{isOpen:e,open:t,close:n}=D(),o=se();U(()=>o.path,n),mt(e,n);const{frontmatter:r}=P(),d=Xe(),p=k(()=>!!d["home-hero-image"]);return Me("hero-image-slot-exists",p),(_,g)=>{const V=j("Content");return l(r).layout!==!1?(a(),i("div",{key:0,class:T(["Layout",l(r).pageClass])},[u(_.$slots,"layout-top",{},void 0,!0),h(sl),h(st,{class:"backdrop",show:l(e),onClick:l(n)},null,8,["show","onClick"]),h(Gr,null,{"nav-bar-title-before":v(()=>[u(_.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(_.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(_.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(_.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":v(()=>[u(_.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(_.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),h(Jn,{open:l(e),onOpenMenu:l(t)},null,8,["open","onOpenMenu"]),h(el,{open:l(e)},{"sidebar-nav-before":v(()=>[u(_.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":v(()=>[u(_.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),h(Mn,null,{"page-top":v(()=>[u(_.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(_.$slots,"page-bottom",{},void 0,!0)]),"not-found":v(()=>[u(_.$slots,"not-found",{},void 0,!0)]),"home-hero-before":v(()=>[u(_.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(_.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(_.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(_.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(_.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(_.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":v(()=>[u(_.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(_.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(_.$slots,"doc-after",{},void 0,!0)]),"doc-top":v(()=>[u(_.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(_.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":v(()=>[u(_.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(_.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(_.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(_.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(_.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(_.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),h(Bn),u(_.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),$(V,{key:1}))}}});const ol=m(nl,[["__scopeId","data-v-9d8abc1e"]]);const rl={Layout:ol,enhanceApp:({app:s})=>{s.component("Badge",Qe)}};export{Na as c,rl as t,P as u}; diff --git a/assets/zh_benchmark_coremark.md.40178108.js b/assets/zh_benchmark_coremark.md.40178108.js deleted file mode 100644 index 1d42ad90..00000000 --- a/assets/zh_benchmark_coremark.md.40178108.js +++ /dev/null @@ -1,7 +0,0 @@ -import{_ as s,o as a,c as o,Q as n}from"./chunks/framework.76cb5871.js";const d=JSON.parse('{"title":"运行 Coremark","description":"","frontmatter":{},"headers":[],"relativePath":"zh/benchmark/coremark.md","filePath":"zh/benchmark/coremark.md","lastUpdated":1701843761000}'),l={name:"zh/benchmark/coremark.md"},p=n(`

运行 Coremark

这里我们从零开始,安装 ruyisdk 并编译运行 Coremark。这里我们介绍使用 ruyi 交叉编译 Coremark 的步骤。

安装 ruyi

下载工具链

交叉编译 Coremark

  1. 下载 Coremark

    bash
    git clone https://github.com/eembc/coremark.git
    git clone https://github.com/eembc/coremark.git
  2. 交叉编译 Coremark

    bash
    cd coremark
    -mkdir rv64 && cp simple/* rv64/
    -sed -i 's/ee_u32         ee_ptr_int/unsigned long long         ee_ptr_int/g' rv64/core_portme.h
    -make compile PORT_DIR=rv64 CC=$riscv64-ruyi-linux-gnu-gcc LD=$riscv64-ruyi-linux-gnu-gcc XCFLAGS="-march=$rv64gc"
    cd coremark
    -mkdir rv64 && cp simple/* rv64/
    -sed -i 's/ee_u32         ee_ptr_int/unsigned long long         ee_ptr_int/g' rv64/core_portme.h
    -make compile PORT_DIR=rv64 CC=$riscv64-ruyi-linux-gnu-gcc LD=$riscv64-ruyi-linux-gnu-gcc XCFLAGS="-march=$rv64gc"

    编译成功会看到 coremark 目录下生成了 coremark.exe,将 coremark.exe 拷贝到我们的 riscv 开发板或者 Qemu 上就可以运行了。

`,6),e=[p];function r(c,t,i,y,E,F){return a(),o("div",null,e)}const h=s(l,[["render",r]]);export{d as __pageData,h as default}; diff --git a/assets/zh_benchmark_coremark.md.40178108.lean.js b/assets/zh_benchmark_coremark.md.40178108.lean.js deleted file mode 100644 index f3caec9c..00000000 --- a/assets/zh_benchmark_coremark.md.40178108.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as o,Q as n}from"./chunks/framework.76cb5871.js";const d=JSON.parse('{"title":"运行 Coremark","description":"","frontmatter":{},"headers":[],"relativePath":"zh/benchmark/coremark.md","filePath":"zh/benchmark/coremark.md","lastUpdated":1701843761000}'),l={name:"zh/benchmark/coremark.md"},p=n("",6),e=[p];function r(c,t,i,y,E,F){return a(),o("div",null,e)}const h=s(l,[["render",r]]);export{d as __pageData,h as default}; diff --git a/assets/zh_benchmark_coremark.md.8bb24a44.js b/assets/zh_benchmark_coremark.md.8bb24a44.js new file mode 100644 index 00000000..7e51fe1b --- /dev/null +++ b/assets/zh_benchmark_coremark.md.8bb24a44.js @@ -0,0 +1,29 @@ +import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.76cb5871.js";const d=JSON.parse('{"title":"使用编译环境进行 Coremark 构建","description":"","frontmatter":{},"headers":[],"relativePath":"zh/benchmark/coremark.md","filePath":"zh/benchmark/coremark.md","lastUpdated":1702129622000}'),o={name:"zh/benchmark/coremark.md"},p=l(`

使用编译环境进行 Coremark 构建

这里用 “使用 PLCT 工具链配置 Milkv-Duo 编译环境” 一节中的 Milkv-Duo 编译环境,构建 coremark 。

首先进入编译环境:

bash
$ . milkv-venv/bin/ruyi-activate
+«Ruyi milkv-venv» $
$ . milkv-venv/bin/ruyi-activate
+«Ruyi milkv-venv» $

coremark 源码可以直接从 RUYI 软件仓库中下载,当前 v0.2 最新的源码版本为 1.0.1 :

bash
«Ruyi milkv-venv» $ mkdir coremark
+«Ruyi milkv-venv» $ cd coremark
+«Ruyi milkv-venv» $ ruyi extract coremark
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/coremark-1.01.tar.gz to /home/myon/.cache/ruyi/distfiles/coremark-1.01.tar.gz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  391k  100  391k    0     0  1400k      0 --:--:-- --:--:-- --:--:-- 1404k
+info: extracting coremark-1.01.tar.gz for package coremark-1.0.1
+info: package coremark-1.0.1 extracted to current working directory
«Ruyi milkv-venv» $ mkdir coremark
+«Ruyi milkv-venv» $ cd coremark
+«Ruyi milkv-venv» $ ruyi extract coremark
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/coremark-1.01.tar.gz to /home/myon/.cache/ruyi/distfiles/coremark-1.01.tar.gz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  391k  100  391k    0     0  1400k      0 --:--:-- --:--:-- --:--:-- 1404k
+info: extracting coremark-1.01.tar.gz for package coremark-1.0.1
+info: package coremark-1.0.1 extracted to current working directory

这个操作将从 RUYI 软件源中下载 coremark 源码并解包到当前目录

由于使用的工具链为 riscv64-plct-linux-gnu-gcc ,需要编辑构建脚本:

bash
«Ruyi milkv-venv» $ sed -i 's/\\bgcc\\b/riscv64-plct-linux-gnu-gcc/g' linux64/core_portme.mak
«Ruyi milkv-venv» $ sed -i 's/\\bgcc\\b/riscv64-plct-linux-gnu-gcc/g' linux64/core_portme.mak

构建 coremark:

bash
«Ruyi milkv-venv» $ make PORT_DIR=linux64 link
+riscv64-plct-linux-gnu-gcc -O2 -Ilinux64 -I. -DFLAGS_STR=\\""-O2   -lrt"\\" -DITERATIONS=0  core_list_join.c core_main.c core_matrix.c core_state.c core_util.c linux64/core_portme.c -o ./coremark.exe -lrt
+Link performed along with compile
+«Ruyi milkv-venv» $ file coremark.exe
+coremark.exe: ELF 64-bit LSB executable, UCB RISC-V, RVC, double-float ABI, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64-lp64d.so.1, BuildID[sha1]=d9dbc7115d07d1953087dd2c1e5d46adc2ab0d4f, for GNU/Linux 4.15.0, with debug_info, not stripped
«Ruyi milkv-venv» $ make PORT_DIR=linux64 link
+riscv64-plct-linux-gnu-gcc -O2 -Ilinux64 -I. -DFLAGS_STR=\\""-O2   -lrt"\\" -DITERATIONS=0  core_list_join.c core_main.c core_matrix.c core_state.c core_util.c linux64/core_portme.c -o ./coremark.exe -lrt
+Link performed along with compile
+«Ruyi milkv-venv» $ file coremark.exe
+coremark.exe: ELF 64-bit LSB executable, UCB RISC-V, RVC, double-float ABI, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64-lp64d.so.1, BuildID[sha1]=d9dbc7115d07d1953087dd2c1e5d46adc2ab0d4f, for GNU/Linux 4.15.0, with debug_info, not stripped

可以看到成功构建 RISC-V 架构的二进制。注意这整个过程如果在 riscv64 环境则不是交叉编译。

退出虚拟环境

bash
«Ruyi milkv-venv» $ ruyi-deactivate
+$
«Ruyi milkv-venv» $ ruyi-deactivate
+$
`,14),e=[p];function c(r,t,E,y,F,i){return a(),n("div",null,e)}const B=s(o,[["render",c]]);export{d as __pageData,B as default}; diff --git a/assets/zh_benchmark_coremark.md.8bb24a44.lean.js b/assets/zh_benchmark_coremark.md.8bb24a44.lean.js new file mode 100644 index 00000000..8caa0b38 --- /dev/null +++ b/assets/zh_benchmark_coremark.md.8bb24a44.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.76cb5871.js";const d=JSON.parse('{"title":"使用编译环境进行 Coremark 构建","description":"","frontmatter":{},"headers":[],"relativePath":"zh/benchmark/coremark.md","filePath":"zh/benchmark/coremark.md","lastUpdated":1702129622000}'),o={name:"zh/benchmark/coremark.md"},p=l("",14),e=[p];function c(r,t,E,y,F,i){return a(),n("div",null,e)}const B=s(o,[["render",c]]);export{d as __pageData,B as default}; diff --git a/assets/zh_environment_gnu-generic_index.md.0cd998a2.js b/assets/zh_environment_gnu-generic_index.md.0cd998a2.js new file mode 100644 index 00000000..9e215189 --- /dev/null +++ b/assets/zh_environment_gnu-generic_index.md.0cd998a2.js @@ -0,0 +1,77 @@ +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.76cb5871.js";const C=JSON.parse('{"title":"使用 GNU 上游工具链配置 RISC-V 编译环境","description":"","frontmatter":{},"headers":[],"relativePath":"zh/environment/gnu-generic/index.md","filePath":"zh/environment/gnu-generic/index.md","lastUpdated":1702129622000}'),p={name:"zh/environment/gnu-generic/index.md"},o=l(`

使用 GNU 上游工具链配置 RISC-V 编译环境

GNU 上游工具链软件包名为 gnu-upstream , v0.2 最新版本二进制为 gnu-upstream-20231118 :

bash
$ ruyi install slug:gnu-upstream-20231118
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  232M  100  232M    0     0  1936k      0  0:02:02  0:02:02 --:--:-- 1924k
+info: extracting RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz for package gnu-upstream-0.20231118.0
+info: package gnu-upstream-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-upstream-0.20231118.0
$ ruyi install slug:gnu-upstream-20231118
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  232M  100  232M    0     0  1936k      0  0:02:02  0:02:02 --:--:-- 1924k
+info: extracting RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz for package gnu-upstream-0.20231118.0
+info: package gnu-upstream-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-upstream-0.20231118.0

slug 可以从 ruyi list 的输出中获取,且拷贝时应删除 slug: gnu-upstream-20231118 之间的空格,变为正确的格式 slug:gnu-upstream-20231118 。 该命令将调用 wgetcurl 从远端软件源获取软件包 tarball ,解压并安装到用户目录。 软件包安装目录默认为 ~/.local/share/ruyi ;在 XDG_DATA_HOME 环境变量被设置时,目录为 $XDG_DATA_HOME/ruyi

也可以使用如下命令让 RUYI 自动选择最新版本安装,注意所安装的版本可能是 v0.2 以后的未测试版本。

bash
$ ruyi install gnu-upstream
$ ruyi install gnu-upstream

由预置的 generic 配置建立编译环境:

bash
$ ruyi venv -t slug:gnu-upstream-20231118 generic venv
+ruyi venv -t slug:gnu-upstream-20231118 generic venv
+info: Creating a Ruyi virtual environment at venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking \`ruyi-deactivate\`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.
$ ruyi venv -t slug:gnu-upstream-20231118 generic venv
+ruyi venv -t slug:gnu-upstream-20231118 generic venv
+info: Creating a Ruyi virtual environment at venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking \`ruyi-deactivate\`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.

这里命令 generic 为如上选择的环境,venv为自定义的相对路径,使用 -t 参数指定工具链。 若使用包名则 RUYI 将自动选择具体的工具链版本:

bash
$ ruyi venv -t gnu-upstream generic venv
$ ruyi venv -t gnu-upstream generic venv

查看可用的工具链二进制:

bash
$ ls ./venv/bin/
+riscv64-unknown-linux-gnu-addr2line  riscv64-unknown-linux-gnu-gcc            riscv64-unknown-linux-gnu-gfortran  riscv64-unknown-linux-gnu-ranlib
+riscv64-unknown-linux-gnu-ar         riscv64-unknown-linux-gnu-gcc-ar         riscv64-unknown-linux-gnu-gprof     riscv64-unknown-linux-gnu-readelf
+riscv64-unknown-linux-gnu-as         riscv64-unknown-linux-gnu-gcc-nm         riscv64-unknown-linux-gnu-ld        riscv64-unknown-linux-gnu-size
+riscv64-unknown-linux-gnu-c++        riscv64-unknown-linux-gnu-gcc-ranlib     riscv64-unknown-linux-gnu-ld.bfd    riscv64-unknown-linux-gnu-strings
+riscv64-unknown-linux-gnu-cc         riscv64-unknown-linux-gnu-gcov           riscv64-unknown-linux-gnu-ldd       riscv64-unknown-linux-gnu-strip
+riscv64-unknown-linux-gnu-c++filt    riscv64-unknown-linux-gnu-gcov-dump      riscv64-unknown-linux-gnu-lto-dump  ruyi-activate
+riscv64-unknown-linux-gnu-cpp        riscv64-unknown-linux-gnu-gcov-tool      riscv64-unknown-linux-gnu-nm
+riscv64-unknown-linux-gnu-elfedit    riscv64-unknown-linux-gnu-gdb            riscv64-unknown-linux-gnu-objcopy
+riscv64-unknown-linux-gnu-g++        riscv64-unknown-linux-gnu-gdb-add-index  riscv64-unknown-linux-gnu-objdump
$ ls ./venv/bin/
+riscv64-unknown-linux-gnu-addr2line  riscv64-unknown-linux-gnu-gcc            riscv64-unknown-linux-gnu-gfortran  riscv64-unknown-linux-gnu-ranlib
+riscv64-unknown-linux-gnu-ar         riscv64-unknown-linux-gnu-gcc-ar         riscv64-unknown-linux-gnu-gprof     riscv64-unknown-linux-gnu-readelf
+riscv64-unknown-linux-gnu-as         riscv64-unknown-linux-gnu-gcc-nm         riscv64-unknown-linux-gnu-ld        riscv64-unknown-linux-gnu-size
+riscv64-unknown-linux-gnu-c++        riscv64-unknown-linux-gnu-gcc-ranlib     riscv64-unknown-linux-gnu-ld.bfd    riscv64-unknown-linux-gnu-strings
+riscv64-unknown-linux-gnu-cc         riscv64-unknown-linux-gnu-gcov           riscv64-unknown-linux-gnu-ldd       riscv64-unknown-linux-gnu-strip
+riscv64-unknown-linux-gnu-c++filt    riscv64-unknown-linux-gnu-gcov-dump      riscv64-unknown-linux-gnu-lto-dump  ruyi-activate
+riscv64-unknown-linux-gnu-cpp        riscv64-unknown-linux-gnu-gcov-tool      riscv64-unknown-linux-gnu-nm
+riscv64-unknown-linux-gnu-elfedit    riscv64-unknown-linux-gnu-gdb            riscv64-unknown-linux-gnu-objcopy
+riscv64-unknown-linux-gnu-g++        riscv64-unknown-linux-gnu-gdb-add-index  riscv64-unknown-linux-gnu-objdump

除了 ruyi-activate 为激活编译环境用的脚本,其他均为工具链二进制。

激活构建环境,激活方式与 python 虚拟环境类似,并且改变 PS1 以提示当前进入编译环境中:

bash
$ . venv/bin/ruyi-activate
+«Ruyi venv» $
$ . venv/bin/ruyi-activate
+«Ruyi venv» $

也可以使用 source 命令:

bash
$ source venv/bin/ruyi-activate
+«Ruyi venv» $
$ source venv/bin/ruyi-activate
+«Ruyi venv» $

调用工具链:

bash
«Ruyi venv» $ riscv64-unknown-linux-gnu-gcc --version
+riscv64-unknown-linux-gnu-gcc (RuyiSDK 20231118 Upstream-Sources) 13.2.0
+Copyright (C) 2023 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
«Ruyi venv» $ riscv64-unknown-linux-gnu-gcc --version
+riscv64-unknown-linux-gnu-gcc (RuyiSDK 20231118 Upstream-Sources) 13.2.0
+Copyright (C) 2023 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

退出编译环境:

bash
«Ruyi venv» $ ruyi-deactivate
+$
«Ruyi venv» $ ruyi-deactivate
+$

环境将被还原。

`,22),e=[o];function c(r,t,E,y,F,i){return n(),a("div",null,e)}const v=s(p,[["render",c]]);export{C as __pageData,v as default}; diff --git a/assets/zh_environment_gnu-generic_index.md.0cd998a2.lean.js b/assets/zh_environment_gnu-generic_index.md.0cd998a2.lean.js new file mode 100644 index 00000000..c5273100 --- /dev/null +++ b/assets/zh_environment_gnu-generic_index.md.0cd998a2.lean.js @@ -0,0 +1 @@ +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.76cb5871.js";const C=JSON.parse('{"title":"使用 GNU 上游工具链配置 RISC-V 编译环境","description":"","frontmatter":{},"headers":[],"relativePath":"zh/environment/gnu-generic/index.md","filePath":"zh/environment/gnu-generic/index.md","lastUpdated":1702129622000}'),p={name:"zh/environment/gnu-generic/index.md"},o=l("",22),e=[o];function c(r,t,E,y,F,i){return n(),a("div",null,e)}const v=s(p,[["render",c]]);export{C as __pageData,v as default}; diff --git a/assets/zh_environment_llvm-generic_index.md.22159a68.js b/assets/zh_environment_llvm-generic_index.md.22159a68.js new file mode 100644 index 00000000..43db28be --- /dev/null +++ b/assets/zh_environment_llvm-generic_index.md.22159a68.js @@ -0,0 +1,133 @@ +import{_ as s,o as n,c as l,Q as a}from"./chunks/framework.76cb5871.js";const B=JSON.parse('{"title":"使用 LLVM 上游工具链配置 RISC-V 编译环境","description":"","frontmatter":{},"headers":[],"relativePath":"zh/environment/llvm-generic/index.md","filePath":"zh/environment/llvm-generic/index.md","lastUpdated":1702129622000}'),p={name:"zh/environment/llvm-generic/index.md"},o=a(`

使用 LLVM 上游工具链配置 RISC-V 编译环境

注意在 v0.2 版本中,该部分只适用于在 x86-64 host 配置交叉编译环境。

LLVM 上游工具链软件包名为 llvm-upstream , v0.2 最新版本二进制为 llvm-upstream-20231121 。 由于配置 LLVM 工具链环境依赖 gcc 环境,故同时需要安装 gcc 工具链。

另外尽管 llvm-upstream 在 list 命令中打印了 slug 信息,但是实际上并不存在该 slug ,故不能指定 slug 安装。

bash
$ ruyi install llvm-upstream slug:gnu-upstream-20231118
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/llvm-17.0.5.ruyi-20231121.amd64.tar.zst to
+/home/myon/.cache/ruyi/distfiles/llvm-17.0.5.ruyi-20231121.amd64.tar.zst
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  398M  100  398M    0     0  10.7M      0  0:00:36  0:00:36 --:--:-- 11.0M
+info: extracting llvm-17.0.5.ruyi-20231121.amd64.tar.zst for package llvm-upstream-17.0.5-ruyi.20231121
+info: package llvm-upstream-17.0.5-ruyi.20231121 installed to /home/myon/.local/share/ruyi/binaries/x86_64/llvm-upstream-17.0.5-ruyi.20231121
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  232M  100  232M    0     0  10.0M      0  0:00:23  0:00:23 --:--:-- 10.9M
+info: extracting RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz for package gnu-upstream-0.20231118.0
+info: package gnu-upstream-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-upstream-0.20231118.0
$ ruyi install llvm-upstream slug:gnu-upstream-20231118
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/llvm-17.0.5.ruyi-20231121.amd64.tar.zst to
+/home/myon/.cache/ruyi/distfiles/llvm-17.0.5.ruyi-20231121.amd64.tar.zst
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  398M  100  398M    0     0  10.7M      0  0:00:36  0:00:36 --:--:-- 11.0M
+info: extracting llvm-17.0.5.ruyi-20231121.amd64.tar.zst for package llvm-upstream-17.0.5-ruyi.20231121
+info: package llvm-upstream-17.0.5-ruyi.20231121 installed to /home/myon/.local/share/ruyi/binaries/x86_64/llvm-upstream-17.0.5-ruyi.20231121
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  232M  100  232M    0     0  10.0M      0  0:00:23  0:00:23 --:--:-- 10.9M
+info: extracting RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz for package gnu-upstream-0.20231118.0
+info: package gnu-upstream-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-upstream-0.20231118.0

由预置的 generic 配置建立编译环境:

bash
$ ruyi venv -t llvm-upstream --sysroot-from gnu-upstream generic ./llvm_venv
+info: Creating a Ruyi virtual environment at llvm_venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking \`ruyi-deactivate\`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/llvm_venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.
$ ruyi venv -t llvm-upstream --sysroot-from gnu-upstream generic ./llvm_venv
+info: Creating a Ruyi virtual environment at llvm_venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking \`ruyi-deactivate\`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/llvm_venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.

--sysroot-from 指定从 gnu-upstream 获取 sysroot ,这是由于 llvm 构建依赖一些 gcc 库。

查看可用的工具链二进制,包括 llvm-upstream 和 gnu-upstream :

bash
$ ls llvm_venv/bin/
+amdgpu-arch               dsymutil                 llvm-dlltool            llvm-rc                              riscv64-unknown-linux-gnu-cpp
+analyze-build             FileCheck                llvm-dwarfdump          llvm-readelf                         riscv64-unknown-linux-gnu-g++
+bugpoint                  find-all-symbols         llvm-dwarfutil          llvm-readobj                         riscv64-unknown-linux-gnu-gcc
+c-index-test              git-clang-format         llvm-dwp                llvm-reduce                          riscv64-unknown-linux-gnu-gcc-ar
+clang                     hmaptool                 llvm-exegesis           llvm-remark-size-diff                riscv64-unknown-linux-gnu-gcc-nm
+clang++                   intercept-build          llvm-extract            llvm-remarkutil                      riscv64-unknown-linux-gnu-gcc-ranlib
+clang-apply-replacements  ld64.lld                 llvm-gsymutil           llvm-rtdyld                          riscv64-unknown-linux-gnu-ld
+clang-change-namespace    ld.lld                   llvm-ifs                llvm-sim                             riscv64-unknown-linux-gnu-nm
+clang-check               llc                      llvm-install-name-tool  llvm-size                            riscv64-unknown-linux-gnu-objcopy
+clang-cl                  lld                      llvm-jitlink            llvm-split                           riscv64-unknown-linux-gnu-objdump
+clang-cpp                 lld-link                 llvm-jitlink-executor   llvm-stress                          riscv64-unknown-linux-gnu-ranlib
+clangd                    lli                      llvm-lib                llvm-strings                         riscv64-unknown-linux-gnu-readelf
+clang-doc                 lli-child-target         llvm-libtool-darwin     llvm-strip                           riscv64-unknown-linux-gnu-size
+clang-extdef-mapping      llvm-addr2line           llvm-link               llvm-symbolizer                      riscv64-unknown-linux-gnu-strings
+clang-format              llvm-ar                  llvm-lipo               llvm-tapi-diff                       riscv64-unknown-linux-gnu-strip
+clang-include-cleaner     llvm-as                  llvm-lto                llvm-tblgen                          run-clang-tidy
+clang-include-fixer       llvm-bcanalyzer          llvm-lto2               llvm-tli-checker                     ruyi-activate
+clang-linker-wrapper      llvm-bitcode-strip       llvm-mc                 llvm-undname                         sancov
+clang-move                llvm-cat                 llvm-mca                llvm-windres                         sanstats
+clang-offload-bundler     llvm-cfi-verify          llvm-ml                 llvm-xray                            scan-build
+clang-offload-packager    llvm-config              llvm-modextract         modularize                           scan-build-py
+clang-pseudo              llvm-cov                 llvm-mt                 not                                  scan-view
+clang-query               llvm-c-test              llvm-nm                 nvptx-arch                           split-file
+clang-refactor            llvm-cvtres              llvm-objcopy            obj2yaml                             UnicodeNameMappingGenerator
+clang-rename              llvm-cxxdump             llvm-objdump            opt                                  verify-uselistorder
+clang-reorder-fields      llvm-cxxfilt             llvm-opt-report         pp-trace                             wasm-ld
+clang-repl                llvm-cxxmap              llvm-otool              riscv64-unknown-linux-gnu-addr2line  yaml2obj
+clang-scan-deps           llvm-debuginfo-analyzer  llvm-pdbutil            riscv64-unknown-linux-gnu-ar         yaml-bench
+clang-tblgen              llvm-debuginfod          llvm-PerfectShuffle     riscv64-unknown-linux-gnu-as
+clang-tidy                llvm-debuginfod-find     llvm-profdata           riscv64-unknown-linux-gnu-c++
+count                     llvm-diff                llvm-profgen            riscv64-unknown-linux-gnu-cc
+diagtool                  llvm-dis                 llvm-ranlib             riscv64-unknown-linux-gnu-c++filt
$ ls llvm_venv/bin/
+amdgpu-arch               dsymutil                 llvm-dlltool            llvm-rc                              riscv64-unknown-linux-gnu-cpp
+analyze-build             FileCheck                llvm-dwarfdump          llvm-readelf                         riscv64-unknown-linux-gnu-g++
+bugpoint                  find-all-symbols         llvm-dwarfutil          llvm-readobj                         riscv64-unknown-linux-gnu-gcc
+c-index-test              git-clang-format         llvm-dwp                llvm-reduce                          riscv64-unknown-linux-gnu-gcc-ar
+clang                     hmaptool                 llvm-exegesis           llvm-remark-size-diff                riscv64-unknown-linux-gnu-gcc-nm
+clang++                   intercept-build          llvm-extract            llvm-remarkutil                      riscv64-unknown-linux-gnu-gcc-ranlib
+clang-apply-replacements  ld64.lld                 llvm-gsymutil           llvm-rtdyld                          riscv64-unknown-linux-gnu-ld
+clang-change-namespace    ld.lld                   llvm-ifs                llvm-sim                             riscv64-unknown-linux-gnu-nm
+clang-check               llc                      llvm-install-name-tool  llvm-size                            riscv64-unknown-linux-gnu-objcopy
+clang-cl                  lld                      llvm-jitlink            llvm-split                           riscv64-unknown-linux-gnu-objdump
+clang-cpp                 lld-link                 llvm-jitlink-executor   llvm-stress                          riscv64-unknown-linux-gnu-ranlib
+clangd                    lli                      llvm-lib                llvm-strings                         riscv64-unknown-linux-gnu-readelf
+clang-doc                 lli-child-target         llvm-libtool-darwin     llvm-strip                           riscv64-unknown-linux-gnu-size
+clang-extdef-mapping      llvm-addr2line           llvm-link               llvm-symbolizer                      riscv64-unknown-linux-gnu-strings
+clang-format              llvm-ar                  llvm-lipo               llvm-tapi-diff                       riscv64-unknown-linux-gnu-strip
+clang-include-cleaner     llvm-as                  llvm-lto                llvm-tblgen                          run-clang-tidy
+clang-include-fixer       llvm-bcanalyzer          llvm-lto2               llvm-tli-checker                     ruyi-activate
+clang-linker-wrapper      llvm-bitcode-strip       llvm-mc                 llvm-undname                         sancov
+clang-move                llvm-cat                 llvm-mca                llvm-windres                         sanstats
+clang-offload-bundler     llvm-cfi-verify          llvm-ml                 llvm-xray                            scan-build
+clang-offload-packager    llvm-config              llvm-modextract         modularize                           scan-build-py
+clang-pseudo              llvm-cov                 llvm-mt                 not                                  scan-view
+clang-query               llvm-c-test              llvm-nm                 nvptx-arch                           split-file
+clang-refactor            llvm-cvtres              llvm-objcopy            obj2yaml                             UnicodeNameMappingGenerator
+clang-rename              llvm-cxxdump             llvm-objdump            opt                                  verify-uselistorder
+clang-reorder-fields      llvm-cxxfilt             llvm-opt-report         pp-trace                             wasm-ld
+clang-repl                llvm-cxxmap              llvm-otool              riscv64-unknown-linux-gnu-addr2line  yaml2obj
+clang-scan-deps           llvm-debuginfo-analyzer  llvm-pdbutil            riscv64-unknown-linux-gnu-ar         yaml-bench
+clang-tblgen              llvm-debuginfod          llvm-PerfectShuffle     riscv64-unknown-linux-gnu-as
+clang-tidy                llvm-debuginfod-find     llvm-profdata           riscv64-unknown-linux-gnu-c++
+count                     llvm-diff                llvm-profgen            riscv64-unknown-linux-gnu-cc
+diagtool                  llvm-dis                 llvm-ranlib             riscv64-unknown-linux-gnu-c++filt

进入 llvm 编译环境:

bash
$ . llvm_venv/bin/ruyi-activate
+«Ruyi llvm_venv» $
$ . llvm_venv/bin/ruyi-activate
+«Ruyi llvm_venv» $

此时应当可以正常调用 clang :

bash
«Ruyi llvm_venv» $ clang --version
+clang version 17.0.5
+Target: riscv64-unknown-linux-gnu
+Thread model: posix
+InstalledDir: /home/myon/.local/share/ruyi/binaries/x86_64/llvm-upstream-17.0.5-ruyi.20231121/bin
«Ruyi llvm_venv» $ clang --version
+clang version 17.0.5
+Target: riscv64-unknown-linux-gnu
+Thread model: posix
+InstalledDir: /home/myon/.local/share/ruyi/binaries/x86_64/llvm-upstream-17.0.5-ruyi.20231121/bin

退出编译环境:

bash
«Ruyi llvm_venv» $ ruyi-deactivate
+$
«Ruyi llvm_venv» $ ruyi-deactivate
+$
`,16),e=[o];function c(r,t,y,E,F,i){return n(),l("div",null,e)}const v=s(p,[["render",c]]);export{B as __pageData,v as default}; diff --git a/assets/zh_environment_llvm-generic_index.md.22159a68.lean.js b/assets/zh_environment_llvm-generic_index.md.22159a68.lean.js new file mode 100644 index 00000000..1be10463 --- /dev/null +++ b/assets/zh_environment_llvm-generic_index.md.22159a68.lean.js @@ -0,0 +1 @@ +import{_ as s,o as n,c as l,Q as a}from"./chunks/framework.76cb5871.js";const B=JSON.parse('{"title":"使用 LLVM 上游工具链配置 RISC-V 编译环境","description":"","frontmatter":{},"headers":[],"relativePath":"zh/environment/llvm-generic/index.md","filePath":"zh/environment/llvm-generic/index.md","lastUpdated":1702129622000}'),p={name:"zh/environment/llvm-generic/index.md"},o=a("",16),e=[o];function c(r,t,y,E,F,i){return n(),l("div",null,e)}const v=s(p,[["render",c]]);export{B as __pageData,v as default}; diff --git a/assets/zh_environment_plct-milkv-duo_index.md.3a67286f.js b/assets/zh_environment_plct-milkv-duo_index.md.3a67286f.js new file mode 100644 index 00000000..0114ec21 --- /dev/null +++ b/assets/zh_environment_plct-milkv-duo_index.md.3a67286f.js @@ -0,0 +1,73 @@ +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.76cb5871.js";const C=JSON.parse('{"title":"使用 PLCT 工具链配置 Milkv-Duo 编译环境","description":"","frontmatter":{},"headers":[],"relativePath":"zh/environment/plct-milkv-duo/index.md","filePath":"zh/environment/plct-milkv-duo/index.md","lastUpdated":1702129622000}'),p={name:"zh/environment/plct-milkv-duo/index.md"},o=l(`

使用 PLCT 工具链配置 Milkv-Duo 编译环境

PLCT 工具链软件包名为 gnu-plct , v0.2 最新版本二进制为 gnu-plct-20231118 :

bash
$ ruyi install slug:gnu-plct-20231118
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  232M  100  232M    0     0  10.6M      0  0:00:21  0:00:21 --:--:-- 10.9M
+info: extracting RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz for package gnu-plct-0.20231118.0
+info: package gnu-plct-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-plct-0.20231118.0
$ ruyi install slug:gnu-plct-20231118
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  232M  100  232M    0     0  10.6M      0  0:00:21  0:00:21 --:--:-- 10.9M
+info: extracting RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz for package gnu-plct-0.20231118.0
+info: package gnu-plct-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-plct-0.20231118.0

由预置的 milkv-duo 配置在 ./milkv-venv 目录建立编译环境:

bash
$ ruyi venv -t slug:gnu-plct-20231118 milkv-duo ./milkv-venv
+info: Creating a Ruyi virtual environment at milkv-venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking \`ruyi-deactivate\`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/milkv-venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.
$ ruyi venv -t slug:gnu-plct-20231118 milkv-duo ./milkv-venv
+info: Creating a Ruyi virtual environment at milkv-venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking \`ruyi-deactivate\`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/milkv-venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.

查看可用的工具链二进制:

bash
$ ls ./venv/bin/
+riscv64-plct-linux-gnu-addr2line  riscv64-plct-linux-gnu-gcc            riscv64-plct-linux-gnu-gfortran  riscv64-plct-linux-gnu-ranlib
+riscv64-plct-linux-gnu-ar         riscv64-plct-linux-gnu-gcc-ar         riscv64-plct-linux-gnu-gprof     riscv64-plct-linux-gnu-readelf
+riscv64-plct-linux-gnu-as         riscv64-plct-linux-gnu-gcc-nm         riscv64-plct-linux-gnu-ld        riscv64-plct-linux-gnu-size
+riscv64-plct-linux-gnu-c++        riscv64-plct-linux-gnu-gcc-ranlib     riscv64-plct-linux-gnu-ld.bfd    riscv64-plct-linux-gnu-strings
+riscv64-plct-linux-gnu-cc         riscv64-plct-linux-gnu-gcov           riscv64-plct-linux-gnu-ldd       riscv64-plct-linux-gnu-strip
+riscv64-plct-linux-gnu-c++filt    riscv64-plct-linux-gnu-gcov-dump      riscv64-plct-linux-gnu-lto-dump  ruyi-activate
+riscv64-plct-linux-gnu-cpp        riscv64-plct-linux-gnu-gcov-tool      riscv64-plct-linux-gnu-nm
+riscv64-plct-linux-gnu-elfedit    riscv64-plct-linux-gnu-gdb            riscv64-plct-linux-gnu-objcopy
+riscv64-plct-linux-gnu-g++        riscv64-plct-linux-gnu-gdb-add-index  riscv64-plct-linux-gnu-objdump
$ ls ./venv/bin/
+riscv64-plct-linux-gnu-addr2line  riscv64-plct-linux-gnu-gcc            riscv64-plct-linux-gnu-gfortran  riscv64-plct-linux-gnu-ranlib
+riscv64-plct-linux-gnu-ar         riscv64-plct-linux-gnu-gcc-ar         riscv64-plct-linux-gnu-gprof     riscv64-plct-linux-gnu-readelf
+riscv64-plct-linux-gnu-as         riscv64-plct-linux-gnu-gcc-nm         riscv64-plct-linux-gnu-ld        riscv64-plct-linux-gnu-size
+riscv64-plct-linux-gnu-c++        riscv64-plct-linux-gnu-gcc-ranlib     riscv64-plct-linux-gnu-ld.bfd    riscv64-plct-linux-gnu-strings
+riscv64-plct-linux-gnu-cc         riscv64-plct-linux-gnu-gcov           riscv64-plct-linux-gnu-ldd       riscv64-plct-linux-gnu-strip
+riscv64-plct-linux-gnu-c++filt    riscv64-plct-linux-gnu-gcov-dump      riscv64-plct-linux-gnu-lto-dump  ruyi-activate
+riscv64-plct-linux-gnu-cpp        riscv64-plct-linux-gnu-gcov-tool      riscv64-plct-linux-gnu-nm
+riscv64-plct-linux-gnu-elfedit    riscv64-plct-linux-gnu-gdb            riscv64-plct-linux-gnu-objcopy
+riscv64-plct-linux-gnu-g++        riscv64-plct-linux-gnu-gdb-add-index  riscv64-plct-linux-gnu-objdump

除了 ruyi-activate 为激活编译环境用的脚本,其他均为工具链二进制。

激活编译环境:

bash
$ . milkv-venv/bin/ruyi-activate
+«Ruyi milkv-venv» $
$ . milkv-venv/bin/ruyi-activate
+«Ruyi milkv-venv» $

此时应当可以正常调用工具链

bash
«Ruyi milkv-venv» $ riscv64-plct-linux-gnu-gcc --version
+riscv64-plct-linux-gnu-gcc (RuyiSDK 20231118 PLCT-Sources) 13.1.0
+Copyright (C) 2023 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
«Ruyi milkv-venv» $ riscv64-plct-linux-gnu-gcc --version
+riscv64-plct-linux-gnu-gcc (RuyiSDK 20231118 PLCT-Sources) 13.1.0
+Copyright (C) 2023 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

退出编译环境:

bash
«Ruyi venv» $ ruyi-deactivate
+$
«Ruyi venv» $ ruyi-deactivate
+$
`,14),c=[o];function e(t,r,E,y,F,i){return n(),a("div",null,c)}const v=s(p,[["render",e]]);export{C as __pageData,v as default}; diff --git a/assets/zh_environment_plct-milkv-duo_index.md.3a67286f.lean.js b/assets/zh_environment_plct-milkv-duo_index.md.3a67286f.lean.js new file mode 100644 index 00000000..15193113 --- /dev/null +++ b/assets/zh_environment_plct-milkv-duo_index.md.3a67286f.lean.js @@ -0,0 +1 @@ +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.76cb5871.js";const C=JSON.parse('{"title":"使用 PLCT 工具链配置 Milkv-Duo 编译环境","description":"","frontmatter":{},"headers":[],"relativePath":"zh/environment/plct-milkv-duo/index.md","filePath":"zh/environment/plct-milkv-duo/index.md","lastUpdated":1702129622000}'),p={name:"zh/environment/plct-milkv-duo/index.md"},o=l("",14),c=[o];function e(t,r,E,y,F,i){return n(),a("div",null,c)}const v=s(p,[["render",e]]);export{C as __pageData,v as default}; diff --git a/assets/zh_environment_xthead-sipeed-lpi4a_index.md.1e5178cf.js b/assets/zh_environment_xthead-sipeed-lpi4a_index.md.1e5178cf.js new file mode 100644 index 00000000..49cd5e55 --- /dev/null +++ b/assets/zh_environment_xthead-sipeed-lpi4a_index.md.1e5178cf.js @@ -0,0 +1,163 @@ +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.76cb5871.js";const d=JSON.parse('{"title":"使用平头哥工具链配置荔枝派 4A 编译环境","description":"","frontmatter":{},"headers":[],"relativePath":"zh/environment/xthead-sipeed-lpi4a/index.md","filePath":"zh/environment/xthead-sipeed-lpi4a/index.md","lastUpdated":1702129622000}'),p={name:"zh/environment/xthead-sipeed-lpi4a/index.md"},o=l(`

使用平头哥工具链配置荔枝派 4A 编译环境

list profiles 的输出可以看到,预置的 sipeed-lpi4a 配置需要支持 xthead 特性的工具链包。 若指定不支持该特性的工具链建立虚拟环境并不会报错,但是在构建过程中将会报错:

bash
$ ruyi venv -t slug:gnu-plct-20231118 sipeed-lpi4a venv
+info: Creating a Ruyi virtual environment at venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking \`ruyi-deactivate\`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.
+
+$ . venv/bin/ruyi-activate
+«Ruyi venv» $ riscv64-plct-linux-gnu-gcc test.c
+cc1: error: '-mcpu=c910': unknown CPU
+cc1: error: unknown cpu 'c910' for '-mtune'
$ ruyi venv -t slug:gnu-plct-20231118 sipeed-lpi4a venv
+info: Creating a Ruyi virtual environment at venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking \`ruyi-deactivate\`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.
+
+$ . venv/bin/ruyi-activate
+«Ruyi venv» $ riscv64-plct-linux-gnu-gcc test.c
+cc1: error: '-mcpu=c910': unknown CPU
+cc1: error: unknown cpu 'c910' for '-mtune'

ruyi list -v 中可以看到 gnu-plct-xthead 工具链是支持该特性的:

bash
$ ruyi list -v
+
+...
+
+## toolchain/gnu-plct-xthead 0.20231118.0
+
+...
+
+### Toolchain metadata
+
+* Target: riscv64-plctxthead-linux-gnu
+* Flavors: ['xthead']
+* Components:
+    - binutils 2.35
+    - gcc 10.2.0
+    - gdb 10.0
+    - glibc 2.33
+    - linux-headers 6.4
+
+...
$ ruyi list -v
+
+...
+
+## toolchain/gnu-plct-xthead 0.20231118.0
+
+...
+
+### Toolchain metadata
+
+* Target: riscv64-plctxthead-linux-gnu
+* Flavors: ['xthead']
+* Components:
+    - binutils 2.35
+    - gcc 10.2.0
+    - gdb 10.0
+    - glibc 2.33
+    - linux-headers 6.4
+
+...

平头哥工具链软件包名为 gnu-plct-xthead , v0.2 最新版本二进制为 gnu-plct-xthead-20231118 :

bash
$ ruyi install slug:gnu-plct-xthead-20231118
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  273M  100  273M    0     0  10.8M      0  0:00:25  0:00:25 --:--:-- 10.9M
+info: extracting RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz for package gnu-plct-xthead-0.20231118.0
+info: package gnu-plct-xthead-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-plct-xthead-0.20231118.0
$ ruyi install slug:gnu-plct-xthead-20231118
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  273M  100  273M    0     0  10.8M      0  0:00:25  0:00:25 --:--:-- 10.9M
+info: extracting RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz for package gnu-plct-xthead-0.20231118.0
+info: package gnu-plct-xthead-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-plct-xthead-0.20231118.0

由预置的 sipeed-lpi4a 配置在 ./sipeed-venv 建立编译环境:

bash
$ ruyi venv -t slug:gnu-plct-xthead-20231118 sipeed-lpi4a ./sipeed-venv
+info: Creating a Ruyi virtual environment at sipeed-venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking \`ruyi-deactivate\`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/sipeed-venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.
$ ruyi venv -t slug:gnu-plct-xthead-20231118 sipeed-lpi4a ./sipeed-venv
+info: Creating a Ruyi virtual environment at sipeed-venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking \`ruyi-deactivate\`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/sipeed-venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.

查看可用的工具链二进制:

bash
$ ls ./sipeed-venv/bin/
+riscv64-plctxthead-linux-gnu-addr2line  riscv64-plctxthead-linux-gnu-gcc-nm         riscv64-plctxthead-linux-gnu-ldd
+riscv64-plctxthead-linux-gnu-ar         riscv64-plctxthead-linux-gnu-gcc-ranlib     riscv64-plctxthead-linux-gnu-lto-dump
+riscv64-plctxthead-linux-gnu-as         riscv64-plctxthead-linux-gnu-gcov           riscv64-plctxthead-linux-gnu-nm
+riscv64-plctxthead-linux-gnu-c++        riscv64-plctxthead-linux-gnu-gcov-dump      riscv64-plctxthead-linux-gnu-objcopy
+riscv64-plctxthead-linux-gnu-cc         riscv64-plctxthead-linux-gnu-gcov-tool      riscv64-plctxthead-linux-gnu-objdump
+riscv64-plctxthead-linux-gnu-c++filt    riscv64-plctxthead-linux-gnu-gdb            riscv64-plctxthead-linux-gnu-ranlib
+riscv64-plctxthead-linux-gnu-cpp        riscv64-plctxthead-linux-gnu-gdb-add-index  riscv64-plctxthead-linux-gnu-readelf
+riscv64-plctxthead-linux-gnu-elfedit    riscv64-plctxthead-linux-gnu-gfortran       riscv64-plctxthead-linux-gnu-size
+riscv64-plctxthead-linux-gnu-g++        riscv64-plctxthead-linux-gnu-gprof          riscv64-plctxthead-linux-gnu-strings
+riscv64-plctxthead-linux-gnu-gcc        riscv64-plctxthead-linux-gnu-ld             riscv64-plctxthead-linux-gnu-strip
+riscv64-plctxthead-linux-gnu-gcc-ar     riscv64-plctxthead-linux-gnu-ld.bfd         ruyi-activate
$ ls ./sipeed-venv/bin/
+riscv64-plctxthead-linux-gnu-addr2line  riscv64-plctxthead-linux-gnu-gcc-nm         riscv64-plctxthead-linux-gnu-ldd
+riscv64-plctxthead-linux-gnu-ar         riscv64-plctxthead-linux-gnu-gcc-ranlib     riscv64-plctxthead-linux-gnu-lto-dump
+riscv64-plctxthead-linux-gnu-as         riscv64-plctxthead-linux-gnu-gcov           riscv64-plctxthead-linux-gnu-nm
+riscv64-plctxthead-linux-gnu-c++        riscv64-plctxthead-linux-gnu-gcov-dump      riscv64-plctxthead-linux-gnu-objcopy
+riscv64-plctxthead-linux-gnu-cc         riscv64-plctxthead-linux-gnu-gcov-tool      riscv64-plctxthead-linux-gnu-objdump
+riscv64-plctxthead-linux-gnu-c++filt    riscv64-plctxthead-linux-gnu-gdb            riscv64-plctxthead-linux-gnu-ranlib
+riscv64-plctxthead-linux-gnu-cpp        riscv64-plctxthead-linux-gnu-gdb-add-index  riscv64-plctxthead-linux-gnu-readelf
+riscv64-plctxthead-linux-gnu-elfedit    riscv64-plctxthead-linux-gnu-gfortran       riscv64-plctxthead-linux-gnu-size
+riscv64-plctxthead-linux-gnu-g++        riscv64-plctxthead-linux-gnu-gprof          riscv64-plctxthead-linux-gnu-strings
+riscv64-plctxthead-linux-gnu-gcc        riscv64-plctxthead-linux-gnu-ld             riscv64-plctxthead-linux-gnu-strip
+riscv64-plctxthead-linux-gnu-gcc-ar     riscv64-plctxthead-linux-gnu-ld.bfd         ruyi-activate

进入编译环境并编译一个简单的 C 程序:

bash
$ . sipeed-venv/bin/ruyi-activate
+«Ruyi sipeed-venv» $ cd sipeed-venv/
+«Ruyi sipeed-venv» $ cat > test.c << EOF
+int main()
+{
+    return 0;
+}
+EOF
+«Ruyi sipeed-venv» $ riscv64-plctxthead-linux-gnu-gcc test.c
+«Ruyi sipeed-venv» $ file a.out
+a.out: ELF 64-bit LSB executable, UCB RISC-V, RVC, double-float ABI, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64xthead-lp64d.so.1, BuildID[sha1]=a6c6dcc8a7565fc17427d8ece055874c9bbf6a7a, for GNU/Linux 4.15.0, with debug_info, not stripped
$ . sipeed-venv/bin/ruyi-activate
+«Ruyi sipeed-venv» $ cd sipeed-venv/
+«Ruyi sipeed-venv» $ cat > test.c << EOF
+int main()
+{
+    return 0;
+}
+EOF
+«Ruyi sipeed-venv» $ riscv64-plctxthead-linux-gnu-gcc test.c
+«Ruyi sipeed-venv» $ file a.out
+a.out: ELF 64-bit LSB executable, UCB RISC-V, RVC, double-float ABI, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64xthead-lp64d.so.1, BuildID[sha1]=a6c6dcc8a7565fc17427d8ece055874c9bbf6a7a, for GNU/Linux 4.15.0, with debug_info, not stripped

成功编译并生成 RISC-V 架构的二进制。

退出编译环境:

bash
«Ruyi sipeed-venv» $ ruyi-deactivate
+$
«Ruyi sipeed-venv» $ ruyi-deactivate
+$
`,16),e=[o];function c(t,r,E,y,F,i){return n(),a("div",null,e)}const B=s(p,[["render",c]]);export{d as __pageData,B as default}; diff --git a/assets/zh_environment_xthead-sipeed-lpi4a_index.md.1e5178cf.lean.js b/assets/zh_environment_xthead-sipeed-lpi4a_index.md.1e5178cf.lean.js new file mode 100644 index 00000000..711e7488 --- /dev/null +++ b/assets/zh_environment_xthead-sipeed-lpi4a_index.md.1e5178cf.lean.js @@ -0,0 +1 @@ +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.76cb5871.js";const d=JSON.parse('{"title":"使用平头哥工具链配置荔枝派 4A 编译环境","description":"","frontmatter":{},"headers":[],"relativePath":"zh/environment/xthead-sipeed-lpi4a/index.md","filePath":"zh/environment/xthead-sipeed-lpi4a/index.md","lastUpdated":1702129622000}'),p={name:"zh/environment/xthead-sipeed-lpi4a/index.md"},o=l("",16),e=[o];function c(t,r,E,y,F,i){return n(),a("div",null,e)}const B=s(p,[["render",c]]);export{d as __pageData,B as default}; diff --git a/assets/zh_index.md.d295970d.js b/assets/zh_index.md.05afa7cc.js similarity index 91% rename from assets/zh_index.md.d295970d.js rename to assets/zh_index.md.05afa7cc.js index 45717e70..7e122dfc 100644 --- a/assets/zh_index.md.d295970d.js +++ b/assets/zh_index.md.05afa7cc.js @@ -1 +1 @@ -import{_ as t,o as e,c as a}from"./chunks/framework.76cb5871.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"RuyiSDK 文档","text":"","tagline":"本手册包含了 RuyiSDK 如何构建、如何使用的相关内容。","actions":[{"theme":"brand","text":"快速开始","link":"/zh/introduction/index"},{"theme":"alt","text":"Github","link":"https://github.com/ruyisdk/ruyi"}]},"features":[{"title":"RISCV-GCC","details":"TODO"},{"title":"LLVM","details":"TODO"}]},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md","lastUpdated":1701843761000}'),i={name:"zh/index.md"};function n(o,r,s,d,c,l){return e(),a("div")}const p=t(i,[["render",n]]);export{m as __pageData,p as default}; +import{_ as t,o as e,c as a}from"./chunks/framework.76cb5871.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"RuyiSDK 文档","text":"","tagline":"本手册包含了 RuyiSDK 如何构建、如何使用的相关内容。","actions":[{"theme":"brand","text":"快速开始","link":"/zh/introduction/index"},{"theme":"alt","text":"Github","link":"https://github.com/ruyisdk/ruyi"}]},"features":[{"title":"RISCV-GCC","details":"TODO"},{"title":"LLVM","details":"TODO"}]},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md","lastUpdated":1702129622000}'),i={name:"zh/index.md"};function n(o,r,s,d,c,l){return e(),a("div")}const p=t(i,[["render",n]]);export{m as __pageData,p as default}; diff --git a/assets/zh_index.md.d295970d.lean.js b/assets/zh_index.md.05afa7cc.lean.js similarity index 91% rename from assets/zh_index.md.d295970d.lean.js rename to assets/zh_index.md.05afa7cc.lean.js index 45717e70..7e122dfc 100644 --- a/assets/zh_index.md.d295970d.lean.js +++ b/assets/zh_index.md.05afa7cc.lean.js @@ -1 +1 @@ -import{_ as t,o as e,c as a}from"./chunks/framework.76cb5871.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"RuyiSDK 文档","text":"","tagline":"本手册包含了 RuyiSDK 如何构建、如何使用的相关内容。","actions":[{"theme":"brand","text":"快速开始","link":"/zh/introduction/index"},{"theme":"alt","text":"Github","link":"https://github.com/ruyisdk/ruyi"}]},"features":[{"title":"RISCV-GCC","details":"TODO"},{"title":"LLVM","details":"TODO"}]},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md","lastUpdated":1701843761000}'),i={name:"zh/index.md"};function n(o,r,s,d,c,l){return e(),a("div")}const p=t(i,[["render",n]]);export{m as __pageData,p as default}; +import{_ as t,o as e,c as a}from"./chunks/framework.76cb5871.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"RuyiSDK 文档","text":"","tagline":"本手册包含了 RuyiSDK 如何构建、如何使用的相关内容。","actions":[{"theme":"brand","text":"快速开始","link":"/zh/introduction/index"},{"theme":"alt","text":"Github","link":"https://github.com/ruyisdk/ruyi"}]},"features":[{"title":"RISCV-GCC","details":"TODO"},{"title":"LLVM","details":"TODO"}]},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md","lastUpdated":1702129622000}'),i={name:"zh/index.md"};function n(o,r,s,d,c,l){return e(),a("div")}const p=t(i,[["render",n]]);export{m as __pageData,p as default}; diff --git a/assets/zh_index_en.md.02ef3b95.js b/assets/zh_index_en.md.a6c3ff8b.js similarity index 93% rename from assets/zh_index_en.md.02ef3b95.js rename to assets/zh_index_en.md.a6c3ff8b.js index b6decde8..d5b3c2c0 100644 --- a/assets/zh_index_en.md.02ef3b95.js +++ b/assets/zh_index_en.md.a6c3ff8b.js @@ -1 +1 @@ -import{_ as e,o as t,c as i}from"./chunks/framework.76cb5871.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"RuyiSDK 文档","text":"","tagline":"本手册包含了 RuyiSDK 如何构建、如何使用的相关内容。","actions":[{"theme":"brand","text":"快速开始","link":"/en/introduction/index"},{"theme":"alt","text":"Github","link":"https://github.com/ruyisdk/ruyi"}]},"features":[{"title":"RISCV-GCC","details":"Lorem ipsum dolor sit amet, consectetur adipiscing elit"},{"title":"LLVM","details":"Lorem ipsum dolor sit amet, consectetur adipiscing elit"},{"title":"QEMU","details":"Lorem ipsum dolor sit amet, consectetur adipiscing elit"}]},"headers":[],"relativePath":"zh/index_en.md","filePath":"zh/index_en.md","lastUpdated":1701843761000}'),n={name:"zh/index_en.md"};function a(o,s,r,d,c,l){return t(),i("div")}const u=e(n,[["render",a]]);export{p as __pageData,u as default}; +import{_ as e,o as t,c as i}from"./chunks/framework.76cb5871.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"RuyiSDK 文档","text":"","tagline":"本手册包含了 RuyiSDK 如何构建、如何使用的相关内容。","actions":[{"theme":"brand","text":"快速开始","link":"/en/introduction/index"},{"theme":"alt","text":"Github","link":"https://github.com/ruyisdk/ruyi"}]},"features":[{"title":"RISCV-GCC","details":"Lorem ipsum dolor sit amet, consectetur adipiscing elit"},{"title":"LLVM","details":"Lorem ipsum dolor sit amet, consectetur adipiscing elit"},{"title":"QEMU","details":"Lorem ipsum dolor sit amet, consectetur adipiscing elit"}]},"headers":[],"relativePath":"zh/index_en.md","filePath":"zh/index_en.md","lastUpdated":1702129622000}'),n={name:"zh/index_en.md"};function a(o,s,r,d,c,l){return t(),i("div")}const u=e(n,[["render",a]]);export{p as __pageData,u as default}; diff --git a/assets/zh_index_en.md.02ef3b95.lean.js b/assets/zh_index_en.md.a6c3ff8b.lean.js similarity index 93% rename from assets/zh_index_en.md.02ef3b95.lean.js rename to assets/zh_index_en.md.a6c3ff8b.lean.js index b6decde8..d5b3c2c0 100644 --- a/assets/zh_index_en.md.02ef3b95.lean.js +++ b/assets/zh_index_en.md.a6c3ff8b.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as i}from"./chunks/framework.76cb5871.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"RuyiSDK 文档","text":"","tagline":"本手册包含了 RuyiSDK 如何构建、如何使用的相关内容。","actions":[{"theme":"brand","text":"快速开始","link":"/en/introduction/index"},{"theme":"alt","text":"Github","link":"https://github.com/ruyisdk/ruyi"}]},"features":[{"title":"RISCV-GCC","details":"Lorem ipsum dolor sit amet, consectetur adipiscing elit"},{"title":"LLVM","details":"Lorem ipsum dolor sit amet, consectetur adipiscing elit"},{"title":"QEMU","details":"Lorem ipsum dolor sit amet, consectetur adipiscing elit"}]},"headers":[],"relativePath":"zh/index_en.md","filePath":"zh/index_en.md","lastUpdated":1701843761000}'),n={name:"zh/index_en.md"};function a(o,s,r,d,c,l){return t(),i("div")}const u=e(n,[["render",a]]);export{p as __pageData,u as default}; +import{_ as e,o as t,c as i}from"./chunks/framework.76cb5871.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"RuyiSDK 文档","text":"","tagline":"本手册包含了 RuyiSDK 如何构建、如何使用的相关内容。","actions":[{"theme":"brand","text":"快速开始","link":"/en/introduction/index"},{"theme":"alt","text":"Github","link":"https://github.com/ruyisdk/ruyi"}]},"features":[{"title":"RISCV-GCC","details":"Lorem ipsum dolor sit amet, consectetur adipiscing elit"},{"title":"LLVM","details":"Lorem ipsum dolor sit amet, consectetur adipiscing elit"},{"title":"QEMU","details":"Lorem ipsum dolor sit amet, consectetur adipiscing elit"}]},"headers":[],"relativePath":"zh/index_en.md","filePath":"zh/index_en.md","lastUpdated":1702129622000}'),n={name:"zh/index_en.md"};function a(o,s,r,d,c,l){return t(),i("div")}const u=e(n,[["render",a]]);export{p as __pageData,u as default}; diff --git a/assets/zh_introduction_index.md.275fcd50.js b/assets/zh_introduction_index.md.90a7a037.js similarity index 97% rename from assets/zh_introduction_index.md.275fcd50.js rename to assets/zh_introduction_index.md.90a7a037.js index d0d4053b..e742bb1a 100644 --- a/assets/zh_introduction_index.md.275fcd50.js +++ b/assets/zh_introduction_index.md.90a7a037.js @@ -1 +1 @@ -import{_ as a,o as e,c as r,Q as t}from"./chunks/framework.76cb5871.js";const i="/docs/assets/ruyisdk.14950052.png",k=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"zh/introduction/index.md","filePath":"zh/introduction/index.md","lastUpdated":1701843761000}'),o={name:"zh/introduction/index.md"},s=t('

介绍

RUYISDK 是一个旨在提供给一个一体化集成开发环境的产品计划。从 2023 年开始筹备,计划用三年时间为 RISC-V 开发者提供一个完整的、全家桶式的全功能开发环境。

RUYISDK 的目标

  1. 开发者购买了 (几乎) 任何一款 RISC-V 开发板或模组,都可以通过 RUYISDK 系统获得硬件资料说明、固件 / 软件更新、调试支持等。
  2. 开发者可以指定任何常用的 RISC-V 扩展指令集架构组合,都可以通过 RUYISDK 系统生成客户所需的操作系统、工具链、语言执行环境 (运行时或虚拟机)、计算库、应用框架等。尤其强调 RUYISDK 将完全支持 Vector 0.7.1 和 RVP 0.5.2 等已经大规模硅化的草案 标准 (or 厂商定制扩展)。
  3. 培育运营一个活跃全面的开发者交流社区。

RUYISDK 架构示意图

image

RuyiSDK 包含的内容

RuyiSDK 包管理器

GitHub 项目

文档

',10),d=[s];function n(l,c,h,u,_,p){return e(),r("div",null,d)}const m=a(o,[["render",n]]);export{k as __pageData,m as default}; +import{_ as a,o as e,c as r,Q as t}from"./chunks/framework.76cb5871.js";const i="/docs/assets/ruyisdk.14950052.png",k=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"zh/introduction/index.md","filePath":"zh/introduction/index.md","lastUpdated":1702129622000}'),o={name:"zh/introduction/index.md"},s=t('

介绍

RUYISDK 是一个旨在提供给一个一体化集成开发环境的产品计划。从 2023 年开始筹备,计划用三年时间为 RISC-V 开发者提供一个完整的、全家桶式的全功能开发环境。

RUYISDK 的目标

  1. 开发者购买了 (几乎) 任何一款 RISC-V 开发板或模组,都可以通过 RUYISDK 系统获得硬件资料说明、固件 / 软件更新、调试支持等。
  2. 开发者可以指定任何常用的 RISC-V 扩展指令集架构组合,都可以通过 RUYISDK 系统生成客户所需的操作系统、工具链、语言执行环境 (运行时或虚拟机)、计算库、应用框架等。尤其强调 RUYISDK 将完全支持 Vector 0.7.1 和 RVP 0.5.2 等已经大规模硅化的草案 标准 (or 厂商定制扩展)。
  3. 培育运营一个活跃全面的开发者交流社区。

RUYISDK 架构示意图

image

RuyiSDK 包含的内容

RuyiSDK 包管理器

GitHub 项目

文档

',10),d=[s];function n(l,c,h,u,_,p){return e(),r("div",null,d)}const m=a(o,[["render",n]]);export{k as __pageData,m as default}; diff --git a/assets/zh_introduction_index.md.275fcd50.lean.js b/assets/zh_introduction_index.md.90a7a037.lean.js similarity index 86% rename from assets/zh_introduction_index.md.275fcd50.lean.js rename to assets/zh_introduction_index.md.90a7a037.lean.js index 8d6cf1d7..f29a66b4 100644 --- a/assets/zh_introduction_index.md.275fcd50.lean.js +++ b/assets/zh_introduction_index.md.90a7a037.lean.js @@ -1 +1 @@ -import{_ as a,o as e,c as r,Q as t}from"./chunks/framework.76cb5871.js";const i="/docs/assets/ruyisdk.14950052.png",k=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"zh/introduction/index.md","filePath":"zh/introduction/index.md","lastUpdated":1701843761000}'),o={name:"zh/introduction/index.md"},s=t("",10),d=[s];function n(l,c,h,u,_,p){return e(),r("div",null,d)}const m=a(o,[["render",n]]);export{k as __pageData,m as default}; +import{_ as a,o as e,c as r,Q as t}from"./chunks/framework.76cb5871.js";const i="/docs/assets/ruyisdk.14950052.png",k=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"zh/introduction/index.md","filePath":"zh/introduction/index.md","lastUpdated":1702129622000}'),o={name:"zh/introduction/index.md"},s=t("",10),d=[s];function n(l,c,h,u,_,p){return e(),r("div",null,d)}const m=a(o,[["render",n]]);export{k as __pageData,m as default}; diff --git a/assets/zh_mirror_index.md.4268033b.js b/assets/zh_mirror_index.md.4268033b.js new file mode 100644 index 00000000..fca97624 --- /dev/null +++ b/assets/zh_mirror_index.md.4268033b.js @@ -0,0 +1,21 @@ +import{_ as s,o as a,c as n,Q as o}from"./chunks/framework.76cb5871.js";const F=JSON.parse('{"title":"用户软件源搭建","description":"","frontmatter":{},"headers":[],"relativePath":"zh/mirror/index.md","filePath":"zh/mirror/index.md","lastUpdated":1702129622000}'),l={name:"zh/mirror/index.md"},p=o(`

用户软件源搭建

软件源搭建功能在 v0.2 尚未开发完全,仅有建立 manifest 的功能。

建立 manifest :

bash
$ ruyi admin manifest ./source/zlib-ng-2.1.5.tar.gz
+[
+  {
+    "name": "zlib-ng-2.1.5.tar.gz",
+    "size": 2410601,
+    "checksums": {
+      "sha512": "9212d87c63a2da4e5355a7a1c75380aeba40fbd0ea3d71d3784cb3eac94237f9bea2a1b7993a08f39d4197725c4c133087d3a9d213d3944aa48a7559de2be920",
+      "sha256": "3f6576971397b379d4205ae5451ff5a68edf6c103b2f03c4188ed7075fbb5f04"
+    }
+  }
+]
$ ruyi admin manifest ./source/zlib-ng-2.1.5.tar.gz
+[
+  {
+    "name": "zlib-ng-2.1.5.tar.gz",
+    "size": 2410601,
+    "checksums": {
+      "sha512": "9212d87c63a2da4e5355a7a1c75380aeba40fbd0ea3d71d3784cb3eac94237f9bea2a1b7993a08f39d4197725c4c133087d3a9d213d3944aa48a7559de2be920",
+      "sha256": "3f6576971397b379d4205ae5451ff5a68edf6c103b2f03c4188ed7075fbb5f04"
+    }
+  }
+]
`,4),e=[p];function t(c,r,E,y,i,d){return a(),n("div",null,e)}const q=s(l,[["render",t]]);export{F as __pageData,q as default}; diff --git a/assets/zh_mirror_index.md.4268033b.lean.js b/assets/zh_mirror_index.md.4268033b.lean.js new file mode 100644 index 00000000..b4fbe9c5 --- /dev/null +++ b/assets/zh_mirror_index.md.4268033b.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,Q as o}from"./chunks/framework.76cb5871.js";const F=JSON.parse('{"title":"用户软件源搭建","description":"","frontmatter":{},"headers":[],"relativePath":"zh/mirror/index.md","filePath":"zh/mirror/index.md","lastUpdated":1702129622000}'),l={name:"zh/mirror/index.md"},p=o("",4),e=[p];function t(c,r,E,y,i,d){return a(),n("div",null,e)}const q=s(l,[["render",t]]);export{F as __pageData,q as default}; diff --git a/assets/zh_plan_index.md.8fa93df9.js b/assets/zh_plan_index.md.08fbf5a0.js similarity index 89% rename from assets/zh_plan_index.md.8fa93df9.js rename to assets/zh_plan_index.md.08fbf5a0.js index 500e7594..42031a6e 100644 --- a/assets/zh_plan_index.md.8fa93df9.js +++ b/assets/zh_plan_index.md.08fbf5a0.js @@ -1 +1 @@ -import{_ as a,o as t,c as n,k as e,a as s}from"./chunks/framework.76cb5871.js";const x=JSON.parse('{"title":"版本规划路线图","description":"","frontmatter":{},"headers":[],"relativePath":"zh/plan/index.md","filePath":"zh/plan/index.md","lastUpdated":1701843761000}'),o={name:"zh/plan/index.md"},r=e("h1",{id:"版本规划路线图",tabindex:"-1"},[s("版本规划路线图 "),e("a",{class:"header-anchor",href:"#版本规划路线图","aria-label":'Permalink to "版本规划路线图"'},"​")],-1),d=[r];function c(i,l,p,_,h,m){return t(),n("div",null,d)}const u=a(o,[["render",c]]);export{x as __pageData,u as default}; +import{_ as a,o as t,c as n,k as e,a as s}from"./chunks/framework.76cb5871.js";const x=JSON.parse('{"title":"版本规划路线图","description":"","frontmatter":{},"headers":[],"relativePath":"zh/plan/index.md","filePath":"zh/plan/index.md","lastUpdated":1702129622000}'),o={name:"zh/plan/index.md"},r=e("h1",{id:"版本规划路线图",tabindex:"-1"},[s("版本规划路线图 "),e("a",{class:"header-anchor",href:"#版本规划路线图","aria-label":'Permalink to "版本规划路线图"'},"​")],-1),d=[r];function c(i,l,p,_,h,m){return t(),n("div",null,d)}const u=a(o,[["render",c]]);export{x as __pageData,u as default}; diff --git a/assets/zh_plan_index.md.8fa93df9.lean.js b/assets/zh_plan_index.md.08fbf5a0.lean.js similarity index 89% rename from assets/zh_plan_index.md.8fa93df9.lean.js rename to assets/zh_plan_index.md.08fbf5a0.lean.js index 500e7594..42031a6e 100644 --- a/assets/zh_plan_index.md.8fa93df9.lean.js +++ b/assets/zh_plan_index.md.08fbf5a0.lean.js @@ -1 +1 @@ -import{_ as a,o as t,c as n,k as e,a as s}from"./chunks/framework.76cb5871.js";const x=JSON.parse('{"title":"版本规划路线图","description":"","frontmatter":{},"headers":[],"relativePath":"zh/plan/index.md","filePath":"zh/plan/index.md","lastUpdated":1701843761000}'),o={name:"zh/plan/index.md"},r=e("h1",{id:"版本规划路线图",tabindex:"-1"},[s("版本规划路线图 "),e("a",{class:"header-anchor",href:"#版本规划路线图","aria-label":'Permalink to "版本规划路线图"'},"​")],-1),d=[r];function c(i,l,p,_,h,m){return t(),n("div",null,d)}const u=a(o,[["render",c]]);export{x as __pageData,u as default}; +import{_ as a,o as t,c as n,k as e,a as s}from"./chunks/framework.76cb5871.js";const x=JSON.parse('{"title":"版本规划路线图","description":"","frontmatter":{},"headers":[],"relativePath":"zh/plan/index.md","filePath":"zh/plan/index.md","lastUpdated":1702129622000}'),o={name:"zh/plan/index.md"},r=e("h1",{id:"版本规划路线图",tabindex:"-1"},[s("版本规划路线图 "),e("a",{class:"header-anchor",href:"#版本规划路线图","aria-label":'Permalink to "版本规划路线图"'},"​")],-1),d=[r];function c(i,l,p,_,h,m){return t(),n("div",null,d)}const u=a(o,[["render",c]]);export{x as __pageData,u as default}; diff --git a/assets/zh_ruyi-package_index.md.26b856ed.js b/assets/zh_ruyi-package_index.md.26b856ed.js new file mode 100644 index 00000000..a8c04405 --- /dev/null +++ b/assets/zh_ruyi-package_index.md.26b856ed.js @@ -0,0 +1,125 @@ +import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.76cb5871.js";const u=JSON.parse('{"title":"Ruyi 包管理器","description":"","frontmatter":{},"headers":[],"relativePath":"zh/ruyi-package/index.md","filePath":"zh/ruyi-package/index.md","lastUpdated":1702129622000}'),p={name:"zh/ruyi-package/index.md"},o=l(`

Ruyi 包管理器

RUYI 包管理是 RuyiSDK 开发中的包管理器。用于管理工具链、模拟器、源码等各种二进制软件包和源码包。

支持的发行版平台

当前 RUYI 包管理器 v0.2 版本在以下平台进行了测试

  • x86-64 Fedora 38
  • x86-64 Ubuntu 22.04 LTS
  • x86-64 openEuler 23.09
  • riscv64 RevyOS 20231026
  • riscv64 openEuler 23.09

命令

RUYI 目前支持的命令如下:

bash
ruyi list
+# 从本地软件包缓存中列出可用软件包
+ruyi list profiles
+# 列出已安装的配置
+ruyi update
+# 从配置的软件源更新本地软件包缓存
+ruyi install
+# 下载并安装指定的软件包
+ruyi venv
+# 由指定的工具链和配置建立 RUYI 虚拟环境
+ruyi extract
+# 下载并解包指定的源码包
+ruyi admin
+# ruyi 镜像搭建工具(完善中)
+ruyi self uninstall
+# 卸载 RUYI 包管理器
ruyi list
+# 从本地软件包缓存中列出可用软件包
+ruyi list profiles
+# 列出已安装的配置
+ruyi update
+# 从配置的软件源更新本地软件包缓存
+ruyi install
+# 下载并安装指定的软件包
+ruyi venv
+# 由指定的工具链和配置建立 RUYI 虚拟环境
+ruyi extract
+# 下载并解包指定的源码包
+ruyi admin
+# ruyi 镜像搭建工具(完善中)
+ruyi self uninstall
+# 卸载 RUYI 包管理器

依赖软件

RUYI 包管理器依赖一些外部工具,需要手动安装

Debian/Ubuntu

bash
$ sudo apt-get install wget git tar bzip2 xz-utils zstd
$ sudo apt-get install wget git tar bzip2 xz-utils zstd

Fedora/openEuler

bash
$ sudo apt-get install wget git tar bzip2 xz zstd
$ sudo apt-get install wget git tar bzip2 xz zstd

安装 RUYI 包管理器

从发布镜像中选择合适架构的预编译二进制下载,当前 RUYI 包管理支持 amd64 和 riscv64 架构编译环境。

v0.2 版本的稳定二进制为 20231204 版本。

这里以 amd64 架构环境为例进行安装:

bash
$ wget https://mirror.iscas.ac.cn/ruyisdk/ruyi/testing/ruyi.amd64.20231204
+$ chmod +x ./ruyi.amd64.20231204
+$ sudo cp ruyi.amd64.20231204 /usr/local/bin/ruyi
+$ ruyi version
+Ruyi 0.2.0-beta.20231204
+Copyright (C) 2023 Institute of Software, Chinese Academy of Sciences (ISCAS).
+All rights reserved.
+License: Apache-2.0 <https://www.apache.org/licenses/LICENSE-2.0>
$ wget https://mirror.iscas.ac.cn/ruyisdk/ruyi/testing/ruyi.amd64.20231204
+$ chmod +x ./ruyi.amd64.20231204
+$ sudo cp ruyi.amd64.20231204 /usr/local/bin/ruyi
+$ ruyi version
+Ruyi 0.2.0-beta.20231204
+Copyright (C) 2023 Institute of Software, Chinese Academy of Sciences (ISCAS).
+All rights reserved.
+License: Apache-2.0 <https://www.apache.org/licenses/LICENSE-2.0>

ruyi version 应当可以正常打印版本信息。注意二进制的文件名必须为 ruyi

列出帮助信息:

bash
$ ruyi --help
+usage: ruyi [-h] [-V] {extract,install,i,list,update,venv,admin,self,version} ...
+
+RuyiSDK Package Manager 0.2.0-beta.20231204
+
+options:
+  -h, --help            show this help message and exit
+  -V, --version         Print version information
+
+subcommands:
+  {extract,install,i,list,update,venv,admin,self,version}
+    extract             Fetch package(s) then extract to current directory
+    install (i)         Install package from configured repository
+    list                List available packages in configured repository
+    update              Update RuyiSDK repo and packages
+    venv                Generate a virtual environment adapted to the chosen toolchain and profile
+    admin               (NOT FOR REGULAR USERS) Subcommands for managing Ruyi repos
+    self                Manage this Ruyi installation
+    version             Print version information
$ ruyi --help
+usage: ruyi [-h] [-V] {extract,install,i,list,update,venv,admin,self,version} ...
+
+RuyiSDK Package Manager 0.2.0-beta.20231204
+
+options:
+  -h, --help            show this help message and exit
+  -V, --version         Print version information
+
+subcommands:
+  {extract,install,i,list,update,venv,admin,self,version}
+    extract             Fetch package(s) then extract to current directory
+    install (i)         Install package from configured repository
+    list                List available packages in configured repository
+    update              Update RuyiSDK repo and packages
+    venv                Generate a virtual environment adapted to the chosen toolchain and profile
+    admin               (NOT FOR REGULAR USERS) Subcommands for managing Ruyi repos
+    self                Manage this Ruyi installation
+    version             Print version information

刷新软件包缓存

更新软件包缓存,使用默认镜像即可:

bash
$ ruyi update
$ ruyi update

软件包缓存将存放在用户目录中,通常为 ~/.cache/ruyi ;在 XDG_CACHE_HOME 环境变量被设置时,目录为 $XDG_CACHE_HOME/ruyi 。 在本文档中家目录为 /home/myon

查看可用的软件包,该命令将列出所有可用的软件包:

bash
$ ruyi list
+List of available packages:
+
+* source/ruyisdk-demo
+  - 0.20231114.0 (latest)
+* source/coremark
+  - 1.0.2-pre.20230125 (prerelease, latest-prerelease)
+  - 1.0.1 (latest)
+* emulator/qemu-user-riscv-xthead
+  - 6.1.0-ruyi.20231207+g03813c9fe8 (latest)
+* emulator/qemu-user-riscv-upstream
+  - 8.1.2-ruyi.20231121 (latest)
+* toolchain/gnu-plct
+  - 0.20231118.0 (latest) slug: gnu-plct-20231118
+* toolchain/gnu-plct-xthead
+  - 0.20231118.0 (latest) slug: gnu-plct-xthead-20231118
+* toolchain/gnu-upstream
+  - 0.20231118.0 (latest) slug: gnu-upstream-20231118
+* toolchain/llvm-upstream
+  - 17.0.5-ruyi.20231121 (latest) slug: llvm-upstream-20231121
$ ruyi list
+List of available packages:
+
+* source/ruyisdk-demo
+  - 0.20231114.0 (latest)
+* source/coremark
+  - 1.0.2-pre.20230125 (prerelease, latest-prerelease)
+  - 1.0.1 (latest)
+* emulator/qemu-user-riscv-xthead
+  - 6.1.0-ruyi.20231207+g03813c9fe8 (latest)
+* emulator/qemu-user-riscv-upstream
+  - 8.1.2-ruyi.20231121 (latest)
+* toolchain/gnu-plct
+  - 0.20231118.0 (latest) slug: gnu-plct-20231118
+* toolchain/gnu-plct-xthead
+  - 0.20231118.0 (latest) slug: gnu-plct-xthead-20231118
+* toolchain/gnu-upstream
+  - 0.20231118.0 (latest) slug: gnu-upstream-20231118
+* toolchain/llvm-upstream
+  - 17.0.5-ruyi.20231121 (latest) slug: llvm-upstream-20231121

从输出可以看到软件包共分为三种,其中 source 代表了软件源码包, toolchain 代表了工具链二进制包, emulator 代表了模拟器二进制包。

如果软件包显示 “no binary for current host” 则该软件包的当前版本不支持本机架构。

列出所有软件包的详细信息:

bash
$ ruyi list -v
$ ruyi list -v

列出已知编译环境配置:

bash
$ ruyi list profiles
+generic
+sipeed-lpi4a (needs flavor(s): {'xthead'})
+milkv-duo
$ ruyi list profiles
+generic
+sipeed-lpi4a (needs flavor(s): {'xthead'})
+milkv-duo

这些预置的配置可以用于编译环境的搭建。

卸载 RUYI 包管理器

使用下面的命令卸载 RUYI 包管理器:

bash
$ ruyi self uninstall
$ ruyi self uninstall

这个命令将会询问您以二次确认该操作,如果希望 RUYI 包管理不询问而直接执行:

bash
$ ruyi self uninstall -y
$ ruyi self uninstall -y

上面的命令只是删除 RUYI 本身,并不会删除软件包缓存和安装的 RUYI 软件包。

如果希望删除所有缓存和安装了的软件包以实现干净的卸载:

bash
$ ruyi self uninstall --purge
$ ruyi self uninstall --purge

同样的这个命令将会询问您以二次确认该操作,如果希望 RUYI 包管理不询问而直接执行:

bash
$ ruyi self uninstall --purge -y
$ ruyi self uninstall --purge -y

实现 RUYI 包管理自身的升级可能会需要超级用户权限,而 RUYI 包管理被设计为避免进行需要超级用户权限的操作。 故在需要升级 RUYI 包管理时您需要手动进行该操作,即首先卸载 RUYI 包管理器,再执行安装 RUYI 包管理器的过程, 这个过程中您可以自主选择是否保留旧的软件包缓存和 RUYI 软件包。

注意 RUYI 包管理器也没有实现卸载 RUYI 软件包的功能。这在您强制中断 RUYI 软件包安装进程或做了其他非预期操作时 可能会导致软件包无法重新安装。此时您可以尝试删除 ~/.local/share/ruyi/binaries/\${XDG_DATA_HOME}/ruyi/binaries/ 下对应的 RUYI 软件包安装目录后再重试安装。手动执行删除软件包操作时, 务必提前确认您的操作会得到预期效果。

`,47),e=[o];function t(c,r,y,E,i,F){return a(),n("div",null,e)}const C=s(p,[["render",t]]);export{u as __pageData,C as default}; diff --git a/assets/zh_ruyi-package_index.md.26b856ed.lean.js b/assets/zh_ruyi-package_index.md.26b856ed.lean.js new file mode 100644 index 00000000..c70cfa78 --- /dev/null +++ b/assets/zh_ruyi-package_index.md.26b856ed.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.76cb5871.js";const u=JSON.parse('{"title":"Ruyi 包管理器","description":"","frontmatter":{},"headers":[],"relativePath":"zh/ruyi-package/index.md","filePath":"zh/ruyi-package/index.md","lastUpdated":1702129622000}'),p={name:"zh/ruyi-package/index.md"},o=l("",47),e=[o];function t(c,r,y,E,i,F){return a(),n("div",null,e)}const C=s(p,[["render",t]]);export{u as __pageData,C as default}; diff --git a/assets/zh_ruyi-package_index.md.ef248f25.js b/assets/zh_ruyi-package_index.md.ef248f25.js deleted file mode 100644 index b6c36889..00000000 --- a/assets/zh_ruyi-package_index.md.ef248f25.js +++ /dev/null @@ -1,5 +0,0 @@ -import{_ as s,o as a,c as l,Q as e}from"./chunks/framework.76cb5871.js";const E=JSON.parse('{"title":"Ruyi 包管理器","description":"","frontmatter":{},"headers":[],"relativePath":"zh/ruyi-package/index.md","filePath":"zh/ruyi-package/index.md","lastUpdated":1701843761000}'),p={name:"zh/ruyi-package/index.md"},n=e(`

Ruyi 包管理器

Ruyi 包管理器是设计为用于 RuyiSDK 的包管理器,用于管理工具链。

安装包管理器

目前,您可以从 Ruyi Mirror 下载预编译二进制文件并将其重命名为 ruyi

bash
wget https://mirror.iscas.ac.cn/ruyisdk/ruyi/testing/ruyi.20231030
-mv ruyi.20231030 ruyi
-chmod +x ruyi
wget https://mirror.iscas.ac.cn/ruyisdk/ruyi/testing/ruyi.20231030
-mv ruyi.20231030 ruyi
-chmod +x ruyi

然后将 ruyi 可执行文件加入 $PATH

bash
export PATH="$PATH:/home/ruyi/"
export PATH="$PATH:/home/ruyi/"

命令

Update

  • 将 RuyiSDK 元数据同步到本地存储
  • 默认情况下,存储库克隆到 $XDG_CACHE_HOME/ruyi/packages-index
  • 如果 $XDG_CACHE_HOME 未设置,则默认为 ~/.cache
bash
ruyi update
ruyi update

List

  • 列出可用的工具链
bash
ruyi list
ruyi list

Install

安装一个选定的包。

bash
ruyi install plct-20231026
ruyi install plct-20231026

移除一个包

移除一个选定的包

bash
ruyi uninstall plct-20231026
ruyi uninstall plct-20231026

列出可用的 Profiles

列出所有可用的 Profiles

bash
ruyi list profiles
ruyi list profiles
`,23),o=[n];function t(c,r,i,d,y,h){return a(),l("div",null,o)}const F=s(p,[["render",t]]);export{E as __pageData,F as default}; diff --git a/assets/zh_ruyi-package_index.md.ef248f25.lean.js b/assets/zh_ruyi-package_index.md.ef248f25.lean.js deleted file mode 100644 index 2a31946f..00000000 --- a/assets/zh_ruyi-package_index.md.ef248f25.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as l,Q as e}from"./chunks/framework.76cb5871.js";const E=JSON.parse('{"title":"Ruyi 包管理器","description":"","frontmatter":{},"headers":[],"relativePath":"zh/ruyi-package/index.md","filePath":"zh/ruyi-package/index.md","lastUpdated":1701843761000}'),p={name:"zh/ruyi-package/index.md"},n=e("",23),o=[n];function t(c,r,i,d,y,h){return a(),l("div",null,o)}const F=s(p,[["render",t]]);export{E as __pageData,F as default}; diff --git a/assets/zh_sdk_gnu_index.md.b7287564.js b/assets/zh_sdk_gnu_index.md.e15bc5c0.js similarity index 99% rename from assets/zh_sdk_gnu_index.md.b7287564.js rename to assets/zh_sdk_gnu_index.md.e15bc5c0.js index a0090d4e..7d1c67ff 100644 --- a/assets/zh_sdk_gnu_index.md.b7287564.js +++ b/assets/zh_sdk_gnu_index.md.e15bc5c0.js @@ -1,4 +1,4 @@ -import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.76cb5871.js";const C=JSON.parse('{"title":"使用 GNU 上游工具链配置 RISC-V 编译环境","description":"","frontmatter":{},"headers":[],"relativePath":"zh/sdk/gnu/index.md","filePath":"zh/sdk/gnu/index.md","lastUpdated":1701843761000}'),o={name:"zh/sdk/gnu/index.md"},p=l(`

使用 GNU 上游工具链配置 RISC-V 编译环境

安装

GNU 上游工具链软件包名为 gnu-upstream,v0.2 最新版本二进制为 gnu-upstream-20231118:

bash
$ ruyi install slug:gnu-upstream-20231118
+import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.76cb5871.js";const C=JSON.parse('{"title":"使用 GNU 上游工具链配置 RISC-V 编译环境","description":"","frontmatter":{},"headers":[],"relativePath":"zh/sdk/gnu/index.md","filePath":"zh/sdk/gnu/index.md","lastUpdated":1702129622000}'),o={name:"zh/sdk/gnu/index.md"},p=l(`

使用 GNU 上游工具链配置 RISC-V 编译环境

安装

GNU 上游工具链软件包名为 gnu-upstream,v0.2 最新版本二进制为 gnu-upstream-20231118:

bash
$ ruyi install slug:gnu-upstream-20231118
 info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz to
 /home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz
   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
diff --git a/assets/zh_sdk_gnu_index.md.b7287564.lean.js b/assets/zh_sdk_gnu_index.md.e15bc5c0.lean.js
similarity index 86%
rename from assets/zh_sdk_gnu_index.md.b7287564.lean.js
rename to assets/zh_sdk_gnu_index.md.e15bc5c0.lean.js
index 3a05ed46..8ca0ad86 100644
--- a/assets/zh_sdk_gnu_index.md.b7287564.lean.js
+++ b/assets/zh_sdk_gnu_index.md.e15bc5c0.lean.js
@@ -1 +1 @@
-import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.76cb5871.js";const C=JSON.parse('{"title":"使用 GNU 上游工具链配置 RISC-V 编译环境","description":"","frontmatter":{},"headers":[],"relativePath":"zh/sdk/gnu/index.md","filePath":"zh/sdk/gnu/index.md","lastUpdated":1701843761000}'),o={name:"zh/sdk/gnu/index.md"},p=l("",25),e=[p];function c(r,t,y,E,F,i){return n(),a("div",null,e)}const v=s(o,[["render",c]]);export{C as __pageData,v as default};
+import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.76cb5871.js";const C=JSON.parse('{"title":"使用 GNU 上游工具链配置 RISC-V 编译环境","description":"","frontmatter":{},"headers":[],"relativePath":"zh/sdk/gnu/index.md","filePath":"zh/sdk/gnu/index.md","lastUpdated":1702129622000}'),o={name:"zh/sdk/gnu/index.md"},p=l("",25),e=[p];function c(r,t,y,E,F,i){return n(),a("div",null,e)}const v=s(o,[["render",c]]);export{C as __pageData,v as default};
diff --git a/assets/zh_sdk_llvm_index.md.63a36805.js b/assets/zh_sdk_llvm_index.md.0cfe75f5.js
similarity index 96%
rename from assets/zh_sdk_llvm_index.md.63a36805.js
rename to assets/zh_sdk_llvm_index.md.0cfe75f5.js
index 7f946e8a..10716b57 100644
--- a/assets/zh_sdk_llvm_index.md.63a36805.js
+++ b/assets/zh_sdk_llvm_index.md.0cfe75f5.js
@@ -1 +1 @@
-import{_ as s,o as a,c as l,Q as e}from"./chunks/framework.76cb5871.js";const h=JSON.parse('{"title":"使用 LLVM 上游工具链配置 RISC-V 编译环境","description":"","frontmatter":{},"headers":[],"relativePath":"zh/sdk/llvm/index.md","filePath":"zh/sdk/llvm/index.md","lastUpdated":1701843761000}'),t={name:"zh/sdk/llvm/index.md"},n=e('

使用 LLVM 上游工具链配置 RISC-V 编译环境

注意在 v0.2 版本中,该部分只适用于在 x86-64 host 配置交叉编译环境。

LLVM 上游工具链软件包名为 llvm-upstream,v0.2 最新版本二进制为 llvm-upstream-20231121。 由于配置 LLVM 工具链环境依赖 gcc 环境,故同时需要安装 gcc 工具链。

bash
ruyi install slug:llvm-upstream-20231121 slug:gnu-upstream-20231118
ruyi install slug:llvm-upstream-20231121 slug:gnu-upstream-20231118
',4),o=[n];function p(c,r,i,d,_,m){return a(),l("div",null,o)}const v=s(t,[["render",p]]);export{h as __pageData,v as default}; +import{_ as s,o as a,c as l,Q as e}from"./chunks/framework.76cb5871.js";const h=JSON.parse('{"title":"使用 LLVM 上游工具链配置 RISC-V 编译环境","description":"","frontmatter":{},"headers":[],"relativePath":"zh/sdk/llvm/index.md","filePath":"zh/sdk/llvm/index.md","lastUpdated":1702129622000}'),t={name:"zh/sdk/llvm/index.md"},n=e('

使用 LLVM 上游工具链配置 RISC-V 编译环境

注意在 v0.2 版本中,该部分只适用于在 x86-64 host 配置交叉编译环境。

LLVM 上游工具链软件包名为 llvm-upstream,v0.2 最新版本二进制为 llvm-upstream-20231121。 由于配置 LLVM 工具链环境依赖 gcc 环境,故同时需要安装 gcc 工具链。

bash
ruyi install slug:llvm-upstream-20231121 slug:gnu-upstream-20231118
ruyi install slug:llvm-upstream-20231121 slug:gnu-upstream-20231118
',4),o=[n];function p(c,r,i,d,_,m){return a(),l("div",null,o)}const v=s(t,[["render",p]]);export{h as __pageData,v as default}; diff --git a/assets/zh_sdk_llvm_index.md.63a36805.lean.js b/assets/zh_sdk_llvm_index.md.0cfe75f5.lean.js similarity index 86% rename from assets/zh_sdk_llvm_index.md.63a36805.lean.js rename to assets/zh_sdk_llvm_index.md.0cfe75f5.lean.js index 979c6016..434159e3 100644 --- a/assets/zh_sdk_llvm_index.md.63a36805.lean.js +++ b/assets/zh_sdk_llvm_index.md.0cfe75f5.lean.js @@ -1 +1 @@ -import{_ as s,o as a,c as l,Q as e}from"./chunks/framework.76cb5871.js";const h=JSON.parse('{"title":"使用 LLVM 上游工具链配置 RISC-V 编译环境","description":"","frontmatter":{},"headers":[],"relativePath":"zh/sdk/llvm/index.md","filePath":"zh/sdk/llvm/index.md","lastUpdated":1701843761000}'),t={name:"zh/sdk/llvm/index.md"},n=e("",4),o=[n];function p(c,r,i,d,_,m){return a(),l("div",null,o)}const v=s(t,[["render",p]]);export{h as __pageData,v as default}; +import{_ as s,o as a,c as l,Q as e}from"./chunks/framework.76cb5871.js";const h=JSON.parse('{"title":"使用 LLVM 上游工具链配置 RISC-V 编译环境","description":"","frontmatter":{},"headers":[],"relativePath":"zh/sdk/llvm/index.md","filePath":"zh/sdk/llvm/index.md","lastUpdated":1702129622000}'),t={name:"zh/sdk/llvm/index.md"},n=e("",4),o=[n];function p(c,r,i,d,_,m){return a(),l("div",null,o)}const v=s(t,[["render",p]]);export{h as __pageData,v as default}; diff --git a/assets/zh_virtual_machine_qemu-upstream_index.md.d5187c21.js b/assets/zh_virtual_machine_qemu-upstream_index.md.d5187c21.js new file mode 100644 index 00000000..ec64bebf --- /dev/null +++ b/assets/zh_virtual_machine_qemu-upstream_index.md.d5187c21.js @@ -0,0 +1,109 @@ +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.76cb5871.js";const C=JSON.parse('{"title":"使用上游 QEMU 模拟器运行交叉编译的 RISC-V 二进制","description":"","frontmatter":{},"headers":[],"relativePath":"zh/virtual_machine/qemu-upstream/index.md","filePath":"zh/virtual_machine/qemu-upstream/index.md","lastUpdated":1702129622000}'),p={name:"zh/virtual_machine/qemu-upstream/index.md"},o=l(`

使用上游 QEMU 模拟器运行交叉编译的 RISC-V 二进制

这里使用上游工具链配置带 QEMU 支持 RISC-V 编译环境,并使用上游 QEMU 运行构建出的 RISC-V 二进制。

bash
$ ruyi install slug:gnu-plct-20231118 qemu-user-riscv-upstream
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/qemu-user-riscv-8.1.2.ruyi-20231121.amd64.tar.zst to
+/home/myon/.cache/ruyi/distfiles/qemu-user-riscv-8.1.2.ruyi-20231121.amd64.tar.zst
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100 14.4M  100 14.4M    0     0  7217k      0  0:00:02  0:00:02 --:--:-- 7218k
+info: extracting qemu-user-riscv-8.1.2.ruyi-20231121.amd64.tar.zst for package qemu-user-riscv-upstream-8.1.2-ruyi.20231121
+info: package qemu-user-riscv-upstream-8.1.2-ruyi.20231121 installed to
+/home/myon/.local/share/ruyi/binaries/x86_64/qemu-user-riscv-upstream-8.1.2-ruyi.20231121
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  232M  100  232M    0     0  10.1M      0  0:00:22  0:00:22 --:--:-- 11.0M
+info: extracting RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz for package gnu-plct-0.20231118.0
+info: package gnu-plct-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-plct-0.20231118.0
$ ruyi install slug:gnu-plct-20231118 qemu-user-riscv-upstream
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/qemu-user-riscv-8.1.2.ruyi-20231121.amd64.tar.zst to
+/home/myon/.cache/ruyi/distfiles/qemu-user-riscv-8.1.2.ruyi-20231121.amd64.tar.zst
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100 14.4M  100 14.4M    0     0  7217k      0  0:00:02  0:00:02 --:--:-- 7218k
+info: extracting qemu-user-riscv-8.1.2.ruyi-20231121.amd64.tar.zst for package qemu-user-riscv-upstream-8.1.2-ruyi.20231121
+info: package qemu-user-riscv-upstream-8.1.2-ruyi.20231121 installed to
+/home/myon/.local/share/ruyi/binaries/x86_64/qemu-user-riscv-upstream-8.1.2-ruyi.20231121
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  232M  100  232M    0     0  10.1M      0  0:00:22  0:00:22 --:--:-- 11.0M
+info: extracting RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz for package gnu-plct-0.20231118.0
+info: package gnu-plct-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-plct-0.20231118.0

建立编译环境:

bash
$ ruyi venv -t gnu-plct generic -e qemu-user-riscv-upstream ./qemu_venv
+info: Creating a Ruyi virtual environment at qemu_venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking \`ruyi-deactivate\`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/qemu_venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.
$ ruyi venv -t gnu-plct generic -e qemu-user-riscv-upstream ./qemu_venv
+info: Creating a Ruyi virtual environment at qemu_venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking \`ruyi-deactivate\`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/qemu_venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.

查看可用的二进制:

bash
$ ls qemu_venv/bin/
+riscv64-plct-linux-gnu-addr2line  riscv64-plct-linux-gnu-gcc            riscv64-plct-linux-gnu-gfortran  riscv64-plct-linux-gnu-ranlib
+riscv64-plct-linux-gnu-ar         riscv64-plct-linux-gnu-gcc-ar         riscv64-plct-linux-gnu-gprof     riscv64-plct-linux-gnu-readelf
+riscv64-plct-linux-gnu-as         riscv64-plct-linux-gnu-gcc-nm         riscv64-plct-linux-gnu-ld        riscv64-plct-linux-gnu-size
+riscv64-plct-linux-gnu-c++        riscv64-plct-linux-gnu-gcc-ranlib     riscv64-plct-linux-gnu-ld.bfd    riscv64-plct-linux-gnu-strings
+riscv64-plct-linux-gnu-cc         riscv64-plct-linux-gnu-gcov           riscv64-plct-linux-gnu-ldd       riscv64-plct-linux-gnu-strip
+riscv64-plct-linux-gnu-c++filt    riscv64-plct-linux-gnu-gcov-dump      riscv64-plct-linux-gnu-lto-dump  ruyi-activate
+riscv64-plct-linux-gnu-cpp        riscv64-plct-linux-gnu-gcov-tool      riscv64-plct-linux-gnu-nm        ruyi-qemu
+riscv64-plct-linux-gnu-elfedit    riscv64-plct-linux-gnu-gdb            riscv64-plct-linux-gnu-objcopy
+riscv64-plct-linux-gnu-g++        riscv64-plct-linux-gnu-gdb-add-index  riscv64-plct-linux-gnu-objdump
$ ls qemu_venv/bin/
+riscv64-plct-linux-gnu-addr2line  riscv64-plct-linux-gnu-gcc            riscv64-plct-linux-gnu-gfortran  riscv64-plct-linux-gnu-ranlib
+riscv64-plct-linux-gnu-ar         riscv64-plct-linux-gnu-gcc-ar         riscv64-plct-linux-gnu-gprof     riscv64-plct-linux-gnu-readelf
+riscv64-plct-linux-gnu-as         riscv64-plct-linux-gnu-gcc-nm         riscv64-plct-linux-gnu-ld        riscv64-plct-linux-gnu-size
+riscv64-plct-linux-gnu-c++        riscv64-plct-linux-gnu-gcc-ranlib     riscv64-plct-linux-gnu-ld.bfd    riscv64-plct-linux-gnu-strings
+riscv64-plct-linux-gnu-cc         riscv64-plct-linux-gnu-gcov           riscv64-plct-linux-gnu-ldd       riscv64-plct-linux-gnu-strip
+riscv64-plct-linux-gnu-c++filt    riscv64-plct-linux-gnu-gcov-dump      riscv64-plct-linux-gnu-lto-dump  ruyi-activate
+riscv64-plct-linux-gnu-cpp        riscv64-plct-linux-gnu-gcov-tool      riscv64-plct-linux-gnu-nm        ruyi-qemu
+riscv64-plct-linux-gnu-elfedit    riscv64-plct-linux-gnu-gdb            riscv64-plct-linux-gnu-objcopy
+riscv64-plct-linux-gnu-g++        riscv64-plct-linux-gnu-gdb-add-index  riscv64-plct-linux-gnu-objdump

可以看到 QEMU 模拟器的命令为 ruyi-qemu

进入编译环境:

bash
$ . qemu_venv/bin/ruyi-activate
+«Ruyi qemu_venv» $
$ . qemu_venv/bin/ruyi-activate
+«Ruyi qemu_venv» $

编译一个简单的 C 程序并使用 QEMU 运行:

bash
«Ruyi qemu_venv» $ cd qemu_venv/
+«Ruyi qemu_venv» $ cat > test.c << EOF
+#include <stdio.h>
+
+int main()
+{
+    printf("hello, ruyi");
+    putchar('\\n');
+
+    return 0;
+}
+EOF
+«Ruyi qemu_venv» $ riscv64-plct-linux-gnu-gcc -O3 test.c -o test
+«Ruyi qemu_venv» $ ruyi-qemu ./test
+hello, ruyi
«Ruyi qemu_venv» $ cd qemu_venv/
+«Ruyi qemu_venv» $ cat > test.c << EOF
+#include <stdio.h>
+
+int main()
+{
+    printf("hello, ruyi");
+    putchar('\\n');
+
+    return 0;
+}
+EOF
+«Ruyi qemu_venv» $ riscv64-plct-linux-gnu-gcc -O3 test.c -o test
+«Ruyi qemu_venv» $ ruyi-qemu ./test
+hello, ruyi

退出编译环境:

bash
«Ruyi qemu_venv» $ ruyi-deactivate
+$
«Ruyi qemu_venv» $ ruyi-deactivate
+$
`,14),e=[o];function c(t,r,y,E,F,i){return n(),a("div",null,e)}const B=s(p,[["render",c]]);export{C as __pageData,B as default}; diff --git a/assets/zh_virtual_machine_qemu-upstream_index.md.d5187c21.lean.js b/assets/zh_virtual_machine_qemu-upstream_index.md.d5187c21.lean.js new file mode 100644 index 00000000..4793f1ca --- /dev/null +++ b/assets/zh_virtual_machine_qemu-upstream_index.md.d5187c21.lean.js @@ -0,0 +1 @@ +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.76cb5871.js";const C=JSON.parse('{"title":"使用上游 QEMU 模拟器运行交叉编译的 RISC-V 二进制","description":"","frontmatter":{},"headers":[],"relativePath":"zh/virtual_machine/qemu-upstream/index.md","filePath":"zh/virtual_machine/qemu-upstream/index.md","lastUpdated":1702129622000}'),p={name:"zh/virtual_machine/qemu-upstream/index.md"},o=l("",14),e=[o];function c(t,r,y,E,F,i){return n(),a("div",null,e)}const B=s(p,[["render",c]]);export{C as __pageData,B as default}; diff --git a/assets/zh_virtual_machine_qemu-xthead_index.md.4d101c53.js b/assets/zh_virtual_machine_qemu-xthead_index.md.4d101c53.js new file mode 100644 index 00000000..6560a465 --- /dev/null +++ b/assets/zh_virtual_machine_qemu-xthead_index.md.4d101c53.js @@ -0,0 +1,115 @@ +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.76cb5871.js";const C=JSON.parse('{"title":"使用平头哥 QEMU 模拟器运行交叉编译的 RISC-V 二进制","description":"","frontmatter":{},"headers":[],"relativePath":"zh/virtual_machine/qemu-xthead/index.md","filePath":"zh/virtual_machine/qemu-xthead/index.md","lastUpdated":1702129622000}'),p={name:"zh/virtual_machine/qemu-xthead/index.md"},o=l(`

使用平头哥 QEMU 模拟器运行交叉编译的 RISC-V 二进制

这里使用平头哥工具链配置带 QEMU 支持的荔枝派 4A 编译环境,并使用平头哥 QEMU 运行构建出的 RISC-V 二进制。

bash
$ ruyi install slug:gnu-plct-xthead-20231118 qemu-user-riscv-xthead
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/qemu-user-riscv-xthead-6.1.0.ruyi-20231207.amd64.tar.zst to
+/home/myon/.cache/ruyi/distfiles/qemu-user-riscv-xthead-6.1.0.ruyi-20231207.amd64.tar.zst
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100 3577k  100 3577k    0     0  6110k      0 --:--:-- --:--:-- --:--:-- 6104k
+info: extracting qemu-user-riscv-xthead-6.1.0.ruyi-20231207.amd64.tar.zst for package qemu-user-riscv-xthead-6.1.0-ruyi.20231207+g03813c9fe8
+info: package qemu-user-riscv-xthead-6.1.0-ruyi.20231207+g03813c9fe8 installed to
+/home/myon/.local/share/ruyi/binaries/x86_64/qemu-user-riscv-xthead-6.1.0-ruyi.20231207+g03813c9fe8
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  273M  100  273M    0     0  10.2M      0  0:00:26  0:00:26 --:--:-- 10.9M
+info: extracting RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz for package gnu-plct-xthead-0.20231118.0
+info: package gnu-plct-xthead-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-plct-xthead-0.20231118.0
$ ruyi install slug:gnu-plct-xthead-20231118 qemu-user-riscv-xthead
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/qemu-user-riscv-xthead-6.1.0.ruyi-20231207.amd64.tar.zst to
+/home/myon/.cache/ruyi/distfiles/qemu-user-riscv-xthead-6.1.0.ruyi-20231207.amd64.tar.zst
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100 3577k  100 3577k    0     0  6110k      0 --:--:-- --:--:-- --:--:-- 6104k
+info: extracting qemu-user-riscv-xthead-6.1.0.ruyi-20231207.amd64.tar.zst for package qemu-user-riscv-xthead-6.1.0-ruyi.20231207+g03813c9fe8
+info: package qemu-user-riscv-xthead-6.1.0-ruyi.20231207+g03813c9fe8 installed to
+/home/myon/.local/share/ruyi/binaries/x86_64/qemu-user-riscv-xthead-6.1.0-ruyi.20231207+g03813c9fe8
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  273M  100  273M    0     0  10.2M      0  0:00:26  0:00:26 --:--:-- 10.9M
+info: extracting RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz for package gnu-plct-xthead-0.20231118.0
+info: package gnu-plct-xthead-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-plct-xthead-0.20231118.0

建立编译环境:

bash
$ ruyi venv -t gnu-plct-xthead sipeed-lpi4a -e qemu-user-riscv-xthead ./qemu_venv
+info: Creating a Ruyi virtual environment at qemu_venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking \`ruyi-deactivate\`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/qemu_venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.
$ ruyi venv -t gnu-plct-xthead sipeed-lpi4a -e qemu-user-riscv-xthead ./qemu_venv
+info: Creating a Ruyi virtual environment at qemu_venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking \`ruyi-deactivate\`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/qemu_venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.

查看可用的二进制:

bash
$ ls qemu_venv/bin/
+riscv64-plctxthead-linux-gnu-addr2line  riscv64-plctxthead-linux-gnu-gcc-ranlib     riscv64-plctxthead-linux-gnu-nm
+riscv64-plctxthead-linux-gnu-ar         riscv64-plctxthead-linux-gnu-gcov           riscv64-plctxthead-linux-gnu-objcopy
+riscv64-plctxthead-linux-gnu-as         riscv64-plctxthead-linux-gnu-gcov-dump      riscv64-plctxthead-linux-gnu-objdump
+riscv64-plctxthead-linux-gnu-c++        riscv64-plctxthead-linux-gnu-gcov-tool      riscv64-plctxthead-linux-gnu-ranlib
+riscv64-plctxthead-linux-gnu-cc         riscv64-plctxthead-linux-gnu-gdb            riscv64-plctxthead-linux-gnu-readelf
+riscv64-plctxthead-linux-gnu-c++filt    riscv64-plctxthead-linux-gnu-gdb-add-index  riscv64-plctxthead-linux-gnu-size
+riscv64-plctxthead-linux-gnu-cpp        riscv64-plctxthead-linux-gnu-gfortran       riscv64-plctxthead-linux-gnu-strings
+riscv64-plctxthead-linux-gnu-elfedit    riscv64-plctxthead-linux-gnu-gprof          riscv64-plctxthead-linux-gnu-strip
+riscv64-plctxthead-linux-gnu-g++        riscv64-plctxthead-linux-gnu-ld             ruyi-activate
+riscv64-plctxthead-linux-gnu-gcc        riscv64-plctxthead-linux-gnu-ld.bfd         ruyi-qemu
+riscv64-plctxthead-linux-gnu-gcc-ar     riscv64-plctxthead-linux-gnu-ldd
+riscv64-plctxthead-linux-gnu-gcc-nm     riscv64-plctxthead-linux-gnu-lto-dump
$ ls qemu_venv/bin/
+riscv64-plctxthead-linux-gnu-addr2line  riscv64-plctxthead-linux-gnu-gcc-ranlib     riscv64-plctxthead-linux-gnu-nm
+riscv64-plctxthead-linux-gnu-ar         riscv64-plctxthead-linux-gnu-gcov           riscv64-plctxthead-linux-gnu-objcopy
+riscv64-plctxthead-linux-gnu-as         riscv64-plctxthead-linux-gnu-gcov-dump      riscv64-plctxthead-linux-gnu-objdump
+riscv64-plctxthead-linux-gnu-c++        riscv64-plctxthead-linux-gnu-gcov-tool      riscv64-plctxthead-linux-gnu-ranlib
+riscv64-plctxthead-linux-gnu-cc         riscv64-plctxthead-linux-gnu-gdb            riscv64-plctxthead-linux-gnu-readelf
+riscv64-plctxthead-linux-gnu-c++filt    riscv64-plctxthead-linux-gnu-gdb-add-index  riscv64-plctxthead-linux-gnu-size
+riscv64-plctxthead-linux-gnu-cpp        riscv64-plctxthead-linux-gnu-gfortran       riscv64-plctxthead-linux-gnu-strings
+riscv64-plctxthead-linux-gnu-elfedit    riscv64-plctxthead-linux-gnu-gprof          riscv64-plctxthead-linux-gnu-strip
+riscv64-plctxthead-linux-gnu-g++        riscv64-plctxthead-linux-gnu-ld             ruyi-activate
+riscv64-plctxthead-linux-gnu-gcc        riscv64-plctxthead-linux-gnu-ld.bfd         ruyi-qemu
+riscv64-plctxthead-linux-gnu-gcc-ar     riscv64-plctxthead-linux-gnu-ldd
+riscv64-plctxthead-linux-gnu-gcc-nm     riscv64-plctxthead-linux-gnu-lto-dump

可以看到 QEMU 模拟器的命令为 ruyi-qemu

进入编译环境:

bash
$ . qemu_venv/bin/ruyi-activate
+«Ruyi qemu_venv» $
$ . qemu_venv/bin/ruyi-activate
+«Ruyi qemu_venv» $

编译一个简单的 C 程序并使用 QEMU 运行:

bash
«Ruyi qemu_venv» $ cd qemu_venv/
+«Ruyi qemu_venv» $ cat > test.c << EOF
+#include <stdio.h>
+
+int main()
+{
+    printf("hello, ruyi");
+    putchar('\\n');
+
+    return 0;
+}
+EOF
+«Ruyi qemu_venv» $ riscv64-plctxthead-linux-gnu-gcc -O3 test.c -o test
+«Ruyi qemu_venv» $ ruyi-qemu ./test
+hello, ruyi
«Ruyi qemu_venv» $ cd qemu_venv/
+«Ruyi qemu_venv» $ cat > test.c << EOF
+#include <stdio.h>
+
+int main()
+{
+    printf("hello, ruyi");
+    putchar('\\n');
+
+    return 0;
+}
+EOF
+«Ruyi qemu_venv» $ riscv64-plctxthead-linux-gnu-gcc -O3 test.c -o test
+«Ruyi qemu_venv» $ ruyi-qemu ./test
+hello, ruyi

退出编译环境:

bash
«Ruyi qemu_venv» $ ruyi-deactivate
+$
«Ruyi qemu_venv» $ ruyi-deactivate
+$
`,14),e=[o];function c(t,r,y,E,F,i){return n(),a("div",null,e)}const d=s(p,[["render",c]]);export{C as __pageData,d as default}; diff --git a/assets/zh_virtual_machine_qemu-xthead_index.md.4d101c53.lean.js b/assets/zh_virtual_machine_qemu-xthead_index.md.4d101c53.lean.js new file mode 100644 index 00000000..493fd32d --- /dev/null +++ b/assets/zh_virtual_machine_qemu-xthead_index.md.4d101c53.lean.js @@ -0,0 +1 @@ +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.76cb5871.js";const C=JSON.parse('{"title":"使用平头哥 QEMU 模拟器运行交叉编译的 RISC-V 二进制","description":"","frontmatter":{},"headers":[],"relativePath":"zh/virtual_machine/qemu-xthead/index.md","filePath":"zh/virtual_machine/qemu-xthead/index.md","lastUpdated":1702129622000}'),p={name:"zh/virtual_machine/qemu-xthead/index.md"},o=l("",14),e=[o];function c(t,r,y,E,F,i){return n(),a("div",null,e)}const d=s(p,[["render",c]]);export{C as __pageData,d as default}; diff --git a/hashmap.json b/hashmap.json index bb1ae015..1cdedaca 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"zh_benchmark_coremark.md":"40178108","zh_index.md":"d295970d","zh_index_en.md":"02ef3b95","zh_sdk_gnu_index.md":"b7287564","zh_plan_index.md":"8fa93df9","zh_ruyi-package_index.md":"ef248f25","zh_introduction_index.md":"275fcd50","zh_sdk_llvm_index.md":"63a36805"} +{"zh_index_en.md":"a6c3ff8b","zh_plan_index.md":"08fbf5a0","zh_mirror_index.md":"4268033b","zh_benchmark_coremark.md":"8bb24a44","zh_environment_gnu-generic_index.md":"0cd998a2","zh_environment_plct-milkv-duo_index.md":"3a67286f","zh_environment_xthead-sipeed-lpi4a_index.md":"1e5178cf","zh_sdk_llvm_index.md":"0cfe75f5","zh_sdk_gnu_index.md":"e15bc5c0","zh_environment_llvm-generic_index.md":"22159a68","zh_index.md":"05afa7cc","zh_introduction_index.md":"90a7a037","zh_virtual_machine_qemu-upstream_index.md":"d5187c21","zh_virtual_machine_qemu-xthead_index.md":"4d101c53","zh_ruyi-package_index.md":"26b856ed"} diff --git a/zh/benchmark/coremark.html b/zh/benchmark/coremark.html index 980d98ae..ccb20395 100644 --- a/zh/benchmark/coremark.html +++ b/zh/benchmark/coremark.html @@ -3,27 +3,49 @@ - 运行 Coremark | RuyiSDK documentation + 使用编译环境进行 Coremark 构建 | RuyiSDK documentation - + - - + + -
Skip to content

运行 Coremark

这里我们从零开始,安装 ruyisdk 并编译运行 Coremark。这里我们介绍使用 ruyi 交叉编译 Coremark 的步骤。

安装 ruyi

下载工具链

交叉编译 Coremark

  1. 下载 Coremark

    bash
    git clone https://github.com/eembc/coremark.git
    git clone https://github.com/eembc/coremark.git
  2. 交叉编译 Coremark

    bash
    cd coremark
    -mkdir rv64 && cp simple/* rv64/
    -sed -i 's/ee_u32         ee_ptr_int/unsigned long long         ee_ptr_int/g' rv64/core_portme.h
    -make compile PORT_DIR=rv64 CC=$riscv64-ruyi-linux-gnu-gcc LD=$riscv64-ruyi-linux-gnu-gcc XCFLAGS="-march=$rv64gc"
    cd coremark
    -mkdir rv64 && cp simple/* rv64/
    -sed -i 's/ee_u32         ee_ptr_int/unsigned long long         ee_ptr_int/g' rv64/core_portme.h
    -make compile PORT_DIR=rv64 CC=$riscv64-ruyi-linux-gnu-gcc LD=$riscv64-ruyi-linux-gnu-gcc XCFLAGS="-march=$rv64gc"

    编译成功会看到 coremark 目录下生成了 coremark.exe,将 coremark.exe 拷贝到我们的 riscv 开发板或者 Qemu 上就可以运行了。

- +
Skip to content

使用编译环境进行 Coremark 构建

这里用 “使用 PLCT 工具链配置 Milkv-Duo 编译环境” 一节中的 Milkv-Duo 编译环境,构建 coremark 。

首先进入编译环境:

bash
$ . milkv-venv/bin/ruyi-activate
+«Ruyi milkv-venv» $
$ . milkv-venv/bin/ruyi-activate
+«Ruyi milkv-venv» $

coremark 源码可以直接从 RUYI 软件仓库中下载,当前 v0.2 最新的源码版本为 1.0.1 :

bash
«Ruyi milkv-venv» $ mkdir coremark
+«Ruyi milkv-venv» $ cd coremark
+«Ruyi milkv-venv» $ ruyi extract coremark
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/coremark-1.01.tar.gz to /home/myon/.cache/ruyi/distfiles/coremark-1.01.tar.gz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  391k  100  391k    0     0  1400k      0 --:--:-- --:--:-- --:--:-- 1404k
+info: extracting coremark-1.01.tar.gz for package coremark-1.0.1
+info: package coremark-1.0.1 extracted to current working directory
«Ruyi milkv-venv» $ mkdir coremark
+«Ruyi milkv-venv» $ cd coremark
+«Ruyi milkv-venv» $ ruyi extract coremark
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/coremark-1.01.tar.gz to /home/myon/.cache/ruyi/distfiles/coremark-1.01.tar.gz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  391k  100  391k    0     0  1400k      0 --:--:-- --:--:-- --:--:-- 1404k
+info: extracting coremark-1.01.tar.gz for package coremark-1.0.1
+info: package coremark-1.0.1 extracted to current working directory

这个操作将从 RUYI 软件源中下载 coremark 源码并解包到当前目录

由于使用的工具链为 riscv64-plct-linux-gnu-gcc ,需要编辑构建脚本:

bash
«Ruyi milkv-venv» $ sed -i 's/\bgcc\b/riscv64-plct-linux-gnu-gcc/g' linux64/core_portme.mak
«Ruyi milkv-venv» $ sed -i 's/\bgcc\b/riscv64-plct-linux-gnu-gcc/g' linux64/core_portme.mak

构建 coremark:

bash
«Ruyi milkv-venv» $ make PORT_DIR=linux64 link
+riscv64-plct-linux-gnu-gcc -O2 -Ilinux64 -I. -DFLAGS_STR=\""-O2   -lrt"\" -DITERATIONS=0  core_list_join.c core_main.c core_matrix.c core_state.c core_util.c linux64/core_portme.c -o ./coremark.exe -lrt
+Link performed along with compile
+«Ruyi milkv-venv» $ file coremark.exe
+coremark.exe: ELF 64-bit LSB executable, UCB RISC-V, RVC, double-float ABI, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64-lp64d.so.1, BuildID[sha1]=d9dbc7115d07d1953087dd2c1e5d46adc2ab0d4f, for GNU/Linux 4.15.0, with debug_info, not stripped
«Ruyi milkv-venv» $ make PORT_DIR=linux64 link
+riscv64-plct-linux-gnu-gcc -O2 -Ilinux64 -I. -DFLAGS_STR=\""-O2   -lrt"\" -DITERATIONS=0  core_list_join.c core_main.c core_matrix.c core_state.c core_util.c linux64/core_portme.c -o ./coremark.exe -lrt
+Link performed along with compile
+«Ruyi milkv-venv» $ file coremark.exe
+coremark.exe: ELF 64-bit LSB executable, UCB RISC-V, RVC, double-float ABI, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64-lp64d.so.1, BuildID[sha1]=d9dbc7115d07d1953087dd2c1e5d46adc2ab0d4f, for GNU/Linux 4.15.0, with debug_info, not stripped

可以看到成功构建 RISC-V 架构的二进制。注意这整个过程如果在 riscv64 环境则不是交叉编译。

退出虚拟环境

bash
«Ruyi milkv-venv» $ ruyi-deactivate
+$
«Ruyi milkv-venv» $ ruyi-deactivate
+$
+ \ No newline at end of file diff --git a/zh/environment/gnu-generic/index.html b/zh/environment/gnu-generic/index.html new file mode 100644 index 00000000..a8fa7c9e --- /dev/null +++ b/zh/environment/gnu-generic/index.html @@ -0,0 +1,99 @@ + + + + + + 使用 GNU 上游工具链配置 RISC-V 编译环境 | RuyiSDK documentation + + + + + + + + + + + + +
Skip to content

使用 GNU 上游工具链配置 RISC-V 编译环境

GNU 上游工具链软件包名为 gnu-upstream , v0.2 最新版本二进制为 gnu-upstream-20231118 :

bash
$ ruyi install slug:gnu-upstream-20231118
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  232M  100  232M    0     0  1936k      0  0:02:02  0:02:02 --:--:-- 1924k
+info: extracting RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz for package gnu-upstream-0.20231118.0
+info: package gnu-upstream-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-upstream-0.20231118.0
$ ruyi install slug:gnu-upstream-20231118
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  232M  100  232M    0     0  1936k      0  0:02:02  0:02:02 --:--:-- 1924k
+info: extracting RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz for package gnu-upstream-0.20231118.0
+info: package gnu-upstream-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-upstream-0.20231118.0

slug 可以从 ruyi list 的输出中获取,且拷贝时应删除 slug: gnu-upstream-20231118 之间的空格,变为正确的格式 slug:gnu-upstream-20231118 。 该命令将调用 wgetcurl 从远端软件源获取软件包 tarball ,解压并安装到用户目录。 软件包安装目录默认为 ~/.local/share/ruyi ;在 XDG_DATA_HOME 环境变量被设置时,目录为 $XDG_DATA_HOME/ruyi

也可以使用如下命令让 RUYI 自动选择最新版本安装,注意所安装的版本可能是 v0.2 以后的未测试版本。

bash
$ ruyi install gnu-upstream
$ ruyi install gnu-upstream

由预置的 generic 配置建立编译环境:

bash
$ ruyi venv -t slug:gnu-upstream-20231118 generic venv
+ruyi venv -t slug:gnu-upstream-20231118 generic venv
+info: Creating a Ruyi virtual environment at venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking `ruyi-deactivate`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.
$ ruyi venv -t slug:gnu-upstream-20231118 generic venv
+ruyi venv -t slug:gnu-upstream-20231118 generic venv
+info: Creating a Ruyi virtual environment at venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking `ruyi-deactivate`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.

这里命令 generic 为如上选择的环境,venv为自定义的相对路径,使用 -t 参数指定工具链。 若使用包名则 RUYI 将自动选择具体的工具链版本:

bash
$ ruyi venv -t gnu-upstream generic venv
$ ruyi venv -t gnu-upstream generic venv

查看可用的工具链二进制:

bash
$ ls ./venv/bin/
+riscv64-unknown-linux-gnu-addr2line  riscv64-unknown-linux-gnu-gcc            riscv64-unknown-linux-gnu-gfortran  riscv64-unknown-linux-gnu-ranlib
+riscv64-unknown-linux-gnu-ar         riscv64-unknown-linux-gnu-gcc-ar         riscv64-unknown-linux-gnu-gprof     riscv64-unknown-linux-gnu-readelf
+riscv64-unknown-linux-gnu-as         riscv64-unknown-linux-gnu-gcc-nm         riscv64-unknown-linux-gnu-ld        riscv64-unknown-linux-gnu-size
+riscv64-unknown-linux-gnu-c++        riscv64-unknown-linux-gnu-gcc-ranlib     riscv64-unknown-linux-gnu-ld.bfd    riscv64-unknown-linux-gnu-strings
+riscv64-unknown-linux-gnu-cc         riscv64-unknown-linux-gnu-gcov           riscv64-unknown-linux-gnu-ldd       riscv64-unknown-linux-gnu-strip
+riscv64-unknown-linux-gnu-c++filt    riscv64-unknown-linux-gnu-gcov-dump      riscv64-unknown-linux-gnu-lto-dump  ruyi-activate
+riscv64-unknown-linux-gnu-cpp        riscv64-unknown-linux-gnu-gcov-tool      riscv64-unknown-linux-gnu-nm
+riscv64-unknown-linux-gnu-elfedit    riscv64-unknown-linux-gnu-gdb            riscv64-unknown-linux-gnu-objcopy
+riscv64-unknown-linux-gnu-g++        riscv64-unknown-linux-gnu-gdb-add-index  riscv64-unknown-linux-gnu-objdump
$ ls ./venv/bin/
+riscv64-unknown-linux-gnu-addr2line  riscv64-unknown-linux-gnu-gcc            riscv64-unknown-linux-gnu-gfortran  riscv64-unknown-linux-gnu-ranlib
+riscv64-unknown-linux-gnu-ar         riscv64-unknown-linux-gnu-gcc-ar         riscv64-unknown-linux-gnu-gprof     riscv64-unknown-linux-gnu-readelf
+riscv64-unknown-linux-gnu-as         riscv64-unknown-linux-gnu-gcc-nm         riscv64-unknown-linux-gnu-ld        riscv64-unknown-linux-gnu-size
+riscv64-unknown-linux-gnu-c++        riscv64-unknown-linux-gnu-gcc-ranlib     riscv64-unknown-linux-gnu-ld.bfd    riscv64-unknown-linux-gnu-strings
+riscv64-unknown-linux-gnu-cc         riscv64-unknown-linux-gnu-gcov           riscv64-unknown-linux-gnu-ldd       riscv64-unknown-linux-gnu-strip
+riscv64-unknown-linux-gnu-c++filt    riscv64-unknown-linux-gnu-gcov-dump      riscv64-unknown-linux-gnu-lto-dump  ruyi-activate
+riscv64-unknown-linux-gnu-cpp        riscv64-unknown-linux-gnu-gcov-tool      riscv64-unknown-linux-gnu-nm
+riscv64-unknown-linux-gnu-elfedit    riscv64-unknown-linux-gnu-gdb            riscv64-unknown-linux-gnu-objcopy
+riscv64-unknown-linux-gnu-g++        riscv64-unknown-linux-gnu-gdb-add-index  riscv64-unknown-linux-gnu-objdump

除了 ruyi-activate 为激活编译环境用的脚本,其他均为工具链二进制。

激活构建环境,激活方式与 python 虚拟环境类似,并且改变 PS1 以提示当前进入编译环境中:

bash
$ . venv/bin/ruyi-activate
+«Ruyi venv» $
$ . venv/bin/ruyi-activate
+«Ruyi venv» $

也可以使用 source 命令:

bash
$ source venv/bin/ruyi-activate
+«Ruyi venv» $
$ source venv/bin/ruyi-activate
+«Ruyi venv» $

调用工具链:

bash
«Ruyi venv» $ riscv64-unknown-linux-gnu-gcc --version
+riscv64-unknown-linux-gnu-gcc (RuyiSDK 20231118 Upstream-Sources) 13.2.0
+Copyright (C) 2023 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
«Ruyi venv» $ riscv64-unknown-linux-gnu-gcc --version
+riscv64-unknown-linux-gnu-gcc (RuyiSDK 20231118 Upstream-Sources) 13.2.0
+Copyright (C) 2023 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

退出编译环境:

bash
«Ruyi venv» $ ruyi-deactivate
+$
«Ruyi venv» $ ruyi-deactivate
+$

环境将被还原。

+ + + + \ No newline at end of file diff --git a/zh/environment/llvm-generic/index.html b/zh/environment/llvm-generic/index.html new file mode 100644 index 00000000..54722856 --- /dev/null +++ b/zh/environment/llvm-generic/index.html @@ -0,0 +1,155 @@ + + + + + + 使用 LLVM 上游工具链配置 RISC-V 编译环境 | RuyiSDK documentation + + + + + + + + + + + + +
Skip to content

使用 LLVM 上游工具链配置 RISC-V 编译环境

注意在 v0.2 版本中,该部分只适用于在 x86-64 host 配置交叉编译环境。

LLVM 上游工具链软件包名为 llvm-upstream , v0.2 最新版本二进制为 llvm-upstream-20231121 。 由于配置 LLVM 工具链环境依赖 gcc 环境,故同时需要安装 gcc 工具链。

另外尽管 llvm-upstream 在 list 命令中打印了 slug 信息,但是实际上并不存在该 slug ,故不能指定 slug 安装。

bash
$ ruyi install llvm-upstream slug:gnu-upstream-20231118
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/llvm-17.0.5.ruyi-20231121.amd64.tar.zst to
+/home/myon/.cache/ruyi/distfiles/llvm-17.0.5.ruyi-20231121.amd64.tar.zst
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  398M  100  398M    0     0  10.7M      0  0:00:36  0:00:36 --:--:-- 11.0M
+info: extracting llvm-17.0.5.ruyi-20231121.amd64.tar.zst for package llvm-upstream-17.0.5-ruyi.20231121
+info: package llvm-upstream-17.0.5-ruyi.20231121 installed to /home/myon/.local/share/ruyi/binaries/x86_64/llvm-upstream-17.0.5-ruyi.20231121
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  232M  100  232M    0     0  10.0M      0  0:00:23  0:00:23 --:--:-- 10.9M
+info: extracting RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz for package gnu-upstream-0.20231118.0
+info: package gnu-upstream-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-upstream-0.20231118.0
$ ruyi install llvm-upstream slug:gnu-upstream-20231118
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/llvm-17.0.5.ruyi-20231121.amd64.tar.zst to
+/home/myon/.cache/ruyi/distfiles/llvm-17.0.5.ruyi-20231121.amd64.tar.zst
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  398M  100  398M    0     0  10.7M      0  0:00:36  0:00:36 --:--:-- 11.0M
+info: extracting llvm-17.0.5.ruyi-20231121.amd64.tar.zst for package llvm-upstream-17.0.5-ruyi.20231121
+info: package llvm-upstream-17.0.5-ruyi.20231121 installed to /home/myon/.local/share/ruyi/binaries/x86_64/llvm-upstream-17.0.5-ruyi.20231121
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  232M  100  232M    0     0  10.0M      0  0:00:23  0:00:23 --:--:-- 10.9M
+info: extracting RuyiSDK-20231118-Upstream-Sources-riscv64-unknown-linux-gnu.tar.xz for package gnu-upstream-0.20231118.0
+info: package gnu-upstream-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-upstream-0.20231118.0

由预置的 generic 配置建立编译环境:

bash
$ ruyi venv -t llvm-upstream --sysroot-from gnu-upstream generic ./llvm_venv
+info: Creating a Ruyi virtual environment at llvm_venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking `ruyi-deactivate`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/llvm_venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.
$ ruyi venv -t llvm-upstream --sysroot-from gnu-upstream generic ./llvm_venv
+info: Creating a Ruyi virtual environment at llvm_venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking `ruyi-deactivate`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/llvm_venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.

--sysroot-from 指定从 gnu-upstream 获取 sysroot ,这是由于 llvm 构建依赖一些 gcc 库。

查看可用的工具链二进制,包括 llvm-upstream 和 gnu-upstream :

bash
$ ls llvm_venv/bin/
+amdgpu-arch               dsymutil                 llvm-dlltool            llvm-rc                              riscv64-unknown-linux-gnu-cpp
+analyze-build             FileCheck                llvm-dwarfdump          llvm-readelf                         riscv64-unknown-linux-gnu-g++
+bugpoint                  find-all-symbols         llvm-dwarfutil          llvm-readobj                         riscv64-unknown-linux-gnu-gcc
+c-index-test              git-clang-format         llvm-dwp                llvm-reduce                          riscv64-unknown-linux-gnu-gcc-ar
+clang                     hmaptool                 llvm-exegesis           llvm-remark-size-diff                riscv64-unknown-linux-gnu-gcc-nm
+clang++                   intercept-build          llvm-extract            llvm-remarkutil                      riscv64-unknown-linux-gnu-gcc-ranlib
+clang-apply-replacements  ld64.lld                 llvm-gsymutil           llvm-rtdyld                          riscv64-unknown-linux-gnu-ld
+clang-change-namespace    ld.lld                   llvm-ifs                llvm-sim                             riscv64-unknown-linux-gnu-nm
+clang-check               llc                      llvm-install-name-tool  llvm-size                            riscv64-unknown-linux-gnu-objcopy
+clang-cl                  lld                      llvm-jitlink            llvm-split                           riscv64-unknown-linux-gnu-objdump
+clang-cpp                 lld-link                 llvm-jitlink-executor   llvm-stress                          riscv64-unknown-linux-gnu-ranlib
+clangd                    lli                      llvm-lib                llvm-strings                         riscv64-unknown-linux-gnu-readelf
+clang-doc                 lli-child-target         llvm-libtool-darwin     llvm-strip                           riscv64-unknown-linux-gnu-size
+clang-extdef-mapping      llvm-addr2line           llvm-link               llvm-symbolizer                      riscv64-unknown-linux-gnu-strings
+clang-format              llvm-ar                  llvm-lipo               llvm-tapi-diff                       riscv64-unknown-linux-gnu-strip
+clang-include-cleaner     llvm-as                  llvm-lto                llvm-tblgen                          run-clang-tidy
+clang-include-fixer       llvm-bcanalyzer          llvm-lto2               llvm-tli-checker                     ruyi-activate
+clang-linker-wrapper      llvm-bitcode-strip       llvm-mc                 llvm-undname                         sancov
+clang-move                llvm-cat                 llvm-mca                llvm-windres                         sanstats
+clang-offload-bundler     llvm-cfi-verify          llvm-ml                 llvm-xray                            scan-build
+clang-offload-packager    llvm-config              llvm-modextract         modularize                           scan-build-py
+clang-pseudo              llvm-cov                 llvm-mt                 not                                  scan-view
+clang-query               llvm-c-test              llvm-nm                 nvptx-arch                           split-file
+clang-refactor            llvm-cvtres              llvm-objcopy            obj2yaml                             UnicodeNameMappingGenerator
+clang-rename              llvm-cxxdump             llvm-objdump            opt                                  verify-uselistorder
+clang-reorder-fields      llvm-cxxfilt             llvm-opt-report         pp-trace                             wasm-ld
+clang-repl                llvm-cxxmap              llvm-otool              riscv64-unknown-linux-gnu-addr2line  yaml2obj
+clang-scan-deps           llvm-debuginfo-analyzer  llvm-pdbutil            riscv64-unknown-linux-gnu-ar         yaml-bench
+clang-tblgen              llvm-debuginfod          llvm-PerfectShuffle     riscv64-unknown-linux-gnu-as
+clang-tidy                llvm-debuginfod-find     llvm-profdata           riscv64-unknown-linux-gnu-c++
+count                     llvm-diff                llvm-profgen            riscv64-unknown-linux-gnu-cc
+diagtool                  llvm-dis                 llvm-ranlib             riscv64-unknown-linux-gnu-c++filt
$ ls llvm_venv/bin/
+amdgpu-arch               dsymutil                 llvm-dlltool            llvm-rc                              riscv64-unknown-linux-gnu-cpp
+analyze-build             FileCheck                llvm-dwarfdump          llvm-readelf                         riscv64-unknown-linux-gnu-g++
+bugpoint                  find-all-symbols         llvm-dwarfutil          llvm-readobj                         riscv64-unknown-linux-gnu-gcc
+c-index-test              git-clang-format         llvm-dwp                llvm-reduce                          riscv64-unknown-linux-gnu-gcc-ar
+clang                     hmaptool                 llvm-exegesis           llvm-remark-size-diff                riscv64-unknown-linux-gnu-gcc-nm
+clang++                   intercept-build          llvm-extract            llvm-remarkutil                      riscv64-unknown-linux-gnu-gcc-ranlib
+clang-apply-replacements  ld64.lld                 llvm-gsymutil           llvm-rtdyld                          riscv64-unknown-linux-gnu-ld
+clang-change-namespace    ld.lld                   llvm-ifs                llvm-sim                             riscv64-unknown-linux-gnu-nm
+clang-check               llc                      llvm-install-name-tool  llvm-size                            riscv64-unknown-linux-gnu-objcopy
+clang-cl                  lld                      llvm-jitlink            llvm-split                           riscv64-unknown-linux-gnu-objdump
+clang-cpp                 lld-link                 llvm-jitlink-executor   llvm-stress                          riscv64-unknown-linux-gnu-ranlib
+clangd                    lli                      llvm-lib                llvm-strings                         riscv64-unknown-linux-gnu-readelf
+clang-doc                 lli-child-target         llvm-libtool-darwin     llvm-strip                           riscv64-unknown-linux-gnu-size
+clang-extdef-mapping      llvm-addr2line           llvm-link               llvm-symbolizer                      riscv64-unknown-linux-gnu-strings
+clang-format              llvm-ar                  llvm-lipo               llvm-tapi-diff                       riscv64-unknown-linux-gnu-strip
+clang-include-cleaner     llvm-as                  llvm-lto                llvm-tblgen                          run-clang-tidy
+clang-include-fixer       llvm-bcanalyzer          llvm-lto2               llvm-tli-checker                     ruyi-activate
+clang-linker-wrapper      llvm-bitcode-strip       llvm-mc                 llvm-undname                         sancov
+clang-move                llvm-cat                 llvm-mca                llvm-windres                         sanstats
+clang-offload-bundler     llvm-cfi-verify          llvm-ml                 llvm-xray                            scan-build
+clang-offload-packager    llvm-config              llvm-modextract         modularize                           scan-build-py
+clang-pseudo              llvm-cov                 llvm-mt                 not                                  scan-view
+clang-query               llvm-c-test              llvm-nm                 nvptx-arch                           split-file
+clang-refactor            llvm-cvtres              llvm-objcopy            obj2yaml                             UnicodeNameMappingGenerator
+clang-rename              llvm-cxxdump             llvm-objdump            opt                                  verify-uselistorder
+clang-reorder-fields      llvm-cxxfilt             llvm-opt-report         pp-trace                             wasm-ld
+clang-repl                llvm-cxxmap              llvm-otool              riscv64-unknown-linux-gnu-addr2line  yaml2obj
+clang-scan-deps           llvm-debuginfo-analyzer  llvm-pdbutil            riscv64-unknown-linux-gnu-ar         yaml-bench
+clang-tblgen              llvm-debuginfod          llvm-PerfectShuffle     riscv64-unknown-linux-gnu-as
+clang-tidy                llvm-debuginfod-find     llvm-profdata           riscv64-unknown-linux-gnu-c++
+count                     llvm-diff                llvm-profgen            riscv64-unknown-linux-gnu-cc
+diagtool                  llvm-dis                 llvm-ranlib             riscv64-unknown-linux-gnu-c++filt

进入 llvm 编译环境:

bash
$ . llvm_venv/bin/ruyi-activate
+«Ruyi llvm_venv» $
$ . llvm_venv/bin/ruyi-activate
+«Ruyi llvm_venv» $

此时应当可以正常调用 clang :

bash
«Ruyi llvm_venv» $ clang --version
+clang version 17.0.5
+Target: riscv64-unknown-linux-gnu
+Thread model: posix
+InstalledDir: /home/myon/.local/share/ruyi/binaries/x86_64/llvm-upstream-17.0.5-ruyi.20231121/bin
«Ruyi llvm_venv» $ clang --version
+clang version 17.0.5
+Target: riscv64-unknown-linux-gnu
+Thread model: posix
+InstalledDir: /home/myon/.local/share/ruyi/binaries/x86_64/llvm-upstream-17.0.5-ruyi.20231121/bin

退出编译环境:

bash
«Ruyi llvm_venv» $ ruyi-deactivate
+$
«Ruyi llvm_venv» $ ruyi-deactivate
+$
+ + + + \ No newline at end of file diff --git a/zh/environment/plct-milkv-duo/index.html b/zh/environment/plct-milkv-duo/index.html new file mode 100644 index 00000000..1279e753 --- /dev/null +++ b/zh/environment/plct-milkv-duo/index.html @@ -0,0 +1,95 @@ + + + + + + 使用 PLCT 工具链配置 Milkv-Duo 编译环境 | RuyiSDK documentation + + + + + + + + + + + + +
Skip to content

使用 PLCT 工具链配置 Milkv-Duo 编译环境

PLCT 工具链软件包名为 gnu-plct , v0.2 最新版本二进制为 gnu-plct-20231118 :

bash
$ ruyi install slug:gnu-plct-20231118
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  232M  100  232M    0     0  10.6M      0  0:00:21  0:00:21 --:--:-- 10.9M
+info: extracting RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz for package gnu-plct-0.20231118.0
+info: package gnu-plct-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-plct-0.20231118.0
$ ruyi install slug:gnu-plct-20231118
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  232M  100  232M    0     0  10.6M      0  0:00:21  0:00:21 --:--:-- 10.9M
+info: extracting RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz for package gnu-plct-0.20231118.0
+info: package gnu-plct-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-plct-0.20231118.0

由预置的 milkv-duo 配置在 ./milkv-venv 目录建立编译环境:

bash
$ ruyi venv -t slug:gnu-plct-20231118 milkv-duo ./milkv-venv
+info: Creating a Ruyi virtual environment at milkv-venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking `ruyi-deactivate`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/milkv-venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.
$ ruyi venv -t slug:gnu-plct-20231118 milkv-duo ./milkv-venv
+info: Creating a Ruyi virtual environment at milkv-venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking `ruyi-deactivate`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/milkv-venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.

查看可用的工具链二进制:

bash
$ ls ./venv/bin/
+riscv64-plct-linux-gnu-addr2line  riscv64-plct-linux-gnu-gcc            riscv64-plct-linux-gnu-gfortran  riscv64-plct-linux-gnu-ranlib
+riscv64-plct-linux-gnu-ar         riscv64-plct-linux-gnu-gcc-ar         riscv64-plct-linux-gnu-gprof     riscv64-plct-linux-gnu-readelf
+riscv64-plct-linux-gnu-as         riscv64-plct-linux-gnu-gcc-nm         riscv64-plct-linux-gnu-ld        riscv64-plct-linux-gnu-size
+riscv64-plct-linux-gnu-c++        riscv64-plct-linux-gnu-gcc-ranlib     riscv64-plct-linux-gnu-ld.bfd    riscv64-plct-linux-gnu-strings
+riscv64-plct-linux-gnu-cc         riscv64-plct-linux-gnu-gcov           riscv64-plct-linux-gnu-ldd       riscv64-plct-linux-gnu-strip
+riscv64-plct-linux-gnu-c++filt    riscv64-plct-linux-gnu-gcov-dump      riscv64-plct-linux-gnu-lto-dump  ruyi-activate
+riscv64-plct-linux-gnu-cpp        riscv64-plct-linux-gnu-gcov-tool      riscv64-plct-linux-gnu-nm
+riscv64-plct-linux-gnu-elfedit    riscv64-plct-linux-gnu-gdb            riscv64-plct-linux-gnu-objcopy
+riscv64-plct-linux-gnu-g++        riscv64-plct-linux-gnu-gdb-add-index  riscv64-plct-linux-gnu-objdump
$ ls ./venv/bin/
+riscv64-plct-linux-gnu-addr2line  riscv64-plct-linux-gnu-gcc            riscv64-plct-linux-gnu-gfortran  riscv64-plct-linux-gnu-ranlib
+riscv64-plct-linux-gnu-ar         riscv64-plct-linux-gnu-gcc-ar         riscv64-plct-linux-gnu-gprof     riscv64-plct-linux-gnu-readelf
+riscv64-plct-linux-gnu-as         riscv64-plct-linux-gnu-gcc-nm         riscv64-plct-linux-gnu-ld        riscv64-plct-linux-gnu-size
+riscv64-plct-linux-gnu-c++        riscv64-plct-linux-gnu-gcc-ranlib     riscv64-plct-linux-gnu-ld.bfd    riscv64-plct-linux-gnu-strings
+riscv64-plct-linux-gnu-cc         riscv64-plct-linux-gnu-gcov           riscv64-plct-linux-gnu-ldd       riscv64-plct-linux-gnu-strip
+riscv64-plct-linux-gnu-c++filt    riscv64-plct-linux-gnu-gcov-dump      riscv64-plct-linux-gnu-lto-dump  ruyi-activate
+riscv64-plct-linux-gnu-cpp        riscv64-plct-linux-gnu-gcov-tool      riscv64-plct-linux-gnu-nm
+riscv64-plct-linux-gnu-elfedit    riscv64-plct-linux-gnu-gdb            riscv64-plct-linux-gnu-objcopy
+riscv64-plct-linux-gnu-g++        riscv64-plct-linux-gnu-gdb-add-index  riscv64-plct-linux-gnu-objdump

除了 ruyi-activate 为激活编译环境用的脚本,其他均为工具链二进制。

激活编译环境:

bash
$ . milkv-venv/bin/ruyi-activate
+«Ruyi milkv-venv» $
$ . milkv-venv/bin/ruyi-activate
+«Ruyi milkv-venv» $

此时应当可以正常调用工具链

bash
«Ruyi milkv-venv» $ riscv64-plct-linux-gnu-gcc --version
+riscv64-plct-linux-gnu-gcc (RuyiSDK 20231118 PLCT-Sources) 13.1.0
+Copyright (C) 2023 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
«Ruyi milkv-venv» $ riscv64-plct-linux-gnu-gcc --version
+riscv64-plct-linux-gnu-gcc (RuyiSDK 20231118 PLCT-Sources) 13.1.0
+Copyright (C) 2023 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

退出编译环境:

bash
«Ruyi venv» $ ruyi-deactivate
+$
«Ruyi venv» $ ruyi-deactivate
+$
+ + + + \ No newline at end of file diff --git a/zh/environment/xthead-sipeed-lpi4a/index.html b/zh/environment/xthead-sipeed-lpi4a/index.html new file mode 100644 index 00000000..e3e5224c --- /dev/null +++ b/zh/environment/xthead-sipeed-lpi4a/index.html @@ -0,0 +1,185 @@ + + + + + + 使用平头哥工具链配置荔枝派 4A 编译环境 | RuyiSDK documentation + + + + + + + + + + + + +
Skip to content

使用平头哥工具链配置荔枝派 4A 编译环境

list profiles 的输出可以看到,预置的 sipeed-lpi4a 配置需要支持 xthead 特性的工具链包。 若指定不支持该特性的工具链建立虚拟环境并不会报错,但是在构建过程中将会报错:

bash
$ ruyi venv -t slug:gnu-plct-20231118 sipeed-lpi4a venv
+info: Creating a Ruyi virtual environment at venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking `ruyi-deactivate`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.
+
+$ . venv/bin/ruyi-activate
+«Ruyi venv» $ riscv64-plct-linux-gnu-gcc test.c
+cc1: error: '-mcpu=c910': unknown CPU
+cc1: error: unknown cpu 'c910' for '-mtune'
$ ruyi venv -t slug:gnu-plct-20231118 sipeed-lpi4a venv
+info: Creating a Ruyi virtual environment at venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking `ruyi-deactivate`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.
+
+$ . venv/bin/ruyi-activate
+«Ruyi venv» $ riscv64-plct-linux-gnu-gcc test.c
+cc1: error: '-mcpu=c910': unknown CPU
+cc1: error: unknown cpu 'c910' for '-mtune'

ruyi list -v 中可以看到 gnu-plct-xthead 工具链是支持该特性的:

bash
$ ruyi list -v
+
+...
+
+## toolchain/gnu-plct-xthead 0.20231118.0
+
+...
+
+### Toolchain metadata
+
+* Target: riscv64-plctxthead-linux-gnu
+* Flavors: ['xthead']
+* Components:
+    - binutils 2.35
+    - gcc 10.2.0
+    - gdb 10.0
+    - glibc 2.33
+    - linux-headers 6.4
+
+...
$ ruyi list -v
+
+...
+
+## toolchain/gnu-plct-xthead 0.20231118.0
+
+...
+
+### Toolchain metadata
+
+* Target: riscv64-plctxthead-linux-gnu
+* Flavors: ['xthead']
+* Components:
+    - binutils 2.35
+    - gcc 10.2.0
+    - gdb 10.0
+    - glibc 2.33
+    - linux-headers 6.4
+
+...

平头哥工具链软件包名为 gnu-plct-xthead , v0.2 最新版本二进制为 gnu-plct-xthead-20231118 :

bash
$ ruyi install slug:gnu-plct-xthead-20231118
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  273M  100  273M    0     0  10.8M      0  0:00:25  0:00:25 --:--:-- 10.9M
+info: extracting RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz for package gnu-plct-xthead-0.20231118.0
+info: package gnu-plct-xthead-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-plct-xthead-0.20231118.0
$ ruyi install slug:gnu-plct-xthead-20231118
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  273M  100  273M    0     0  10.8M      0  0:00:25  0:00:25 --:--:-- 10.9M
+info: extracting RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz for package gnu-plct-xthead-0.20231118.0
+info: package gnu-plct-xthead-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-plct-xthead-0.20231118.0

由预置的 sipeed-lpi4a 配置在 ./sipeed-venv 建立编译环境:

bash
$ ruyi venv -t slug:gnu-plct-xthead-20231118 sipeed-lpi4a ./sipeed-venv
+info: Creating a Ruyi virtual environment at sipeed-venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking `ruyi-deactivate`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/sipeed-venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.
$ ruyi venv -t slug:gnu-plct-xthead-20231118 sipeed-lpi4a ./sipeed-venv
+info: Creating a Ruyi virtual environment at sipeed-venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking `ruyi-deactivate`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/sipeed-venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.

查看可用的工具链二进制:

bash
$ ls ./sipeed-venv/bin/
+riscv64-plctxthead-linux-gnu-addr2line  riscv64-plctxthead-linux-gnu-gcc-nm         riscv64-plctxthead-linux-gnu-ldd
+riscv64-plctxthead-linux-gnu-ar         riscv64-plctxthead-linux-gnu-gcc-ranlib     riscv64-plctxthead-linux-gnu-lto-dump
+riscv64-plctxthead-linux-gnu-as         riscv64-plctxthead-linux-gnu-gcov           riscv64-plctxthead-linux-gnu-nm
+riscv64-plctxthead-linux-gnu-c++        riscv64-plctxthead-linux-gnu-gcov-dump      riscv64-plctxthead-linux-gnu-objcopy
+riscv64-plctxthead-linux-gnu-cc         riscv64-plctxthead-linux-gnu-gcov-tool      riscv64-plctxthead-linux-gnu-objdump
+riscv64-plctxthead-linux-gnu-c++filt    riscv64-plctxthead-linux-gnu-gdb            riscv64-plctxthead-linux-gnu-ranlib
+riscv64-plctxthead-linux-gnu-cpp        riscv64-plctxthead-linux-gnu-gdb-add-index  riscv64-plctxthead-linux-gnu-readelf
+riscv64-plctxthead-linux-gnu-elfedit    riscv64-plctxthead-linux-gnu-gfortran       riscv64-plctxthead-linux-gnu-size
+riscv64-plctxthead-linux-gnu-g++        riscv64-plctxthead-linux-gnu-gprof          riscv64-plctxthead-linux-gnu-strings
+riscv64-plctxthead-linux-gnu-gcc        riscv64-plctxthead-linux-gnu-ld             riscv64-plctxthead-linux-gnu-strip
+riscv64-plctxthead-linux-gnu-gcc-ar     riscv64-plctxthead-linux-gnu-ld.bfd         ruyi-activate
$ ls ./sipeed-venv/bin/
+riscv64-plctxthead-linux-gnu-addr2line  riscv64-plctxthead-linux-gnu-gcc-nm         riscv64-plctxthead-linux-gnu-ldd
+riscv64-plctxthead-linux-gnu-ar         riscv64-plctxthead-linux-gnu-gcc-ranlib     riscv64-plctxthead-linux-gnu-lto-dump
+riscv64-plctxthead-linux-gnu-as         riscv64-plctxthead-linux-gnu-gcov           riscv64-plctxthead-linux-gnu-nm
+riscv64-plctxthead-linux-gnu-c++        riscv64-plctxthead-linux-gnu-gcov-dump      riscv64-plctxthead-linux-gnu-objcopy
+riscv64-plctxthead-linux-gnu-cc         riscv64-plctxthead-linux-gnu-gcov-tool      riscv64-plctxthead-linux-gnu-objdump
+riscv64-plctxthead-linux-gnu-c++filt    riscv64-plctxthead-linux-gnu-gdb            riscv64-plctxthead-linux-gnu-ranlib
+riscv64-plctxthead-linux-gnu-cpp        riscv64-plctxthead-linux-gnu-gdb-add-index  riscv64-plctxthead-linux-gnu-readelf
+riscv64-plctxthead-linux-gnu-elfedit    riscv64-plctxthead-linux-gnu-gfortran       riscv64-plctxthead-linux-gnu-size
+riscv64-plctxthead-linux-gnu-g++        riscv64-plctxthead-linux-gnu-gprof          riscv64-plctxthead-linux-gnu-strings
+riscv64-plctxthead-linux-gnu-gcc        riscv64-plctxthead-linux-gnu-ld             riscv64-plctxthead-linux-gnu-strip
+riscv64-plctxthead-linux-gnu-gcc-ar     riscv64-plctxthead-linux-gnu-ld.bfd         ruyi-activate

进入编译环境并编译一个简单的 C 程序:

bash
$ . sipeed-venv/bin/ruyi-activate
+«Ruyi sipeed-venv» $ cd sipeed-venv/
+«Ruyi sipeed-venv» $ cat > test.c << EOF
+int main()
+{
+    return 0;
+}
+EOF
+«Ruyi sipeed-venv» $ riscv64-plctxthead-linux-gnu-gcc test.c
+«Ruyi sipeed-venv» $ file a.out
+a.out: ELF 64-bit LSB executable, UCB RISC-V, RVC, double-float ABI, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64xthead-lp64d.so.1, BuildID[sha1]=a6c6dcc8a7565fc17427d8ece055874c9bbf6a7a, for GNU/Linux 4.15.0, with debug_info, not stripped
$ . sipeed-venv/bin/ruyi-activate
+«Ruyi sipeed-venv» $ cd sipeed-venv/
+«Ruyi sipeed-venv» $ cat > test.c << EOF
+int main()
+{
+    return 0;
+}
+EOF
+«Ruyi sipeed-venv» $ riscv64-plctxthead-linux-gnu-gcc test.c
+«Ruyi sipeed-venv» $ file a.out
+a.out: ELF 64-bit LSB executable, UCB RISC-V, RVC, double-float ABI, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64xthead-lp64d.so.1, BuildID[sha1]=a6c6dcc8a7565fc17427d8ece055874c9bbf6a7a, for GNU/Linux 4.15.0, with debug_info, not stripped

成功编译并生成 RISC-V 架构的二进制。

退出编译环境:

bash
«Ruyi sipeed-venv» $ ruyi-deactivate
+$
«Ruyi sipeed-venv» $ ruyi-deactivate
+$
+ + + + \ No newline at end of file diff --git a/zh/index.html b/zh/index.html index baa0cbff..b37e6eb5 100644 --- a/zh/index.html +++ b/zh/index.html @@ -7,17 +7,17 @@ - + - - + +
Skip to content

RuyiSDK 文档

本手册包含了 RuyiSDK 如何构建、如何使用的相关内容。

- + \ No newline at end of file diff --git a/zh/index_en.html b/zh/index_en.html index c1b8d073..963e8c3d 100644 --- a/zh/index_en.html +++ b/zh/index_en.html @@ -7,17 +7,17 @@ - + - - + +
Skip to content

RuyiSDK 文档

本手册包含了 RuyiSDK 如何构建、如何使用的相关内容。

- + \ No newline at end of file diff --git a/zh/introduction/index.html b/zh/introduction/index.html index 06d4b54d..6b1e005a 100644 --- a/zh/introduction/index.html +++ b/zh/introduction/index.html @@ -7,17 +7,17 @@ - + - - + + -
Skip to content

介绍

RUYISDK 是一个旨在提供给一个一体化集成开发环境的产品计划。从 2023 年开始筹备,计划用三年时间为 RISC-V 开发者提供一个完整的、全家桶式的全功能开发环境。

RUYISDK 的目标

  1. 开发者购买了 (几乎) 任何一款 RISC-V 开发板或模组,都可以通过 RUYISDK 系统获得硬件资料说明、固件 / 软件更新、调试支持等。
  2. 开发者可以指定任何常用的 RISC-V 扩展指令集架构组合,都可以通过 RUYISDK 系统生成客户所需的操作系统、工具链、语言执行环境 (运行时或虚拟机)、计算库、应用框架等。尤其强调 RUYISDK 将完全支持 Vector 0.7.1 和 RVP 0.5.2 等已经大规模硅化的草案 标准 (or 厂商定制扩展)。
  3. 培育运营一个活跃全面的开发者交流社区。

RUYISDK 架构示意图

image

RuyiSDK 包含的内容

RuyiSDK 包管理器

GitHub 项目

文档

- +
Skip to content

介绍

RUYISDK 是一个旨在提供给一个一体化集成开发环境的产品计划。从 2023 年开始筹备,计划用三年时间为 RISC-V 开发者提供一个完整的、全家桶式的全功能开发环境。

RUYISDK 的目标

  1. 开发者购买了 (几乎) 任何一款 RISC-V 开发板或模组,都可以通过 RUYISDK 系统获得硬件资料说明、固件 / 软件更新、调试支持等。
  2. 开发者可以指定任何常用的 RISC-V 扩展指令集架构组合,都可以通过 RUYISDK 系统生成客户所需的操作系统、工具链、语言执行环境 (运行时或虚拟机)、计算库、应用框架等。尤其强调 RUYISDK 将完全支持 Vector 0.7.1 和 RVP 0.5.2 等已经大规模硅化的草案 标准 (or 厂商定制扩展)。
  3. 培育运营一个活跃全面的开发者交流社区。

RUYISDK 架构示意图

image

RuyiSDK 包含的内容

RuyiSDK 包管理器

GitHub 项目

文档

+ \ No newline at end of file diff --git a/zh/mirror/index.html b/zh/mirror/index.html new file mode 100644 index 00000000..3e69ecc2 --- /dev/null +++ b/zh/mirror/index.html @@ -0,0 +1,43 @@ + + + + + + 用户软件源搭建 | RuyiSDK documentation + + + + + + + + + + + + +
Skip to content

用户软件源搭建

软件源搭建功能在 v0.2 尚未开发完全,仅有建立 manifest 的功能。

建立 manifest :

bash
$ ruyi admin manifest ./source/zlib-ng-2.1.5.tar.gz
+[
+  {
+    "name": "zlib-ng-2.1.5.tar.gz",
+    "size": 2410601,
+    "checksums": {
+      "sha512": "9212d87c63a2da4e5355a7a1c75380aeba40fbd0ea3d71d3784cb3eac94237f9bea2a1b7993a08f39d4197725c4c133087d3a9d213d3944aa48a7559de2be920",
+      "sha256": "3f6576971397b379d4205ae5451ff5a68edf6c103b2f03c4188ed7075fbb5f04"
+    }
+  }
+]
$ ruyi admin manifest ./source/zlib-ng-2.1.5.tar.gz
+[
+  {
+    "name": "zlib-ng-2.1.5.tar.gz",
+    "size": 2410601,
+    "checksums": {
+      "sha512": "9212d87c63a2da4e5355a7a1c75380aeba40fbd0ea3d71d3784cb3eac94237f9bea2a1b7993a08f39d4197725c4c133087d3a9d213d3944aa48a7559de2be920",
+      "sha256": "3f6576971397b379d4205ae5451ff5a68edf6c103b2f03c4188ed7075fbb5f04"
+    }
+  }
+]
+ + + + \ No newline at end of file diff --git a/zh/plan/index.html b/zh/plan/index.html index 83a0aa1a..9fa40563 100644 --- a/zh/plan/index.html +++ b/zh/plan/index.html @@ -7,17 +7,17 @@ - + - - + + -
Skip to content

版本规划路线图

- +
Skip to content

版本规划路线图

+ \ No newline at end of file diff --git a/zh/ruyi-package/index.html b/zh/ruyi-package/index.html index be03e58d..24aef478 100644 --- a/zh/ruyi-package/index.html +++ b/zh/ruyi-package/index.html @@ -7,21 +7,141 @@ - + - - + + -
Skip to content

Ruyi 包管理器

Ruyi 包管理器是设计为用于 RuyiSDK 的包管理器,用于管理工具链。

安装包管理器

目前,您可以从 Ruyi Mirror 下载预编译二进制文件并将其重命名为 ruyi

bash
wget https://mirror.iscas.ac.cn/ruyisdk/ruyi/testing/ruyi.20231030
-mv ruyi.20231030 ruyi
-chmod +x ruyi
wget https://mirror.iscas.ac.cn/ruyisdk/ruyi/testing/ruyi.20231030
-mv ruyi.20231030 ruyi
-chmod +x ruyi

然后将 ruyi 可执行文件加入 $PATH

bash
export PATH="$PATH:/home/ruyi/"
export PATH="$PATH:/home/ruyi/"

命令

Update

  • 将 RuyiSDK 元数据同步到本地存储
  • 默认情况下,存储库克隆到 $XDG_CACHE_HOME/ruyi/packages-index
  • 如果 $XDG_CACHE_HOME 未设置,则默认为 ~/.cache
bash
ruyi update
ruyi update

List

  • 列出可用的工具链
bash
ruyi list
ruyi list

Install

安装一个选定的包。

bash
ruyi install plct-20231026
ruyi install plct-20231026

移除一个包

移除一个选定的包

bash
ruyi uninstall plct-20231026
ruyi uninstall plct-20231026

列出可用的 Profiles

列出所有可用的 Profiles

bash
ruyi list profiles
ruyi list profiles
- +
Skip to content

Ruyi 包管理器

RUYI 包管理是 RuyiSDK 开发中的包管理器。用于管理工具链、模拟器、源码等各种二进制软件包和源码包。

支持的发行版平台

当前 RUYI 包管理器 v0.2 版本在以下平台进行了测试

  • x86-64 Fedora 38
  • x86-64 Ubuntu 22.04 LTS
  • x86-64 openEuler 23.09
  • riscv64 RevyOS 20231026
  • riscv64 openEuler 23.09

命令

RUYI 目前支持的命令如下:

bash
ruyi list
+# 从本地软件包缓存中列出可用软件包
+ruyi list profiles
+# 列出已安装的配置
+ruyi update
+# 从配置的软件源更新本地软件包缓存
+ruyi install
+# 下载并安装指定的软件包
+ruyi venv
+# 由指定的工具链和配置建立 RUYI 虚拟环境
+ruyi extract
+# 下载并解包指定的源码包
+ruyi admin
+# ruyi 镜像搭建工具(完善中)
+ruyi self uninstall
+# 卸载 RUYI 包管理器
ruyi list
+# 从本地软件包缓存中列出可用软件包
+ruyi list profiles
+# 列出已安装的配置
+ruyi update
+# 从配置的软件源更新本地软件包缓存
+ruyi install
+# 下载并安装指定的软件包
+ruyi venv
+# 由指定的工具链和配置建立 RUYI 虚拟环境
+ruyi extract
+# 下载并解包指定的源码包
+ruyi admin
+# ruyi 镜像搭建工具(完善中)
+ruyi self uninstall
+# 卸载 RUYI 包管理器

依赖软件

RUYI 包管理器依赖一些外部工具,需要手动安装

Debian/Ubuntu

bash
$ sudo apt-get install wget git tar bzip2 xz-utils zstd
$ sudo apt-get install wget git tar bzip2 xz-utils zstd

Fedora/openEuler

bash
$ sudo apt-get install wget git tar bzip2 xz zstd
$ sudo apt-get install wget git tar bzip2 xz zstd

安装 RUYI 包管理器

从发布镜像中选择合适架构的预编译二进制下载,当前 RUYI 包管理支持 amd64 和 riscv64 架构编译环境。

v0.2 版本的稳定二进制为 20231204 版本。

这里以 amd64 架构环境为例进行安装:

bash
$ wget https://mirror.iscas.ac.cn/ruyisdk/ruyi/testing/ruyi.amd64.20231204
+$ chmod +x ./ruyi.amd64.20231204
+$ sudo cp ruyi.amd64.20231204 /usr/local/bin/ruyi
+$ ruyi version
+Ruyi 0.2.0-beta.20231204
+Copyright (C) 2023 Institute of Software, Chinese Academy of Sciences (ISCAS).
+All rights reserved.
+License: Apache-2.0 <https://www.apache.org/licenses/LICENSE-2.0>
$ wget https://mirror.iscas.ac.cn/ruyisdk/ruyi/testing/ruyi.amd64.20231204
+$ chmod +x ./ruyi.amd64.20231204
+$ sudo cp ruyi.amd64.20231204 /usr/local/bin/ruyi
+$ ruyi version
+Ruyi 0.2.0-beta.20231204
+Copyright (C) 2023 Institute of Software, Chinese Academy of Sciences (ISCAS).
+All rights reserved.
+License: Apache-2.0 <https://www.apache.org/licenses/LICENSE-2.0>

ruyi version 应当可以正常打印版本信息。注意二进制的文件名必须为 ruyi

列出帮助信息:

bash
$ ruyi --help
+usage: ruyi [-h] [-V] {extract,install,i,list,update,venv,admin,self,version} ...
+
+RuyiSDK Package Manager 0.2.0-beta.20231204
+
+options:
+  -h, --help            show this help message and exit
+  -V, --version         Print version information
+
+subcommands:
+  {extract,install,i,list,update,venv,admin,self,version}
+    extract             Fetch package(s) then extract to current directory
+    install (i)         Install package from configured repository
+    list                List available packages in configured repository
+    update              Update RuyiSDK repo and packages
+    venv                Generate a virtual environment adapted to the chosen toolchain and profile
+    admin               (NOT FOR REGULAR USERS) Subcommands for managing Ruyi repos
+    self                Manage this Ruyi installation
+    version             Print version information
$ ruyi --help
+usage: ruyi [-h] [-V] {extract,install,i,list,update,venv,admin,self,version} ...
+
+RuyiSDK Package Manager 0.2.0-beta.20231204
+
+options:
+  -h, --help            show this help message and exit
+  -V, --version         Print version information
+
+subcommands:
+  {extract,install,i,list,update,venv,admin,self,version}
+    extract             Fetch package(s) then extract to current directory
+    install (i)         Install package from configured repository
+    list                List available packages in configured repository
+    update              Update RuyiSDK repo and packages
+    venv                Generate a virtual environment adapted to the chosen toolchain and profile
+    admin               (NOT FOR REGULAR USERS) Subcommands for managing Ruyi repos
+    self                Manage this Ruyi installation
+    version             Print version information

刷新软件包缓存

更新软件包缓存,使用默认镜像即可:

bash
$ ruyi update
$ ruyi update

软件包缓存将存放在用户目录中,通常为 ~/.cache/ruyi ;在 XDG_CACHE_HOME 环境变量被设置时,目录为 $XDG_CACHE_HOME/ruyi 。 在本文档中家目录为 /home/myon

查看可用的软件包,该命令将列出所有可用的软件包:

bash
$ ruyi list
+List of available packages:
+
+* source/ruyisdk-demo
+  - 0.20231114.0 (latest)
+* source/coremark
+  - 1.0.2-pre.20230125 (prerelease, latest-prerelease)
+  - 1.0.1 (latest)
+* emulator/qemu-user-riscv-xthead
+  - 6.1.0-ruyi.20231207+g03813c9fe8 (latest)
+* emulator/qemu-user-riscv-upstream
+  - 8.1.2-ruyi.20231121 (latest)
+* toolchain/gnu-plct
+  - 0.20231118.0 (latest) slug: gnu-plct-20231118
+* toolchain/gnu-plct-xthead
+  - 0.20231118.0 (latest) slug: gnu-plct-xthead-20231118
+* toolchain/gnu-upstream
+  - 0.20231118.0 (latest) slug: gnu-upstream-20231118
+* toolchain/llvm-upstream
+  - 17.0.5-ruyi.20231121 (latest) slug: llvm-upstream-20231121
$ ruyi list
+List of available packages:
+
+* source/ruyisdk-demo
+  - 0.20231114.0 (latest)
+* source/coremark
+  - 1.0.2-pre.20230125 (prerelease, latest-prerelease)
+  - 1.0.1 (latest)
+* emulator/qemu-user-riscv-xthead
+  - 6.1.0-ruyi.20231207+g03813c9fe8 (latest)
+* emulator/qemu-user-riscv-upstream
+  - 8.1.2-ruyi.20231121 (latest)
+* toolchain/gnu-plct
+  - 0.20231118.0 (latest) slug: gnu-plct-20231118
+* toolchain/gnu-plct-xthead
+  - 0.20231118.0 (latest) slug: gnu-plct-xthead-20231118
+* toolchain/gnu-upstream
+  - 0.20231118.0 (latest) slug: gnu-upstream-20231118
+* toolchain/llvm-upstream
+  - 17.0.5-ruyi.20231121 (latest) slug: llvm-upstream-20231121

从输出可以看到软件包共分为三种,其中 source 代表了软件源码包, toolchain 代表了工具链二进制包, emulator 代表了模拟器二进制包。

如果软件包显示 “no binary for current host” 则该软件包的当前版本不支持本机架构。

列出所有软件包的详细信息:

bash
$ ruyi list -v
$ ruyi list -v

列出已知编译环境配置:

bash
$ ruyi list profiles
+generic
+sipeed-lpi4a (needs flavor(s): {'xthead'})
+milkv-duo
$ ruyi list profiles
+generic
+sipeed-lpi4a (needs flavor(s): {'xthead'})
+milkv-duo

这些预置的配置可以用于编译环境的搭建。

卸载 RUYI 包管理器

使用下面的命令卸载 RUYI 包管理器:

bash
$ ruyi self uninstall
$ ruyi self uninstall

这个命令将会询问您以二次确认该操作,如果希望 RUYI 包管理不询问而直接执行:

bash
$ ruyi self uninstall -y
$ ruyi self uninstall -y

上面的命令只是删除 RUYI 本身,并不会删除软件包缓存和安装的 RUYI 软件包。

如果希望删除所有缓存和安装了的软件包以实现干净的卸载:

bash
$ ruyi self uninstall --purge
$ ruyi self uninstall --purge

同样的这个命令将会询问您以二次确认该操作,如果希望 RUYI 包管理不询问而直接执行:

bash
$ ruyi self uninstall --purge -y
$ ruyi self uninstall --purge -y

实现 RUYI 包管理自身的升级可能会需要超级用户权限,而 RUYI 包管理被设计为避免进行需要超级用户权限的操作。 故在需要升级 RUYI 包管理时您需要手动进行该操作,即首先卸载 RUYI 包管理器,再执行安装 RUYI 包管理器的过程, 这个过程中您可以自主选择是否保留旧的软件包缓存和 RUYI 软件包。

注意 RUYI 包管理器也没有实现卸载 RUYI 软件包的功能。这在您强制中断 RUYI 软件包安装进程或做了其他非预期操作时 可能会导致软件包无法重新安装。此时您可以尝试删除 ~/.local/share/ruyi/binaries/${XDG_DATA_HOME}/ruyi/binaries/ 下对应的 RUYI 软件包安装目录后再重试安装。手动执行删除软件包操作时, 务必提前确认您的操作会得到预期效果。

+ \ No newline at end of file diff --git a/zh/sdk/gnu/index.html b/zh/sdk/gnu/index.html index 673ceeb2..234268f8 100644 --- a/zh/sdk/gnu/index.html +++ b/zh/sdk/gnu/index.html @@ -7,11 +7,11 @@ - + - - + + @@ -92,8 +92,8 @@ This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

退出编译环境:

bash
«Ruyi venv» [myon@youmu-work ruyi]$ ruyi-deactivate
 [myon@youmu-work ruyi]$
«Ruyi venv» [myon@youmu-work ruyi]$ ruyi-deactivate
-[myon@youmu-work ruyi]$

环境将被还原。

- +[myon@youmu-work ruyi]$

环境将被还原。

+ \ No newline at end of file diff --git a/zh/sdk/llvm/index.html b/zh/sdk/llvm/index.html index 132690ba..c612371f 100644 --- a/zh/sdk/llvm/index.html +++ b/zh/sdk/llvm/index.html @@ -7,17 +7,17 @@ - + - - + + -
Skip to content

使用 LLVM 上游工具链配置 RISC-V 编译环境

注意在 v0.2 版本中,该部分只适用于在 x86-64 host 配置交叉编译环境。

LLVM 上游工具链软件包名为 llvm-upstream,v0.2 最新版本二进制为 llvm-upstream-20231121。 由于配置 LLVM 工具链环境依赖 gcc 环境,故同时需要安装 gcc 工具链。

bash
ruyi install slug:llvm-upstream-20231121 slug:gnu-upstream-20231118
ruyi install slug:llvm-upstream-20231121 slug:gnu-upstream-20231118
- +
Skip to content

使用 LLVM 上游工具链配置 RISC-V 编译环境

注意在 v0.2 版本中,该部分只适用于在 x86-64 host 配置交叉编译环境。

LLVM 上游工具链软件包名为 llvm-upstream,v0.2 最新版本二进制为 llvm-upstream-20231121。 由于配置 LLVM 工具链环境依赖 gcc 环境,故同时需要安装 gcc 工具链。

bash
ruyi install slug:llvm-upstream-20231121 slug:gnu-upstream-20231118
ruyi install slug:llvm-upstream-20231121 slug:gnu-upstream-20231118
+ \ No newline at end of file diff --git a/zh/virtual_machine/qemu-upstream/index.html b/zh/virtual_machine/qemu-upstream/index.html new file mode 100644 index 00000000..ade7b1ce --- /dev/null +++ b/zh/virtual_machine/qemu-upstream/index.html @@ -0,0 +1,131 @@ + + + + + + 使用上游 QEMU 模拟器运行交叉编译的 RISC-V 二进制 | RuyiSDK documentation + + + + + + + + + + + + +
Skip to content

使用上游 QEMU 模拟器运行交叉编译的 RISC-V 二进制

这里使用上游工具链配置带 QEMU 支持 RISC-V 编译环境,并使用上游 QEMU 运行构建出的 RISC-V 二进制。

bash
$ ruyi install slug:gnu-plct-20231118 qemu-user-riscv-upstream
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/qemu-user-riscv-8.1.2.ruyi-20231121.amd64.tar.zst to
+/home/myon/.cache/ruyi/distfiles/qemu-user-riscv-8.1.2.ruyi-20231121.amd64.tar.zst
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100 14.4M  100 14.4M    0     0  7217k      0  0:00:02  0:00:02 --:--:-- 7218k
+info: extracting qemu-user-riscv-8.1.2.ruyi-20231121.amd64.tar.zst for package qemu-user-riscv-upstream-8.1.2-ruyi.20231121
+info: package qemu-user-riscv-upstream-8.1.2-ruyi.20231121 installed to
+/home/myon/.local/share/ruyi/binaries/x86_64/qemu-user-riscv-upstream-8.1.2-ruyi.20231121
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  232M  100  232M    0     0  10.1M      0  0:00:22  0:00:22 --:--:-- 11.0M
+info: extracting RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz for package gnu-plct-0.20231118.0
+info: package gnu-plct-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-plct-0.20231118.0
$ ruyi install slug:gnu-plct-20231118 qemu-user-riscv-upstream
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/qemu-user-riscv-8.1.2.ruyi-20231121.amd64.tar.zst to
+/home/myon/.cache/ruyi/distfiles/qemu-user-riscv-8.1.2.ruyi-20231121.amd64.tar.zst
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100 14.4M  100 14.4M    0     0  7217k      0  0:00:02  0:00:02 --:--:-- 7218k
+info: extracting qemu-user-riscv-8.1.2.ruyi-20231121.amd64.tar.zst for package qemu-user-riscv-upstream-8.1.2-ruyi.20231121
+info: package qemu-user-riscv-upstream-8.1.2-ruyi.20231121 installed to
+/home/myon/.local/share/ruyi/binaries/x86_64/qemu-user-riscv-upstream-8.1.2-ruyi.20231121
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  232M  100  232M    0     0  10.1M      0  0:00:22  0:00:22 --:--:-- 11.0M
+info: extracting RuyiSDK-20231118-PLCT-Sources-riscv64-plct-linux-gnu.tar.xz for package gnu-plct-0.20231118.0
+info: package gnu-plct-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-plct-0.20231118.0

建立编译环境:

bash
$ ruyi venv -t gnu-plct generic -e qemu-user-riscv-upstream ./qemu_venv
+info: Creating a Ruyi virtual environment at qemu_venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking `ruyi-deactivate`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/qemu_venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.
$ ruyi venv -t gnu-plct generic -e qemu-user-riscv-upstream ./qemu_venv
+info: Creating a Ruyi virtual environment at qemu_venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking `ruyi-deactivate`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/qemu_venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.

查看可用的二进制:

bash
$ ls qemu_venv/bin/
+riscv64-plct-linux-gnu-addr2line  riscv64-plct-linux-gnu-gcc            riscv64-plct-linux-gnu-gfortran  riscv64-plct-linux-gnu-ranlib
+riscv64-plct-linux-gnu-ar         riscv64-plct-linux-gnu-gcc-ar         riscv64-plct-linux-gnu-gprof     riscv64-plct-linux-gnu-readelf
+riscv64-plct-linux-gnu-as         riscv64-plct-linux-gnu-gcc-nm         riscv64-plct-linux-gnu-ld        riscv64-plct-linux-gnu-size
+riscv64-plct-linux-gnu-c++        riscv64-plct-linux-gnu-gcc-ranlib     riscv64-plct-linux-gnu-ld.bfd    riscv64-plct-linux-gnu-strings
+riscv64-plct-linux-gnu-cc         riscv64-plct-linux-gnu-gcov           riscv64-plct-linux-gnu-ldd       riscv64-plct-linux-gnu-strip
+riscv64-plct-linux-gnu-c++filt    riscv64-plct-linux-gnu-gcov-dump      riscv64-plct-linux-gnu-lto-dump  ruyi-activate
+riscv64-plct-linux-gnu-cpp        riscv64-plct-linux-gnu-gcov-tool      riscv64-plct-linux-gnu-nm        ruyi-qemu
+riscv64-plct-linux-gnu-elfedit    riscv64-plct-linux-gnu-gdb            riscv64-plct-linux-gnu-objcopy
+riscv64-plct-linux-gnu-g++        riscv64-plct-linux-gnu-gdb-add-index  riscv64-plct-linux-gnu-objdump
$ ls qemu_venv/bin/
+riscv64-plct-linux-gnu-addr2line  riscv64-plct-linux-gnu-gcc            riscv64-plct-linux-gnu-gfortran  riscv64-plct-linux-gnu-ranlib
+riscv64-plct-linux-gnu-ar         riscv64-plct-linux-gnu-gcc-ar         riscv64-plct-linux-gnu-gprof     riscv64-plct-linux-gnu-readelf
+riscv64-plct-linux-gnu-as         riscv64-plct-linux-gnu-gcc-nm         riscv64-plct-linux-gnu-ld        riscv64-plct-linux-gnu-size
+riscv64-plct-linux-gnu-c++        riscv64-plct-linux-gnu-gcc-ranlib     riscv64-plct-linux-gnu-ld.bfd    riscv64-plct-linux-gnu-strings
+riscv64-plct-linux-gnu-cc         riscv64-plct-linux-gnu-gcov           riscv64-plct-linux-gnu-ldd       riscv64-plct-linux-gnu-strip
+riscv64-plct-linux-gnu-c++filt    riscv64-plct-linux-gnu-gcov-dump      riscv64-plct-linux-gnu-lto-dump  ruyi-activate
+riscv64-plct-linux-gnu-cpp        riscv64-plct-linux-gnu-gcov-tool      riscv64-plct-linux-gnu-nm        ruyi-qemu
+riscv64-plct-linux-gnu-elfedit    riscv64-plct-linux-gnu-gdb            riscv64-plct-linux-gnu-objcopy
+riscv64-plct-linux-gnu-g++        riscv64-plct-linux-gnu-gdb-add-index  riscv64-plct-linux-gnu-objdump

可以看到 QEMU 模拟器的命令为 ruyi-qemu

进入编译环境:

bash
$ . qemu_venv/bin/ruyi-activate
+«Ruyi qemu_venv» $
$ . qemu_venv/bin/ruyi-activate
+«Ruyi qemu_venv» $

编译一个简单的 C 程序并使用 QEMU 运行:

bash
«Ruyi qemu_venv» $ cd qemu_venv/
+«Ruyi qemu_venv» $ cat > test.c << EOF
+#include <stdio.h>
+
+int main()
+{
+    printf("hello, ruyi");
+    putchar('\n');
+
+    return 0;
+}
+EOF
+«Ruyi qemu_venv» $ riscv64-plct-linux-gnu-gcc -O3 test.c -o test
+«Ruyi qemu_venv» $ ruyi-qemu ./test
+hello, ruyi
«Ruyi qemu_venv» $ cd qemu_venv/
+«Ruyi qemu_venv» $ cat > test.c << EOF
+#include <stdio.h>
+
+int main()
+{
+    printf("hello, ruyi");
+    putchar('\n');
+
+    return 0;
+}
+EOF
+«Ruyi qemu_venv» $ riscv64-plct-linux-gnu-gcc -O3 test.c -o test
+«Ruyi qemu_venv» $ ruyi-qemu ./test
+hello, ruyi

退出编译环境:

bash
«Ruyi qemu_venv» $ ruyi-deactivate
+$
«Ruyi qemu_venv» $ ruyi-deactivate
+$
+ + + + \ No newline at end of file diff --git a/zh/virtual_machine/qemu-xthead/index.html b/zh/virtual_machine/qemu-xthead/index.html new file mode 100644 index 00000000..b4a0cc3d --- /dev/null +++ b/zh/virtual_machine/qemu-xthead/index.html @@ -0,0 +1,137 @@ + + + + + + 使用平头哥 QEMU 模拟器运行交叉编译的 RISC-V 二进制 | RuyiSDK documentation + + + + + + + + + + + + +
Skip to content

使用平头哥 QEMU 模拟器运行交叉编译的 RISC-V 二进制

这里使用平头哥工具链配置带 QEMU 支持的荔枝派 4A 编译环境,并使用平头哥 QEMU 运行构建出的 RISC-V 二进制。

bash
$ ruyi install slug:gnu-plct-xthead-20231118 qemu-user-riscv-xthead
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/qemu-user-riscv-xthead-6.1.0.ruyi-20231207.amd64.tar.zst to
+/home/myon/.cache/ruyi/distfiles/qemu-user-riscv-xthead-6.1.0.ruyi-20231207.amd64.tar.zst
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100 3577k  100 3577k    0     0  6110k      0 --:--:-- --:--:-- --:--:-- 6104k
+info: extracting qemu-user-riscv-xthead-6.1.0.ruyi-20231207.amd64.tar.zst for package qemu-user-riscv-xthead-6.1.0-ruyi.20231207+g03813c9fe8
+info: package qemu-user-riscv-xthead-6.1.0-ruyi.20231207+g03813c9fe8 installed to
+/home/myon/.local/share/ruyi/binaries/x86_64/qemu-user-riscv-xthead-6.1.0-ruyi.20231207+g03813c9fe8
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  273M  100  273M    0     0  10.2M      0  0:00:26  0:00:26 --:--:-- 10.9M
+info: extracting RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz for package gnu-plct-xthead-0.20231118.0
+info: package gnu-plct-xthead-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-plct-xthead-0.20231118.0
$ ruyi install slug:gnu-plct-xthead-20231118 qemu-user-riscv-xthead
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/qemu-user-riscv-xthead-6.1.0.ruyi-20231207.amd64.tar.zst to
+/home/myon/.cache/ruyi/distfiles/qemu-user-riscv-xthead-6.1.0.ruyi-20231207.amd64.tar.zst
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100 3577k  100 3577k    0     0  6110k      0 --:--:-- --:--:-- --:--:-- 6104k
+info: extracting qemu-user-riscv-xthead-6.1.0.ruyi-20231207.amd64.tar.zst for package qemu-user-riscv-xthead-6.1.0-ruyi.20231207+g03813c9fe8
+info: package qemu-user-riscv-xthead-6.1.0-ruyi.20231207+g03813c9fe8 installed to
+/home/myon/.local/share/ruyi/binaries/x86_64/qemu-user-riscv-xthead-6.1.0-ruyi.20231207+g03813c9fe8
+info: downloading https://mirror.iscas.ac.cn/ruyisdk/dist/RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz to
+/home/myon/.cache/ruyi/distfiles/RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  273M  100  273M    0     0  10.2M      0  0:00:26  0:00:26 --:--:-- 10.9M
+info: extracting RuyiSDK-20231118-T-Head-Sources-riscv64-plctxthead-linux-gnu.tar.xz for package gnu-plct-xthead-0.20231118.0
+info: package gnu-plct-xthead-0.20231118.0 installed to /home/myon/.local/share/ruyi/binaries/x86_64/gnu-plct-xthead-0.20231118.0

建立编译环境:

bash
$ ruyi venv -t gnu-plct-xthead sipeed-lpi4a -e qemu-user-riscv-xthead ./qemu_venv
+info: Creating a Ruyi virtual environment at qemu_venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking `ruyi-deactivate`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/qemu_venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.
$ ruyi venv -t gnu-plct-xthead sipeed-lpi4a -e qemu-user-riscv-xthead ./qemu_venv
+info: Creating a Ruyi virtual environment at qemu_venv...
+info: The virtual environment is now created.
+
+You may activate it by sourcing the appropriate activation script in the
+bin directory, and deactivate by invoking `ruyi-deactivate`.
+
+A fresh sysroot/prefix is also provisioned in the virtual environment.
+It is available at the following path:
+
+    /home/myon/ruyisdk/ruyi/qemu_venv/sysroot
+
+The virtual environment also comes with ready-made CMake toolchain file
+and Meson cross file. Check the virtual environment root for those;
+comments in the files contain usage instructions.

查看可用的二进制:

bash
$ ls qemu_venv/bin/
+riscv64-plctxthead-linux-gnu-addr2line  riscv64-plctxthead-linux-gnu-gcc-ranlib     riscv64-plctxthead-linux-gnu-nm
+riscv64-plctxthead-linux-gnu-ar         riscv64-plctxthead-linux-gnu-gcov           riscv64-plctxthead-linux-gnu-objcopy
+riscv64-plctxthead-linux-gnu-as         riscv64-plctxthead-linux-gnu-gcov-dump      riscv64-plctxthead-linux-gnu-objdump
+riscv64-plctxthead-linux-gnu-c++        riscv64-plctxthead-linux-gnu-gcov-tool      riscv64-plctxthead-linux-gnu-ranlib
+riscv64-plctxthead-linux-gnu-cc         riscv64-plctxthead-linux-gnu-gdb            riscv64-plctxthead-linux-gnu-readelf
+riscv64-plctxthead-linux-gnu-c++filt    riscv64-plctxthead-linux-gnu-gdb-add-index  riscv64-plctxthead-linux-gnu-size
+riscv64-plctxthead-linux-gnu-cpp        riscv64-plctxthead-linux-gnu-gfortran       riscv64-plctxthead-linux-gnu-strings
+riscv64-plctxthead-linux-gnu-elfedit    riscv64-plctxthead-linux-gnu-gprof          riscv64-plctxthead-linux-gnu-strip
+riscv64-plctxthead-linux-gnu-g++        riscv64-plctxthead-linux-gnu-ld             ruyi-activate
+riscv64-plctxthead-linux-gnu-gcc        riscv64-plctxthead-linux-gnu-ld.bfd         ruyi-qemu
+riscv64-plctxthead-linux-gnu-gcc-ar     riscv64-plctxthead-linux-gnu-ldd
+riscv64-plctxthead-linux-gnu-gcc-nm     riscv64-plctxthead-linux-gnu-lto-dump
$ ls qemu_venv/bin/
+riscv64-plctxthead-linux-gnu-addr2line  riscv64-plctxthead-linux-gnu-gcc-ranlib     riscv64-plctxthead-linux-gnu-nm
+riscv64-plctxthead-linux-gnu-ar         riscv64-plctxthead-linux-gnu-gcov           riscv64-plctxthead-linux-gnu-objcopy
+riscv64-plctxthead-linux-gnu-as         riscv64-plctxthead-linux-gnu-gcov-dump      riscv64-plctxthead-linux-gnu-objdump
+riscv64-plctxthead-linux-gnu-c++        riscv64-plctxthead-linux-gnu-gcov-tool      riscv64-plctxthead-linux-gnu-ranlib
+riscv64-plctxthead-linux-gnu-cc         riscv64-plctxthead-linux-gnu-gdb            riscv64-plctxthead-linux-gnu-readelf
+riscv64-plctxthead-linux-gnu-c++filt    riscv64-plctxthead-linux-gnu-gdb-add-index  riscv64-plctxthead-linux-gnu-size
+riscv64-plctxthead-linux-gnu-cpp        riscv64-plctxthead-linux-gnu-gfortran       riscv64-plctxthead-linux-gnu-strings
+riscv64-plctxthead-linux-gnu-elfedit    riscv64-plctxthead-linux-gnu-gprof          riscv64-plctxthead-linux-gnu-strip
+riscv64-plctxthead-linux-gnu-g++        riscv64-plctxthead-linux-gnu-ld             ruyi-activate
+riscv64-plctxthead-linux-gnu-gcc        riscv64-plctxthead-linux-gnu-ld.bfd         ruyi-qemu
+riscv64-plctxthead-linux-gnu-gcc-ar     riscv64-plctxthead-linux-gnu-ldd
+riscv64-plctxthead-linux-gnu-gcc-nm     riscv64-plctxthead-linux-gnu-lto-dump

可以看到 QEMU 模拟器的命令为 ruyi-qemu

进入编译环境:

bash
$ . qemu_venv/bin/ruyi-activate
+«Ruyi qemu_venv» $
$ . qemu_venv/bin/ruyi-activate
+«Ruyi qemu_venv» $

编译一个简单的 C 程序并使用 QEMU 运行:

bash
«Ruyi qemu_venv» $ cd qemu_venv/
+«Ruyi qemu_venv» $ cat > test.c << EOF
+#include <stdio.h>
+
+int main()
+{
+    printf("hello, ruyi");
+    putchar('\n');
+
+    return 0;
+}
+EOF
+«Ruyi qemu_venv» $ riscv64-plctxthead-linux-gnu-gcc -O3 test.c -o test
+«Ruyi qemu_venv» $ ruyi-qemu ./test
+hello, ruyi
«Ruyi qemu_venv» $ cd qemu_venv/
+«Ruyi qemu_venv» $ cat > test.c << EOF
+#include <stdio.h>
+
+int main()
+{
+    printf("hello, ruyi");
+    putchar('\n');
+
+    return 0;
+}
+EOF
+«Ruyi qemu_venv» $ riscv64-plctxthead-linux-gnu-gcc -O3 test.c -o test
+«Ruyi qemu_venv» $ ruyi-qemu ./test
+hello, ruyi

退出编译环境:

bash
«Ruyi qemu_venv» $ ruyi-deactivate
+$
«Ruyi qemu_venv» $ ruyi-deactivate
+$
+ + + + \ No newline at end of file