gpt4 book ai didi

android - gradle experimental 通过 srcDir srcFile 指令包含文件目录

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:35 26 4
gpt4 key购买 nike

有谁知道 srcDir 的包含如何在 gradle 实验文件(cpp 和 h)中工作?这是一个“三重”问题:

1°) srcDir 是如何工作的?

1.a°) 它是否递归地包含所有子目录?它只包含深层文件吗?它们是否包括所有 cpp/c/cc/cxx 文件?

例如这个命令:

android.sources {
main {
jni {
source {
srcDir "../../../../some/path/src"
}
}
}
}

是否包括src下的所有cpp文件? src 下的所有文件?所有cpp文件都递归到子目录中?所有文件都递归到子目录中?

谷歌文档非常模糊:

http://tools.android.com/tech-docs/new-build-system/gradle-experimental

gradle 也不清楚:

https://docs.gradle.org/current/userguide/nativeBinaries.html

它说它只包含 src/${name}/cpp ?这是什么意思?我必须创建一个

 ../../../../some/path/src/cpp 

文件夹?

1.b°) 标题呢:

android.sources {
main {
jni {
exportedHeaders {
srcDir "../../../../some/path/src"
}
}
}
}

我觉得应用于标题的 srcDir 指令与源的 srcDir 不同(它仅包含其当前深度的标题)

2°) 如果我想混合使用文件和目录怎么办?

android.sources {
main {
jni {
source {
srcDir "../../../../some/path/src"
srcFile "../../../../some/path/src/myFile.cpp"
}
}
}
}

好像不行

3°) include/exclude 指令是如何工作的?

include/exclude 指令怎么样,它们是否仅适用于前面的 srcDir 语句?还是它们适用于“源” block 的所有语句?

做:

 android.sources {
main {
jni {
source {
srcDir "../../../../some/path/src"
include "*.cpp"
}
}
}
}

似乎不包含任何 cpp 文件。我以为它会包括这个文件夹层次结构的所有 cpp 文件,甚至是 src 下的所有 cpp 文件,但看起来它没有。

我想指出我使用的是 gradle 2.9,这是最新的 gradle-experimental-0.6.0-alpha3 插件所必需的。

最佳答案

我至少可以回答我的第一点。在深入挖掘资源后(在某些时候它成为最好的文档),我找到了检索源的方法的实现:

public Set<File> getSrcDirs() {
Set<File> dirs = new LinkedHashSet<File>();
for (DirectoryTree tree : getSrcDirTrees()) {
dirs.add(tree.getDir());
}
return dirs;
}

在 DefaultSourceDirectorySet.java 中。

此方法在 gradle-eperimental 插件中用于检索 cpp 和 c 源:

            languageSourceSets.create(
sourceSetName + "Cpp",
CppSourceSet.class,
new Action<CppSourceSet>() {
@Override
public void execute(CppSourceSet source) {
source.getSource().setSrcDirs(jni.getSource().getSrcDirs());
source.getSource().include("**/*.C");
source.getSource().include("**/*.CPP");
source.getSource().include("**/*.c++");
source.getSource().include("**/*.cc");
source.getSource().include("**/*.cp");
source.getSource().include("**/*.cpp");
source.getSource().include("**/*.cxx");
source.getSource().exclude(jni.getSource().getExcludes());
source.exportedHeaders(new Action<SourceDirectorySet>() {
@Override
public void execute(SourceDirectorySet files) {
files.source(jni.getExportedHeaders());
}
});
configurePrebuiltDependency(source, jni);
}
});

在 NdkConfiguration.java 文件的执行方法中。

对于header,就不一样了,没有这样的东西 source.getSource().include("**/*.H");

,我们有:

            for (LanguageSourceSet sourceSet : nativeBinary.getSources()) {
if (sourceSet instanceof HeaderExportingSourceSet) {
HeaderExportingSourceSet source = (HeaderExportingSourceSet) sourceSet;
artifact.getExportedHeaderDirectories().addAll(
source.getExportedHeaders().getSrcDirs());
}
}

在 NdkComponentModelPlugin.java 的执行方法中。它直接使用默认gradle实现的getSrcDirs方法,递归地包含给定目录下的所有目录

其他的我会继续研究

编辑:总结:

1°)a°) srcDir 包括所有匹配模式的文件: *.C, *.CPP, *.c++, *.cc, *.cp, *.cpp, *.cxx

b°) includeHeaders 有效,并且只包含给定文件夹深度的标题(所以如果你像这样包含它们,你必须给标题的所有子路径:#include "test.h",而不是#包括“dir1/dir2/dir3/test.h”

2°) 看起来我在我的包含中做错了一些事情,因为它们现在似乎确实有效。但是,您不能只包含文件。因此最好包含源文件的顶级目录,然后排除与给定模式不匹配的每个文件(如 Alex Cohn 回答中所述)

3°) include 指令不起作用

关于android - gradle experimental 通过 srcDir srcFile 指令包含文件目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34292670/

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