Gradle:如何为C / C ++目标文件指定输出目录?

时间:2018-06-16 18:14:45

标签: c gradle native

我有一个相当简单的build.gradle文件,它构建了一个zlib目录。不幸的是,生成的* .o文件被分散到各个目录中。
e.g。

build/objs/zlib/shared/zlibC/xvtb7xzcn488esep2yp1v714/uncompr.o
build/objs/zlib/shared/zlibC/2osjpf8p443huii37rw8g7o7d/zutil.o
[...]
build/objs/zlib/shared/zlibC/bkho3m4h5simvpsegapx51g54/trees.o
build/objs/zlib/shared/zlibC/2zicemubjlmw82yi1ysriaup4/inflate.o

如何为所有生成的* .o文件(减去unique-id目录)设置输出目录为 build / zlib

apply plugin: 'c'

FileCollection zlibfiles = files(
            'adler32',
            [...]
            'trees',
            'zutil')

model {
    components {
        zlib(NativeLibrarySpec) {
            sources {
                c {
                    source {
                        srcDir "."
                        include '*.c'
                    }
                    exportedHeaders {
                        srcDir '.'
                    }
                }
            }
        }
    }
    binaries {
        withType(SharedLibraryBinarySpec) {
            if (targetPlatform.operatingSystem.linux) {
                cppCompiler.args '-c', '-g', '-fPIC'
                // relative paths are ignored by Gradle
                // only fully qualified paths are recognized 
                // cppCompiler.args '-I', '../..'
                cppCompiler.args '-I', "${rootDir}/zlib"
                linker.args '-pthread'
            }
        }
    }
}

我有一个find-copy任务,但这里的目标是正确使用Gradle。我宁愿使用Gradle的gcc / g ++' -o'选项。

task zlibcopy (type: Copy) {
    configurations {
        conf
    }
    dependencies {
        conf fileTree(dir: "${buildDir}/objs/zlib/shared/zlibC/")
    }
    from configurations.conf.getAsFileTree()
    into "${rootDir}/build/client/ps/common/zlib"
}

Gradle:4.7
CentOS:7.4
Java:1.8.0_144

2 个答案:

答案 0 :(得分:0)

显然,Gradle不允许将本机代码输出到指定的输出目录。您可以在唯一标识的输出目录中找到* .o,在“共享”目录中找到* .so,在“静态”目录中找到* .a。真该死!

答案 1 :(得分:-1)

尝试一下,不会包含唯一的目录。

task zlibcopy (type: Copy) {
    zlibfiles.each { File file ->
        println file.name
        from ("${buildDir}/objs/zlib/shared/zlibC/") {
            include "**/${file.name}*"
        }
        includeEmptyDirs = false
        eachFile {
            def (id, name) = it.path.split('/')
            it.relativePath = RelativePath.parse(true, name)
        }
        into "${rootDir}/build/zlib"
    }
}
  

最后六个* .o文件永远不会被复制

也许这六个文件不包含在zlibfiles中,因此从未包括在内?