android — экспериментальные библиотеки включаемых файлов через директиву srcDir srcFile

Кто-нибудь знает, как работает включение srcDir в экспериментальных файлах Gradle (cpp AND h)? Это своего рода «трехкратный» вопрос:

1 °) как работает srcDir?

1.a °) Включает ли он рекурсивно все подкаталоги? Включает ли он только файлы на их глубоком уровне? Включают ли они все файлы cpp / c / cc / cxx?

например эта команда:

android.sources {
main {
jni {
source {
srcDir "../../../../some/path/src"}
}
}
}

Включает ли он все файлы cpp под src? все файлы под 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, они применяются только к предыдущему оператору srcDir? Или они применяются ко всем операторам блока «источник»?

делать:

 android.sources {
main {
jni {
source {
srcDir "../../../../some/path/src"include "*.cpp"}
}
}
}

Кажется, не включает в себя файл CPP. Я думал, что он будет включать все файлы cpp этой иерархии папок, или даже все файлы cpp в src, но похоже, что это не так.

Я хочу отметить, что я использую Gradle 2.9, который требуется для последнего плагина gradle-экспериментальный-0.6.0-alpha3.

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);
}
});

в методе execute из файла NdkConfiguration.java.

Для шапки все по другому, нет таких вещей как
source.getSource () включают в себя ( «** / * H.»).

, вместо этого мы имеем:

            for (LanguageSourceSet sourceSet : nativeBinary.getSources()) {
if (sourceSet instanceof HeaderExportingSourceSet) {
HeaderExportingSourceSet source = (HeaderExportingSourceSet) sourceSet;
artifact.getExportedHeaderDirectories().addAll(
source.getExportedHeaders().getSrcDirs());
}
}

В методе выполнения файла NdkComponentModelPlugin.java. Он напрямую использует метод getSrcDirs реализации gradle по умолчанию, который рекурсивно включает все dir в соответствии с заданным

Я буду продолжать исследовать другие вопросы

РЕДАКТИРОВАТЬ: В итоге:

1 °)
а) srcDir включает в себя все файлы, соответствующие шаблону:
* .C, * .CPP, * .c ++, * .cc, * .cp, * .cpp, * .cxx

b °) работает includeHeaders и включает заголовок только на заданной глубине папки (поэтому вы должны указывать весь подпуть к заголовку, если вы включаете их следующим образом: #include «test.h» вместо #include «dir1 /dir2/dir3/test.h»

2 °) похоже, что я что-то не так делал в своих включениях, так как теперь они, похоже, работают. Тем не менее, вы не можете просто включить файлы. Поэтому лучше включить top dir исходного файла, а затем исключить каждый файл, который не соответствует заданному шаблону (как описано в ответе Алекса Кона)

3 °) Директива включения не работает

4

Другие решения

Для версии 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.

3

По вопросам рекламы [email protected]