菜单

构建系统

相关源文件

本页面介绍了 Ghidra 基于 Gradle 的构建系统,该系统负责管理编译、依赖解析、原生代码编译、文档生成和分发包创建。有关从源代码构建 Ghidra 的信息,请参阅 构建 Ghidra。有关创建扩展的信息,请参阅 创建扩展

架构概述

Ghidra 的构建系统基于 Gradle,具有分层的任务定义、属性和配置结构。该系统使用一组 Gradle 脚本来管理构建过程的各个方面。

来源:build.gradle16-114 DevGuide.md31-70 gradle/root/distribution.gradle16-57 gradle/support/fetchDependencies.gradle16-34

构建系统组件

构建系统包含以下主要组件

  1. 根构建文件:配置项目属性并应用其他脚本
  2. Gradle 脚本:用于不同构建方面的专用脚本
  3. 任务定义:用于构建、测试和打包 Ghidra 的自定义任务
  4. 依赖管理:用于下载和管理依赖项的系统

核心 Gradle 构建脚本

文件目的
build.gradle主构建文件,用于配置全局属性并应用其他脚本
gradle/root/distribution.gradle处理分发包和组件的打包
gradle/support/fetchDependencies.gradle下载外部依赖项
GPL/nativeBuildProperties.gradle配置原生代码编译
gradle/support/ip.gradle管理文件的许可信息
gradle/hasPythonPackage.gradle处理 Python 包集成

来源:build.gradle104-112 DevGuide.md31-68 gradle/root/distribution.gradle642-713 gradle/support/fetchDependencies.gradle16-34

构建生命周期

构建过程遵循从依赖解析到最终打包的定义生命周期。

来源:DevGuide.md31-68 gradle/root/distribution.gradle642-713 build.gradle74-91

依赖管理

Ghidra 的构建系统管理来自多个来源的依赖项

  1. Maven Central 依赖项:标准的 Java 依赖项
  2. 非 Maven 外部依赖项:使用 fetchDependencies 任务下载
  3. 本地依赖项:存储在扁平化的仓库目录中

该系统处理不同场景下的依赖项解析,包括离线构建。

外部依赖

外部依赖项在 fetchDependencies.gradle 中定义,并在构建准备阶段下载。这些依赖项包括

  • 函数 ID 数据库(.fidb 文件)
  • Python wheel 和包
  • Ghidra 服务器等工具(如 YAJSW)
  • Windows 构建的 Visual Studio 组件

来源:gradle/support/fetchDependencies.gradle63-345 DevGuide.md32-36 build.gradle74-91

多平台支持

Ghidra 的构建系统支持多平台,包含特定平台的原生组件和分发产物。

平台支持架构

构建系统默认使用当前平台来确定要构建的原生组件。通过 -PallPlatforms 标志,它可以构建一个跨平台的分发包。

来源:GPL/nativeBuildProperties.gradle16-203 build.gradle52-56 GPL/vsconfig.gradle12-79 gradle/root/distribution.gradle507-532

构建原生组件

原生组件使用特定于平台的工具链进行构建

  • Windows:Visual Studio(2017 或更高版本)
  • Linux/FreeBSD:GCC 或 Clang
  • macOS:Clang

系统根据当前平台自动检测合适的工具链。为每个支持的平台生成特定于平台的构建任务。

原生构建过程

对于 PDB 支持和其他原生组件,构建系统使用特定的项目文件

  • Windows:Visual Studio 解决方案文件(.sln)
  • Linux/macOS:Makefile 或直接编译

来源:GPL/nativeBuildProperties.gradle124-171 Ghidra/Features/PDB/buildNatives.gradle26-58 Ghidra/Features/PDB/src/pdb/pdb.vcxproj1-132

Python 集成

Ghidra 在其构建系统中具有深度 Python 集成,支持

  1. Python 开发环境:虚拟环境的创建
  2. PyGhidra 包:Ghidra 的 Python 绑定
  3. Python 类型存根:为 IDE 支持生成的类型信息
  4. Python Wheel 打包:用于分发构建 Python 包

Python 构建组件

来源:gradle/root/venv.gradle16-36 gradle/hasPythonPackage.gradle16-103 Ghidra/Features/PyGhidra/build.gradle22-111 build.gradle155-237

分发包创建

构建过程的最后一步是创建分发包,其中包括

  1. 核心 Ghidra 文件:Java 类、资源和配置
  2. 原生组件: 平台特定的二进制文件
  3. 文档: Javadoc、JSON 文档和其他文档
  4. 扩展模块: 打包的扩展
  5. 支持文件: 脚本、示例和实用程序

分发程序集过程

来源: gradle/root/distribution.gradle349-495 gradle/root/distribution.gradle642-720

常见构建任务

构建系统提供了各种任务,以满足不同的开发工作流

核心构建任务

任务描述
gradle -I gradle/support/fetchDependencies.gradle下载非 Maven Central 依赖项
gradle prepdev下载 Maven Central 依赖项并为开发进行设置
gradle cleanEclipse eclipse生成 Eclipse 项目文件
gradle buildNatives为当前平台构建原生组件
gradle sleighCompile编译 Sleigh 文件
gradle createJavadocs构建 Javadoc 文档
gradle buildPyPackage为 PyGhidra 和 Debugger 构建 Python 包
gradle assembleAll以未压缩形式构建 Ghidra
gradle buildGhidra构建压缩的 Ghidra 发行版

测试任务

任务描述
gradle unitTestReport运行单元测试并生成报告
gradle integrationTest运行集成测试
gradle combinedTestReport运行所有测试并生成报告

来源: DevGuide.md31-68 DevGuide.md147-161

扩展开发

构建系统支持扩展的开发和打包

  • 扩展可以作为独立模块进行构建
  • 它们可以打包成 ZIP 文件进行分发
  • 构建系统负责处理依赖项和许可信息

来源: gradle/support/extensionCommon.gradle18-142 gradle/distributableGhidraModule.gradle16-234

离线构建

构建系统支持在隔离网络环境中进行离线构建

  1. 在联网系统上下载依赖项
  2. 将 Ghidra 存储库及其依赖项传输到离线系统
  3. 使用本地依赖项进行构建
gradle -I gradle/support/fetchDependencies.gradle
gradle -g dependencies/gradle prepdev
# Move ghidra directory to offline system
gradle -g dependencies/gradle buildGhidra

来源: DevGuide.md132-145