gradle实验通过srcDir-srcFile指令包含文件目录
gradle experimental include file directories via srcDir srcFile directive
有人知道srcDir的includes在gradle实验文件(cpp AND 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
第一级也不清楚:
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-experital-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 eperiental插件中用于检索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文件的execute方法中。
对于标题,它是不同的,没有这样的东西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方法,该方法递归地包括给定一个下的所有dir
我会继续调查的其他方面
编辑:总结:
1°)a°)srcDir包括与模式匹配的所有文件:*.C、*.CPP、*.C++、*.cc、*.cp、*.CPP、*.cxx
b°)includeHeaders有效,并且只包括给定文件夹深度的标头(因此,如果您像这样包括它们,则必须为标头提供所有子路径:#include"test.h",而不是#include"dir1/dir2/test.h"
2°)看起来我在我的包里做了一些错误的事情,因为它们现在似乎确实有效。但是,不能只包含文件。因此,最好包括源文件的top dir,然后排除与给定模式不匹配的每个文件(如Alex Cohn回答中所述)
3°)include指令不起作用
对于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插件无关。
- 使用预处理指令检查是否包含标头?
- C++:包含指令和头文件有什么区别?
- 如何使用预处理器指令包含两次具有不同代码的文件?
- 分析包含处理指令的 XML
- 查找包含指令使用的文件
- 在仅包含字节而不是指令名称的函数中使用 ASM
- 为什么在头文件顶部包含指令
- 如何在属性表中包含预处理器指令
- 在编译 Android 版 OpenCV Core 模块时,包含 Eclipse 中未解析的指令引用
- c++ 条件包含指令中是否允许命名空间
- 如何使用 boost::spirit::lex 实现包含指令
- gradle实验通过srcDir-srcFile指令包含文件目录
- 如何在标准C/C++代码上包含和翻译自定义指令/扩展以保持高性能
- 包含指令取决于Qt版本
- #error "SSE2 指令集未启用"时包含 <emmintrin.h>
- 为什么更常见的#include指令没有默认包含?
- 是否有包含目录的pragma指令
- 在预处理器指令中包含静态库
- 仅头文件库设计-包含指令
- C++数学函数可以在VS 2013中不包含指令"math.h"的情况下使用