From a9898a05ac5eb6de9f1b068094ec4edfbf86c61d Mon Sep 17 00:00:00 2001 From: LE GARREC Vincent Date: Thu, 27 Apr 2023 12:05:16 +0200 Subject: [PATCH] CMake: allow dynamic builds on Android and Emscripten. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Same as in Corrade, they still default to static because that's the least painful. Plugins however still need to be forced to be built static on platforms where the PluginManager doesn't have any support for dynamic plugins implemented. The logic is now only simplified, to not have to change it again when e.g. Android gets the needed bits implemented in PluginManager. Co-authored-by: Vladimír Vondruš --- CMakeLists.txt | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e2d2fc575..f8a37ef9c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -335,7 +335,14 @@ option(MAGNUM_BUILD_DEPRECATED "Include deprecated API in the build" ON) set(MAGNUM_DEPLOY_PREFIX "." CACHE STRING "Prefix where to put final application executables") -option(MAGNUM_BUILD_STATIC "Build static libraries (default are shared)" OFF) +# It's inconvenient to manually load all shared libs using Android / JNI, +# similarly on Emscripten, so there default to static. +if(CORRADE_TARGET_EMSCRIPTEN OR CORRADE_TARGET_ANDROID) + set(OFF_EXCEPT_ANDROID_EMSCRIPTEN ON) +else() + set(OFF_EXCEPT_ANDROID_EMSCRIPTEN OFF) +endif() +option(MAGNUM_BUILD_STATIC "Build static libraries" ${OFF_EXCEPT_ANDROID_EMSCRIPTEN}) # Disable PIC on Emscripten by default (but still allow it to be enabled # explicitly if one so desires). Currently causes linker errors related to # __memory_base etc.: https://github.com/emscripten-core/emscripten/issues/8761 @@ -346,7 +353,12 @@ else() endif() option(MAGNUM_BUILD_STATIC_PIC "Build static libraries and plugins with position-independent code" ${ON_EXCEPT_EMSCRIPTEN}) cmake_dependent_option(MAGNUM_BUILD_STATIC_UNIQUE_GLOBALS "Build static libraries with globals unique across shared libraries" ${ON_EXCEPT_EMSCRIPTEN} "MAGNUM_BUILD_STATIC" OFF) -option(MAGNUM_BUILD_PLUGINS_STATIC "Build static plugins (default are dynamic)" OFF) +# It makes no sense to build dynamic plugins if PluginManager can't load them +if(CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT) + set(MAGNUM_BUILD_PLUGINS_STATIC ON CACHE BOOL "Build static plugins" FORCE) +else() + option(MAGNUM_BUILD_PLUGINS_STATIC "Build static plugins" OFF) +endif() option(MAGNUM_BUILD_TESTS "Build unit tests" OFF) cmake_dependent_option(MAGNUM_BUILD_GL_TESTS "Build unit tests for OpenGL code" OFF "MAGNUM_BUILD_TESTS;MAGNUM_TARGET_GL" OFF) cmake_dependent_option(MAGNUM_BUILD_AL_TESTS "Build unit tests for OpenAL code" ON "MAGNUM_BUILD_TESTS;MAGNUM_WITH_AUDIO" OFF) @@ -547,15 +559,6 @@ if(MAGNUM_BUILD_DEPRECATED) endif() endif() -# Dynamic linking is meaningless on Emscripten and too inconvenient on Android -if(CORRADE_TARGET_EMSCRIPTEN OR CORRADE_TARGET_ANDROID) - set(MAGNUM_BUILD_STATIC ON) - set(MAGNUM_BUILD_PLUGINS_STATIC ON) -# Dynamic plugins are not working on iOS or Windows RT at the moment -elseif(CORRADE_TARGET_IOS OR CORRADE_TARGET_WINDOWS_RT) - set(MAGNUM_BUILD_PLUGINS_STATIC ON) -endif() - # Check dependencies if(MAGNUM_WITH_GL) if(NOT MAGNUM_TARGET_GLES OR (MAGNUM_TARGET_GLES AND NOT MAGNUM_TARGET_EGL AND NOT CORRADE_TARGET_IOS))