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指令如何工作?
那么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插件所要求的.
解决方法
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文件的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,* .cp,*.cpp,* .cxx
b°)includeHeaders有效,并且只包含给定文件夹深度的标题(因此,如果要包含它们,则必须将所有子路径提供给标题:#include“test.h”,而不是#include“dir1” /dir2/dir3/test.h”
2°)它看起来我在我的包含中做了一些错误,因为它们现在看起来似乎有效.但是,您不能只包含文件.因此最好包括源文件的顶部目录,然后排除与给定模式不匹配的每个文件(如Alex Cohn答案中所述)
3°)include指令不起作用
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。