gpt4 book ai didi

gradle - 使用 Gradle 管理依赖项并在遗留 C++ 项目上启动自定义编译脚本

转载 作者:行者123 更新时间:2023-12-03 05:31:21 25 4
gpt4 key购买 nike

我正在尝试将一个非常困惑的遗留 C++ 项目逐步迁移到 Gradle。

tl;博士

该项目由一个过于复杂的 shell 脚本系统编译而成,每个模块都包含一个额外的 .txt包含依赖项的文件。那些.txt文件由 shell 脚本解析并按照您编写它们的顺序进行编译(是的,如果您以错误的顺序编写依赖项,编译将失败。

编译的结果放在三个公共(public)目录中:exe对于可执行文件,i686对于*.so文件(exe64x86_64 在 64 位的情况下)和 includes中间目录.h后续编译所需的文件和其他文件。在为 Windows 而不是为 Linux 编译时也会发生同样的情况,但现在我专注于为 Linux 编译。

这是存储库的样子:

root
├── dependency
│   └── shared-dependency
└── project
├── exe
├── i686
├── includes
│   ├── 32
│   └── 64
├── lib1
├── lib2
├── lib3
├── lib4
├── (other directories)
└── main
shared-dependency是第一个编译的,第二个是 main模块(可执行文件),然后是一些 libs .对于 libs ,正如我所说,依赖关系在 libs 中定义。文件夹。
shared-dependencymain模块总是被编译,而不是库:你选择编译的库将根据它的 txt 中定义的依赖关系来定义要编译的内容。文件。例如: txt lib6 中的文件包含字符串 lib2 lib1 lib5 ,因此构建过程将按以下顺序编译: shared-dependency , main , lib2 , lib1 , lib5 , lib6 .另一个例子: txt lib10 中的文件包含字符串 lib2 lib5 lib28 lib8 ,因此构建过程将按以下顺序编译: shared-dependency , main , lib2 , lib5 , lib28 ,
lib8 . lib10 .

至于现在,如果您创建一个新库,您必须手动定义它的所有依赖项并将它们写入 txt 文件(以正确的顺序!),以便您能够构建它。

问题

作为此迁移的第一步,我的目标是使用 Gradle 来:
  • 调用构建脚本(并且不要使用 Gradle 的构建,我会将其留到迁移的后期,因为我必须撕开那些凌乱的脚本才能做到这一点)。
  • 定义依赖项(奖励:在 lib 的子文件夹中定义每个依赖项,并且不要污染根 build.gradle )。

  • 我在 project 中创建了一个 Gradle 项目目录并以编程方式将其所有子文件夹定义为包含在 settings.gradle 中文件并在 build.gradle 中定义构建任务文件:
    allprojects {
    task build {
    exec {
    commandLine "sh", "build.sh"
    }
    }
    }

    但我无法定义依赖关系!如果我在 build.gradle 中添加类似的内容文件:
    project(':lib1') {
    dependencies {
    archives project(':main')functionalities
    }
    }

    不管我选择什么而不是 archives单词(如 implementation ),Gradle 会提示
    Could not find method archives() for arguments [project ':main'] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

    我对 Gradle 完全陌生,但如果我的理解是正确的,我必须应用一个插件才能使用依赖项,例如 apply plugin: 'base' .但是如果我这样做,我将无法再定义构建任务,因为我得到 Cannot add task 'build' as a task with that name already exists. .如果我尝试使用 task build <<< {我收到另一个错误: expecting '}', found 'build' .

    目前我对Gradle内部逻辑的理解几乎为零,所以卡住了。

    可以以适合我需要的方式配置 Gradle 吗?

    最佳答案

    这很令人沮丧,但最终我能够实现我想要的。

    设置.gradle:

    rootDir.eachDir { f ->
    if(!f.getName().startsWith(".") &&
    !f.getName().startsWith("include") &&
    !f.getName().startsWith("lib") &&
    !f.getName().startsWith("lib64") &&
    !f.getName().startsWith("exe") &&
    !f.getName().startsWith("i686") &&
    !f.getName().startsWith("x86_64") ) {
    include f.getName()
    }
    }

    这将包括所有子目录作为模块

    根 build.gradle:
    defaultTasks 'build'

    allprojects {
    task build {
    doLast {
    exec {
    commandLine 'sh', "${project.name}.sh", '32', 'all'
    }
    }
    }
    }

    这将为每个子模块调用自定义构建脚本。请注意,我必须在根项目中添加一个空的 project_name.sh,否则 Gradle 会提示该文件丢失。我不知道是否有设置告诉他不要尝试调用根目录中的构建脚本,我仍然需要研究这个。

    子模块 build.gradle 的示例:
    build {
    dependsOn ":lib1:build"
    dependsOn ":lib2:build"
    dependsOn ":lib6:build"
    }

    这定义了子模块 tat 是当前模块的依赖项。

    就是这样!

    关于gradle - 使用 Gradle 管理依赖项并在遗留 C++ 项目上启动自定义编译脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59186625/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com