检查项目对多架构的支持性
在开始针对目标架构适配软件之前,需要先确认当前软件项目 是否已支持多架构,以及 支持到何种程度。
以 RISC-V 架构为例,软件项目的状态可以分为以下几种情况:
- 当前软件与目标架构 完全无关
- 当前软件只支持 单一 目标架构
- 当前软件支持 两个或多个 目标架构,但尚未支持 RISC-V 架构
- 当前软件已 部分支持 RISC-V 架构,但仍有部分功能不支持 RISC-V 架构
- 当前软件已 完全支持 RISC-V 架构(无需进一步修改)
对于第 1 种情况,常见于 完全通过标准库 API 编写 的软件。 这些软件能否在目标架构上运行,完全依赖于编译器(或解释器等)是否支持目标架构, 而无需在源代码中进行任何区分,即软件本身不存在任何架构相关源代码; 另一些软件中仅包含 某个软件的资源文件,这些资源文件通常不需要被直接执行。 称以上这类软件是 架构无关 的。
提示
在 RPM 软件包管理器中,这些软件包通常含有 noarch
标记,可以安装在任何目标架构的操作系统中。
在 CentOS 7 的所有 RPM 软件包 中,有 2,727 / 10,072 个 (27.1%) 架构无关软件包。
对于第 2 种情况,常见于 针对特定架构硬件平台编写 的专用软件。 这些软件为了充分利用特定架构硬件平台的特性,往往大量使用硬件相关、架构相关的库方法与 API 等, 在其它架构平台上则几乎无法编译运行。 这些专用软件迁移难度大,成本高,在非必要的情况下应降低迁移工作优先级。 若确实需要迁移,则需要针对每处原架构相关用法寻找目标架构对应的替代用法。
对于第 3 和第 4 种情况,表明软件本身 已经为支持多架构打好了基础。 在做出进一步的修改前,应先检查并充分了解软件当前支持多架构的方式, 尽量选用相同或相似的方式支持新架构,尽量保证风格一致。
项目结构检查
一种最朴素的方式是遍历项目所有文件和目录,检查文件名或目录名中是否频繁出现常见的 架构关键字。 若某一组目录或文件下多次出现架构关键字,则可以认为软件项目已对这些不同架构引入了多架构支持。
编译配置检查
常见的编译工具链针对多架构适配提供了一些 预定义宏 和 模板方法, 开发者可利用它们编写判断条件,按照不同的目标架构切换使用不同的源文件。 若项目的编译配置中已存在这样的架构判定用法,则可以初步认为该项目 已初步支持多架构。
rpmbuild 配置文件
主要指 RPM 包管理器构建软件包时所使用的配置文件。 其中常见的架构判定用法参见 rpmbuild 配置文件
Makefile 配置文件
主要指 make 工具编译软件包时所使用的配置文件。 其中常见的架构判定用法参见 Makefile 配置文件
Autoconf 配置文件
主要指 Autoconf 工具为软件包生成编译配置时所使用的配置文件。 其中常见的架构判定用法参见 Autoconf 配置文件
源代码检查
不同的编程语言以不同的形式提供了判断目标平台架构的方法, 通常可分为 架构相关宏 和 架构信息相关 API 两类。 其中,前者通常在编译预处理阶段被解析,由编译器启用或屏蔽特定的代码块。 后者通常在运行时获取当前运行环境架构,根据获取的结果执行不同分支。
C/C++ 中的架构相关宏
重点关注是否存在以下形式的架构相关宏判断语句:
#ifdef __ARCH
#ifndef __ARCH__
#elifdef __ARCH // Since C++ 23
#elifndef __ARCH__ // Since C++ 23
#if defined(__ARCH)
#elif defined(__ARCH__)
#if __ARCH
#elif __ARCH__