cmake: improve the package code

Signed-off-by: Yuhang Zhao <2546789017@qq.com>
This commit is contained in:
Yuhang Zhao 2023-02-19 12:36:41 +08:00
parent a375bc6748
commit 9a81cf1503
11 changed files with 413 additions and 103 deletions

View File

@ -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)

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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"

View File

@ -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
$<TARGET_OBJECTS:${__target}>
)
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()

View File

@ -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")

View File

@ -42,17 +42,6 @@
# include <QtGui/qstylehints.h>
#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) {

View File

@ -39,17 +39,6 @@
# include <QtGui/private/qmemrotate_p.h>
#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);

View File

@ -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 "$<$<CONFIG:Debug>:${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()

View File

@ -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()