Skip to content

Install prebuilt assets with cmake #658

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 16 commits into from
Dec 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions .github/workflows/pull_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,6 @@ jobs:
fetch-depth: 0
submodules: recursive

- name: Regenerate symlinks pointing to submodule (Windows)
if: ${{ matrix.os == 'windows-2022' }}
run: |
Remove-Item -Recurse app/src/main/assets/usr/share, plugin/hangul/src/main/assets/usr/share/libhangul, plugin/chewing/src/main/assets/usr/share/libchewing, plugin/jyutping/src/main/assets/usr/share/libime
git checkout -- .

- name: Setup Java
uses: actions/setup-java@v4
with:
Expand Down
13 changes: 2 additions & 11 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,21 +1,12 @@
# Module :app
# Installed data
/app/src/main/assets/usr/share/fcitx5/addon
/app/src/main/assets/usr/share/fcitx5/chttrans
/app/src/main/assets/usr/share/fcitx5/data
/app/src/main/assets/usr/share/fcitx5/default
/app/src/main/assets/usr/share/fcitx5/inputmethod
/app/src/main/assets/usr/share/fcitx5/lua
/app/src/main/assets/usr/share/fcitx5/punctuation
/app/src/main/assets/usr/share/fcitx5/unicode
/app/src/main/assets/usr/share/locale
/app/src/main/assets/usr/
# Generated asset descriptor
/app/src/main/assets/descriptor.json

# Plugins
# Installed data
/plugin/*/src/main/assets/usr/share/fcitx5
/plugin/*/src/main/assets/usr/share/locale
/plugin/*/src/main/assets/usr/
# Generated asset descriptor
/plugin/*/src/main/assets/descriptor.json

