4

srcDir のインクルードが gradle 実験ファイル (cpp AND h) でどのように機能するかを知っている人はいますか? これは一種の「3 倍」の質問です。

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°) ヘッダーについて:

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-experimental-0.6.0-alpha3 プラグインで必要な gradle 2.9 を使用していることを指摘したいと思います。

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 ファイルの 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 の execute メソッド内。デフォルトの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°) include ディレクティブが機能しない

于 2015-12-16T14:10:42.887 に答える