Cangjie SDK Build Guide
1 Build Overview
This guide is designed to help users: set up the Cangjie SDK build environment in Linux systems and build a complete linux Cangjie SDK with all components.
1.1 Build Process Overview
kanban
1.Preparation Phase
A[Prepare Environment]
B[Build Core Dependencies]
C[Create Workspace]
2.Source Code<br>Acquisition and<br>Core Build Phase
D[Get Cangjie Source Code]
E[Build Cangjie<br>Compiler and<br>Debugger]
F[Build Cangjie Runtime]
3.Library Build Phase
G[Build Cangjie Standard Library]
H[Build STDX Extension Library]
4.Toolset Build Phase
I[Build cjpm Tool]
J[Build cjfmt Tool]
K[Build cjlint Tool]
L[Build cjcov Tool]
M[Build cjtrace-recover<br>Tool]
N[Build hle Tool]
O[Build lspserver Tool]
P[Build cjprof Tool]
5.Packaging and Verification
Q[Organize and<br>Package Files]
R[Build Hello,<br>Cangjie Program]
1.2 Key Notes
- Static Compilation (Optional):
cjdbdepends onlibeditand ncurses. To ensure the generated Cangjie SDK runs stably on Linux distributions that meet the following conditions, you need to compile static versions oflibeditandncursesfrom source:- glibc version ≥ build environment version
- Linux Kernel version matches the build environment
- Environment Isolation: All custom dependencies are installed in
/opt/buildtoolsto avoid polluting system paths - Memory Requirements: Full build requires ≥8GB memory, recommend adding 4GB swap space
- Network Requirements: First build requires downloading approximately 3GB of data, please ensure stable network connection
- CPU Architecture: Must set corresponding environment variables based on your computer's chip architecture (x86_64 or aarch64), and select appropriate system tools and docker images (
uname -m)
2 Environment Preparation
2.1 System Requirements
- Operating System: Ubuntu 22.04 LTS as an example, other versions can also refer to this process
- Disk Space: ≥50GB
- Memory: ≥8GB (physical memory + swap space)
- User Permissions: Regular user + sudo privileges
You can choose to build Cangjie SDK based on our provided Docker environment. This docker is Ubuntu 18.04 with all system tools and build tools required for building Cangjie pre-installed:
docker pull swr.cn-north-4.myhuaweicloud.com/cj-docker/cangjie_ubuntu18_x86_kernel:v2.9 # or docker pull swr.cn-north-4.myhuaweicloud.com/cj-docker/cangjie_ubuntu18_arm_kernel:v2.2
2.2 System Tools Installation
-
Using Huawei Mirror Source (Optional)
# 1. Backup configuration file: sudo cp -a /etc/apt/sources.list /etc/apt/sources.list.bak; # 2. Modify sources.list file, replace http://archive.ubuntu.com and http://security.ubuntu.com with http://mirrors.huaweicloud.com, you can refer to the following command: sudo sed -i "s@http://.*archive.ubuntu.com@http://mirrors.huaweicloud.com@g" /etc/apt/sources.list; sudo sed -i "s@http://.*security.ubuntu.com@http://mirrors.huaweicloud.com@g" /etc/apt/sources.list; # 3. Update index sudo apt-get update; -
Install System Tools
sudo apt update && sudo apt install -y \ tar unzip wget curl libcurl4 expat openssl make gcc g++ gettext \ nfs-common libtool sqlite3 zlib1g-dev libssl-dev cmake ninja-build\ libcurl4-openssl-dev sudo autoconf build-essential rapidjson-dev \ texinfo binutils expat libelf-dev libdwarf-dev openssh-client ssh \ dos2unix libxext-dev libxtst-dev libxt-dev libcups2-dev clang clang-15 libedit-dev\ libxrender-dev zip bzip2 libopenmpi-dev vim gdb lldb libclang-15-dev libgtest-dev\ rpm patch libtinfo5 cpio rpm2cpio libncurses5 libncurses5-dev strace net-tools swig;
2.3 Static Library Compilation (Optional)
The libedit and ncurses libraries are not required to be compiled from source; you can also use system pre-compiled versions.
Preparation:
# Build tools directory
export BUILD_ROOT=/opt/buildtools;
sudo mkdir -p $BUILD_ROOT;
sudo chown $USER:$USER $BUILD_ROOT;
tmp_cpus=$(grep -w processor /proc/cpuinfo|wc -l);
(1) Compile ncurses 6.5 (Static)
cd $BUILD_ROOT;
git clone https://gitcode.com/openharmony/third_party_ncurses.git -b OpenHarmony-v6.0-Release ncurses-6.5;
cd ncurses-6.5;
./configure --with-termlib CC=clang CXX=clang++ CFLAGS=-fPIC CPPFLAGS=-fPIC CFLAGS="-fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack" CXXFLAGS="-fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack" --with-terminfo-dirs=/etc/terminfo:/lib/terminfo:/usr/share/terminfo --disable-widec --disable-overwrite --disable-root-environ;
make -j ${tmp_cpus};
make install DESTDIR=${BUILD_ROOT}/ncurses-6.5;
(2) Compile libedit 3.1 (Static)
cd $BUILD_ROOT;
git clone https://gitcode.com/openharmony/third_party_libedit.git -b OpenHarmony-5.0.0-Release;
cd third_party_libedit && tar xf libedit-20210910-3.1.tar.gz;
cd libedit-20210910-3.1;
./configure --with-pic --enable-shared=no --prefix=${BUILD_ROOT}/libedit-3.1;
make -j ${tmp_cpus};
make install;
2.4 Set Environment Variables
(1) OpenSSL Environment Variable Setup
Building Cangjie standard library and Stdx extension library depends on OpenSSL 3+. In the previous section (2.2 System Tools Installation - Install System Tools), we have already installed the OpenSSL library. Now we need to set the OPENSSL_PATH environment variable:
-
Locate OpenSSL lib directory
Library file location: Default in
/usr/lib/x86_64-linux-gnu/(x86_64) or/usr/lib/aarch64-linux-gnu/(aarch64), verification method:# Find libssl.so ls /usr/lib/x86_64-linux-gnu/libssl.so* # Find libcrypto.so ls /usr/lib/x86_64-linux-gnu/libcrypto.so* -
Set OPENSSL_PATH environment variable
* Replace
/path/to/openssl-3.xin the example below with youropenssllib directoryexport OPENSSL_PATH=/path/to/openssl-3.x export LD_LIBRARY_PATH=$OPENSSL_PATH:$LD_LIBRARY_PATH -
If you are using the official image, you can use the following settings
# x86_64 export OPENSSL_PATH=${BUILD_ROOT}/openssl-3.0.9/lib64; # aarch64 export OPENSSL_PATH=${BUILD_ROOT}/openssl-3.0.9/lib; export LD_LIBRARY_PATH=$OPENSSL_PATH:$LD_LIBRARY_PATH
(2) Other Environment Variable Setup
Before proceeding with subsequent steps, configure the following environment variables:
export PATH=/usr/lib/llvm-15/bin:$PATH; # Add clang-15 to environment variables
# Architecture name
export ARCH=x86_64 # or aarch64
# Cangjie SDK version number
export CANGJIE_VERSION=1.0.0
# Stdx version number
export STDX_VERSION=1
export SDK_NAME=linux-x64 # or linux-aarch64
3. Source Code Preparation
3.1 Create Workspace
* Replace /path/to/workspace in the example below with your workspace directory for building Cangjie SDK
export WORKSPACE=/path/to/workspace
mkdir -p $WORKSPACE;
cd $WORKSPACE;
3.2 Get Cangjie Source Code
git clone https://gitcode.com/Cangjie/cangjie_compiler.git -b main;
git clone https://gitcode.com/Cangjie/cangjie_runtime.git -b main;
git clone https://gitcode.com/Cangjie/cangjie_tools.git -b main;
git clone https://gitcode.com/Cangjie/cangjie_stdx.git -b main;
4 Build Process
4.1 Build Cangjie Compiler and Debugger
You can use your compiled static libraries (optional) via
CMAKE_PREFIX_PATHand--target-lib
export CMAKE_PREFIX_PATH=$BUILD_ROOT/libedit-3.1:$BUILD_ROOT/ncurses-6.5/usr;
Execute build:
cd $WORKSPACE/cangjie_compiler;
python3 build.py clean;
python3 build.py build -t release \
-v ${CANGJIE_VERSION} \
--no-tests \
--target-lib=$BUILD_ROOT/ncurses-6.5/usr/lib \
--build-cjdb;
python3 build.py install;
Verify installation:
source output/envsetup.sh;
cjc -v;
4.2 Build Cangjie Runtime
cd $WORKSPACE/cangjie_runtime/runtime;
python3 build.py clean;
python3 build.py build -t release -v ${CANGJIE_VERSION};
python3 build.py install;
cp -R output/common/linux_release_${ARCH}/{lib,runtime} $WORKSPACE/cangjie_compiler/output;
4.3 Build Cangjie Standard Library
cd $WORKSPACE/cangjie_runtime/stdlib;
python3 build.py clean;
python3 build.py build -t release \
--target-lib=$WORKSPACE/cangjie_runtime/runtime/output \
--target-lib=$OPENSSL_PATH;
python3 build.py install;
cp -R output/* $WORKSPACE/cangjie_compiler/output/;
4.4 Build STDX Extension Library
cd $WORKSPACE/cangjie_stdx;
python3 build.py clean;
python3 build.py build -t release \
--include=${WORKSPACE}/cangjie_compiler/include \
--target-lib=$OPENSSL_PATH;
python3 build.py install;
export CANGJIE_STDX_PATH=$WORKSPACE/cangjie_stdx/target/linux_${ARCH}_cjnative/static/stdx;
4.5 Build Toolset
(1) cjpm
cd ${WORKSPACE}/cangjie_tools/cjpm/build;
python3 build.py clean;
python3 build.py build -t release --set-rpath \$ORIGIN/../../runtime/lib/linux_${ARCH}_cjnative;
python3 build.py install;
mkdir -p ${WORKSPACE}/cangjie_compiler/output/tools/config;
cp ${WORKSPACE}/cangjie_tools/cjpm/dist/cjpm ${WORKSPACE}/cangjie_compiler/output/tools/bin;
mv ${WORKSPACE}/cangjie_tools/cjpm/dist/*.toml ${WORKSPACE}/cangjie_compiler/output/tools/config;
(2) cjfmt
cd ${WORKSPACE}/cangjie_tools/cjfmt/build;
python3 build.py clean;
python3 build.py build -t release;
python3 build.py install;
mv ${WORKSPACE}/cangjie_tools/cjfmt/build/build/bin/cjfmt ${WORKSPACE}/cangjie_compiler/output/tools/bin;
mv ${WORKSPACE}/cangjie_tools/cjfmt/config/*.toml ${WORKSPACE}/cangjie_compiler/output/tools/config;
(3) cjlint
cd ${WORKSPACE}/cangjie_tools/cjlint/build;
python3 build.py clean;
python3 build.py build -t release;
python3 build.py install;
mv ${WORKSPACE}/cangjie_tools/cjlint/dist/bin/cjlint ${WORKSPACE}/cangjie_compiler/output/tools/bin
mv ${WORKSPACE}/cangjie_tools/cjlint/dist/lib/* ${WORKSPACE}/cangjie_compiler/output/tools/lib
mv ${WORKSPACE}/cangjie_tools/cjlint/dist/config/* ${WORKSPACE}/cangjie_compiler/output/tools/config
(4) cjcov
cd ${WORKSPACE}/cangjie_tools/cjcov/build;
python3 build.py clean;
python3 build.py build -t release;
python3 build.py install;
mv ${WORKSPACE}/cangjie_tools/cjcov/dist/cjcov ${WORKSPACE}/cangjie_compiler/output/tools/bin;
(5) cjtrace-recover
cd ${WORKSPACE}/cangjie_tools/cjtrace-recover/build;
python3 build.py clean;
python3 build.py build -t release;
python3 build.py install --prefix ${WORKSPACE}/cangjie_compiler/output/tools;
(6) HyperLangExtension
cd $WORKSPACE/cangjie_tools/hyperlangExtension/build;
python3 build.py clean;
python3 build.py build -t release;
python3 build.py install;
cp ${WORKSPACE}/cangjie_tools/hyperlangExtension/target/bin/main ${WORKSPACE}/cangjie_compiler/output/tools/bin/hle;
cp -R ${WORKSPACE}/cangjie_tools/hyperlangExtension/src/dtsparser ${WORKSPACE}/cangjie_compiler/output/tools;
rm -rf ${WORKSPACE}/cangjie_compiler/output/tools/dtsparser/*.cj;
(7) LSP Server
cd $WORKSPACE/cangjie_tools/cangjie-language-server/build;
python3 build.py clean;
python3 build.py build -t release;
python3 build.py install;
cp ${WORKSPACE}/cangjie_tools/cangjie-language-server/output/bin/LSPServer ${WORKSPACE}/cangjie_compiler/output/tools/bin
#### (8) cjprof
```bash
cd ${WORKSPACE}/cangjie_tools/cjprof/build;
python3 build.py build -t release;
python3 build.py install;
cp $WORKSPACE/cangjie_tools/cjprof/dist/bin/cjprof ${WORKSPACE}/cangjie_compiler/output/tools/bin
cp $WORKSPACE/cangjie_tools/cjprof/dist/lib/* ${WORKSPACE}/cangjie_compiler/output/tools/lib;
## 5 Organize and Package Files
### 5.1 Organize and Package SDK
```bash
# Clear previous builds
mkdir -p $WORKSPACE/software;
rm -rf $WORKSPACE/software/*;
cd $WORKSPACE/software;
# Copy cangjie directory
cp -R $WORKSPACE/cangjie_compiler/output cangjie;
cp $WORKSPACE/cangjie_compiler/LICENSE cangjie;
cp $WORKSPACE/cangjie_compiler/Open_Source_Software_Notice.docx cangjie;
# Package and set permissions
chmod -R 750 cangjie
tar --format=gnu -zcvf cangjie-sdk-${SDK_NAME}-${CANGJIE_VERSION}.tar.gz cangjie;
chmod 550 cangjie-sdk-${SDK_NAME}-${CANGJIE_VERSION}.tar.gz;
5.2 Organize and Package Stdx
cd $WORKSPACE/software;
# Copy stdx directory
cp -r $WORKSPACE/cangjie_stdx/target/linux_${ARCH}_cjnative .;
cp $WORKSPACE/cangjie_stdx/LICENSE linux_${ARCH}_cjnative;
cp $WORKSPACE/cangjie_stdx/Open_Source_Software_Notice.docx linux_${ARCH}_cjnative;
chmod -R 750 linux_${ARCH}_cjnative;
zip -qr cangjie-stdx-${SDK_NAME}-${CANGJIE_VERSION}.${STDX_VERSION}.zip linux_${ARCH}_cjnative;
chmod 550 cangjie-stdx-${SDK_NAME}-${CANGJIE_VERSION}.${STDX_VERSION}.zip;
6 Build Hello, Cangjie Program
Check generated files:
ls -lh $WORKSPACE/software
# Should include:
# - cangjie-sdk-${SDK_NAME}-${CANGJIE_VERSION}.tar.gz
# - cangjie-stdx-${SDK_NAME}-${CANGJIE_VERSION}.${STDX_VERSION}.zip
Verify Hello, Cangjie program:
cd $WORKSPACE;
source $WORKSPACE/software/cangjie/envsetup.sh;
echo "main() { println(\"Hello, Cangjie\") }" > hello.cj
cjc hello.cj -o hello && ./hello
# You will see the following output in the console:
# Hello, Cangjie
🎉 Congratulations on successfully building the Cangjie SDK and running the Hello, Cangjie program!