Lely CANopen configure 配置项与日志解读

在这里插入图片描述

@[toc]

1. configure 在构建链路中的位置

configure 属于 GNU Build System 的配置阶段。它不会直接把 Lely 源码编译成库,而是读取命令行参数、探测工具链和目标系统能力,然后生成 Makefileconfig.h.pc 文件和 libtool 相关脚本。后续 make 才进入编译阶段。

在这里插入图片描述

一个典型的交叉编译配置命令可以写成:

1
2
3
4
5
6
7
../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

1
2
3
../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

1
2
3
4
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... yes

build 是执行构建命令的机器,host 是生成程序未来运行的目标系统,target 对普通库项目通常跟 host 一致。这里 build 与 host 不同,因此进入交叉编译路径。

5.3 基础构建工具

1
2
3
4
5
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 开关

1
2
checking whether to build with code coverage support... no
checking for valgrind... no

覆盖率未启用,Valgrind 可执行程序未找到。若没有开启相关测试目标,这类 no 不构成构建中断。后面又检测到 valgrind/valgrind.h,说明头文件与可执行程序是两类独立检查。

5.5 C 编译器探测

1
2
3
4
5
6
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 系统头文件探测

1
2
3
4
5
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

1
2
checking whether we are using the GNU C++ compiler... yes
checking whether aarch64-poky-linux-g++ supports C++11 features with -std=gnu++11... yes

Lely core 是 C 库为主,但提供部分 C++ 接口和 C++ CANopen application library。该段确认目标 C++ 编译器可用,并能通过 -std=gnu++11 支持 C++11。

5.8 Libtool、链接器与 binutils

1
2
3
4
5
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 非前缀工具警告

1
2
3
4
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... no

mt 是 Windows manifest 相关工具。当前目标是 Linux/ARM64,日志中虽然出现 warning,但紧接着判断 mt 不是 manifest tool;对 Linux CANopen 库构建一般不是关键路径。文章中应解释为“非关键工具探测警告”,而不是当作主失败点。

5.10 PIC、共享库与静态链接测试

1
2
3
4
5
6
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

1
2
3
4
5
6
7
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_DIRPKG_CONFIG_LIBDIR 等。

5.12 测试、Valgrind 头文件、SocketCAN 与 Linux 接口

1
2
3
4
5
6
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... yes

CppUTest 未找到,但单元测试已通过配置参数关闭;SocketCAN、CAN error、CAN raw、netlink、rtnetlink、epoll、ioctl 等 Linux 头文件可用,说明目标 sysroot 支持 Lely Linux CAN/I/O 相关构建路径。

5.13 Bluetooth 与 BlueZ

1
2
3
checking for bluetooth/bluetooth.h... yes
checking for bluetooth/rfcomm.h... yes
checking for library containing str2ba... -lbluetooth

Lely 的 I/O 层在 Linux 下可探测 BlueZ/Bluetooth RFCOMM。官方安装文档说明 Bluetooth 支持不是 CANopen stack 的必需条件,因此这类能力更多影响可选 I/O 支持。

5.14 Doxygen 与生成阶段

1
2
3
4
5
6
7
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 commands

Doxygen 未找到只影响 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 日志末尾出现以下模式时,说明它已经完成探测并开始生成构建系统文件:

1
2
3
4
5
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-cythonmakemake checkmake 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 查看完整配置项。