---
title: 源码迁移（CLI）
description: "源码迁移 功能检查并分析用户C/C++/ASM/Fortran/Go/Java/Python/Scala语言等源码文件，定位出需迁移代码并给出迁移指导。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevps/portingadvisor/sourcecodeporting/KunpengDevKitCli_0013.html
sourcePath: /source/zh/kunpengdevps/portingadvisor/sourcecodeporting/KunpengDevKitCli_0013.html
indexId: 835f37b2bdf42a5f8ce1c02e402eaa6a60e091ffa015388d07bd513223a0f4c583
---
# 源码迁移（CLI）

源码迁移 功能检查并分析用户C/C++/ASM/Fortran/Go/Java/Python/Scala语言等源码文件，定位出需迁移代码并给出迁移指导。

多模块并发时，不支持同时设置不同的日志级别。


#### 前提条件

- 已安装应用迁移工具。
- 使用压缩包安装工具时，请解压后切换至工具目录使用，采用./方式执行命令，例如./devkit porting -h。使用RPM包安装工具时，可直接执行命令，例如devkit porting -h。本章示例均为RPM包安装使用。


#### 命令功能

在终端环境下分析用户C/C++/ASM/Fortran/Go/Java/Python/Scala语言软件的可迁移性。


#### 注意事项

如果用户所处的环境 Glibc 版本低于2.28，则无法使用最新的汇编文件自动翻译功能，如有需要，请按照以下步骤进行操作：

若使用RPM安装方式，则PATH为“/usr/local/devkit”；若使用解压压缩包方式安装，则PATH为解压路径。


- 可连接外网：在“PATH/porting/devkitplugins/all_asm/bin”下执行bash addAsmLibraries.sh即可。
- 无法连接外网：需手动创建“tmp/rpm”目录，把RPM包放至“PATH/porting/devkitplugins/all_asm/tmp/rpm”目录下，然后在“PATH/porting/devkitplugins/all_asm/bin”下执行bash addAsmLibraries.sh即可。
**表1 RPM包获取**

