编译工具使用
编译工具asn1rs-cli,位于“/usr/local/ksl/bin”下。用户可以使用它来解析ASN.1脚本,并将ASN.1脚本转换为C语言代码的中间文件(包含多个源文件和头文件)。
在本章节的示例中,将展示如何使用编译工具asn1rs-cli将.asn文件转换为C语言源码文件。
获取帮助
执行以下命令获取命令相关帮助。
./asn1rs-cli --help
输出如下回显信息。
ASN.1 Rust Compiler 1.2.0
USAGE:
asn1rs-cli [FLAGS] [OPTIONS] --input <ASN.1 文件(列表)> --method <传输语法(aper|uper|eper|ber...)> [SUBCOMMAND]
FLAGS:
-C, --comments 提取日志信息到抽象语法文件中
-D, --debug 打印调试信息到文件
-h, --help Prints help information
-r, --intermediate 导出中间结果到文件
-V, --version Prints version information
OPTIONS:
--dump-types <csv文件路径>
控制台输出编译出的类型列表至csv文件
-i, --input <ASN.1 文件(列表)>
选择一个或多个 ASN.1 文本文件,如 -i s1.asn x2.asn; 也可利用通配,如 -i *.asn
--merge <合并后的目录名,支持指定多级目录,如a/b/c,最终输出目录在exports/a/b/c>
合并编译,未合并情况下每个ASN.1文件将独立进行编译和输出,存在该选项则将所有输入的ASN.1文件合并生成目标文件
-m, --method <传输语法(aper|uper|eper|ber...)>
选择一个编解码规则,选中的编解码规则会应用到当前命令行的所有输入文件中
SUBCOMMANDS:
cc [核心] 将 ASN.1 文件编译为 C 代码
cceos [扩展] C 后端 LTE EOS 版本
ccnr [核心] 将 ASN.1 文件编译为 CPP 代码
diff [扩展] 比对ASN.1文件的版本变更是否符合要求
help Prints this message or the help of the given subcommand(s)
xmlc [核心] 将 ASN.1 文件编译为 XML 文件
子参数
该工具还有一系列子参数,例如cc子参数的帮助信息可执行以下命令查看。
./asn1rs-cli cc --help
输出如下回显信息。
asn1rs-cli-cc
[核心] 将 ASN.1 文件编译为 C 代码
USAGE:
asn1rs-cli --input <ASN.1 文件(列表)> --method <传输语法(aper|uper|eper|ber...)> cc [FLAGS] [OPTIONS]
FLAGS:
--count-like-present 当 SEQUENCE OF 类型作为可选成员时,利用其 count 字段在接口中充当 present 标识
-h, --help Prints help information
--testcases 围绕已经定义的值,生成 testcase 的C文件和头文件, 依赖 --values
--values 生成所有值的定义, 依赖 --mode full
-V, --version Prints version information
OPTIONS:
-C, --cinline <需要生成内联C代码的类型列表,使用逗号隔开,由于生成代码可能非常多,不支持直接生成全部类型>
由于指定类型被直接展开为包含编解码逻辑的C代码,生成代码时编译程序将做一定程度的优化,使用该开关可以优化指定类型的编解码性能
--enum-as-uint <数据类型的名字(u8|u16|u32)>
设定ENUMERATED类型的C接口为u8,u16,u32数据类型,不使用C的enum类型
-e, --extension <扩展(rust)>
rust-用于生成Native-Rust的头文件
--limits <规格配置文件,用于指定C数组的规格宏>
有关规格文件的 SCHEMA, 可以阅读 libcompiler/asn1rs-cli/examples/limits.schema.json
-A, --long-abbrs <支持全词匹配功能的缩略表文件路径>
样例文件可以参考 libcompiler/asn1rs-cli/examples/long-abbrs.csv
-m, --mode <编译模式(full|noinf)>
full-完整生成接口和表的源码; noinf-仅生成表的源码; 默认-noinf
-p, --prefix <生成C代码符号的前缀名字>
大小写不敏感
-a, --short-abbrs <支持单词匹配功能的缩略表文件路径>
样例文件可以参考 libcompiler/asn1rs-cli/examples/short-abbrs.csv
-T, --try-compile <libcodec相对路径, 例如 ../libcodec>
尝试编译生成代码, 目前只支持目标语言为C/C++的场景, 编译器为GCC
示例
将一个ASN.1脚本test.asn转换成BER模式的C代码文件。
- test.asn脚本内容如下:
MyModule DEFINITIONS AUTOMATIC TAGS ::= BEGIN MyType ::= SEQUENCE { boolType BOOLEAN, intType INTEGER(0..128), enumType ENUMERATED { a, b }, bitStrType BIT STRING(SIZE(0..128)), octStrType OCTET STRING(SIZE(0..64)), seqOfType SEQUENCE OF INTEGER, choiceType CHOICE { a INTEGER(0..3), b BOOLEAN } } END - 使用asn1rs-cli命令进行转换。
./asn1rs-cli -i test.asn -m ber cc -m full
生成的代码文件位于“exports”目录。exports └── test ├── codec_index.h ├── codec_interfaces.h └── codec_tables.c- codec_index.h:定义了各个数据单元的唯一标识,在后续的编解码接口中需要使用到。
- codec_interfaces.h:提供了抽象语法中数据描述的C程序接口。
- codec_tables.c:定义了用于描述各个数据类型的静态变量。
若指定了--values --testcases参数还会生成codec_testcases.h、codec_values.c、codec_values.h三个文件,用于定义和声明脚本中定义的值,并生成测试用例。
父主题: 使用说明