Expand Down
25 changes: 1 addition & 24 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ Discuss on Telegram: [@fcitx5_android_group](https://t.me/fcitx5_android_group)

### Dependencies

- Android SDK Platform & Build-Tools 34.
- Android SDK Platform & Build-Tools 35.
- Android NDK (Side by side) 25 & CMake 3.22.1, they can be installed using SDK Manager in Android Studio or `sdkmanager` command line.
- [KDE/extra-cmake-modules](https://github.com/KDE/extra-cmake-modules)
- GNU Gettext >= 0.20 (for `msgfmt` binary; or install `appstream` if you really have to use gettext <= 0.19.)
Expand All @@ -96,29 +96,6 @@ git clone git@github.com:fcitx5-android/fcitx5-android.git
git submodule update --init --recursive
```

<details>
<summary>On Windows, you may need to regenerate symlinks to submodules.</summary>

Run in PowerShell:

```powershell
Remove-Item -Recurse app/src/main/assets/usr/share, plugin/hangul/src/main/assets/usr/share/libhangul, plugin/chewing/src/main/assets/usr/share/libchewing, plugin/jyutping/src/main/assets/usr/share/libime
```

Or Command Prompt:

```bat
RD /S /Q app\src\main\assets\usr\share plugin\hangul\src\main\assets\usr\share\libhangul plugin\chewing\src\main\assets\usr\share\libchewing plugin\jyutping\src\main\assets\usr\share\libime
```

Then let `git` regenerate symlinks:

```shell
git checkout -- .
```

</details>

Install `extra-cmake-modules` and `gettext` with your system package manager:

```shell
Expand Down
7 changes: 2 additions & 5 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -67,12 +67,8 @@ kotlin {
}
}

aboutLibraries {
configPath = "app/licenses"
}

fcitxComponent {
installLibraries = listOf(
includeLibs = listOf(
"fcitx5",
"fcitx5-lua",
"libime",
Expand All @@ -82,6 +78,7 @@ fcitxComponent {
excludeFiles = listOf("cangjie", "erbi", "qxm", "wanfeng").map {
"usr/share/fcitx5/inputmethod/$it.conf"
}
installPrebuiltAssets = true
}

ksp {
Expand Down
1 change: 0 additions & 1 deletion app/src/main/assets/usr/share/fcitx5/pinyin/chaizi.dict

This file was deleted.

1 change: 0 additions & 1 deletion app/src/main/assets/usr/share/fcitx5/pinyin/symbols

This file was deleted.

1 change: 0 additions & 1 deletion app/src/main/assets/usr/share/fcitx5/pinyinhelper

This file was deleted.

1 change: 0 additions & 1 deletion app/src/main/assets/usr/share/fcitx5/spell

This file was deleted.

1 change: 0 additions & 1 deletion app/src/main/assets/usr/share/fcitx5/table

This file was deleted.

1 change: 0 additions & 1 deletion app/src/main/assets/usr/share/libime

This file was deleted.

1 change: 0 additions & 1 deletion app/src/main/assets/usr/share/opencc

This file was deleted.

40 changes: 24 additions & 16 deletions app/src/main/cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -65,22 +65,30 @@ target_link_libraries(native-lib
pinyin-customphrase
)

# copy module libraries from dependency lib
add_custom_target(copy-fcitx5-modules
# fcitx5
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_PROPERTY:fcitx5::clipboard,IMPORTED_LOCATION> ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_PROPERTY:fcitx5::imselector,IMPORTED_LOCATION> ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_PROPERTY:fcitx5::quickphrase,IMPORTED_LOCATION> ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_PROPERTY:fcitx5::spell,IMPORTED_LOCATION> ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_PROPERTY:fcitx5::unicode,IMPORTED_LOCATION> ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
# fcitx5-lua
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_PROPERTY:fcitx5-lua::luaaddonloader,IMPORTED_LOCATION> ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
# fcitx5-chinese-addons
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_PROPERTY:fcitx5-chinese-addons::pinyin,IMPORTED_LOCATION> ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_PROPERTY:fcitx5-chinese-addons::table,IMPORTED_LOCATION> ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_PROPERTY:fcitx5-chinese-addons::scel2org5,IMPORTED_LOCATION> ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_PROPERTY:fcitx5-chinese-addons::chttrans,IMPORTED_LOCATION> ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_PROPERTY:fcitx5-chinese-addons::fullwidth,IMPORTED_LOCATION> ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_PROPERTY:fcitx5-chinese-addons::pinyinhelper,IMPORTED_LOCATION> ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_PROPERTY:fcitx5-chinese-addons::punctuation,IMPORTED_LOCATION> ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
COMMAND ${CMAKE_COMMAND} -E copy_if_different
$<TARGET_PROPERTY:fcitx5::clipboard,IMPORTED_LOCATION>
$<TARGET_PROPERTY:fcitx5::imselector,IMPORTED_LOCATION>
$<TARGET_PROPERTY:fcitx5::quickphrase,IMPORTED_LOCATION>
$<TARGET_PROPERTY:fcitx5::spell,IMPORTED_LOCATION>
$<TARGET_PROPERTY:fcitx5::unicode,IMPORTED_LOCATION>
$<TARGET_PROPERTY:fcitx5-lua::luaaddonloader,IMPORTED_LOCATION>
$<TARGET_PROPERTY:fcitx5-chinese-addons::pinyin,IMPORTED_LOCATION>
$<TARGET_PROPERTY:fcitx5-chinese-addons::table,IMPORTED_LOCATION>
$<TARGET_PROPERTY:fcitx5-chinese-addons::scel2org5,IMPORTED_LOCATION>
$<TARGET_PROPERTY:fcitx5-chinese-addons::chttrans,IMPORTED_LOCATION>
$<TARGET_PROPERTY:fcitx5-chinese-addons::fullwidth,IMPORTED_LOCATION>
$<TARGET_PROPERTY:fcitx5-chinese-addons::pinyinhelper,IMPORTED_LOCATION>
$<TARGET_PROPERTY:fcitx5-chinese-addons::punctuation,IMPORTED_LOCATION>
${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
COMMENT "Copying fcitx5 module libraries to :app"
)

# install prebuilt assets
install(FILES "${PREBUILT_DIR}/spell-dict/en_dict.fscd" DESTINATION "${FCITX_INSTALL_PKGDATADIR}/spell" COMPONENT prebuilt-assets)
install(FILES "${PREBUILT_DIR}/chinese-addons-data/pinyin/chaizi.dict" DESTINATION "${FCITX_INSTALL_PKGDATADIR}/pinyin" COMPONENT prebuilt-assets)
install(DIRECTORY "${PREBUILT_DIR}/chinese-addons-data/pinyinhelper" DESTINATION "${FCITX_INSTALL_PKGDATADIR}" COMPONENT prebuilt-assets)
install(DIRECTORY "${PREBUILT_DIR}/libime/table" DESTINATION "${FCITX_INSTALL_PKGDATADIR}" COMPONENT prebuilt-assets)
install(DIRECTORY "${PREBUILT_DIR}/libime/data/" DESTINATION "${FCITX_INSTALL_DATADIR}/libime" COMPONENT prebuilt-assets)
install(DIRECTORY "${PREBUILT_DIR}/opencc/data/" DESTINATION "${FCITX_INSTALL_DATADIR}/opencc" COMPONENT prebuilt-assets)
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ class AndroidAppConventionPlugin : AndroidBaseConventionPlugin() {
target.pluginManager.apply(target.libs.plugins.aboutlibraries.get().pluginId)

target.configure<AboutLibrariesExtension> {
configPath = target.rootProject.relativePath(target.file("licenses"))
excludeFields = arrayOf(
"generated", "developers", "organization", "scm", "funding", "content"
)
Expand Down
29 changes: 17 additions & 12 deletions build-logic/convention/src/main/kotlin/FcitxComponentPlugin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,20 @@ import org.gradle.kotlin.dsl.task
import java.io.File
import kotlin.io.path.isSymbolicLink

/**
* Add task installFcitxConfig and installFcitxTranslation, using a random variant's cxx dir
*/
class FcitxComponentPlugin : Plugin<Project> {

abstract class FcitxComponentExtension {
var installLibraries: List<String> = emptyList()
var includeLibs: List<String> = emptyList()
var excludeFiles: List<String> = emptyList()
var modifyFiles: Map<String, (File) -> Unit> = emptyMap()
var installPrebuiltAssets: Boolean = false
}

companion object {
const val INSTALL_TASK = "installFcitxComponent"
const val DELETE_TASK = "deleteFcitxComponentExcludeFiles"
const val CLEAN_TASK = "cleanFcitxComponents"
const val EXTENSION = "fcitxComponent"

val DEPENDENT_TASKS = arrayOf(INSTALL_TASK, DELETE_TASK)
}
Expand All @@ -37,10 +36,10 @@ class FcitxComponentPlugin : Plugin<Project> {
registerCMakeTask(target, "generate-desktop-file", "config")
registerCMakeTask(target, "translation-file", "translation")
registerCleanTask(target)
target.extensions.create<FcitxComponentExtension>("fcitxComponent")
target.extensions.create<FcitxComponentExtension>(EXTENSION)
target.afterEvaluate {
val ext = extensions.getByName<FcitxComponentExtension>("fcitxComponent")
ext.installLibraries.forEach {
val ext = extensions.getByName<FcitxComponentExtension>(EXTENSION)
ext.includeLibs.forEach {
val project = rootProject.project(":lib:$it")
registerCMakeTask(target, "generate-desktop-file", "config", project)
registerCMakeTask(target, "translation-file", "translation", project)
Expand All @@ -55,6 +54,9 @@ class FcitxComponentPlugin : Plugin<Project> {
}
}
}
if (ext.installPrebuiltAssets) {
registerCMakeTask(target, "", "prebuilt-assets")
}
}
}

Expand All @@ -67,17 +69,20 @@ class FcitxComponentPlugin : Plugin<Project> {
component: String,
sourceProject: Project = project
) {
val componentName = component.split('-').joinToString("") { it.capitalized() }
val taskName = if (project === sourceProject) {
"installProject${component.capitalized()}"
"installProject$componentName"
} else {
"installLibrary${component.capitalized()}[${sourceProject.name}]"
"installLibrary$componentName[${sourceProject.name}]"
}
val task = project.task(taskName) {
runAfterNativeConfigure(sourceProject) { abiModel ->
val cmake = abiModel.variant.module.cmake!!.cmakeExe!!
sourceProject.exec {
workingDir = abiModel.cxxBuildFolder
commandLine(cmake, "--build", ".", "--target", target)
if (target.isNotEmpty()) {
sourceProject.exec {
workingDir = abiModel.cxxBuildFolder
commandLine(cmake, "--build", ".", "--target", target)
}
}
sourceProject.exec {
workingDir = abiModel.cxxBuildFolder
Expand Down
50 changes: 35 additions & 15 deletions build-logic/convention/src/main/kotlin/FcitxHeadersPlugin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,32 +8,60 @@ import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.Delete
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.create
import org.gradle.kotlin.dsl.getByName
import org.gradle.kotlin.dsl.task
import org.gradle.kotlin.dsl.withType
import java.io.File

class FcitxHeadersPlugin : Plugin<Project> {

abstract class FcitxHeadersExtension {
var installDevelComponent: Boolean = false
}

companion object {
const val INSTALL_TASK = "installFcitxHeaders"
const val HEADERS_TASK = "installFcitxHeaders"
const val DEVEL_TASK = "installFcitxDevelComponent"
const val CLEAN_TASK = "cleanFcitxHeaders"
const val EXTENSION = "fcitxHeaders"
}

private val Project.headersInstallDir
get() = file("build/headers")

private val Project.develComponentInstallDir
get() = file("build/devel")

override fun apply(target: Project) {
registerInstallTask(target)
// mkdir for all prefab library headers
target.extensions.configure<LibraryAndroidComponentsExtension> {
finalizeDsl {
@Suppress("UnstableApiUsage")
it.prefab.forEach { library ->
library.headers?.let { path -> target.file(path).mkdirs() }
}
}
}
registerInstallTask(target, HEADERS_TASK, "header", target.headersInstallDir)
registerCleanTask(target)
target.extensions.create<FcitxHeadersExtension>(EXTENSION)
target.afterEvaluate {
val ext = extensions.getByName<FcitxHeadersExtension>(EXTENSION)
if (ext.installDevelComponent) {
registerInstallTask(target, DEVEL_TASK, "Devel", target.develComponentInstallDir)
}
}
}

private fun registerInstallTask(project: Project) {
val installHeadersTask = project.task(INSTALL_TASK) {
private fun registerInstallTask(project: Project, name: String, component: String, dest: File) {
val installHeadersTask = project.task(name) {
runAfterNativeConfigure(project) { abiModel ->
val cmake = abiModel.variant.module.cmake!!.cmakeExe!!
project.exec {
workingDir = abiModel.cxxBuildFolder
environment("DESTDIR", project.headersInstallDir.absolutePath)
commandLine(cmake, "--install", ".", "--component", "header")
environment("DESTDIR", dest.absolutePath)
commandLine(cmake, "--install", ".", "--component", component)
}
}
}
Expand All @@ -42,20 +70,12 @@ class FcitxHeadersPlugin : Plugin<Project> {
project.tasks.withType<PrefabPackageConfigurationTask>().all {
dependsOn(installHeadersTask)
}

project.extensions.configure<LibraryAndroidComponentsExtension> {
finalizeDsl {
@Suppress("UnstableApiUsage")
it.prefab.forEach { library ->
library.headers?.let { path -> project.file(path).mkdirs() }
}
}
}
}

private fun registerCleanTask(project: Project) {
project.task<Delete>(CLEAN_TASK) {
delete(project.headersInstallDir)
delete(project.develComponentInstallDir)
}.also {
project.cleanTask.dependsOn(it)
}
Expand Down
9 changes: 9 additions & 0 deletions lib/fcitx5/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ plugins {
id("org.fcitx.fcitx5.android.fcitx-headers")
}

fcitxHeaders {
installDevelComponent = true
}

android {
namespace = "org.fcitx.fcitx5.android.lib.fcitx5"

Expand All @@ -14,6 +18,7 @@ android {
targets(
// dummy "cmake" target
"cmake",
"devel",
// fcitx5
"Fcitx5Core",
"Fcitx5Config",
Expand All @@ -35,6 +40,10 @@ android {
headerOnly = true
headers = "src/main/cpp/cmake"
}
create("devel") {
headerOnly = true
headers = "build/devel/usr/lib/cmake"
}
val headersPrefix = "build/headers/usr/include/Fcitx5"
create("Fcitx5Core") {
libraryName = "libFcitx5Core"
Expand Down
2 changes: 2 additions & 0 deletions lib/fcitx5/src/main/cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ add_link_options("LINKER:--hash-style=gnu,--build-id=none")

# dummy target to export src/main/cpp/cmake
add_custom_target(cmake)
# dummy target to export build/devel/usr/lib/cmake
add_custom_target(devel)
# dummy target to export "notifications_public.h"
add_custom_target(notifications)

Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Loading
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy