Gradle C插件示例

时间:2015-05-07 10:41:00

标签: c gradle eclipse-cdt

在我的本地文件系统上,我有以下C项目目录结构:

derpus/
    src/
        derpus/
            c/
                derpus.c
            headers/
    build.gradle

derpus.c的位置:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    puts("Derp!");
    return EXIT_SUCCESS;
}

我想使用Gradle Native (C) Plugin来管理derpus版本的全部范围。具体来说,我希望Gradle:

  1. 生成Gradle包装器,以便我可以使用gradlew进行所有构建调用;和
  2. 编译&amp;通过derpusderpus.exe构建到gradlew;和
  3. 运行gradlew eclipse时生成Eclipse项目信息,然后我可以将项目导入Eclipse(我已预先安装了Eclipse CDT插件)
  4. 这是我的build.gradle

    apply plugin: 'c'
    apply plugin: 'eclipse'
    
    sources {
        c {
            source {
                srcDir "src/derpus/c"
                include "**/*.c"
            }
            exportedHeaders {
                srcDir "src/derpus/headers"
            }
        }
    }
    
    task wrapper(type: Wrapper) {
        gradleVersion = '2.3'
    }
    

    显然我应该可以运行gradle wrapper来处理第一项。但至于编译和构建,没有C插件文档中的任何地方我实际上看到一个命令或构建调用实际上运行编译和构建

    至于第三项,使用Eclipse插件并通过gradlew eclipse调用它,我想知道是否还需要做任何其他工作,以便生成的项目/设置配置与Eclipse CDT兼容插件期望为了使用C程序。虽然我打算让Gradle处理我的所有构建,但我仍然希望在Eclipse中进行所有开发,因此CDT附带的所有内容(语法高亮,编译等)对我来说非常重要。

4 个答案:

答案 0 :(得分:6)

好的,我想出了所有3个,并且认为我会为任何未来的读者发布这个答案。

请注意:对于现代C程序员来说,这个解决方案真的可行:

  • 想要在Eclipse中完成所有开发,充分利用现代IDE设施,如语法高亮,错误,goto声明,开放调用层次结构,Eclipse调试器等;的但...
  • 想要像Gradle这样的现代化的kick-a **构建系统来完成所有的命令行/ shell构建

此外,因为我在Windows上,我选择使用MinGW进行GCC配置,所以如果您使用的是* nix或Mac,或者您更喜欢Cygwin,那么您甚至必须自定义此解决方案进一步

更进一步,我只使用Eclipse Luna,使用最新的Eclipse CDT插件(8.6)和使用Gradle 2.3验证了这一点。

解决方案

首先,我必须更正我对C插件的使用,将build.gradle更改为如下所示:

apply plugin: 'c'
apply plugin: 'eclipse'

model {
    components {
        derpus(NativeExecutableSpec) {
            sources {
                c(CSourceSet) {
                    source {
                        srcDir "src/derpus/c"
                        include "**/*.c"
                    }
                    exportedHeaders {
                        srcDir "src/derpus/headers"
                    }
                }
            }
        }
    }
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.3'
}

这使我可以毫无错误地运行gradle wrapper

接下来,我开始发现Gradle Native Binaries文档从未提到编译/构建本机可执行文件的构建调用非常奇怪。我疯狂地猜测它可能正在利用Gradle的“约定优于配置”方法,我跑了gradlew build - 瞧!巨大的成功。现在在derpus/build/binaries/derpusExecutable derpus.exe gradlew eclipse下!到目前为止,非常好。

当您想要将此Gradle管理的项目导入Eclipse时,真正令人头疼的是,但Eclipse CDT仍然提供了现代C IDE的所有常规功能。

我开始运行derpus/,它在.project项目根目录下添加了以下文件:

  • .settings/language.settings
  • #include <stdio.h>

我打开Eclipse并将其作为项目导入,但是我遇到了各种各样的错误,当我在derpus.c文件中悬停F3并点击.project时,Eclipse做了没有。很明显,仍然没有正确配置。所以我得到了黑客攻击。

原来你需要:

  • 当然,首先要确保CDT插件已安装且工作正常(doh!)
  • 在Eclipse中创建一个“虚拟”C项目,它允许您将Eclipse CDT生成的设置/配置复制到实际项目
  • 修改您的实际<buildSpec />文件,以包含在虚拟项目的<natures />文件中生成的相同.project.cproject元素
  • 将虚拟项目的dummy文件复制到实际项目的根目录,然后在文本编辑器中打开它。您想要使用实际项目的名称重命名虚拟项目名称的所有实例;在我的情况下,有3个实例。就我而言,我的虚拟项目实际上命名为derpus,我的实际项目名为dummy。因此,我必须在此文件中将derpus的3个实例更改为<a href="javascript:void(0)" onclick="location.href='http:\\my-url.com'">Link</a>
  • 重启Eclipse

您的实际项目现在的行为与使用CDT插件创建的C项目完全相同。别忘了删除你的“虚拟”项目; - )

答案 1 :(得分:1)

您可以借助以下方法将c ++性质添加到项目中:

  1. 创建一个gradle项目
  2. 选择项目
  3. 使用Eclipse-&gt; new-&gt;其他
  4. 选择c ++ - &gt;转换为c ++项目
  5. 清理项目

答案 2 :(得分:0)

刚试过这个(使用Gradle 4.3),我想指出您可以将model部分简化为:

model {
    components {
        derpus(NativeExecutableSpec)
    }
}

因为源目录默认为"src/derpus/c"

答案 3 :(得分:0)

目前,gradle版本6.2.2(新的C ++插件)可用于该任务。包装器任务默认存在。通过添加eclipse插件可以使用Eclipse任务。

plugins {
    id 'cpp-application'
    id 'eclipse'
}

application {
    binaries.configureEach {
        def compileTask = compileTask.get()
        compileTask.source.from fileTree(dir: "src/derpus/c", include: "**/*.c")
        if (toolChain instanceof VisualCpp) {
            compileTask.compilerArgs = ["/TC"]
        } else if (toolChain instanceof GccCompatibleToolChain) {
            compileTask.compilerArgs = ["-x", "c", "-std=c11"]
        }

        def linkTask = linkTask.get()
        if (toolChain instanceof GccCompatibleToolChain) {
            linkTask.linkerArgs = ["-nodefaultlibs", "-lc"]
        }
    }
}

参考:

https://github.com/gradle/native-samples/tree/master/c/application