Кто-нибудь знает, как работает включение 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.
Я могу хотя бы ответить на мой первый пункт. Покопавшись в источниках (в какой-то момент это становится лучшей документацией), я обнаружил реализацию методов, которые извлекают источники:
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 °) Директива включения не работает
Для версии 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.