| 服务器架构 | RPM包 | 获取方式 |
| --- | --- | --- |
| x86 | glibc\-2.28\-101.el8.x86\_64.rpm | 获取链接(https://vault.centos.org/centos/8.2.2004/BaseOS/x86\_64/os/Packages/glibc\-2.28\-101.el8.x86\_64.rpm) |
| x86 | libstdc++\-8.3.1\-5.el8.0.2.x86\_64.rpm | 获取链接(https://vault.centos.org/centos/8.2.2004/BaseOS/x86\_64/os/Packages/libstdc++\-8.3.1\-5.el8.0.2.x86\_64.rpm) |
| ARM | glibc\-2.28\-101.el8.aarch64.rpm | 获取链接(https://vault.centos.org/centos/8.2.2004/BaseOS/aarch64/os/Packages/glibc\-2.28\-101.el8.aarch64.rpm) |
| ARM | libstdc++\-8.3.1\-5.el8.0.2.aarch64.rpm | 获取链接(https://vault.centos.org/centos/8.2.2004/BaseOS/aarch64/os/Packages/libstdc++\-8.3.1\-5.el8.0.2.aarch64.rpm) |


#### 命令格式

```
devkit porting src-mig -i,--input path-to-source-code -c,--cmd 'string of compiling command line' [-s,--source-type {c|c++|asm|fortran|go|python|java|scala}*] [-t,--target-os target-os] [-p,--compilercompiler-version] [-f,--fortran-compiler fortran-compiler-version] [-o,--output path-to-output] [-b,--build-tool {make, cmake, automake, go, bazel, blade, other}] [-r,--report-type {all/json/html/csv}] [-l,--log-level {0/1/2/3} ] [-np number-of-multi-progress <number>] [--set-timeout time-limit-for-task] [--ignore path-to ignore-file] [--macro MACRO] [--keep-going {True, False}] [--ignore-path path-to-ignore-source-code] [--kp-compatibility] [-h,--help]
```


#### 参数说明


**表2 参数说明**

| 参数 | 参数选项 | 参数说明 |
| --- | --- | --- |
| \-h/\-\-help | \- | 可选参数，获取帮助信息。 |
| \-i/\-\-input\-path | \- | 必选参数，待扫描源码的文件夹或压缩包所在路径，若存在多个扫描路径需使用空格分隔。 例如：/home/test1 /home/test2。 须知： 若待扫描文件路径中包含以下架构相关的关键词（关键词位于\_或/之后，并在/\_或.之前，不区分大小写），则忽略该文件，例如：/home/Arm\_branch/test1。 PPC、PPC64、s390、s390x、powerpc、alpha、MIPS、itanium、WIN64、WIN32、BOOST\_COMP\_MSVC、arm、aarch64、sparc、sparc64 |
| \-c/\-\-cmd | \- | 可选参数，源码的构建命令，需使用单引号或双引号包裹。若命令包含空格，需使用单引号。 当构建工具为make或cmake时，若未指定“\-c”选项或构建工具与“\-c”选项不匹配，将扫描所有文件；若构建工具与“\-c”匹配，构建成功时将扫描对应的内容，构建失败时将扫描所有文件。 当构建工具为bazel或blade时，若指定“\-c”选项，将扫描所有文件。 命令行工具源码构建命令不支持设置变量和export环境变量。 例如："CFLAGS='\-O0 \-g';make"或"export CFLAGS='\-O0 \-g';make"。 |
| \-s/\-\-source\-type | c/c++/asm/fortran/go/java/python/scala | 可选参数，待扫描源码类型，默认为'c,c++,asm'。 |
| \-t/\-\-target\-os | 详见“\-h”帮助信息。 | 可选参数，迁移的目标操作系统，如果用户不输入则默认为当前操作系统。 |
| \-p/\-\-compiler | 详见“\-h”帮助信息。 | 可选参数，编译器版本，C/C++/ASM和GO语言使用相同的编译器版本。默认为目标操作系统附带的编译器版本。 |
| \-f/\-\-fortran\-compiler | flang2.1.0/flang2.3.0/flang2.4.0/flang2.5.0/flang2.5.0.1/flang3.0.0/flang3.1.0/flang3.2.0/flang4.0.0/flang4.1.0/gfortran7/gfortran8/gfortran9 | 可选参数，fortran代码的编译器版本，默认为flang2.5.0.1。 |
| \-o/\-\-output | \- | 可选参数，扫描报告的存放路径，默认存放在当前执行路径下，报告名称为“特性名称\_时间戳”。 |
| \-b/\-\-build\-tool | make/cmake/automake/go/bazel/blade/other | 可选参数，构建工具，默认make。 “go”构建工具只在待扫描源码类型包含“go”且不包含“fortran”时可用。 待扫描源码类型包含“fortran”或“go”时，不支持“bazel”和“blade”选项。 bazel构建工具仅支持BUILD、BUILD.bazel构建文件中编译选项的识别和BUILD、BUILD.bazel、MODULE.bazel构建文件中CPU选项的识别。 blade构建工具仅支持\*.conf、BLADE\_ROOT、BLADE\_ROOT.local、BUILD构建文件中编译选项的识别。 “源码类型”同时选择“c/c++”和“go”时： 若构建工具为“make”，则C/C++扫描源码和 Makefile （构建扫描），Go扫描源码。 若构建工具为“go”，则C/C++扫描源码和Makefile（全量扫描），Go扫描源码。 “other”表示不支持的构建工具，若选择将会进行全量扫描，可能存在误报风险，请谨慎选择。 |
| \-r/\-\-report\-type | all/json/html/csv | 可选参数，扫描报告的格式，默认为all。 all：生成JSON、HTML、CSV三种格式报告。 json：生成JSON格式报告。 html：生成HTML格式报告。 csv：生成CSV格式报告。 |
| \-l/\-\-log\-level | 0/1/2/3 | 可选参数，设置日志级别，默认为1。 0：日志级别为DEBUG。 1：日志级别为INFO。 2：日志级别为WARNING。 3：日志级别为ERROR。 |
| \-np/\-\-number\-of\-progress | \- | 可选参数，配置源码扫描并发进程数，默认为1。 若配置的进程数超过当前主机的CPU核心数，系统会自动调整为当前主机的CPU核心数。 |
| \-\-set\-timeout | \- | 可选参数，任务超时时间，单位为分钟，若执行时间超过超时时间则退出执行。默认无超时时间，任务将持续执行直到结束。 |
| \-\-ignore | {install\_path}/porting/ignore\_rules.json | 可选参数，可通过配置屏蔽扫描规则文件，屏蔽不影响扫描结果的信息。默认读取porting路径下的ignore\_rules.json文件，具体格式请参见屏蔽扫描规则文件说明（\-\-ignore）。 |
| \-\-macro | \- | 可选参数，自定义x86平台宏。输入自定义宏时，多个宏之间请用“;”进行分隔。 |
| \-\-keep\-going | True/False | 可选参数，发现arm/arm64/aarch64关键字是否继续扫描。 True False |
| \-\-ignore\-path | \- | 可选参数，指定需要屏蔽扫描的源码文件或源码文件夹所在路径，若存在多个路径需使用空格分隔。 例如：/home/test /home/a.cpp |
| \-\-kp\-compatibility | \- | 可选参数，指定该选项将只进行鲲鹏平台跨代际的兼容性检查，目标平台为鲲鹏920新型号处理器，建议在完成x86到鲲鹏的迁移之后再使用该选项。 说明： 当前支持C/C++/ASM、Fortran和Go语言。 |


#### 使用示例

此处以分析TestData工程代码并输出CSV格式、JSON格式、HTML格式的分析报告为例，请根据实际情况将“/home/TestData/wtdbg2-2.5”替换为需要扫描的代码路径。

```
devkit porting src-mig -i /home/TestData/wtdbg2-2.5 -c "make"
```

返回信息如下，并输出报告。

```
Using the local system as target os: openeuler20.03sp1
Current progress: #################################  [100%] [Phase 3/3] Scan completed. Generating reports.
Scanned time: 2025/08/11 10:57:16

Configuration:
    Scan code path: /home/TestData/wtdbg2-2.5/
    Compiler: GCC 4.8.5
    Interpreted(Python, Java, Scala): False
    Go: False
    Target OS: openeuler20.03sp1, kernel: 4.19.90
    Software make command: make
    Source Need Migrated: Need Migrated

File scan statistics:
    Total files: 35
    Scanned 34 C/C++ files, 1 Makefile/CMakeLists.txt/Automake related files, total 3 files need to be migrated.
    Scanned 0 pure assembly files, 0 pure assembly files to be migrated.
    Scanned 0 Go files, 0 Go files to be migrated.
    Scanned 0 python files, 0 python files to be migrated.
    Scanned 0 java files, 0 java files to be migrated.
    Scanned 0 scala files, 0 scala files to be migrated.
    Scanned 0 bazel files, 0 bazel files to be migrated.
    Scanned 0 blade files, 0 blade files to be migrated.

Dependency file statistics:
    Adaptable for Compatibility: 1, To be Modified: 0, Total Dependencies: 1

Source file statistics:
    Files to be modified: 3
    Lines to be modified: 17
    Total 10 rules and 6 suggestions.
    Estimated transplant workload: 0.1 person/months.(C/C++/Fortran/Go, 500Line/PM; ASM, 250Line/PM)

For the detailed information, please check:
/home/DevKit_Software/Code_Porting_20250811025716_CLwu9d_zh.json
/home/DevKit_Software/Code_Porting_20250811025716_CLwu9d_zh.csv
/home/DevKit_Software/Code_Porting_20250811025716_CLwu9d.html
```

不同的目标操作系统支持的SO库不一样，所以分析报告会有差异。


#### 屏蔽扫描规则文件说明（--ignore）

可通过ignore_rules.json文件配置屏蔽扫描规则，配置完成后重新扫描文件，扫描报告中将不会展示该扫描项。配置示例如下：

```
{
        "src_list": [
                "-march",
                "-mpopcnt"
        ],
        "lib_list": [
                "libz.so.1"
        ]
}
```

- lib_list：需要屏蔽的依赖文件列表。
- src_list：需要屏蔽的源码文件关键字列表。


#### 输出报告说明


**表3 迁移报告结果参数说明（以CSV为例）**

| 参数 | 说明 |
| --- | --- |
| 报告生成时间 | 显示报告的生成时间。 |
| 配置 | 显示任务名称、报告生成时间、源码文件存放路径、目标操作系统、目标系统内核版本、编译器版本、构建工具、编译命令、是否包含解释性语言和Go语言以及自定义x86宏。 |
| 扫描文件统计 | 显示已扫描的文件数以及需要迁移的文件数。 |
| 依赖文件统计 | 源码包所依赖的与架构相关文件数。 |
| 源码文件统计 | 显示需要修改的文件数、代码行数、规则项和建议项总数，以及预估源码迁移人力。 |
| 与架构相关的依赖文件 | 显示与架构相关的依赖文件详细信息，依赖文件替换方式可参见替换依赖文件。 文件名：依赖文件名称。 文件类型：依赖文件类型。 分析结果：依赖文件分析结果。 处理建议：待修改文件处理建议。 URL：用户可以根据报告提供的链接，下载鲲鹏平台可用的文件。 |
| 源文件扫描详情 | 显示源文件分析报告的详细信息： 文件名：扫描文件全路径。 文件类型：扫描文件的类型。 行号（起始行，结束行）：函数在文件中的行号。 行数：函数在文件中的总行数。 类别：关键字所属类型。 关键字：关键字名称。 建议：迁移建议或者提示建议。 描述：关键字用法描述。 修改级别：修改级别，详细说明及示例详见源码迁移修改级别说明。 修改原因：显示文件的原因分析。 |


关键字所属类型：- INVALID_CATEGORY：无效的迁移项类型。
- INTRINSICS_INCLUDE：头文件中的# intrinsics内联函数。
- INTRINSICS：intrinsics内联函数。
- COMPILER_MACRO：编译器宏。
- ATTRIBUTE：编译器Attribute。
- COMPILER_BUILTIN：编译器内建函数。
- COMPILER_OPTION：编译器选项。
- BUILTIN_ASSEMBLES：嵌入式汇编。
- LIBS：扫描出动态链接库。
- COMPILER_OPTION_SPECIAL：特殊编译器选项。
- MODULE_FUNCTION：ModuleFunction函数。
- AARCH_SPECIFIC：AArch平台独有，根据keep-going的值来判断是否提前结束扫描。
- PURE_ASSEMBLES：纯汇编文件。
- AUTOMAKE_FILE：Automake文件。
- FORTRAN_COMPILER_OPTION：GFortran的编译选项。
- FORTRAN_BUILTIN：Fortran的内建函数。
- FORTRAN_GRAMMAR：Fortran的语法。
- PRECOMPILED_MACRO：预编译宏。
- PYTHON_LIBRARY：Python文件扫描出的SO文件。
- PYTHON_LOAD_LIBRARY：Python文件扫描出加载SO文件所在行。
- JAVA_LIBRARY：Java文件扫描出的SO文件。
- JAVA_LOAD_LIBRARY：Java文件扫描出加载SO文件所在行。
- SCALA_LIBRARY：Scala文件扫描出的SO文件。
- SCALA_LOAD_LIBRARY：Scala文件扫描出加载SO文件所在行。
- FORTRAN_MODULE_FILE：Fortran module文件编译出的.mod文件。
- MIX_FUNCTION_NOT_MATCH：C和Fortran函数互调参数和返回值不匹配。
- INTRINSICS_LIBRARY：构建文件提示添加intrinsic函数的SO链接库。
- TEE_UNSUPPORTED_API：TEE不支持的POSIX API。
- JAVA_MATH_LIBRARY：Java文件扫描出Math数学库的位置。


ModuleFunction函数的描述说明如下：```
current usage:
add_library(test1 STATIC attr_gcc5.1.c builtin_gcc5.1.c )
The general signature is:
    add_library(<name> [STATIC | SHARED | MODULE]
                [EXCLUDE_FROM_ALL]
                [source1] [source2 ...])
For details: https://cmake.org/cmake/help/v3.13/command/add_library.html
```

- current usage：当前文档中的函数用法。
- The general signature is：官方通用函数用法。
- For details：对应Module函数的官方详细帮助文档链接。
