4

有谁知道 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 指令呢,它们只适用于前面的 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 插件所必需的。

4

2 回答 2

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 和 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 文件的执行方法中。

对于标头,则不同,没有诸如 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”,而不是#include“dir1 /dir2/dir3/test.h"

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

3°) 包含指令不起作用

于 2015-12-16T14:10:42.887 回答
3

对于 v. 0.4.0srcDirs包括所有子目录并exclude适用于模式。我不知道启用includesrcFile.

android.sources {
    main {
       jni.source {
            srcDirs = ["~/srcs/jni"]
            exclude "**/win.cpp"
        }
    }
}

另请参阅https://stackoverflow.com/a/32640823/192373

即使对于 0.6.0 文档也没有exportedHeder提及,一般来说 gradle 本机文档与 Android 插件无关。

于 2015-12-15T17:45:40.317 回答