Gradle: 如何指定C/C++目标文件的输出目录?
Gradle: How to designate a output directory for C/C++ object files?
我有一个相当简单的 build.gradle 文件,它构建了一个 zlib 目录。不幸的是,生成的 *.o 文件散布在各个目录中。
例如
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 文件的输出目录设置为 build/zlib(减去唯一 ID 目录)?
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'
}
}
}
}
我有一个查找复制任务,但这里的目标是正确使用 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
中央操作系统:7.4
Java: 1.8.0_144
尝试一下,不会包含唯一目录。
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"
}
}
the last six *.o files are never copied
也许这六个文件未包含在 zlibfiles
中,因此从未包含在内?
显然,Gradle不允许将本机代码输出到指定的输出目录。您可以在唯一标识的输出目录中找到 *.o,在 "shared" 目录中找到 *.so,在 "static" 目录中找到 *.a。该死的
我有一个相当简单的 build.gradle 文件,它构建了一个 zlib 目录。不幸的是,生成的 *.o 文件散布在各个目录中。
例如
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 文件的输出目录设置为 build/zlib(减去唯一 ID 目录)?
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'
}
}
}
}
我有一个查找复制任务,但这里的目标是正确使用 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
中央操作系统:7.4
Java: 1.8.0_144
尝试一下,不会包含唯一目录。
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"
}
}
the last six *.o files are never copied
也许这六个文件未包含在 zlibfiles
中,因此从未包含在内?
显然,Gradle不允许将本机代码输出到指定的输出目录。您可以在唯一标识的输出目录中找到 *.o,在 "shared" 目录中找到 *.so,在 "static" 目录中找到 *.a。该死的