有谁知道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 one也不清楚:
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指令如何工作?
包含/排除指令怎么样,它们仅适用于以前的srcDir语句?或者他们是否适用于“来源”区块的所有陈述?
做的:
android.sources {
main {
jni {
source {
srcDir "../../../../some/path/src"
include "*.cpp"
}
}
}
}
似乎不包含任何cpp文件。我认为它将包括此文件夹层次结构的所有cpp文件,甚至包括src下的所有cpp文件,但它看起来没有。
我想指出我使用的是gradle 2.9,这是最新的gradle-experimental-0.6.0-alpha3插件所需要的。
答案 0 :(得分:4)
我至少可以回答我的第一点。在深入挖掘源代码(在某些时候它成为最好的文档)后,我找到了检索源代码的方法的实现:
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 AND 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文件的execute方法。
对于标题,它是不同的,没有这样的东西 source.getSource()包括( “** / * 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方法,其中包括给定的一个递归所有dir
我将继续调查其他要点
编辑:总结:
1°) a°)srcDir包括与模式匹配的所有文件: * .C,* .CPP,* .c ++,*。cc,*。ccp,* .cpp,* .cxx
b°)includeHeaders工作,并且只包含给定文件夹深度的标题(因此,如果要包含它们,则必须将所有子路径提供给标题:#include“test.h”,而不是#包括“dir1 / dir2 / dir3 / test.h”
2°)它看起来我在我的包含中做了一些错误,因为它们现在看起来似乎有效。但是,您不能只包含文件。因此最好包括源文件的顶部目录,然后排除与给定模式不匹配的每个文件(如Alex Cohn答案中所述)
3°)include指令不起作用
答案 1 :(得分:3)
对于v.0.4.0 srcDirs
包括所有子目录,exclude
适用于模式。我不知道有关启用include
或srcFile
的计划。
android.sources {
main {
jni.source {
srcDirs = ["~/srcs/jni"]
exclude "**/win.cpp"
}
}
}
另见https://stackoverflow.com/a/32640823/192373
即使对于0.6.0,文档也没有提及exportedHeder
,一般而言,gradle原生文档与Android插件无关。