Lely CANopen configure 配置项与日志解读
Lely CANopen configure 配置项与日志解读
文章目录
- Lely CANopen configure 配置项与日志解读
- 1. configure 在构建链路中的位置
- 2. configure 可传入配置的主要类别
- 2.1 通用控制
- 2.2 安装路径
- 2.3 程序名变换
- 2.4 系统类型与交叉编译
- 2.5 Autotools/Libtool 构建行为
- 2.6 平台能力裁剪
- 2.7 EDS/DCF 与对象字典裁剪
- 2.8 CANopen 协议服务裁剪
- 2.9 C++ application、工具、测试、Python、文档
- 2.10 外部包与工具链搜索
- 2.11 常用环境变量
- 3. 常见配置组合如何理解
- 4. configure 日志应按阶段阅读
- 5. 输入日志逐段说明
- 5.1 命令行与 site script
- 5.2 build / host / target
- 5.3 基础构建工具
- 5.4 覆盖率与 Valgrind 开关
- 5.5 C 编译器探测
- 5.6 系统头文件探测
- 5.7 C++ 编译器与 C++11
- 5.8 Libtool、链接器与 binutils
- 5.9 非前缀工具警告
- 5.10 PIC、共享库与静态链接测试
- 5.11 运行时库、线程和 pkg-config
- 5.12 测试、Valgrind 头文件、SocketCAN 与 Linux 接口
- 5.13 Bluetooth 与 BlueZ
- 5.14 Doxygen 与生成阶段
- 6. 日志中容易误读的点
- 7. 判断 configure 是否进入生成阶段
- 9. 参考资料
1. configure 在构建链路中的位置
configure属于 GNU Build System 的配置阶段。它不会直接把 Lely 源码编译成库,而是读取命令行参数、探测工具链和目标系统能力,然后生成Makefile、config.h、.pc文件和 libtool 相关脚本。后续make才进入编译阶段。
一个典型的交叉编译配置命令可以写成:
../configure\--host=aarch64-poky-linux\--prefix=<INSTALL_PREFIX>\--disable-python\--disable-cython\--disable-tests\--disable-unit-tests这条命令包含两类信息:一类是“目标平台和安装位置”,另一类是“功能裁剪策略”。前者影响工具链选择和安装目录,后者影响 Python、测试、CANopen 模块、C++ 接口等是否进入构建目标。
2. configure 可传入配置的主要类别
下面按用途列出本地configure --help中出现的主要参数。表中的“禁用”通常意味着对应代码、构建目标或条件宏会被关闭;但具体是否彻底移除,还要看该模块与其他模块之间的依赖关系。
2.1 通用控制
| 参数 | 作用 |
|---|---|
-h, --help | 显示帮助并退出。 |
--help=short | 只显示当前包相关的短帮助。 |
--help=recursive | 显示当前包及子包的短帮助。 |
-V, --version | 显示 configure 版本信息。 |
-q, --quiet, --silent | 减少checking ...输出,适合脚本环境。 |
--cache-file=FILE | 把探测结果缓存到指定文件;重复配置时可减少探测开销。 |
-C, --config-cache | 等价于--cache-file=config.cache。 |
-n, --no-create | 只执行探测,不生成 Makefile/config.h 等输出文件。 |
--srcdir=DIR | 指定源码目录;用于 out-of-tree build。 |
2.2 安装路径
| 参数 | 作用 |
|---|---|
--prefix=PREFIX | 安装根目录,默认/usr/local。头文件、库、工具默认都会落到该前缀下。 |
--exec-prefix=EPREFIX | 架构相关文件的安装根目录,默认继承PREFIX。 |
--bindir=DIR | 用户可执行程序安装目录,默认EPREFIX/bin。 |
--sbindir=DIR | 系统管理程序安装目录,默认EPREFIX/sbin。 |
--libexecdir=DIR | 内部辅助可执行程序安装目录。 |
--sysconfdir=DIR | 只读单机配置目录,默认PREFIX/etc。 |
--sharedstatedir=DIR | 可修改、架构无关的共享状态目录。 |
--localstatedir=DIR | 可修改、单机本地状态目录。 |
--runstatedir=DIR | 运行期状态目录。 |
--libdir=DIR | 库文件安装目录,交叉编译多架构安装时常显式指定。 |
--includedir=DIR | C/C++ 头文件安装目录。 |
--oldincludedir=DIR | 非 GCC 场景的传统头文件目录。 |
--datarootdir=DIR | 架构无关只读数据根目录。 |
--datadir=DIR | 架构无关数据目录。 |
--infodir=DIR | info 文档目录。 |
--localedir=DIR | 本地化数据目录。 |
--mandir=DIR | man 文档目录。 |
--docdir=DIR | 项目文档安装根目录。 |
--htmldir=DIR / --dvidir=DIR / --pdfdir=DIR / --psdir=DIR | 不同格式文档的安装目录;是否生成文档还受--disable-doc、Doxygen 等影响。 |
2.3 程序名变换
| 参数 | 作用 |
|---|---|
--program-prefix=PREFIX | 给安装的程序名添加前缀。 |
--program-suffix=SUFFIX | 给安装的程序名添加后缀。 |
--program-transform-name=PROGRAM | 用 sed 表达式转换安装程序名。 |
2.4 系统类型与交叉编译
| 参数 | 作用 |
|---|---|
--build=BUILD | 构建机三元组;通常自动推断。 |
--host=HOST | 目标运行平台三元组;与 build 不同时进入交叉编译。 |
--target=TARGET | 主要用于构建编译器等工具链;普通库项目一般等于 host。 |
2.5 Autotools/Libtool 构建行为
| 参数 | 作用 |
|---|---|
--disable-option-checking | 忽略无法识别的--enable-*/--with-*选项。 |
--enable-silent-rules / --disable-silent-rules | 控制 make 输出详细程度。 |
--disable-maintainer-mode | 关闭维护者规则,避免普通构建触发 Autotools 重新生成。 |
--enable-code-coverage | 开启覆盖率构建,通常用于测试和 CI。 |
--enable-valgrind | 在单元测试中启用 Valgrind。 |
--disable-valgrind-memcheck | 跳过 Valgrind memcheck 测试。 |
--disable-valgrind-helgrind | 跳过 Valgrind helgrind 线程检测。 |
--disable-valgrind-drd | 跳过 Valgrind drd 线程检测。 |
--disable-valgrind-sgcheck | 跳过 Valgrind sgcheck。 |
--enable-dependency-tracking | 启用依赖跟踪,增量构建更准确但可能更慢。 |
--disable-dependency-tracking | 关闭依赖跟踪,加快一次性构建。 |
--enable-shared[=PKGS] | 构建共享库,默认 yes。 |
--enable-static[=PKGS] | 构建静态库,默认 yes。 |
--enable-fast-install[=PKGS] | 启用 libtool 快速安装优化。 |
--disable-libtool-lock | 禁用 libtool 锁;可能影响并行构建可靠性。 |
2.6 平台能力裁剪
| 参数 | 作用 |
|---|---|
--disable-rt | 禁用 Realtime Extensions。 |
--disable-threads | 禁用多线程支持;官方文档对应LELY_NO_THREADS。 |
--enable-ecss-compliance | 启用 ECSS 合规构建路径,主要面向特定合规/测试需求。 |
--disable-errno | 禁用 errno;官方文档说明这也会禁用 C++ 支持,因为 C++ API 依赖 errno 处理异常。 |
--disable-malloc | 禁用动态内存分配;官方文档说明该支持仍是 preliminary,且会禁用 C++ 支持。 |
--disable-stdio | 禁用标准 I/O;errno 或 malloc 被禁用时也会自动禁用 stdio。 |
--disable-cxx | 禁用 C++ 接口,并禁用整个 C++ CANopen application library。 |
--disable-daemon | 禁用 daemon/service 支持;stdio 被禁用时会自动禁用。 |
--disable-diag | 禁用诊断函数输出;诊断接口仍可调用但无效果。 |
--disable-canfd | 禁用 CAN FD,缩小通用 CAN 消息结构;编译库和应用时宏设置需要一致。 |
2.7 EDS/DCF 与对象字典裁剪
| 参数 | 作用 |
|---|---|
--disable-dcf | 禁用 EDS/DCF 支持。 |
--disable-dcf-restore | 不保存/恢复 application parameters 的 concise DCF。 |
--disable-obj-default | 禁用对象字典默认值。 |
--disable-obj-file | 禁用对象字典 UploadFile/DownloadFile 支持。 |
--disable-obj-limits | 禁用对象字典最小值/最大值约束。 |
--disable-obj-name | 禁用对象字典名称字符串。 |
--disable-obj-upload | 禁用对象字典自定义 upload indication 函数。 |
--disable-sdev | 禁用 static device description 支持。 |
2.8 CANopen 协议服务裁剪
| 参数 | 作用 |
|---|---|
--disable-ssdo-blk | 禁用 Server-SDO block transfer。 |
--disable-csdo | 禁用 Client-SDO。 |
--disable-rpdo | 禁用 Receive-PDO。 |
--disable-tpdo | 禁用 Transmit-PDO。 |
--disable-mpdo | 禁用 Multiplex PDO。 |
--disable-sync | 禁用 SYNC 对象。 |
--disable-time | 禁用 TIME 时间戳对象。 |
--disable-emcy | 禁用 EMCY emergency 对象。 |
--disable-lss | 禁用 LSS Layer Setting Services。 |
--disable-wtm | 禁用 WTM Wireless Transmission Media 支持。 |
--disable-master | 禁用 CANopen master 支持。 |
--disable-ng | 禁用 node guarding。 |
--disable-nmt-boot | 禁用 NMT boot slave。 |
--disable-nmt-cfg | 禁用 NMT configuration request。 |
--disable-gw | 禁用 gateway 支持。 |
--disable-gw-txt | 禁用 ASCII gateway 支持。 |
2.9 C++ application、工具、测试、Python、文档
| 参数 | 作用 |
|---|---|
--disable-coapp-master | 禁用 C++ CANopen application master 支持。 |
--disable-coapp-slave | 禁用 C++ CANopen application slave 支持。 |
--disable-tools | 禁用命令行工具构建。 |
--disable-tests | 禁用测试。 |
--disable-unit-tests | 禁用单元测试。 |
--disable-unit-tests-memleak | 禁用单元测试内存泄漏检测。 |
--disable-python | 禁用 Python tools and bindings;官方交叉编译文档说明该选项会隐含--disable-cython,并禁用 DCF tools。 |
--disable-python2 | 禁用 Python 2 tools and bindings。 |
--disable-python3 | 禁用 Python 3 tools and bindings。 |
--disable-cython | 不使用 Cython 生成 Python bindings;官方文档说明该绑定已属于 deprecated Python bindings。 |
--disable-doc | 禁用 Doxygen 文档生成。 |
2.10 外部包与工具链搜索
| 参数 | 作用 |
|---|---|
--with-gcov=GCOV | 指定覆盖率工具 gcov。 |
--with-pic[=PKGS] | 控制 PIC/non-PIC 对象使用策略。 |
| `–with-aix-soname=aix | svr4 |
--with-gnu-ld | 假设 C 编译器使用 GNU ld。 |
--with-sysroot[=DIR] | 在指定 sysroot 或编译器 sysroot 中搜索依赖库。 |
--with-ixxat[=DIR] | 搜索 IXXAT VCI SDK;官方文档说明会在 DIR/inc 下查找 VCI 头文件。 |
--with-vci[=DIR] | 同 IXXAT VCI SDK 搜索相关。 |
2.11 常用环境变量
| 参数 | 作用 |
|---|---|
CC / CXX | 指定 C/C++ 编译器命令。 |
CFLAGS / CXXFLAGS | 指定 C/C++ 编译参数,例如优化、告警、目标架构。 |
CPPFLAGS | 指定预处理参数,例如额外 include 路径。 |
LDFLAGS | 指定链接器参数,例如额外库目录。 |
LIBS | 显式追加链接库。 |
CPP / CXXCPP | 指定 C/C++ 预处理器。 |
PKG_CONFIG / PKG_CONFIG_PATH / PKG_CONFIG_LIBDIR | 控制 pkg-config 工具及搜索路径;交叉编译时尤其重要。 |
CPPUTEST_CFLAGS / CPPUTEST_LIBS | 覆盖 CppUTest 的编译与链接参数。 |
LT_SYS_LIBRARY_PATH | 用户定义的运行期库搜索路径。 |
3. 常见配置组合如何理解
| 场景 | 配置示例 | 说明 |
|---|
| 交叉编译到 ARM64 Linux |--host=aarch64-poky-linux --prefix=<INSTALL_PREFIX>|--host触发交叉编译路径;--prefix控制安装根目录。 |
| 不构建 Python 工具/绑定 |--disable-python --disable-cython|--disable-python会关闭 Python tools and bindings,并隐含关闭 Cython 绑定;显式写出--disable-cython可增强命令可读性。 |
| 不跑测试 |--disable-tests --disable-unit-tests| 关闭测试和单元测试目标;这不等于 configure 完全不探测 CppUTest,因为脚本仍可能检查可选依赖。 |
| 只保留 C 库接口 |--disable-cxx| 关闭 C++ 接口和 C++ CANopen application library。 |
| 减少目标运行时依赖 |--disable-threads --disable-stdio --disable-daemon| 面向资源受限或无完整 POSIX 能力的运行时;需要确认应用是否依赖这些能力。 |
| 不需要 CAN FD |--disable-canfd| 缩小 CAN 消息结构;库和应用编译宏需要保持一致。 |
| 不生成文档 |--disable-doc| 避免 Doxygen/Graphviz 成为文档生成路径的依赖。 |
4. configure 日志应按阶段阅读
configure 日志的格式通常是checking ... yes/no/value。其中yes表示检查通过,no表示未找到或不支持,(cached)表示复用缓存。判断一条日志是否异常,不能只看yes/no,还要看它检查的是必需依赖、可选依赖,还是被配置项关闭的功能。
5. 输入日志逐段说明
5.1 命令行与 site script
../configure --host=aarch64-poky-linux --prefix=<INSTALL_PREFIX> \ --disable-python --disable-cython --disable-tests --disable-unit-tests configure: loading site script <YOCTO_SDK>/site-config-armv8a-poky-linux第一行是传入 configure 的显式策略:目标平台由--host指定,安装根目录由--prefix指定,Python、Cython、测试和单元测试被关闭。第二行说明 Yocto SDK 提供了 site 配置,configure 会从中读取交叉编译相关默认值,例如 sysroot、工具链路径或缓存结果。
5.2 build / host / target
checking build system type... x86_64-pc-linux-gnu checking host system type... aarch64-poky-linux-gnu checking target system type... aarch64-poky-linux-gnu checking whether we are cross compiling... yesbuild是执行构建命令的机器,host是生成程序未来运行的目标系统,target对普通库项目通常跟 host 一致。这里 build 与 host 不同,因此进入交叉编译路径。
5.3 基础构建工具
checking for a BSD-compatible install... /usr/bin/install -c checking for a thread-safe mkdir -p... /usr/bin/mkdir -p checking for gawk... gawk checking whether make sets $(MAKE)... yes checking for a sed that does not truncate output... (cached) sed这些是 Autotools/Automake 构建脚本所需的基础命令。(cached)表示该结果已被缓存或前面已经探测过,不是异常。
5.4 覆盖率与 Valgrind 开关
checking whether to build with code coverage support... no checking for valgrind... no覆盖率未启用,Valgrind 可执行程序未找到。若没有开启相关测试目标,这类no不构成构建中断。后面又检测到valgrind/valgrind.h,说明头文件与可执行程序是两类独立检查。
5.5 C 编译器探测
checking for aarch64-poky-linux-gcc... aarch64-poky-linux-gcc ... --sysroot=<TARGET_SYSROOT> checking whether the C compiler works... yes checking whether we are using the GNU C compiler... yes checking ... option to accept ISO C89... none needed checking ... option to accept ISO C99... none needed checking how to run the C preprocessor... aarch64-poky-linux-gcc -E ...configure 找到了交叉 C 编译器,并验证它可以编译最小测试程序。none needed表示编译器默认模式已能满足对应 C 标准测试,无需额外-std=参数。
5.6 系统头文件探测
checking for ANSI C header files... yes checking for sys/types.h... yes checking for stdint.h... yes checking minix/config.h usability... no checking whether it is safe to define __EXTENSIONS__... yes这些检查用于判断目标 sysroot 中的 C 库头文件能力。minix/config.h... no只是说明目标系统不是 Minix 风格,不是错误。__EXTENSIONS__与系统兼容宏有关。
5.7 C++ 编译器与 C++11
checking whether we are using the GNU C++ compiler... yes checking whether aarch64-poky-linux-g++ supports C++11 features with -std=gnu++11... yesLely core 是 C 库为主,但提供部分 C++ 接口和 C++ CANopen application library。该段确认目标 C++ 编译器可用,并能通过-std=gnu++11支持 C++11。
5.8 Libtool、链接器与 binutils
checking for ld used by aarch64-poky-linux-gcc... aarch64-poky-linux-ld --sysroot=<TARGET_SYSROOT> checking if the linker ... is GNU ld... yes checking for BSD- or MS-compatible name lister (nm)... aarch64-poky-linux-nm checking for aarch64-poky-linux-ar... aarch64-poky-linux-ar checking for aarch64-poky-linux-ranlib... aarch64-poky-linux-ranlib这一段属于 libtool 初始化。它确定链接器、符号表工具、归档工具和 ranlib 是否与目标三元组匹配,这决定后续.so、.a和 libtool wrapper 的生成方式。
5.9 非前缀工具警告
checking for aarch64-poky-linux-mt... no checking for mt... mt configure: WARNING: using cross tools not prefixed with host triplet checking if mt is a manifest tool... nomt是 Windows manifest 相关工具。当前目标是 Linux/ARM64,日志中虽然出现 warning,但紧接着判断mt不是 manifest tool;对 Linux CANopen 库构建一般不是关键路径。文章中应解释为“非关键工具探测警告”,而不是当作主失败点。
5.10 PIC、共享库与静态链接测试
checking ... option to produce PIC... -fPIC -DPIC checking ... PIC flag -fPIC -DPIC works... yes checking ... static flag -static works... no checking whether ... linker supports shared libraries... yes checking whether to build shared libraries... yes checking whether to build static libraries... yes-fPIC通过,说明可生成位置无关代码,满足共享库构建。-static works... no表示用-static生成完全静态可执行文件的测试没有通过;它不等同于不能生成静态库,因为后面build static libraries... yes仍然成立。
5.11 运行时库、线程和 pkg-config
checking for qemu-aarch64... qemu-aarch64 checking for timer_create in -lrt... yes checking whether pthreads work with "-pthread" and "-lpthread"... yes checking for PTHREAD_PRIO_INHERIT... yes checking for aarch64-poky-linux-pkg-config... no checking for pkg-config... <SDK_HOST_SYSROOT>/usr/bin/pkg-config checking pkg-config is at least version 0.9.0... yes这部分确认 QEMU、POSIX timer、pthread 和 pkg-config。未找到带目标前缀的 pkg-config,但找到了 SDK host sysroot 中的 pkg-config;交叉编译场景需要进一步关注它是否配套设置了PKG_CONFIG_SYSROOT_DIR、PKG_CONFIG_LIBDIR等。
5.12 测试、Valgrind 头文件、SocketCAN 与 Linux 接口
checking for CPPUTEST... no checking valgrind/valgrind.h usability... yes checking linux/can.h usability... yes checking linux/can/raw.h presence... yes checking sys/epoll.h presence... yes checking sys/ioctl.h presence... yesCppUTest 未找到,但单元测试已通过配置参数关闭;SocketCAN、CAN error、CAN raw、netlink、rtnetlink、epoll、ioctl 等 Linux 头文件可用,说明目标 sysroot 支持 Lely Linux CAN/I/O 相关构建路径。
5.13 Bluetooth 与 BlueZ
checking for bluetooth/bluetooth.h... yes checking for bluetooth/rfcomm.h... yes checking for library containing str2ba... -lbluetoothLely 的 I/O 层在 Linux 下可探测 BlueZ/Bluetooth RFCOMM。官方安装文档说明 Bluetooth 支持不是 CANopen stack 的必需条件,因此这类能力更多影响可选 I/O 支持。
5.14 Doxygen 与生成阶段
checking for doxygen... no checking that generated files are newer than configure... done configure: creating ./config.status config.status: creating Makefile config.status: creating config.h config.status: executing depfiles commands config.status: executing libtool commandsDoxygen 未找到只影响 API 文档生成。末尾进入config.status并生成顶层 Makefile、各子目录 Makefile、pkg-config 文件和config.h,表示 configure 已完成“生成构建系统文件”这一阶段。
6. 日志中容易误读的点
| 日志现象 | 正确理解 |
|---|
|checking for CPPUTEST... no| CppUTest 未找到;如果单元测试目标已关闭,它不是主构建路径的中断点。 |
|checking for doxygen... no| Doxygen 未找到;通常只影响 API 文档生成。 |
|checking ... static flag -static works... no| 表示完全静态链接测试未通过;不等于不能生成.a静态库。 |
|configure: WARNING: using cross tools not prefixed with host triplet| 某个工具没有目标三元组前缀;需要结合具体工具判断。这里出现在mt相关探测中,通常不是 Linux/ARM CANopen 库的关键工具。 |
|python/.../Makefile仍被创建 | Autotools 可生成子目录 Makefile,但实际是否参与构建由 Automake 条件和 configure 变量决定。 |
|pkg-config没有目标前缀 | 交叉编译中常见;关键是是否使用 SDK 提供的 pkg-config,并且路径变量是否指向目标 sysroot。 |
7. 判断 configure 是否进入生成阶段
configure 日志末尾出现以下模式时,说明它已经完成探测并开始生成构建系统文件:
configure: creating ./config.status config.status: creating Makefile config.status: creating config.h config.status: executing depfiles commands config.status: executing libtool commands如果出现configure: error: ...,则通常表示配置阶段被中断,需要根据错误项补依赖、修工具链路径或调整--enable/--disable/--with参数。
9. 参考资料
Lely CANopen:Installation。说明 GNU Build System 构建流程、依赖项、
autoreconf -i、../configure --disable-cython、make、make check、make install。Lely CANopen:Cross-compilation。说明
--host=HOST交叉编译,以及--disable-python会隐含--disable-cython并禁用 DCF tools。Lely CANopen:Build configuration。说明
--disable-cxx、--disable-threads、--disable-errno、--disable-malloc、--disable-stdio、--disable-daemon、--disable-diag、--disable-canfd等配置项和对应预处理宏。Lely core libraries Doxygen 首页。说明可通过
./configure --help查看完整配置项。