summaryrefslogtreecommitdiffstats
path: root/cmake/Qt3rdPartyLibraryHelpers.cmake
blob: 33bfc3e8348a716082f38a804efd3e9b3b449bf2 (plain)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
macro(qt_internal_get_add_library_option_args option_args)set(${option_args}SHAREDSTATICMODULEINTERFACENO_UNITY_BUILD)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)cmake_parse_arguments(PARSE_ARGV1 arg "${option_args}""""")_qt_internal_validate_all_args_are_parsed(arg)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})if(arg_NO_UNITY_BUILD)set_property(TARGET"${target}"PROPERTY UNITY_BUILD OFF)endif()qt_internal_mark_as_internal_library(${target})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)qt_internal_get_add_library_option_args(option_args)set(single_args OUTPUT_DIRECTORYARCHIVE_INSTALL_DIRECTORYINSTALL_DIRECTORY)set(multi_args ${__default_private_args}${__default_public_args})cmake_parse_arguments(PARSE_ARGV1 arg "${option_args}""${single_args}""${multi_args}")_qt_internal_validate_all_args_are_parsed(arg)_qt_internal_validate_no_unity_build(arg)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})qt_internal_default_warnings_are_errors("${target}")if(arg_OUTPUT_DIRECTORY)set_target_properties(${target}PROPERTIESARCHIVE_OUTPUT_DIRECTORY${arg_OUTPUT_DIRECTORY}RUNTIME_OUTPUT_DIRECTORY${arg_OUTPUT_DIRECTORY}LIBRARY_OUTPUT_DIRECTORY${arg_OUTPUT_DIRECTORY})endif()_qt_internal_forward_function_args(FORWARD_PREFIX arg FORWARD_OUT_VAR extend_target_args FORWARD_MULTISOURCESNO_PCH_SOURCESINCLUDE_DIRECTORIESSYSTEM_INCLUDE_DIRECTORIESPUBLIC_INCLUDE_DIRECTORIESPUBLIC_DEFINESDEFINESPUBLIC_LIBRARIESCOMPILE_OPTIONSPUBLIC_COMPILE_OPTIONSLINK_OPTIONSPUBLIC_LINK_OPTIONSMOC_OPTIONSENABLE_AUTOGEN_TOOLSDISABLE_AUTOGEN_TOOLS)qt_internal_extend_target("${target}"${extend_target_args}LIBRARIES${arg_LIBRARIES} Qt::PlatformCommonInternal NO_UNITY_BUILD# Disabled by default)endfunction()# This function replaces qmake's qt_helper_lib feature. It is intended to# compile 3rdparty libraries as part of the build.#function(qt_internal_add_3rdparty_library target)qt_internal_get_add_library_option_args(library_option_args)set(option_args EXCEPTIONSINSTALLSKIP_AUTOMOC${__qt_internal_sbom_optional_args})set(single_args OUTPUT_DIRECTORYQMAKE_LIB_NAME${__qt_internal_sbom_single_args})set(multi_args ${__default_private_args}${__default_public_args}${__qt_internal_sbom_multi_args})cmake_parse_arguments(PARSE_ARGV1 arg "${library_option_args};${option_args}""${single_args}""${multi_args}")_qt_internal_validate_all_args_are_parsed(arg)_qt_internal_validate_no_unity_build(arg)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})set_target_properties(${target}PROPERTIES _qt_module_interface_name "${target}" _qt_package_version "${PROJECT_VERSION}" _qt_package_name "${INSTALL_CMAKE_NAMESPACE}${target}" _qt_module_is_3rdparty_library TRUE)set(export_properties "_qt_module_interface_name""_qt_package_version""_qt_package_name""_qt_module_is_3rdparty_library")set_property(TARGET${target}APPEND PROPERTYEXPORT_PROPERTIES"${export_properties}")qt_internal_add_qt_repo_known_module(${target})qt_internal_add_target_aliases(${target})qt_internal_default_warnings_are_errors("${target}")set_target_properties(${target}PROPERTIESLIBRARY_OUTPUT_DIRECTORY"${QT_BUILD_DIR}/${INSTALL_LIBDIR}"RUNTIME_OUTPUT_DIRECTORY"${QT_BUILD_DIR}/${INSTALL_BINDIR}"ARCHIVE_OUTPUT_DIRECTORY"${QT_BUILD_DIR}/${INSTALL_LIBDIR}"VERSION${PROJECT_VERSION}SOVERSION${PROJECT_VERSION_MAJOR} _qt_module_skip_depends_include TRUE)set_property(TARGET"${target}"APPEND PROPERTY EXPORT_PROPERTIES _qt_module_is_3rdparty_library)set_property(TARGET"${target}"APPEND PROPERTY EXPORT_PROPERTIES _qt_module_skip_depends_include)qt_handle_multi_config_output_dirs("${target}")set_target_properties(${target}PROPERTIESOUTPUT_NAME"${INSTALL_CMAKE_NAMESPACE}${target}")if(NOT arg_INTERFACE)qt_set_common_target_properties(${target})endif()if(NOT arg_SKIP_AUTOMOC)qt_autogen_tools_initial_setup(${target})endif()if(NOT arg_EXCEPTIONS)qt_internal_set_exceptions_flags("${target}""DEFAULT")else()qt_internal_set_exceptions_flags("${target}""${arg_EXCEPTIONS}")endif()qt_internal_extend_target("${target}"SOURCES${arg_SOURCES}INCLUDE_DIRECTORIES${arg_INCLUDE_DIRECTORIES}PUBLIC_INCLUDE_DIRECTORIES${arg_PUBLIC_INCLUDE_DIRECTORIES}PUBLIC_DEFINES${arg_PUBLIC_DEFINES}DEFINES${arg_DEFINES}PUBLIC_LIBRARIES${arg_PUBLIC_LIBRARIES}LIBRARIES${arg_LIBRARIES} Qt::PlatformModuleInternal COMPILE_OPTIONS${arg_COMPILE_OPTIONS}PUBLIC_COMPILE_OPTIONS${arg_PUBLIC_COMPILE_OPTIONS}LINK_OPTIONS${arg_LINK_OPTIONS}PUBLIC_LINK_OPTIONS${arg_PUBLIC_LINK_OPTIONS}MOC_OPTIONS${arg_MOC_OPTIONS}ENABLE_AUTOGEN_TOOLS${arg_ENABLE_AUTOGEN_TOOLS}DISABLE_AUTOGEN_TOOLS${arg_DISABLE_AUTOGEN_TOOLS}NO_UNITY_BUILD)if(NOT BUILD_SHARED_LIBS OR arg_INSTALL)set(will_install TRUE)else()set(will_install FALSE)endif()if(will_install)qt_generate_3rdparty_lib_pri_file("${target}""${arg_QMAKE_LIB_NAME}" pri_file)if(pri_file)qt_install(FILES"${pri_file}"DESTINATION"${INSTALL_MKSPECSDIR}/modules")endif()set(path_suffix "${INSTALL_CMAKE_NAMESPACE}${target}")qt_path_join(config_build_dir ${QT_CONFIG_BUILD_DIR} ${path_suffix})qt_path_join(config_install_dir ${QT_CONFIG_INSTALL_DIR} ${path_suffix})set(export_name "${INSTALL_CMAKE_NAMESPACE}${target}Targets")qt_internal_get_min_new_policy_cmake_version(min_new_policy_version)qt_internal_get_max_new_policy_cmake_version(max_new_policy_version)configure_package_config_file("${QT_CMAKE_DIR}/Qt3rdPartyLibraryConfig.cmake.in""${config_build_dir}/${INSTALL_CMAKE_NAMESPACE}${target}Config.cmake"INSTALL_DESTINATION"${config_install_dir}")write_basic_package_version_file("${config_build_dir}/${INSTALL_CMAKE_NAMESPACE}${target}ConfigVersionImpl.cmake"VERSION${PROJECT_VERSION}COMPATIBILITY AnyNewerVersion )qt_internal_write_qt_package_version_file("${INSTALL_CMAKE_NAMESPACE}${target}""${config_build_dir}/${INSTALL_CMAKE_NAMESPACE}${target}ConfigVersion.cmake")qt_install(FILES"${config_build_dir}/${INSTALL_CMAKE_NAMESPACE}${target}Config.cmake""${config_build_dir}/${INSTALL_CMAKE_NAMESPACE}${target}ConfigVersion.cmake""${config_build_dir}/${INSTALL_CMAKE_NAMESPACE}${target}ConfigVersionImpl.cmake"DESTINATION"${config_install_dir}"COMPONENT Devel )qt_install(TARGETS${target}EXPORT"${export_name}"RUNTIME DESTINATION${INSTALL_BINDIR}LIBRARY DESTINATION${INSTALL_LIBDIR}ARCHIVE DESTINATION${INSTALL_LIBDIR})qt_install(EXPORT${export_name}NAMESPACE"${QT_CMAKE_EXPORT_NAMESPACE}::"DESTINATION"${config_install_dir}")qt_internal_export_additional_targets_file(TARGETS${target}EXPORT_NAME_PREFIX${INSTALL_CMAKE_NAMESPACE}${target}CONFIG_INSTALL_DIR"${config_install_dir}")qt_internal_export_modern_cmake_config_targets_file(TARGETS${target}EXPORT_NAME_PREFIX${INSTALL_CMAKE_NAMESPACE}${target}CONFIG_BUILD_DIR"${config_build_dir}"CONFIG_INSTALL_DIR"${config_install_dir}")set(debug_install_dir "${INSTALL_LIBDIR}")if(MINGW)set(debug_install_dir "${INSTALL_BINDIR}")endif()qt_enable_separate_debug_info(${target}"${debug_install_dir}")qt_internal_install_pdb_files(${target}"${INSTALL_LIBDIR}")endif()if(BUILD_SHARED_LIBS AND MSVC)set_target_properties(${target}PROPERTIESINTERPROCEDURAL_OPTIMIZATION OFF)endif()if(QT_GENERATE_SBOM)set(sbom_args "")list(APPEND sbom_args TYPE QT_THIRD_PARTY_MODULE)if(NOT will_install)list(APPEND sbom_args NO_INSTALL)endif()qt_get_cmake_configurations(configs)foreach(config IN LISTS configs)_qt_internal_sbom_append_multi_config_aware_single_arg_option(RUNTIME_PATH"${INSTALL_BINDIR}""${config}" sbom_args )_qt_internal_sbom_append_multi_config_aware_single_arg_option(LIBRARY_PATH"${INSTALL_LIBDIR}""${config}" sbom_args )_qt_internal_sbom_append_multi_config_aware_single_arg_option(ARCHIVE_PATH"${INSTALL_LIBDIR}""${config}" sbom_args )endforeach()_qt_internal_forward_function_args(FORWARD_APPENDFORWARD_PREFIX arg FORWARD_OUT_VAR sbom_args FORWARD_OPTIONS${__qt_internal_sbom_optional_args}FORWARD_SINGLE${__qt_internal_sbom_single_args}FORWARD_MULTI${__qt_internal_sbom_multi_args})qt_internal_extend_qt_entity_sbom(${target} ${sbom_args})endif()qt_add_list_file_finalizer(qt_internal_finalize_3rdparty_library ${target})endfunction()function(qt_internal_finalize_3rdparty_library target)_qt_internal_finalize_sbom(${target})endfunction()function(qt_install_3rdparty_library_wrap_config_extra_file target)if(TARGET"${target}")set(use_bundled "ON")else()set(use_bundled "OFF")endif()set(QT_USE_BUNDLED_${target}"${use_bundled}"CACHE INTERNAL"")set(extra_cmake_code "set(QT_USE_BUNDLED_${target} ${use_bundled} CACHE INTERNAL\"\")")configure_file("${QT_CMAKE_DIR}/QtFindWrapConfigExtra.cmake.in""${QT_CONFIG_BUILD_DIR}/${INSTALL_CMAKE_NAMESPACE}/FindWrap${target}ConfigExtra.cmake" @ONLY)qt_install(FILES"${QT_CONFIG_BUILD_DIR}/${INSTALL_CMAKE_NAMESPACE}/FindWrap${target}ConfigExtra.cmake"DESTINATION"${QT_CONFIG_INSTALL_DIR}/${INSTALL_CMAKE_NAMESPACE}"COMPONENT Devel )endfunction()# This function implements qmake's qt_helper_lib MODULE_EXT_HEADERS and MODULE_EXT_HEADERS_DIR features.# It creates a header-only module exposing a subset or all headers of a 3rd-party library.function(qt_internal_add_3rdparty_header_module target)set(single_args EXTERNAL_HEADERS_DIR)set(multi_args EXTERNAL_HEADERS)cmake_parse_arguments(PARSE_ARGV1 arg "${option_args}""${single_args}""${multi_args}")_qt_internal_validate_all_args_are_parsed(arg)_qt_internal_forward_function_args(FORWARD_PREFIX arg FORWARD_OUT_VAR add_module_args FORWARD_SINGLEEXTERNAL_HEADERSEXTERNAL_HEADERS_DIR)qt_internal_add_module(${target}IS_QT_3RD_PARTY_HEADER_MODULEINTERNAL_MODULEHEADER_MODULENO_CONFIG_HEADER_FILENO_GENERATE_CPP_EXPORTS${add_module_args})set_target_properties(${target}PROPERTIES _qt_module_is_3rdparty_header_library TRUE _qt_module_skip_depends_include TRUE)set_property(TARGET"${target}"APPEND PROPERTY EXPORT_PROPERTIES _qt_module_is_3rdparty_header_library)set_property(TARGET"${target}"APPEND PROPERTY EXPORT_PROPERTIES _qt_module_skip_depends_include)endfunction()
close