diff options
| author | Alexandru Croitor <alexandru.croitor@qt.io> | 2021-05-19 12:35:18 +0200 |
|---|---|---|
| committer | Alexandru Croitor <alexandru.croitor@qt.io> | 2021-05-25 22:36:53 +0200 |
| commit | 1bd408d6f7eac7908c77a0129e0173c280fce55b (patch) | |
| tree | 8b14a26a49c62bbe9cd5f6aa78ba146f0a1f09bc /cmake/Qt3rdPartyLibraryHelpers.cmake | |
| parent | 5e96c64afb274a3cc4364b1390ce0b776d637dd6 (diff) | |
CMake: Introduce a public qt_add_library function
Internally it uses a new _qt_internal_add_library function (similar
how we have qt_add_executable and _qt_internal_add_executable) as well
as finalizer code line the executable case.
_qt_internal_add_library forwards arguments to add_library with some
Qt specific adjustments to the selected default target type (based on
whether Qt is configured as static or shared).
The new _qt_internal_add_library is now used in qt_add_plugin as well
as some internal library creating functions like
qt_internal_add_module.
This reduces some duplication of file name adjustments across
functions and creates a central point for creation of Qt-like
libraries (for some definition of Qt-like).
Change-Id: Id9a31fe6bf278c8c3bb1e61e00a9febf7f1a2664
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Diffstat (limited to 'cmake/Qt3rdPartyLibraryHelpers.cmake')
| -rw-r--r-- | cmake/Qt3rdPartyLibraryHelpers.cmake | 189 |
1 files changed, 115 insertions, 74 deletions
diff --git a/cmake/Qt3rdPartyLibraryHelpers.cmake b/cmake/Qt3rdPartyLibraryHelpers.cmake index a2f35cf362f..b7fbea62c91 100644 --- a/cmake/Qt3rdPartyLibraryHelpers.cmake +++ b/cmake/Qt3rdPartyLibraryHelpers.cmake @@ -1,52 +1,96 @@ +macro(qt_internal_get_add_library_option_args option_args) + set(${option_args} + SHARED + STATIC + MODULE + INTERFACE + ) +endmacro() + +# Helper to create a library using the public _qt_internal_add_library function. +# +# The difference to _qt_internal_add_library is that MODULE is replaced with STATIC in a static +# Qt build. +# Everything else is just prepation for option validating. +function(qt_internal_add_common_qt_library_helper target) + qt_internal_get_add_library_option_args(option_args) + qt_parse_all_arguments(arg "qt_internal_add_common_qt_library_helper" + "${option_args}" + "" + "" + ${ARGN} + ) + + if(arg_SHARED) + set(arg_SHARED SHARED) + else() + set(arg_SHARED "") + endif() + + if(arg_MODULE) + set(arg_MODULE MODULE) + else() + set(arg_MODULE "") + endif() + + if(arg_STATIC) + set(arg_STATIC STATIC) + else() + set(arg_STATIC "") + endif() + + if(arg_INTERFACE) + set(arg_INTERFACE INTERFACE) + else() + set(arg_INTERFACE "") + endif() + + if(arg_MODULE AND NOT BUILD_SHARED_LIBS) + set(arg_MODULE STATIC) + endif() + + _qt_internal_add_library(${target} ${arg_STATIC} ${arg_SHARED} ${arg_MODULE} ${arg_INTERFACE}) +endfunction() + # Wrapper function to create a regular cmake target and forward all the # arguments collected by the conversion script. function(qt_internal_add_cmake_library target) - # Process arguments: + qt_internal_get_add_library_option_args(option_args) + set(single_args + OUTPUT_DIRECTORY + ARCHIVE_INSTALL_DIRECTORY + INSTALL_DIRECTORY + ) + set(multi_args + ${__default_private_args} + ${__default_public_args} + ) + qt_parse_all_arguments(arg "qt_add_cmake_library" - "SHARED;MODULE;STATIC;INTERFACE" - "OUTPUT_DIRECTORY;ARCHIVE_INSTALL_DIRECTORY;INSTALL_DIRECTORY" - "${__default_private_args};${__default_public_args}" + "${option_args}" + "${single_args}" + "${multi_args}" ${ARGN} ) - set(is_static_lib 0) - - ### Define Targets: - if(${arg_INTERFACE}) - add_library("${target}" INTERFACE) - elseif(${arg_STATIC} OR (${arg_MODULE} AND NOT BUILD_SHARED_LIBS)) - add_library("${target}" STATIC) - set(is_static_lib 1) - elseif(${arg_SHARED}) - add_library("${target}" SHARED) - _qt_internal_apply_win_prefix_and_suffix("${target}") - elseif(${arg_MODULE}) - add_library("${target}" MODULE) - set_property(TARGET ${name} PROPERTY C_VISIBILITY_PRESET default) - set_property(TARGET ${name} PROPERTY CXX_VISIBILITY_PRESET default) - set_property(TARGET ${name} PROPERTY OBJC_VISIBILITY_PRESET default) - set_property(TARGET ${name} PROPERTY OBJCXX_VISIBILITY_PRESET default) - - if(APPLE) - # CMake defaults to using .so extensions for loadable modules, aka plugins, - # but Qt plugins are actually suffixed with .dylib. - set_property(TARGET "${target}" PROPERTY SUFFIX ".dylib") - endif() - _qt_internal_apply_win_prefix_and_suffix("${target}") - else() - add_library("${target}") - if(NOT BUILD_SHARED_LIBS) - set(is_static_lib 1) - endif() - endif() + qt_remove_args(library_helper_args + ARGS_TO_REMOVE + ${single_args} + ${multi_args} + ALL_ARGS + ${option_args} + ${single_args} + ${multi_args} + ARGS + ${ARGN} + ) + + qt_internal_add_common_qt_library_helper(${target} ${library_helper_args}) if (NOT arg_ARCHIVE_INSTALL_DIRECTORY AND arg_INSTALL_DIRECTORY) set(arg_ARCHIVE_INSTALL_DIRECTORY "${arg_INSTALL_DIRECTORY}") endif() - if (ANDROID) - qt_android_apply_arch_suffix("${target}") - endif() qt_skip_warnings_are_errors_when_repo_unclean("${target}") if (arg_INSTALL_DIRECTORY) @@ -91,42 +135,43 @@ endfunction() # compile 3rdparty libraries as part of the build. # function(qt_internal_add_3rdparty_library target) - # Process arguments: - qt_parse_all_arguments(arg "qt_add_3rdparty_library" - "SHARED;MODULE;STATIC;INTERFACE;EXCEPTIONS;INSTALL;SKIP_AUTOMOC" - "OUTPUT_DIRECTORY;QMAKE_LIB_NAME" - "${__default_private_args};${__default_public_args}" + qt_internal_get_add_library_option_args(library_option_args) + set(option_args + EXCEPTIONS + INSTALL + SKIP_AUTOMOC + ) + set(single_args + OUTPUT_DIRECTORY + QMAKE_LIB_NAME + ) + set(multi_args + ${__default_private_args} + ${__default_public_args} + ) + + qt_parse_all_arguments(arg "qt_internal_add_3rdparty_library" + "${library_option_args};${option_args}" + "${single_args}" + "${multi_args}" ${ARGN} ) - set(is_static_lib 0) - - ### Define Targets: - if(${arg_INTERFACE}) - add_library("${target}" INTERFACE) - elseif(${arg_STATIC} OR (${arg_MODULE} AND NOT BUILD_SHARED_LIBS)) - add_library("${target}" STATIC) - set(is_static_lib 1) - elseif(${arg_SHARED}) - add_library("${target}" SHARED) - elseif(${arg_MODULE}) - add_library("${target}" MODULE) - set_property(TARGET ${name} PROPERTY C_VISIBILITY_PRESET default) - set_property(TARGET ${name} PROPERTY CXX_VISIBILITY_PRESET default) - set_property(TARGET ${name} PROPERTY OBJC_VISIBILITY_PRESET default) - set_property(TARGET ${name} PROPERTY OBJCXX_VISIBILITY_PRESET default) - - if(APPLE) - # CMake defaults to using .so extensions for loadable modules, aka plugins, - # but Qt plugins are actually suffixed with .dylib. - set_property(TARGET "${target}" PROPERTY SUFFIX ".dylib") - endif() - else() - add_library("${target}") - if(NOT BUILD_SHARED_LIBS) - set(is_static_lib 1) - endif() - endif() + qt_remove_args(library_helper_args + ARGS_TO_REMOVE + ${option_args} + ${single_args} + ${multi_args} + ALL_ARGS + ${library_option_args} + ${option_args} + ${single_args} + ${multi_args} + ARGS + ${ARGN} + ) + + qt_internal_add_common_qt_library_helper(${target} ${library_helper_args}) if(NOT arg_INTERFACE) qt_set_common_target_properties(${target}) @@ -143,10 +188,6 @@ function(qt_internal_add_3rdparty_library target) qt_internal_add_target_aliases(${target}) _qt_internal_apply_strict_cpp(${target}) - if (ANDROID) - qt_android_apply_arch_suffix("${target}") - endif() - qt_skip_warnings_are_errors_when_repo_unclean("${target}") set_target_properties(${target} PROPERTIES |
