Запустите CMake из Gradle перед компиляцией кода Kotlin - PullRequest
1 голос
/ 08 ноября 2019

Используя Gradle 5.4.1, я хочу создать проект CMake для приложения для Android. Это можно сделать в app / build.gradle с помощью:

externalNativeBuild {
    cmake {
        // Provides a relative path to your CMake build script.
        version "3.13.0+"
        path "../subproject/CMakeLists.txt"
    }
}

Этот проект создает общую библиотеку и некоторые файлы Java с помощью SWIG. Я могу указать выходной каталог для исходных текстов Java с помощью -DJAVA_OUTPUT_DIR = generate / java .

Как заставить gradle ждать сборки CMake перед компиляцией исходного кода основного приложения (Kotlin)? Исходный код импортирует сгенерированные файлы JAVA, и в настоящее время процесс сборки не выполняется из-за отсутствия файлов Java. Похоже, что Gradle запускает cmake и компилятор Kotlin параллельно.

Дополнительный вопрос: как я могу добавить сгенерированный исходный каталог вывода в дерево проекта AndroidStudio как сгенерированный источник ? В сгенерированном источнике есть специальная запись.

Информация о версии:

$ ./gradlew --version

------------------------------------------------------------
Gradle 5.4.1
------------------------------------------------------------

Build time:   2019-04-26 08:14:42 UTC
Revision:     261d171646b36a6a28d5a19a69676cd098a4c19d

Kotlin:       1.3.21
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM:          11.0.5 (Debian 11.0.5+10-post-Debian-1deb10u1)
OS:           Linux 4.19.0-6-amd64 amd64

1 Ответ

1 голос
/ 08 ноября 2019

Вы должны добавить задачу cmake в качестве зависимости для задачи compileKotlin.

Задача Gradle частично упорядочена (некоторая задача должна быть запущена перед некоторыми другими задачами). Зависимости используются для выражения этой связи.

Чтобы объявить зависимость от externalNativeBuild - добавьте это к build.gradle

project.afterEvaluate {
    if (tasks.findByName("externalNativeBuildDebug")) {
        compileDebugKotlin.dependsOn externalNativeBuildDebug
    }
    if (tasks.findByName("externalNativeBuildRelease")) {
        compileReleaseKotlin.dependsOn externalNativeBuildRelease  
    }
}
  • Что такое afterEvaluate? Это этап жизненного цикла Gradle. Это когда все определения читаются и применяются. Подробнее здесь .

  • Что такое externalNativeBuildDebug и externalNativeBuildRelease? Это ссылки на задачу externalNativeBuild, в зависимости от конкретной команды сборки

...