From 9a81cf15036e5404009ae7ccf561d2e1df23a7e0 Mon Sep 17 00:00:00 2001 From: Yuhang Zhao <2546789017@qq.com> Date: Sun, 19 Feb 2023 12:36:41 +0800 Subject: [PATCH] cmake: improve the package code Signed-off-by: Yuhang Zhao <2546789017@qq.com> --- CMakeLists.txt | 5 +- FramelessHelperConfig.cmake.in | 19 ++- FramelessHelperModuleConfig.cmake.in | 59 ++++++++ FramelessHelperModuleTargets.cmake.in | 49 +++++++ .../Core/framelesshelpercore_global.h | 5 + src/core/CMakeLists.txt | 110 ++++++++++++--- src/core/framelesshelpercore_global.cpp | 11 ++ src/core/framelessmanager.cpp | 13 +- src/core/micamaterial.cpp | 13 +- src/quick/CMakeLists.txt | 130 +++++++++++++----- src/widgets/CMakeLists.txt | 102 +++++++++++--- 11 files changed, 413 insertions(+), 103 deletions(-) create mode 100644 FramelessHelperModuleConfig.cmake.in create mode 100644 FramelessHelperModuleTargets.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index a522e07..f3db5cf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -148,8 +148,9 @@ if(NOT FRAMELESSHELPER_NO_SUMMARY) set(__qt_inst_dir "${Qt5_DIR}") endif() # /whatever/Qt/6.4.0/gcc_64/lib/cmake/Qt6 - set(__qt_inst_dir ${__qt_inst_dir}/../../..) - cmake_path(NORMAL_PATH __qt_inst_dir) + cmake_path(GET __qt_inst_dir PARENT_PATH __qt_inst_dir) + cmake_path(GET __qt_inst_dir PARENT_PATH __qt_inst_dir) + cmake_path(GET __qt_inst_dir PARENT_PATH __qt_inst_dir) message("Qt install dir: ${__qt_inst_dir}") message("Qt version: ${QT_VERSION}") get_target_property(__qt_type Qt${QT_VERSION_MAJOR}::Core TYPE) diff --git a/FramelessHelperConfig.cmake.in b/FramelessHelperConfig.cmake.in index 677781c..dc650f6 100644 --- a/FramelessHelperConfig.cmake.in +++ b/FramelessHelperConfig.cmake.in @@ -27,9 +27,24 @@ set(_@PROJECT_NAME@_supported_components Core Widgets Quick) foreach(_comp ${@PROJECT_NAME@_FIND_COMPONENTS}) - if(NOT _comp IN_LIST _@PROJECT_NAME@_supported_components) + if(_comp IN_LIST _@PROJECT_NAME@_supported_components) + set(__proj_name "@PROJECT_NAME@${_comp}") + cmake_path(GET CMAKE_CURRENT_LIST_FILE PARENT_PATH __imp_prefix) + cmake_path(GET __imp_prefix PARENT_PATH __imp_prefix) + include("${__imp_prefix}/${__proj_name}/${__proj_name}Config.cmake") + unset(__imp_prefix) + unset(__proj_name) + else() set(@PROJECT_NAME@_FOUND FALSE) set(@PROJECT_NAME@_NOT_FOUND_MESSAGE "Unsupported component: ${_comp}") endif() - include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@${_comp}Targets.cmake") endforeach() + +if(NOT DEFINED @PROJECT_NAME@_FOUND) + set(@PROJECT_NAME@_FOUND TRUE) + set(@PROJECT_NAME@_VERSION "@PROJECT_VERSION@") + set(@PROJECT_NAME@_VERSION_MAJOR "@PROJECT_VERSION_MAJOR@") + set(@PROJECT_NAME@_VERSION_MINOR "@PROJECT_VERSION_MINOR@") + set(@PROJECT_NAME@_VERSION_PATCH "@PROJECT_VERSION_PATCH@") + set(@PROJECT_NAME@_VERSION_TWEAK "@PROJECT_VERSION_TWEAK@") +endif() diff --git a/FramelessHelperModuleConfig.cmake.in b/FramelessHelperModuleConfig.cmake.in new file mode 100644 index 0000000..a2497bf --- /dev/null +++ b/FramelessHelperModuleConfig.cmake.in @@ -0,0 +1,59 @@ +#[[ + MIT License + + Copyright (C) 2021-2023 by wangwenx190 (Yuhang Zhao) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +]] + +if(NOT DEFINED @SUB_PROJ_NAME@_FOUND) + set(@SUB_PROJ_NAME@_FOUND TRUE) +endif() + +if(@SUB_PROJ_NAME@_FOUND) + include("${CMAKE_CURRENT_LIST_DIR}/@SUB_PROJ_NAME@Targets.cmake") +endif() + +if(TARGET @PROJECT_NAME@::@SUB_MOD_NAME@) + set(@SUB_PROJ_NAME@_LIBRARIES @PROJECT_NAME@::@SUB_MOD_NAME@) + get_target_property(@SUB_PROJ_NAME@_VERSION @PROJECT_NAME@::@SUB_MOD_NAME@ VERSION) + if(NOT @SUB_PROJ_NAME@_VERSION) + set(@SUB_PROJ_NAME@_VERSION "") + endif() + get_target_property(@SUB_PROJ_NAME@_INCLUDE_DIRS @PROJECT_NAME@::@SUB_MOD_NAME@ INTERFACE_INCLUDE_DIRECTORIES) + if(NOT @SUB_PROJ_NAME@_INCLUDE_DIRS) + set(@SUB_PROJ_NAME@_INCLUDE_DIRS "") + endif() + get_target_property(@SUB_PROJ_NAME@_DEFINITIONS @PROJECT_NAME@::@SUB_MOD_NAME@ INTERFACE_COMPILE_DEFINITIONS) + if(NOT @SUB_PROJ_NAME@_DEFINITIONS) + set(@SUB_PROJ_NAME@_DEFINITIONS "") + else() + list(TRANSFORM @SUB_PROJ_NAME@_DEFINITIONS PREPEND "-D") + endif() + get_target_property(@SUB_PROJ_NAME@_COMPILE_DEFINITIONS @PROJECT_NAME@::@SUB_MOD_NAME@ INTERFACE_COMPILE_DEFINITIONS) + if(NOT @SUB_PROJ_NAME@_COMPILE_DEFINITIONS) + set(@SUB_PROJ_NAME@_COMPILE_DEFINITIONS "") + endif() + list(REMOVE_DUPLICATES @SUB_PROJ_NAME@_INCLUDE_DIRS) + list(REMOVE_DUPLICATES @SUB_PROJ_NAME@_DEFINITIONS) + list(REMOVE_DUPLICATES @SUB_PROJ_NAME@_COMPILE_DEFINITIONS) +else() + set(@SUB_PROJ_NAME@_FOUND FALSE) + set(@SUB_PROJ_NAME@_NOT_FOUND_MESSAGE "Target \"@PROJECT_NAME@::@SUB_MOD_NAME@\" was not found.") +endif() diff --git a/FramelessHelperModuleTargets.cmake.in b/FramelessHelperModuleTargets.cmake.in new file mode 100644 index 0000000..0f019ed --- /dev/null +++ b/FramelessHelperModuleTargets.cmake.in @@ -0,0 +1,49 @@ +#[[ + MIT License + + Copyright (C) 2021-2023 by wangwenx190 (Yuhang Zhao) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +]] + +if(NOT TARGET @PROJECT_NAME@::@SUB_MOD_NAME@) + cmake_path(GET CMAKE_CURRENT_LIST_FILE PARENT_PATH __import_prefix) + cmake_path(GET __import_prefix PARENT_PATH __import_prefix) + cmake_path(GET __import_prefix PARENT_PATH __import_prefix) + cmake_path(GET __import_prefix PARENT_PATH __import_prefix) + if(__import_prefix STREQUAL "/") + set(__import_prefix "") + endif() + add_library(@SUB_PROJ_NAME@ @SUB_MOD_LIB_TYPE@ IMPORTED) + add_library(@PROJECT_NAME@::@SUB_MOD_NAME@ ALIAS @SUB_PROJ_NAME@) + set_target_properties(@SUB_PROJ_NAME@ PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES + "${__import_prefix}/include" + "${__import_prefix}/include/@PROJECT_NAME@" + "${__import_prefix}/include/@SUB_PROJ_PATH@" + "${__import_prefix}/include/@SUB_PROJ_PATH@/private" + INTERFACE_COMPILE_DEFINITIONS "@SUB_MOD_DEFS@" + IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" + IMPORTED_LOCATION "${__import_prefix}/@SUB_MOD_LIB_DIR@/@SUB_MOD_FILE_NAME@" + IMPORTED_IMPLIB "${__import_prefix}/lib/@SUB_MOD_FILE_BASENAME@.lib" + VERSION "@PROJECT_VERSION@" + SOVERSION "@PROJECT_VERSION_MAJOR@" + ) + unset(__import_prefix) +endif() diff --git a/include/FramelessHelper/Core/framelesshelpercore_global.h b/include/FramelessHelper/Core/framelesshelpercore_global.h index 7ab6718..eabb33c 100644 --- a/include/FramelessHelper/Core/framelesshelpercore_global.h +++ b/include/FramelessHelper/Core/framelesshelpercore_global.h @@ -193,6 +193,11 @@ QT_END_NAMESPACE } #endif +#ifndef FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE +// Call this function in your main() function if you built FramelessHelper as a static library. +extern "C" FRAMELESSHELPER_CORE_API void framelesshelpercore_initResource(); +#endif // FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE + FRAMELESSHELPER_BEGIN_NAMESPACE #include "framelesshelper.version" diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index d89c085..682b6b1 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -154,13 +154,54 @@ endif() set(ALL_SOURCES ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ${SOURCES}) if(FRAMELESSHELPER_BUILD_STATIC) + set(SUB_MOD_LIB_TYPE "STATIC") + set(SUB_MOD_LIB_DIR "lib") add_library(${SUB_PROJ_NAME} STATIC ${ALL_SOURCES}) + add_library(${SUB_PROJ_NAME}_static ALIAS ${SUB_PROJ_NAME}) else() + set(SUB_MOD_LIB_TYPE "SHARED") + set(SUB_MOD_LIB_DIR "bin") add_library(${SUB_PROJ_NAME} SHARED ${ALL_SOURCES}) + add_library(${SUB_PROJ_NAME}_shared ALIAS ${SUB_PROJ_NAME}) endif() add_library(${PROJECT_NAME}::${SUB_PROJ_NAME} ALIAS ${SUB_PROJ_NAME}) add_library(${PROJECT_NAME}::${SUB_MOD_NAME} ALIAS ${SUB_PROJ_NAME}) +set_target_properties(${SUB_PROJ_NAME} PROPERTIES + VERSION "${PROJECT_VERSION}" + SOVERSION "${PROJECT_VERSION_MAJOR}" +) + +set(__prefix "") +if(NOT WIN32) + set(__prefix "lib") +endif() +set(__suffix "") +if(FRAMELESSHELPER_BUILD_STATIC) + if(MSVC) + set(__suffix "lib") + else() + set(__suffix "a") + endif() +else() + if(WIN32) + set(__suffix "dll") + elseif(APPLE) + set(__suffix "dylib") + elseif(UNIX) + set(__suffix "so") + endif() +endif() +set(SUB_MOD_FILE_PREFIX "${__prefix}") +set(SUB_MOD_FILE_SUFFIX "${__suffix}") +set(SUB_MOD_FILE_BASENAME "${SUB_MOD_FILE_PREFIX}${SUB_PROJ_NAME}") +if("x${CMAKE_BUILD_TYPE}" STREQUAL "xDebug") + string(APPEND SUB_MOD_FILE_BASENAME "${CMAKE_DEBUG_POSTFIX}") +endif() +set(SUB_MOD_FILE_NAME "${SUB_MOD_FILE_BASENAME}.${SUB_MOD_FILE_SUFFIX}") +unset(__suffix) +unset(__prefix) + if(NOT FRAMELESSHELPER_NO_BUNDLE_RESOURCE) if(QT_VERSION VERSION_GREATER_EQUAL "6.2") qt_add_resources(${SUB_PROJ_NAME} framelesshelpercore @@ -169,7 +210,15 @@ if(NOT FRAMELESSHELPER_NO_BUNDLE_RESOURCE) FILES "resources/fonts/iconfont.ttf" "resources/images/noise.png" + OUTPUT_TARGETS __qrc_targets ) + if(FRAMELESSHELPER_BUILD_STATIC AND __qrc_targets) + foreach(__target ${__qrc_targets}) + target_sources(${SUB_PROJ_NAME} PRIVATE + $ + ) + endforeach() + endif() else() target_sources(${SUB_PROJ_NAME} PRIVATE framelesshelpercore.qrc @@ -178,9 +227,10 @@ if(NOT FRAMELESSHELPER_NO_BUNDLE_RESOURCE) endif() if(FRAMELESSHELPER_BUILD_STATIC) - target_compile_definitions(${SUB_PROJ_NAME} PUBLIC - FRAMELESSHELPER_CORE_STATIC - ) + set(__def FRAMELESSHELPER_CORE_STATIC) + target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def}) + list(APPEND SUB_MOD_DEFS ${__def}) + unset(__def) endif() if(FRAMELESSHELPER_NO_DEBUG_OUTPUT) @@ -190,24 +240,27 @@ if(FRAMELESSHELPER_NO_DEBUG_OUTPUT) endif() if(FRAMELESSHELPER_NO_BUNDLE_RESOURCE) - target_compile_definitions(${SUB_PROJ_NAME} PRIVATE - FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE - ) + set(__def FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE) + target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def}) + list(APPEND SUB_MOD_DEFS ${__def}) + unset(__def) endif() if(FRAMELESSHELPER_NO_PRIVATE) - target_compile_definitions(${SUB_PROJ_NAME} PRIVATE - FRAMELESSHELPER_CORE_NO_PRIVATE - ) + set(__def FRAMELESSHELPER_CORE_NO_PRIVATE) + target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def}) + list(APPEND SUB_MOD_DEFS ${__def}) + unset(__def) endif() if(DEFINED FRAMELESSHELPER_NAMESPACE) if("x${FRAMELESSHELPER_NAMESPACE}" STREQUAL "x") message(FATAL_ERROR "FRAMELESSHELPER_NAMESPACE can't be empty!") endif() - target_compile_definitions(${SUB_PROJ_NAME} PRIVATE - FRAMELESSHELPER_NAMESPACE=${FRAMELESSHELPER_NAMESPACE} - ) + set(__def FRAMELESSHELPER_NAMESPACE=${FRAMELESSHELPER_NAMESPACE}) + target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def}) + list(APPEND SUB_MOD_DEFS ${__def}) + unset(__def) endif() target_compile_definitions(${SUB_PROJ_NAME} PRIVATE @@ -287,13 +340,30 @@ if(FRAMELESSHELPER_ENABLE_CFGUARD) endif() setup_compile_params(TARGETS ${SUB_PROJ_NAME} ${__extra_flags}) if(NOT FRAMELESSHELPER_NO_INSTALL) - setup_package_export( - TARGET ${SUB_PROJ_NAME} - PACKAGE_NAME ${PROJECT_NAME} - NAMESPACE ${PROJECT_NAME} - INCLUDE_PATH ${SUB_PROJ_PATH} - PUBLIC_HEADERS ${PUBLIC_HEADERS} - ALIAS_HEADERS ${PUBLIC_HEADERS_ALIAS} - PRIVATE_HEADERS ${PRIVATE_HEADERS} + include(GNUInstallDirs) + set(__cmake_dir "${CMAKE_CURRENT_BINARY_DIR}/cmake") + set(__config_file "${__cmake_dir}/${SUB_PROJ_NAME}Config.cmake") + configure_file(../../FramelessHelperModuleConfig.cmake.in ${__config_file} @ONLY) + set(__targets_file "${__cmake_dir}/${SUB_PROJ_NAME}Targets.cmake") + configure_file(../../FramelessHelperModuleTargets.cmake.in ${__targets_file} @ONLY) + install( + FILES "${__config_file}" "${__targets_file}" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${SUB_PROJ_NAME}" + ) + set(__inc_dir "${CMAKE_INSTALL_INCLUDEDIR}/${SUB_PROJ_PATH}") + install( + FILES ${PUBLIC_HEADERS} ${PUBLIC_HEADERS_ALIAS} + DESTINATION "${__inc_dir}" + ) + install( + FILES ${PRIVATE_HEADERS} + DESTINATION "${__inc_dir}/private" + ) + install( + TARGETS ${SUB_PROJ_NAME} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + INCLUDES DESTINATION "${__inc_dir}" ) endif() diff --git a/src/core/framelesshelpercore_global.cpp b/src/core/framelesshelpercore_global.cpp index 256882f..be8fb2a 100644 --- a/src/core/framelesshelpercore_global.cpp +++ b/src/core/framelesshelpercore_global.cpp @@ -97,6 +97,17 @@ QDebug operator<<(QDebug d, const FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::Dpi QT_END_NAMESPACE #endif // QT_NO_DEBUG_STREAM +#ifndef FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE +// The "Q_INIT_RESOURCE()" macro can't be used within a namespace, +// so we wrap it into a separate function outside of the namespace and +// then call it instead inside the namespace, that's also the recommended +// workaround provided by Qt's official documentation. +extern "C" void framelesshelpercore_initResource() +{ + Q_INIT_RESOURCE(framelesshelpercore); +} +#endif // FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE + FRAMELESSHELPER_BEGIN_NAMESPACE static Q_LOGGING_CATEGORY(lcCoreGlobal, "wangwenx190.framelesshelper.core.global") diff --git a/src/core/framelessmanager.cpp b/src/core/framelessmanager.cpp index 10c0eb4..3c6f715 100644 --- a/src/core/framelessmanager.cpp +++ b/src/core/framelessmanager.cpp @@ -42,17 +42,6 @@ # include #endif // (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) -#ifndef FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE -// The "Q_INIT_RESOURCE()" macro can't be used within a namespace, -// so we wrap it into a separate function outside of the namespace and -// then call it instead inside the namespace, that's also the recommended -// workaround provided by Qt's official documentation. -static inline void initResource() -{ - Q_INIT_RESOURCE(framelesshelpercore); -} -#endif // FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE - FRAMELESSHELPER_BEGIN_NAMESPACE static Q_LOGGING_CATEGORY(lcFramelessManager, "wangwenx190.framelesshelper.core.framelessmanager") @@ -151,7 +140,7 @@ void FramelessManagerPrivate::initializeIconFont() return; } inited = true; - initResource(); + framelesshelpercore_initResource(); // We always register this font because it's our only fallback. const int id = QFontDatabase::addApplicationFont(kIconFontFilePath); if (id < 0) { diff --git a/src/core/micamaterial.cpp b/src/core/micamaterial.cpp index c2155f8..fb35bc9 100644 --- a/src/core/micamaterial.cpp +++ b/src/core/micamaterial.cpp @@ -39,17 +39,6 @@ # include #endif // FRAMELESSHELPER_CORE_NO_PRIVATE -#ifndef FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE -// The "Q_INIT_RESOURCE()" macro can't be used within a namespace, -// so we wrap it into a separate function outside of the namespace and -// then call it instead inside the namespace, that's also the recommended -// workaround provided by Qt's official documentation. -static inline void initResource() -{ - Q_INIT_RESOURCE(framelesshelpercore); -} -#endif // FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE - FRAMELESSHELPER_BEGIN_NAMESPACE static Q_LOGGING_CATEGORY(lcMicaMaterial, "wangwenx190.framelesshelper.core.micamaterial") @@ -587,7 +576,7 @@ void MicaMaterialPrivate::maybeGenerateBlurredWallpaper(const bool force) void MicaMaterialPrivate::updateMaterialBrush() { #ifndef FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE - initResource(); + framelesshelpercore_initResource(); static const QImage noiseTexture = QImage(kNoiseImageFilePath); #endif // FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE QImage micaTexture = QImage(QSize(64, 64), QImage::Format_ARGB32_Premultiplied); diff --git a/src/quick/CMakeLists.txt b/src/quick/CMakeLists.txt index 0caf25c..0a90189 100644 --- a/src/quick/CMakeLists.txt +++ b/src/quick/CMakeLists.txt @@ -100,19 +100,60 @@ endif() set(ALL_SOURCES ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ${SOURCES}) if(FRAMELESSHELPER_BUILD_STATIC) + set(SUB_MOD_LIB_TYPE "STATIC") + set(SUB_MOD_LIB_DIR "lib") add_library(${SUB_PROJ_NAME} STATIC ${ALL_SOURCES}) + add_library(${SUB_PROJ_NAME}_static ALIAS ${SUB_PROJ_NAME}) else() + set(SUB_MOD_LIB_TYPE "SHARED") + set(SUB_MOD_LIB_DIR "bin") add_library(${SUB_PROJ_NAME} SHARED ${ALL_SOURCES}) + add_library(${SUB_PROJ_NAME}_shared ALIAS ${SUB_PROJ_NAME}) endif() add_library(${PROJECT_NAME}::${SUB_PROJ_NAME} ALIAS ${SUB_PROJ_NAME}) add_library(${PROJECT_NAME}::${SUB_MOD_NAME} ALIAS ${SUB_PROJ_NAME}) -set(__import_base_dir ${PROJECT_BINARY_DIR}/imports) -if(DEFINED FRAMELESSHELPER_IMPORT_DIR) - set(__import_base_dir ${FRAMELESSHELPER_IMPORT_DIR}) +set_target_properties(${SUB_PROJ_NAME} PROPERTIES + VERSION "${PROJECT_VERSION}" + SOVERSION "${PROJECT_VERSION_MAJOR}" +) + +set(__prefix "") +if(NOT WIN32) + set(__prefix "lib") endif() -set(__import_uri org/wangwenx190/${PROJECT_NAME}) -set(__import_dir ${__import_base_dir}/${__import_uri}) +set(__suffix "") +if(FRAMELESSHELPER_BUILD_STATIC) + if(MSVC) + set(__suffix "lib") + else() + set(__suffix "a") + endif() +else() + if(WIN32) + set(__suffix "dll") + elseif(APPLE) + set(__suffix "dylib") + elseif(UNIX) + set(__suffix "so") + endif() +endif() +set(SUB_MOD_FILE_PREFIX "${__prefix}") +set(SUB_MOD_FILE_SUFFIX "${__suffix}") +set(SUB_MOD_FILE_BASENAME "${SUB_MOD_FILE_PREFIX}${SUB_PROJ_NAME}") +if("x${CMAKE_BUILD_TYPE}" STREQUAL "xDebug") + string(APPEND SUB_MOD_FILE_BASENAME "${CMAKE_DEBUG_POSTFIX}") +endif() +set(SUB_MOD_FILE_NAME "${SUB_MOD_FILE_BASENAME}.${SUB_MOD_FILE_SUFFIX}") +unset(__suffix) +unset(__prefix) + +set(__import_base_dir "${PROJECT_BINARY_DIR}/imports") +if(DEFINED FRAMELESSHELPER_IMPORT_DIR) + set(__import_base_dir "${FRAMELESSHELPER_IMPORT_DIR}") +endif() +set(__import_uri "org/wangwenx190/${PROJECT_NAME}") +set(__import_dir "${__import_base_dir}/${__import_uri}") if(QT_VERSION VERSION_GREATER_EQUAL "6.2") qt_add_qml_module(${SUB_PROJ_NAME} @@ -131,13 +172,10 @@ if(QT_VERSION VERSION_GREATER_EQUAL "6.2") if(UNIX) set(__lib_prefix lib) endif() - set(__lib_suffix) - if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(__lib_suffix ${CMAKE_DEBUG_POSTFIX}) - endif() + set(__lib_suffix "$<$:${CMAKE_DEBUG_POSTFIX}>") set(__lib_ext) if(FRAMELESSHELPER_BUILD_STATIC) - if(WIN32) + if(MSVC) set(__lib_ext lib) else() set(__lib_ext a) @@ -151,19 +189,21 @@ if(QT_VERSION VERSION_GREATER_EQUAL "6.2") set(__lib_ext so) endif() endif() - install(FILES - "${__import_dir}/qmldir" - "${__import_dir}/${SUB_PROJ_NAME}.qmltypes" - "${__import_dir}/${__lib_prefix}${SUB_PROJ_NAME}plugin${__lib_suffix}.${__lib_ext}" - DESTINATION "${CMAKE_INSTALL_PREFIX}/qml/${__import_uri}" + install( + FILES + "${__import_dir}/qmldir" + "${__import_dir}/${SUB_PROJ_NAME}.qmltypes" + "${__import_dir}/${__lib_prefix}${SUB_PROJ_NAME}plugin${__lib_suffix}.${__lib_ext}" + DESTINATION "qml/${__import_uri}" ) endif() endif() if(FRAMELESSHELPER_BUILD_STATIC) - target_compile_definitions(${SUB_PROJ_NAME} PUBLIC - FRAMELESSHELPER_QUICK_STATIC - ) + set(__def FRAMELESSHELPER_QUICK_STATIC) + target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def}) + list(APPEND SUB_MOD_DEFS ${__def}) + unset(__def) endif() if(FRAMELESSHELPER_NO_DEBUG_OUTPUT) @@ -173,24 +213,27 @@ if(FRAMELESSHELPER_NO_DEBUG_OUTPUT) endif() if(FRAMELESSHELPER_NO_BUNDLE_RESOURCE) - target_compile_definitions(${SUB_PROJ_NAME} PRIVATE - FRAMELESSHELPER_QUICK_NO_BUNDLE_RESOURCE - ) + set(__def FRAMELESSHELPER_QUICK_NO_BUNDLE_RESOURCE) + target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def}) + list(APPEND SUB_MOD_DEFS ${__def}) + unset(__def) endif() if(FRAMELESSHELPER_NO_PRIVATE) - target_compile_definitions(${SUB_PROJ_NAME} PRIVATE - FRAMELESSHELPER_QUICK_NO_PRIVATE - ) + set(__def FRAMELESSHELPER_QUICK_NO_PRIVATE) + target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def}) + list(APPEND SUB_MOD_DEFS ${__def}) + unset(__def) endif() if(DEFINED FRAMELESSHELPER_NAMESPACE) if("x${FRAMELESSHELPER_NAMESPACE}" STREQUAL "x") message(FATAL_ERROR "FRAMELESSHELPER_NAMESPACE can't be empty!") endif() - target_compile_definitions(${SUB_PROJ_NAME} PRIVATE - FRAMELESSHELPER_NAMESPACE=${FRAMELESSHELPER_NAMESPACE} - ) + set(__def FRAMELESSHELPER_NAMESPACE=${FRAMELESSHELPER_NAMESPACE}) + target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def}) + list(APPEND SUB_MOD_DEFS ${__def}) + unset(__def) endif() target_compile_definitions(${SUB_PROJ_NAME} PRIVATE @@ -244,13 +287,30 @@ if(FRAMELESSHELPER_ENABLE_CFGUARD) endif() setup_compile_params(TARGETS ${SUB_PROJ_NAME} ${__extra_flags}) if(NOT FRAMELESSHELPER_NO_INSTALL) - setup_package_export( - TARGET ${SUB_PROJ_NAME} - PACKAGE_NAME ${PROJECT_NAME} - NAMESPACE ${PROJECT_NAME} - INCLUDE_PATH ${SUB_PROJ_PATH} - PUBLIC_HEADERS ${PUBLIC_HEADERS} - ALIAS_HEADERS ${PUBLIC_HEADERS_ALIAS} - PRIVATE_HEADERS ${PRIVATE_HEADERS} + include(GNUInstallDirs) + set(__cmake_dir "${CMAKE_CURRENT_BINARY_DIR}/cmake") + set(__config_file "${__cmake_dir}/${SUB_PROJ_NAME}Config.cmake") + configure_file(../../FramelessHelperModuleConfig.cmake.in ${__config_file} @ONLY) + set(__targets_file "${__cmake_dir}/${SUB_PROJ_NAME}Targets.cmake") + configure_file(../../FramelessHelperModuleTargets.cmake.in ${__targets_file} @ONLY) + install( + FILES "${__config_file}" "${__targets_file}" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${SUB_PROJ_NAME}" + ) + set(__inc_dir "${CMAKE_INSTALL_INCLUDEDIR}/${SUB_PROJ_PATH}") + install( + FILES ${PUBLIC_HEADERS} ${PUBLIC_HEADERS_ALIAS} + DESTINATION "${__inc_dir}" + ) + install( + FILES ${PRIVATE_HEADERS} + DESTINATION "${__inc_dir}/private" + ) + install( + TARGETS ${SUB_PROJ_NAME} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + INCLUDES DESTINATION "${__inc_dir}" ) endif() diff --git a/src/widgets/CMakeLists.txt b/src/widgets/CMakeLists.txt index d7095f8..0dc9138 100644 --- a/src/widgets/CMakeLists.txt +++ b/src/widgets/CMakeLists.txt @@ -88,17 +88,59 @@ endif() set(ALL_SOURCES ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ${SOURCES}) if(FRAMELESSHELPER_BUILD_STATIC) + set(SUB_MOD_LIB_TYPE "STATIC") + set(SUB_MOD_LIB_DIR "lib") add_library(${SUB_PROJ_NAME} STATIC ${ALL_SOURCES}) + add_library(${SUB_PROJ_NAME}_static ALIAS ${SUB_PROJ_NAME}) else() + set(SUB_MOD_LIB_TYPE "SHARED") + set(SUB_MOD_LIB_DIR "bin") add_library(${SUB_PROJ_NAME} SHARED ${ALL_SOURCES}) + add_library(${SUB_PROJ_NAME}_shared ALIAS ${SUB_PROJ_NAME}) endif() add_library(${PROJECT_NAME}::${SUB_PROJ_NAME} ALIAS ${SUB_PROJ_NAME}) add_library(${PROJECT_NAME}::${SUB_MOD_NAME} ALIAS ${SUB_PROJ_NAME}) +set_target_properties(${SUB_PROJ_NAME} PROPERTIES + VERSION "${PROJECT_VERSION}" + SOVERSION "${PROJECT_VERSION_MAJOR}" +) + +set(__prefix "") +if(NOT WIN32) + set(__prefix "lib") +endif() +set(__suffix "") if(FRAMELESSHELPER_BUILD_STATIC) - target_compile_definitions(${SUB_PROJ_NAME} PUBLIC - FRAMELESSHELPER_WIDGETS_STATIC - ) + if(MSVC) + set(__suffix "lib") + else() + set(__suffix "a") + endif() +else() + if(WIN32) + set(__suffix "dll") + elseif(APPLE) + set(__suffix "dylib") + elseif(UNIX) + set(__suffix "so") + endif() +endif() +set(SUB_MOD_FILE_PREFIX "${__prefix}") +set(SUB_MOD_FILE_SUFFIX "${__suffix}") +set(SUB_MOD_FILE_BASENAME "${SUB_MOD_FILE_PREFIX}${SUB_PROJ_NAME}") +if("x${CMAKE_BUILD_TYPE}" STREQUAL "xDebug") + string(APPEND SUB_MOD_FILE_BASENAME "${CMAKE_DEBUG_POSTFIX}") +endif() +set(SUB_MOD_FILE_NAME "${SUB_MOD_FILE_BASENAME}.${SUB_MOD_FILE_SUFFIX}") +unset(__suffix) +unset(__prefix) + +if(FRAMELESSHELPER_BUILD_STATIC) + set(__def FRAMELESSHELPER_WIDGETS_STATIC) + target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def}) + list(APPEND SUB_MOD_DEFS ${__def}) + unset(__def) endif() if(FRAMELESSHELPER_NO_DEBUG_OUTPUT) @@ -108,24 +150,27 @@ if(FRAMELESSHELPER_NO_DEBUG_OUTPUT) endif() if(FRAMELESSHELPER_NO_BUNDLE_RESOURCE) - target_compile_definitions(${SUB_PROJ_NAME} PRIVATE - FRAMELESSHELPER_WIDGETS_NO_BUNDLE_RESOURCE - ) + set(__def FRAMELESSHELPER_WIDGETS_NO_BUNDLE_RESOURCE) + target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def}) + list(APPEND SUB_MOD_DEFS ${__def}) + unset(__def) endif() if(FRAMELESSHELPER_NO_PRIVATE) - target_compile_definitions(${SUB_PROJ_NAME} PRIVATE - FRAMELESSHELPER_WIDGETS_NO_PRIVATE - ) + set(__def FRAMELESSHELPER_WIDGETS_NO_PRIVATE) + target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def}) + list(APPEND SUB_MOD_DEFS ${__def}) + unset(__def) endif() if(DEFINED FRAMELESSHELPER_NAMESPACE) if("x${FRAMELESSHELPER_NAMESPACE}" STREQUAL "x") message(FATAL_ERROR "FRAMELESSHELPER_NAMESPACE can't be empty!") endif() - target_compile_definitions(${SUB_PROJ_NAME} PRIVATE - FRAMELESSHELPER_NAMESPACE=${FRAMELESSHELPER_NAMESPACE} - ) + set(__def FRAMELESSHELPER_NAMESPACE=${FRAMELESSHELPER_NAMESPACE}) + target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def}) + list(APPEND SUB_MOD_DEFS ${__def}) + unset(__def) endif() target_compile_definitions(${SUB_PROJ_NAME} PRIVATE @@ -171,13 +216,30 @@ if(FRAMELESSHELPER_ENABLE_CFGUARD) endif() setup_compile_params(TARGETS ${SUB_PROJ_NAME} ${__extra_flags}) if(NOT FRAMELESSHELPER_NO_INSTALL) - setup_package_export( - TARGET ${SUB_PROJ_NAME} - PACKAGE_NAME ${PROJECT_NAME} - NAMESPACE ${PROJECT_NAME} - INCLUDE_PATH ${SUB_PROJ_PATH} - PUBLIC_HEADERS ${PUBLIC_HEADERS} - ALIAS_HEADERS ${PUBLIC_HEADERS_ALIAS} - PRIVATE_HEADERS ${PRIVATE_HEADERS} + include(GNUInstallDirs) + set(__cmake_dir "${CMAKE_CURRENT_BINARY_DIR}/cmake") + set(__config_file "${__cmake_dir}/${SUB_PROJ_NAME}Config.cmake") + configure_file(../../FramelessHelperModuleConfig.cmake.in ${__config_file} @ONLY) + set(__targets_file "${__cmake_dir}/${SUB_PROJ_NAME}Targets.cmake") + configure_file(../../FramelessHelperModuleTargets.cmake.in ${__targets_file} @ONLY) + install( + FILES "${__config_file}" "${__targets_file}" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${SUB_PROJ_NAME}" + ) + set(__inc_dir "${CMAKE_INSTALL_INCLUDEDIR}/${SUB_PROJ_PATH}") + install( + FILES ${PUBLIC_HEADERS} ${PUBLIC_HEADERS_ALIAS} + DESTINATION "${__inc_dir}" + ) + install( + FILES ${PRIVATE_HEADERS} + DESTINATION "${__inc_dir}/private" + ) + install( + TARGETS ${SUB_PROJ_NAME} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + INCLUDES DESTINATION "${__inc_dir}" ) endif()