资讯动态

cangjie_runtime 标准库源码构建实战:build.py 构建/清理/安装全流程与交叉编译详解

发布时间:2026/10/14 14:59:07 来源:尧图企业网站定制
编程语言语言运行时标准库垃圾回收并发编程【免费下载链接】cangjie_runtime仓颉编程语言运行时与标准库。项目地址https://gitcode.com/Cangjie/cangjie_runtime点击查看免费下载本篇指南以仓颉语言仓库 cangjie_runtime 中的标准库构建文档为核心完整讲解如何在 Ubuntu/MacOS 环境下使用build.py完成标准库的 clean、build、install 三步构建并结合构建脚本与 CMake 源码逐参数剖析--target、--target-lib、sanitizer 等选项的底层行为覆盖 OpenHarmony、Android、iOS、Windows 等多平台交叉编译方案。读完本文你可以独立完成标准库的原生构建、跨平台交叉构建并能依据日志与构建目录快速定位构建失败原因。一、构建环境与前置条件1.1 支持的构建平台标准库支持在Ubuntu/MacOSx86_64、aarch64环境中编译构建。需要注意两个约束构建前需先按仓颉构建依赖工具文档搭好编译环境clang/clang 或 gcc/g、CMake、Ninja 等目前不支持在 Windows 环境内直接构建标准库。需要产出可在 Windows 上运行的标准库产物时须在 Linux 环境下使用--target windows-x86_64进行交叉编译详见 README 的 Constraints 章节。1.2 前置产物runtime 与 cjc 编译器标准库不是独立构建的它的构建体系依赖两个前置产物本仓库的 runtime标准库构建产物需要链接 runtime 的二进制产物如libcangjie-aio.a与cangjie-runtime动态库runtime 的构建方法见 runtime 构建文档cangjie_compilercjc 编译器标准库的每个.cj包都由cjc编译因此必须先源码构建 cjc 并配置到当前 shell 环境。配置 cjc 的方法source 源码构建的cjc路径如..../output/envsetup.sh验证是否配置成功若出现版本信息则说明配置成功cjc -v获取源码git clone https://gitcode.com/Cangjie/cangjie_runtime.git二、标准三步构建流程标准库源码根目录为仓库中的stdlib/目录构建文档中的“std 目录”即指该目录。进入目录后执行build.py脚本它提供clean清理、build构建、install安装三个子命令cd stdlib python3 build.py clean python3 build.py build -t release --target-libruntime构建产物路径 --target-libopenssl lib路径 python3 build.py install各命令作用如下build.py clean清空工作区临时文件build.py build开始执行编译核心参数-t即--build-type指定编译产物类型可以是release或debug--target-lib指定 openssl lib 目录和 runtime 二进制产物 output 目录默认在项目的runtime/output可多次传入build.py install将编译产物安装到output目录下--prefix可指定安装路径可选默认安装在stdlib/output目录。2.1 构建产物的目录结构build.py install完成后stdlib/output目录结构如下output ├── lib # 标准库 static lib ├── modules # 标准库 cjo 文件 └── runtime # 标准库 dynamic lib这三类产物各有用途lib/下是各标准库包的静态库如libcangjie-std-math.a等以及libstdFFI.so的归档modules/下是按目标平台组织的.cjo文件编译器与 cjc 使用的标准库模块文件runtime/下是运行时动态库如 FFI 动态库与 PCRE2 动态库。2.2 build.py 内部执行流程源码佐证从 build.py 的实现看build子命令的实际调用链是通过TARGET_DICTIONARYbuild.py#L42-L59把命令行 target 名映射为 CMake triple如ohos-aarch64→aarch64-linux-ohoscheck_compiler()build.py#L456-L491按优先级搜索clang/clang→ 交叉 gccWindows 场景为x86_64-w64-mingw32-gcc→ 通用gcc/g并把结果写入CC/CXX环境变量。若指定了--target-toolchain则只在该路径内搜索路径错误会直接报 “compiler not found”generate_cmake_defs()build.py#L82-L152把命令行参数翻译成 CMake 定义并为目标平台选择stdlib/cmake/下对应的 toolchain 文件如ohos_aarch64_clang_toolchain.cmake、mingw_x86_64_toolchain.cmake先执行cmake配置输出目录stdlib/build/build再执行ninjaLinux/MacOS 固定使用 Ninja 生成器Windows 上优先 Ninja缺失则回退mingw32-make。此外构建日志会同时输出到终端与stdlib/build/logs/cangjie.log按周滚动保留 60 份构建失败时应优先查看该日志。clean子命令build.py#L302-L327实际删除的内容包括整个build/目录、整个output/目录以及 AST 包由 flatc 生成的两个源码文件libs/std/ast/StdAstFormat_generated.cj和libs/std/ast/astformat_generated.cj。三、核心构建参数逐项解析3.1-t/--build-type该参数映射为 CMake 的CMAKE_BUILD_TYPE。从源码的BuildType枚举build.py#L354-L372看可选值实际包括debug、release、relwithdebinfo三档构建文档主推前两者。不同 build type 对编译的影响可见于 AddCangjieSource.cmakeDebug/RelWithDebInfo 会给cjc附加-g调试信息Release 则附加--trimpath并剥离源码路径同时在 stdlib/CMakeLists.txt#L158-L164 中非 Debug 会定义NDEBUGRelease 额外定义RELEASE。3.2--target-lib可多次传入这是最容易被忽视却最关键的参数它在构建体系中有三个明确用途定位 runtime 产物stdlib/CMakeLists.txt#L59-L71 会遍历每个--target-lib路径按common/平台_构建类型/lib/平台_cjnative/布局查找*cangjie-aio*文件命中后将其设为RUNTIME_COMMON_LIB_DIR未命中则回退到$CANGJIE_HOME/lib/目录。这正是标准库 FFI 动态库链接libcangjie-aio.a与cangjie-runtime的来源libs/CMakeLists.txt#L76-L95作为 OpenSSL 搜索路径PrepareOpenSSL.cmake#L33-L37 会把每个--target-lib的父目录加入CMAKE_PREFIX_PATH供find_package(OpenSSL 3 REQUIRED ...)查找 OpenSSL 头文件与库作为链接目录stdlib/CMakeLists.txt#L177-L179 对每个--target-lib追加-L链接选项。关于 OpenSSL 的实现事实值得注意构建体系要求OpenSSL 3.xfind_package(OpenSSL 3 REQUIRED COMPONENTS Crypto SSL)见 PrepareOpenSSL.cmake#L60且出于安全考虑始终链接共享库.so/.dylib/.dll.a以便用户可用新版本 OpenSSL 直接替换。OpenHarmony 平台是例外OHOS 的 OpenSSL 库名与官方发行版不同如crypto_openssl.zCMake 不做检查而直接手工链接PrepareOpenSSL.cmake#L25-L27。3.3--target与交叉编译--target指定构建平台默认native原生构建完整取值及语义如下来自构建文档并可在 build.py#L42-L59 的TARGET_DICTIONARY中得到印证取值目标 triple说明native默认按宿主机自动选择原生构建ohos-aarch64aarch64-linux-ohos交叉编译 OHOS(aarch64)ohos-x86_64x86_64-linux-ohos交叉编译 OHOS(x86_64)ohos-armarm-linux-ohos交叉编译 OHOS(arm)windows-x86_64x86_64-w64-mingw32Linux 交叉编译 Windowsios-aarch64arm64-apple-ios11交叉编译 iOS(aarch64)ios-simulator-aarch64arm64-apple-ios11-simulator交叉编译 iOS 模拟器(aarch64)ios-simulator-x86_64x86_64-apple-ios11-simulator交叉编译 iOS 模拟器(x86_64)android-aarch64aarch64-linux-android23交叉编译 Android(aarch64默认 API 23)android23-aarch64aarch64-linux-android23交叉编译 Android(aarch64API 23)android26-aarch64aarch64-linux-android26交叉编译 Android(aarch64API 26)android31-aarch64aarch64-linux-android31交叉编译 Android(aarch64API 31)android23-armarm-linux-android23交叉编译 Android(armAPI 23)android-x86_64x86_64-linux-android交叉编译 Android(x86_64默认 API 31)android26-x86_64x86_64-linux-android26交叉编译 Android(x86_64API 26)android31-x86_64x86_64-linux-android31交叉编译 Android(x86_64API 31)交叉编译的底层机制从源码可以确认toolchain 文件选择generate_cmake_defs()依据 triple 选择stdlib/cmake/下的对应 toolchain 文件如 ohos_aarch64_clang_toolchain.cmake 中设置TRIPLE、OHOS ON、--target${TRIPLE}、-mbranch-protectionpac-retb-key等编译选项工具链根路径推导OHOS 交叉构建时脚本以--target-toolchain为基准向上推导OHOS_ROOTbuild.py#L168-L174Android 场景则设置ANDROID_NDK_ROOT并从 triple 中的版本号解析CMAKE_ANDROID_APIbuild.py#L140-L148cjc 侧的交叉参数AddCangjieSource.cmake#L235-L240 显示交叉编译时每次调用cjc都会追加--targetTRIPLE若指定了--target-toolchain还会追加-Btoolchain让后端使用对应工具链。3.4--target-toolchain与--target-sysroot--target-toolchain指定编译工具所在路径交叉编译必需。它既用于编译器查找check_compiler也作为 CMake 变量CANGJIE_TARGET_TOOLCHAIN传给后端OHOS toolchain 文件中还用于定位llvm-ranlib--target-sysroot指定目标系统库目录交叉编译需要作为CANGJIE_TARGET_SYSROOT传给 C/C 编译器的--sysroot。3.5--build-args与--jobs--build-args可多次传入内容会被逐个原样追加到每次cjc编译命令中见 AddCangjieSource.cmake#L178-L180用于透传 cjc 构建选项--jobs-j最大并发构建任务数默认 0 表示交给 Ninja 自行决定对应ninja -j N见 build.py#L200-L205。3.6 Sanitizer 相关选项构建文档提供两个 sanitizer 相关开关源码中还有明确的平台约束--hwasan构建 hwasan 版本的 stdOHOS 交叉编译使用对应 CMake 变量CANGJIE_ENABLE_HWASAN--cjlib-sanitizer-support构建 sanitizer 版本的仓颉标准库可选值为asan、tsan、hwasan对应 CMake 变量CANGJIE_SANITIZER_SUPPORT。从 stdlib/CMakeLists.txt#L215-L262 可以看到其约束条件sanitizer平台约束源码中 FATAL_ERROR 触发条件asan不支持 Windows仅 Linux/OHOStsan不支持 OHOS 及交叉编译仅 Linux/Windows 原生构建hwasan不支持 WindowsLinux/OHOSsanitizer 版本的实现细节为cjc追加--sanitizeaddress|thread|hwaddress编译标志AddCangjieSource.cmake#L139-L147构建目录与安装目录会带/asan、/tsan、/hwasan子路径后缀以区分普通版本并且 sanitizer 版本只安装库文件不安装.cjo/.bchir/.pdba见 AddCangjieSource.cmake#L351-L354。此外sanitizer 构建在stdlib/build/下使用独立的build-libs-sanitizer[-target]目录可与普通构建并存。四、标准库构建了什么产物组织机制理解构建产物需要知道标准库构建体系的两个核心机制均可在源码中确认4.1 每个 cj 包由 cjc 编译为静态库 cjoAddCangjieSource.cmake 中的add_cangjie_library()是标准库包编译的统一入口它调用cjc编译整个包目录-p 包源码目录关键编译参数包括--output-typestaticlibCJNative 后端下产出.a静态库、--ltofull同时产出.bcLTO 位码、--save-temps保留中间产物便于排查。编译产物安装到modules/平台_cjnative/...下的.cjo文件即安装步骤中output/modules目录的来源。4.2 stdFFI 动态库标准库与 runtime 的粘合层libs/CMakeLists.txt#L30-L102 定义了stdFFI共享库目标它把 core、math、convert、fs、env、posix、process、random、regex、net、time、unittest、objectpool、runtime 等各模块的 FFI 目标文件链接在一起并链接PCRE2 动态库regex标准库依赖OHOS 平台使用libpcre2.z.so其他平台打包libpcre2-8到runtime/lib/见 MakeCJNATIVEStdSharedLib.cmake#L362-L374boundscheck 库安全边界检查runtime 的libcangjie-aio.a--whole-archive/-force_load全量链接与cangjie-runtime动态库。这解释了为何--target-lib必须指向 runtime 构建产物目录stdFFI直接消费 runtime 产物。第三方依赖与产物的对应关系可参考 README 中列出的 OpenSSL、PCRE2、flatbuffersast 包使用、boundscheck 说明。4.3 安装路径映射各产物的安装目的地位于各模块的 CMake 文件中静态库安装到lib/平台_cjnative/各模块 CMakeLists如 AddCJNATIVELibrary.cmake 中对cangjie-std-core、cangjie-std-math、cangjie-std-collection等目标的 install 规则.cjo安装到modules/平台_cjnative/FFI 动态库安装到runtime/lib/平台_cjnative/MakeCJNATIVEStdSharedLib.cmake#L363。目录名中的平台前缀如linux_aarch64、linux_ohos、linux_android26由 stdlib/CMakeLists.txt#L31-L56 按目标系统、API 级别与处理器自动计算。五、install 子命令与产物安装策略build.py install的安装逻辑build.py#L232-L290采用“按构建目录批量安装”的方式支持两类选项--prefix指定安装目录可选未指定时使用默认路径--host指定为哪个 target 平台安装取值与--target相同。其核心策略为不带--host收集原生构建目录stdlib/build/build以及stdlib/build/下所有build-libs-*交叉构建目录统一执行cmake --install安装到stdlib/output。这意味着先交叉编译多个平台再一次性 install可以聚合所有平台的产物带--host triple只安装对应的build-cjc-triple交叉目录安装到独立的stdlib/output-host目录若未找到任何已构建目录脚本会报 “Nothing is built yet.” 并终止Windows 交叉产物安装后脚本会清理output-x86_64-w64-mingw32/third_party/mingw/bin下非.exe文件保证发布包干净。六、常见问题与实用技巧查看全部选项构建文档推荐直接查阅 build.py 或使用--helppython3 build.py --help python3 build.py build --help python3 build.py install --help构建失败排查先看终端日志若输出被截断查看滚动日志文件stdlib/build/logs/cangjie.logbuild()在 ninja 返回非 0 时会打印build failed。切换构建平台/类型build()只在构建目录不存在时重新执行 cmake 配置build.py#L219-L222因此改变-t、--target等影响 CMake 定义的参数后建议先python3 build.py clean再重新构建避免旧配置残留。macOS 可复现归档脚本在 macOS 上会自动设置ZERO_AR_DATE1build.py#L179-L180使 ar 归档时间戳归零。Debug 构建加速Debug/RelWithDebInfo 构建会自动引入 ccache 支持见 stdlib/CMakeLists.txt#L106-L110。适用前提以上参数行为均基于当前仓库版本的 build.py 与各 CMake 文件标准库产物需与 cjc 编译器、runtime 配套使用完整发行包可运行于 Linux、macOS、Windows、OpenHarmony、iOS 与 Android 系统。赞分享编程语言语言运行时标准库垃圾回收并发编程【免费下载链接】cangjie_runtime仓颉编程语言运行时与标准库。项目地址https://gitcode.com/Cangjie/cangjie_runtime点击查看免费下载相关推荐Zeek 从源码构建完全指南依赖安装、configure/make 流程与交叉编译实战Zeek 从源码构建完全指南依赖安装、configure/make 流程与交叉编译实战 本文围绕 doc/building from source.rst h网络安全网络IDS从源码编译 NVIDIA DALI 完全指南Docker 构建、Bare Metal 构建与交叉编译详解从源码编译 NVIDIA DALI 完全指南Docker 构建、Bare Metal 构建与交叉编译详解 NVIDIA DALIData Loading L深度学习数据工程Argos Translate 离线翻译实战3 步跑通 Python 本地机器翻译Argos Translate 离线翻译实战3 步跑通 Python 本地机器翻译 产品要出海但业务数据出不了内网或者你只是写了个脚本不想把用户输入发到人工智能NLP本地部署创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