gradle 通过 srcDir srcFile 指令的实验性包含文件目录
gradle experimental include file directories via srcDir srcFile directive
有谁知道 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文件都递归到子目录中?所有文件递归到子目录中?
google 文档非常模糊:
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°) headers:
android.sources {
main {
jni {
exportedHeaders {
srcDir "../../../../some/path/src"
}
}
}
}
我感觉应用于 headers 的 srcDir 指令与 source 的 srcDir 不同(它仅包括其当前深度的 headers)
2°) 如果我想混合使用文件和目录怎么办?
android.sources {
main {
jni {
source {
srcDir "../../../../some/path/src"
srcFile "../../../../some/path/src/myFile.cpp"
}
}
}
}
好像不行
3°) include/exclude 指令如何工作?
include/exclude 指令怎么样,它们只适用于前面的 srcDir 语句吗?还是它们适用于 "source" 块的所有语句?
正在做:
android.sources {
main {
jni {
source {
srcDir "../../../../some/path/src"
include "*.cpp"
}
}
}
}
似乎不包含任何 cpp 文件。我以为它会包括这个文件夹层次结构的所有cpp文件,甚至是src下的所有cpp文件,但看起来没有。
我想指出我使用的是 gradle 2.9,最新的 gradle-experimental-0.6.0-alpha3 插件需要它。
对于 v.0.4.0 srcDirs
包括所有子目录并且 exclude
用于模式。我不知道启用 include
或 srcFile
.
的计划
android.sources {
main {
jni.source {
srcDirs = ["~/srcs/jni"]
exclude "**/win.cpp"
}
}
}
另见
即使是 0.6.0,文档也不会谈论 exportedHeder
,一般来说 gradle 本机文档与 Android 插件无关。
我至少可以回答我的第一点。在深入挖掘资源后(在某些时候它成为最好的文档),我发现了检索源的方法的实现:
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的execute方法中。它直接使用默认 gradle 实现的 getSrcDirs 方法,它递归地包含给定目录
下的所有目录
其他的我会继续研究
编辑:总结:
1°)
a°) srcDir 包括所有匹配模式的文件:
*.C, *.CPP, *.c++, *.cc, *.cp, *.cpp, *.cxx
b°) includeHeaders 有效,并且仅在给定的文件夹深度包含 header(因此,如果您像这样包含它们,则必须将所有子路径提供给 header:#包括 "test.h",而不是 #include "dir1/dir2/dir3/test.h"
2°) 看起来我在我的包含中做错了一些事情,因为它们现在似乎确实有效。但是,您不能只包含文件。因此最好包含源文件的顶级目录,然后排除与给定模式不匹配的每个文件(如 Alex Cohn 回答中所述)
3°) include 指令不起作用
有谁知道 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文件都递归到子目录中?所有文件递归到子目录中?
google 文档非常模糊:
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°) headers:
android.sources {
main {
jni {
exportedHeaders {
srcDir "../../../../some/path/src"
}
}
}
}
我感觉应用于 headers 的 srcDir 指令与 source 的 srcDir 不同(它仅包括其当前深度的 headers)
2°) 如果我想混合使用文件和目录怎么办?
android.sources {
main {
jni {
source {
srcDir "../../../../some/path/src"
srcFile "../../../../some/path/src/myFile.cpp"
}
}
}
}
好像不行
3°) include/exclude 指令如何工作?
include/exclude 指令怎么样,它们只适用于前面的 srcDir 语句吗?还是它们适用于 "source" 块的所有语句?
正在做:
android.sources {
main {
jni {
source {
srcDir "../../../../some/path/src"
include "*.cpp"
}
}
}
}
似乎不包含任何 cpp 文件。我以为它会包括这个文件夹层次结构的所有cpp文件,甚至是src下的所有cpp文件,但看起来没有。
我想指出我使用的是 gradle 2.9,最新的 gradle-experimental-0.6.0-alpha3 插件需要它。
对于 v.0.4.0 srcDirs
包括所有子目录并且 exclude
用于模式。我不知道启用 include
或 srcFile
.
android.sources {
main {
jni.source {
srcDirs = ["~/srcs/jni"]
exclude "**/win.cpp"
}
}
}
另见
即使是 0.6.0,文档也不会谈论 exportedHeder
,一般来说 gradle 本机文档与 Android 插件无关。
我至少可以回答我的第一点。在深入挖掘资源后(在某些时候它成为最好的文档),我发现了检索源的方法的实现:
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的execute方法中。它直接使用默认 gradle 实现的 getSrcDirs 方法,它递归地包含给定目录
下的所有目录其他的我会继续研究
编辑:总结:
1°) a°) srcDir 包括所有匹配模式的文件: *.C, *.CPP, *.c++, *.cc, *.cp, *.cpp, *.cxx
b°) includeHeaders 有效,并且仅在给定的文件夹深度包含 header(因此,如果您像这样包含它们,则必须将所有子路径提供给 header:#包括 "test.h",而不是 #include "dir1/dir2/dir3/test.h"
2°) 看起来我在我的包含中做错了一些事情,因为它们现在似乎确实有效。但是,您不能只包含文件。因此最好包含源文件的顶级目录,然后排除与给定模式不匹配的每个文件(如 Alex Cohn 回答中所述)
3°) include 指令不起作用