仓颉实战系列 - 内置编译条件变量
内置编译条件变量
仓颉提供的内置条件变量有: os、 backend、 arch、 cjc_version、 debug 和 test。
os
os 表示目标平台的操作系统。os 支持 == 和 != 两种操作符。支持的操作系统有:Windows、Linux、macOS。
使用方式如下:
@When[os == "Linux"]
func foo() {
print("Linux, ")
}
@When[os == "Windows"]
func foo() {
print("Windows, ")
}
@When[os != "Windows"]
func fee() {
println("NOT Windows")
}
@When[os != "Linux"]
func fee() {
println("NOT Linux")
}
main() {
foo()
fee()
}
如果在 Windows 环境下编译执行,会得到 Windows, NOT Linux 的信息;如果是在 Linux 环境下,则会得到 Linux, NOT Windows 的信息。
backend
仓颉是多后端语言,backend 表示目标平台的后端类型,用于支持多种后端条件编译。backend 条件支持 == 和 != 两种操作符。
支持的后端有:cjnative、cjvm。
使用方式如下:
@When[backend == "cjnative"]
func foo() {
print("cjnative backend, ")
}
@When[backend == "cjvm"]
func foo() {
print("cjvm backend, ")
}
@When[backend != "cjnative"]
func fee() {
println("NOT cjnative backend")
}
@When[backend != "cjvm"]
func fee() {
println("NOT cjvm backend")
}
main() {
foo()
fee()
}
用 cjnative 后端的发布包编译执行,会得到 cjnative backend, NOT cjvm backend 的信息;用 cjvm 后端的发布包编译执行,则会得到 cjvm backend, NOT cjnative backend 的信息。
arch
arch 表示目标平台的处理器架构。arch 条件支持 == 和 != 两种操作符。
支持的处理器架构有:x86_64、aarch64。
使用方式如下:
@When[arch == "aarch64"]
var arch = "aarch64"
@When[arch == "x86_64"]
var arch = "x86_64"
main() {
println(arch)
}
在 x86_64 架构的目标平台编译执行,会得到 x86_64 的信息;在 aarch64 架构的目标平台编译执行,会得到 aarch64 的信息。
cjc_version
cjc_version 是仓颉内置的条件,开发者可以根据当前仓颉编译器的版本选择要编译的代码。cjc_version 条件支持 ==、!=、>、<、>=、<= 六种操作符,格式为 xx.xx.xx 支持每个 xx 支持 1-2 位数字,计算规则为补位 (补齐 2 位) 比较,例如:0.18.8 < 0.18.11, 0.18.8 == 0.18.08。
使用方式如下:
@When[cjc_version == "0.18.6"]
func foo() {
println("cjc_version equals 0.18.6")
}
@When[cjc_version != "0.18.6"]
func foo() {
println("cjc_version is NOT equal to 0.18.6")
}
@When[cjc_version > "0.18.6"]
func fnn() {
println("cjc_version is greater than 0.18.6")
}
@When[cjc_version <= "0.18.6"]
func fnn() {
println("cjc_version is less than or equal to 0.18.6")
}
@When[cjc_version < "0.18.6"]
func fee() {
println("cjc_version is less than 0.18.6")
}
@When[cjc_version >= "0.18.6"]
func fee() {
println("cjc_version is greater than or equal to 0.18.6")
}
main() {
foo()
fnn()
fee()
}
根据 cjc 的版本,上面代码的执行输出结果会有不同。
debug
debug 表示当前是否启用了调试模式即开启 -g 编译选项, 可以用于在编译代码时进行调试和发布版本之间的切换。debug 条件仅支持逻辑非运算符(!)。
使用方式如下:
@When[debug]
func foo() {
println("debug")
}
@When[!debug]
func foo() {
println("NOT debug")
}
main() {
foo()
}
启用 -g 编译执行会得到 cjc debug 的信息,如果没有启用 -g 编译执行会得到 NOT debug 的信息。
test
test 表示当前是否启用了单元测试选项 --test。test 条件仅支持逻辑非运算符(!)。可以用于区分测试代码与普通代码。 使用方式如下:
@When[test]
@Test
class Tests {
@TestCase
public func case1(): Unit {
@Expect("run", foo())
}
}
func foo() {
"run"
}
@When[!test]
main () {
println(foo())
}
使用 --test 编译执行得到的测试结果,不使用 --test 也可正常完成编译运行得到 run 的信息。
自定义编译条件变量
仓颉允许开发者自定义编译条件变量和取值,自定义的条件变量必须是一个合法的标识符且不允许和内置条件变量同名,其值是一个字符串字面量。自定义条件支持 == 和 != 两种运算符。和内置条件变量不同点在于自定义的条件需要开发者在编译时通过 --cfg 编译选项或者在配置文件 cfg.toml 中定义。
配置自定义条件变量
配置自定义条件变量的方式有两种:在编译选项中直接配置键值对或在配置文件配置键值对。
开发者可以使用 --cfg 以键值对的形式向编译器传递自定义编译条件变量或者指定配置文件 cfg.toml 的搜索路径。
选项值需要使用双引号括起来。
若选项值中包含 = 则会按照键值对的形式直接进行配置(若路径中包含 = 则需要通过 \ 转义),多个键值对可以使用逗号 , 分隔。如:
$ cjc --cfg "feature = lion, platform = dsp" source.cj
允许多次使用 --cfg 编译选项配置,例如:
$ cjc --cfg "feature = lion" --cfg "platform = dsp" source.cj
不允许多次定义同一个条件变量,例如:
$ cjc --cfg "feature = lion" --cfg "feature = meta" source.cj
$ cjc --cfg "feature = lion, feature = meta" source.cj
上述两条编译指令都会报错。
若选项值中不包含 = 或存在通过 \ 转义的 = 则将选项值作为配置文件 cfg.toml 的搜索路径传递给编译器,例如:
$ cjc --cfg "./cfg" source.cj
若 ./cfg 目录下存在 cfg.toml,则编译器会在编译时自动获取 ./cfg/cfg.toml 中配置的自定义编译条件。cfg.toml 文件中应采用键值对的方式配置自定义条件变量,每个键值对独占一行,键名是一个合法的仓颉普通标识符,键值是一个双引号括起来的字符串,字符串不支持转义。cfg.toml 文件中也支持全行注释和行末注释,例如:
feature = "lion"
platform = "dsp"
#全行注释
feature = "meta" # 行末注释
多次使用 --cfg 配置 cfg.toml 文件的搜索路径时,按照传入的顺序依次搜索cfg.toml 文件,若在所有传入的搜索路径下都没有找到 cfg.toml 文件,则在默认路径下搜索配置文件 cfg.toml。
多次使用 --cfg 编译选项进行配置时,若某次以键值对的形式直接进行配置,则会忽略配置文件 cfg.toml 中的配置。
若未使用 --cfg 编译选项,编译器会在默认路径(通过 --package 或 -p 指定的 package 目录或 cjc 执行目录)下搜索配置文件 cfg.toml。
多条件编译
仓颉条件编译允许开发者自由组合多个条件编译选项。支持逻辑运算符组合多个条件,支持括号运算符明确优先级。
使用方式如下:
//source.cj
@When[(test || feature == "lion") && !debug]
func fee() {
println("feature lion")
}
main() {
fee()
}
使用如下编译命令编译运行上段代码:
$ cjc --cfg="feature=lion" source.cj -o runner.out
会得到输出结果如下:
feature lion
部署仓颉运行时
为了使仓颉可执行程序能够在不同的操作系统环境中正常运行,仓颉语言提供了一套运行时(runtime)环境。该运行时环境为仓颉可执行程序提供了对内存和其他系统资源的访问,例如在运行过程中依赖的仓颉动态库。
安装完整的仓颉工具链包含了仓颉代码编译环境和仓颉运行时的安装(详情请参见安装仓颉工具链章节)。如果不需要编译代码,仅仅是运行可执行程序,也可以在环境中独立部署运行时。
本节介绍仓颉运行时的部署。
值得注意的是,编译时使用全静态链接仓颉库,运行时模块已在编译时嵌入到可执行文件中,因此无需在运行环境额外部署运行时,可直接在运行环境中运行编译所得的可执行文件。
Linux
首先请前往仓颉官方发布渠道,下载适配平台架构的安装包:
cangjie-sdk-linux-x64-x.y.z.tar.gz:适用于 x86_64 架构 Linux 系统的仓颉工具链。
cangjie-sdk-linux-aarch64-x.y.z.tar.gz:适用于 aarch64 架构 Linux 系统的仓颉工具链。
请将下载的安装包解压到合适的目录。
解压完成后,可以在当前工作路径下看到一个名为 cangjie 的目录,其中存放了仓颉工具链的全部内容。
cangjie 目录下的 runtime 目录,即为运行时库,存放了仓颉 runtime 的全部动态库。
请在运行环境执行如下命令完成 runtime 的部署(其中 CANGJIEHOME请修改为cangjie目录所在的路径,{CANGJIE_HOME} 请修改为 cangjie 目录所在的路径,CANGJIEHOME请修改为cangjie目录所在的路径,{hw_arch} 请修改为对应的硬件架构):
export LD_LIBRARY_PATH=${CANGJIE_HOME}/runtime/lib/linux_${hw_arch}_llvm:${LD_LIBRARY_PATH}
macOS
首先请前往仓颉官方发布渠道,下载适配平台架构的安装包:
cangjie-sdk-mac-aarch64-x.y.z.tar.gz:适用于 aarch64/arm64 架构 macOS 系统的仓颉工具链。
请将下载的安装包解压到合适的目录。
解压完成后,可以在当前工作路径下看到一个名为 cangjie 的目录,其中存放了仓颉工具链的全部内容。
cangjie 目录下的 runtime 目录,即为运行时库,存放了仓颉 runtime 的全部动态库。
请在运行环境执行如下命令完成 runtime 的部署(其中 CANGJIEHOME请修改为cangjie目录所在的路径,{CANGJIE_HOME} 请修改为 cangjie 目录所在的路径,CANGJIEHOME请修改为cangjie目录所在的路径,{hw_arch} 请修改为对应的硬件架构):
expor
DYLD_LIBRARY_PATH=${CANGJIE_HOME}/runtime/lib/darwin_${hw_arch}_llvm:${DYLD_LIBRARY_PATH}
Windows
首先请前往仓颉官方发布渠道,下载适配平台架构的安装包:
cangjie-sdk-windows-x64-x.y.z.zip:适用于 x86_64 架构 Windows 系统的仓颉工具链。
请将下载的安装包解压到合适的目录。
解压完成后,可以在当前工作路径下看到一个名为 cangjie 的目录,其中存放了仓颉工具链的全部内容。
cangjie 目录下的 runtime 目录,即为运行时库,存放了仓颉 runtime 的全部动态库。
此处为开发者提供三种环境下部署 runtime 的方法,可以根据使用习惯及环境配置,选择一种执行(其中 CANGJIEHOME请修改为cangjie目录所在的路径,{CANGJIE_HOME} 请修改为 cangjie 目录所在的路径,CANGJIEHOME请修改为cangjie目录所在的路径,{hw_arch} 请修改为对应的硬件架构):
若使用 Windows 命令提示符(CMD)环境,请执行:
set "PATH=${CANGJIE_HOME}\runtime\lib\windows_x86_64_llvm;%PATH%;"
若使用 PowerShell 环境,请执行:
$env:PATH = "${CANGJIE_HOME}\runtime\lib\windows_x86_64_llvm;" + $env:Path
若使用 MSYS shell、bash 等环境,请执行:
export PATH=${CANGJIE_HOME}/runtime/lib/windows_x86_64_llvm
新一代开源开发者平台 GitCode,通过集成代码托管服务、代码仓库以及可信赖的开源组件库,让开发者可以在云端进行代码托管和开发。旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。
更多推荐


所有评论(0)