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}") set(__qt_inst_dir "${Qt5_DIR}")
endif() endif()
# /whatever/Qt/6.4.0/gcc_64/lib/cmake/Qt6 # /whatever/Qt/6.4.0/gcc_64/lib/cmake/Qt6
set(__qt_inst_dir ${__qt_inst_dir}/../../..) cmake_path(GET __qt_inst_dir PARENT_PATH __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)
message("Qt install dir: ${__qt_inst_dir}") message("Qt install dir: ${__qt_inst_dir}")
message("Qt version: ${QT_VERSION}") message("Qt version: ${QT_VERSION}")
get_target_property(__qt_type Qt${QT_VERSION_MAJOR}::Core TYPE) 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) set(_@PROJECT_NAME@_supported_components Core Widgets Quick)
foreach(_comp ${@PROJECT_NAME@_FIND_COMPONENTS}) 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@_FOUND FALSE)
set(@PROJECT_NAME@_NOT_FOUND_MESSAGE "Unsupported component: ${_comp}") set(@PROJECT_NAME@_NOT_FOUND_MESSAGE "Unsupported component: ${_comp}")
endif() endif()
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@${_comp}Targets.cmake")
endforeach() 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 #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 FRAMELESSHELPER_BEGIN_NAMESPACE
#include "framelesshelper.version" #include "framelesshelper.version"

View File

@ -154,13 +154,54 @@ endif()
set(ALL_SOURCES ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ${SOURCES}) set(ALL_SOURCES ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ${SOURCES})
if(FRAMELESSHELPER_BUILD_STATIC) 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 ${ALL_SOURCES})
add_library(${SUB_PROJ_NAME}_static ALIAS ${SUB_PROJ_NAME})
else() 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 ${ALL_SOURCES})
add_library(${SUB_PROJ_NAME}_shared ALIAS ${SUB_PROJ_NAME})
endif() endif()
add_library(${PROJECT_NAME}::${SUB_PROJ_NAME} ALIAS ${SUB_PROJ_NAME}) add_library(${PROJECT_NAME}::${SUB_PROJ_NAME} ALIAS ${SUB_PROJ_NAME})
add_library(${PROJECT_NAME}::${SUB_MOD_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(NOT FRAMELESSHELPER_NO_BUNDLE_RESOURCE)
if(QT_VERSION VERSION_GREATER_EQUAL "6.2") if(QT_VERSION VERSION_GREATER_EQUAL "6.2")
qt_add_resources(${SUB_PROJ_NAME} framelesshelpercore qt_add_resources(${SUB_PROJ_NAME} framelesshelpercore
@ -169,7 +210,15 @@ if(NOT FRAMELESSHELPER_NO_BUNDLE_RESOURCE)
FILES FILES
"resources/fonts/iconfont.ttf" "resources/fonts/iconfont.ttf"
"resources/images/noise.png" "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() else()
target_sources(${SUB_PROJ_NAME} PRIVATE target_sources(${SUB_PROJ_NAME} PRIVATE
framelesshelpercore.qrc framelesshelpercore.qrc
@ -178,9 +227,10 @@ if(NOT FRAMELESSHELPER_NO_BUNDLE_RESOURCE)
endif() endif()
if(FRAMELESSHELPER_BUILD_STATIC) if(FRAMELESSHELPER_BUILD_STATIC)
target_compile_definitions(${SUB_PROJ_NAME} PUBLIC set(__def FRAMELESSHELPER_CORE_STATIC)
FRAMELESSHELPER_CORE_STATIC target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def})
) list(APPEND SUB_MOD_DEFS ${__def})
unset(__def)
endif() endif()
if(FRAMELESSHELPER_NO_DEBUG_OUTPUT) if(FRAMELESSHELPER_NO_DEBUG_OUTPUT)
@ -190,24 +240,27 @@ if(FRAMELESSHELPER_NO_DEBUG_OUTPUT)
endif() endif()
if(FRAMELESSHELPER_NO_BUNDLE_RESOURCE) if(FRAMELESSHELPER_NO_BUNDLE_RESOURCE)
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE set(__def FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE)
FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def})
) list(APPEND SUB_MOD_DEFS ${__def})
unset(__def)
endif() endif()
if(FRAMELESSHELPER_NO_PRIVATE) if(FRAMELESSHELPER_NO_PRIVATE)
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE set(__def FRAMELESSHELPER_CORE_NO_PRIVATE)
FRAMELESSHELPER_CORE_NO_PRIVATE target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def})
) list(APPEND SUB_MOD_DEFS ${__def})
unset(__def)
endif() endif()
if(DEFINED FRAMELESSHELPER_NAMESPACE) if(DEFINED FRAMELESSHELPER_NAMESPACE)
if("x${FRAMELESSHELPER_NAMESPACE}" STREQUAL "x") if("x${FRAMELESSHELPER_NAMESPACE}" STREQUAL "x")
message(FATAL_ERROR "FRAMELESSHELPER_NAMESPACE can't be empty!") message(FATAL_ERROR "FRAMELESSHELPER_NAMESPACE can't be empty!")
endif() endif()
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE set(__def FRAMELESSHELPER_NAMESPACE=${FRAMELESSHELPER_NAMESPACE})
FRAMELESSHELPER_NAMESPACE=${FRAMELESSHELPER_NAMESPACE} target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def})
) list(APPEND SUB_MOD_DEFS ${__def})
unset(__def)
endif() endif()
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE target_compile_definitions(${SUB_PROJ_NAME} PRIVATE
@ -287,13 +340,30 @@ if(FRAMELESSHELPER_ENABLE_CFGUARD)
endif() endif()
setup_compile_params(TARGETS ${SUB_PROJ_NAME} ${__extra_flags}) setup_compile_params(TARGETS ${SUB_PROJ_NAME} ${__extra_flags})
if(NOT FRAMELESSHELPER_NO_INSTALL) if(NOT FRAMELESSHELPER_NO_INSTALL)
setup_package_export( include(GNUInstallDirs)
TARGET ${SUB_PROJ_NAME} set(__cmake_dir "${CMAKE_CURRENT_BINARY_DIR}/cmake")
PACKAGE_NAME ${PROJECT_NAME} set(__config_file "${__cmake_dir}/${SUB_PROJ_NAME}Config.cmake")
NAMESPACE ${PROJECT_NAME} configure_file(../../FramelessHelperModuleConfig.cmake.in ${__config_file} @ONLY)
INCLUDE_PATH ${SUB_PROJ_PATH} set(__targets_file "${__cmake_dir}/${SUB_PROJ_NAME}Targets.cmake")
PUBLIC_HEADERS ${PUBLIC_HEADERS} configure_file(../../FramelessHelperModuleTargets.cmake.in ${__targets_file} @ONLY)
ALIAS_HEADERS ${PUBLIC_HEADERS_ALIAS} install(
PRIVATE_HEADERS ${PRIVATE_HEADERS} 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() endif()

View File

@ -97,6 +97,17 @@ QDebug operator<<(QDebug d, const FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::Dpi
QT_END_NAMESPACE QT_END_NAMESPACE
#endif // QT_NO_DEBUG_STREAM #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 FRAMELESSHELPER_BEGIN_NAMESPACE
static Q_LOGGING_CATEGORY(lcCoreGlobal, "wangwenx190.framelesshelper.core.global") static Q_LOGGING_CATEGORY(lcCoreGlobal, "wangwenx190.framelesshelper.core.global")

View File

@ -42,17 +42,6 @@
# include <QtGui/qstylehints.h> # include <QtGui/qstylehints.h>
#endif // (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) #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 FRAMELESSHELPER_BEGIN_NAMESPACE
static Q_LOGGING_CATEGORY(lcFramelessManager, "wangwenx190.framelesshelper.core.framelessmanager") static Q_LOGGING_CATEGORY(lcFramelessManager, "wangwenx190.framelesshelper.core.framelessmanager")
@ -151,7 +140,7 @@ void FramelessManagerPrivate::initializeIconFont()
return; return;
} }
inited = true; inited = true;
initResource(); framelesshelpercore_initResource();
// We always register this font because it's our only fallback. // We always register this font because it's our only fallback.
const int id = QFontDatabase::addApplicationFont(kIconFontFilePath); const int id = QFontDatabase::addApplicationFont(kIconFontFilePath);
if (id < 0) { if (id < 0) {

View File

@ -39,17 +39,6 @@
# include <QtGui/private/qmemrotate_p.h> # include <QtGui/private/qmemrotate_p.h>
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE #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 FRAMELESSHELPER_BEGIN_NAMESPACE
static Q_LOGGING_CATEGORY(lcMicaMaterial, "wangwenx190.framelesshelper.core.micamaterial") static Q_LOGGING_CATEGORY(lcMicaMaterial, "wangwenx190.framelesshelper.core.micamaterial")
@ -587,7 +576,7 @@ void MicaMaterialPrivate::maybeGenerateBlurredWallpaper(const bool force)
void MicaMaterialPrivate::updateMaterialBrush() void MicaMaterialPrivate::updateMaterialBrush()
{ {
#ifndef FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE #ifndef FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE
initResource(); framelesshelpercore_initResource();
static const QImage noiseTexture = QImage(kNoiseImageFilePath); static const QImage noiseTexture = QImage(kNoiseImageFilePath);
#endif // FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE #endif // FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE
QImage micaTexture = QImage(QSize(64, 64), QImage::Format_ARGB32_Premultiplied); 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}) set(ALL_SOURCES ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ${SOURCES})
if(FRAMELESSHELPER_BUILD_STATIC) 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 ${ALL_SOURCES})
add_library(${SUB_PROJ_NAME}_static ALIAS ${SUB_PROJ_NAME})
else() 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 ${ALL_SOURCES})
add_library(${SUB_PROJ_NAME}_shared ALIAS ${SUB_PROJ_NAME})
endif() endif()
add_library(${PROJECT_NAME}::${SUB_PROJ_NAME} ALIAS ${SUB_PROJ_NAME}) add_library(${PROJECT_NAME}::${SUB_PROJ_NAME} ALIAS ${SUB_PROJ_NAME})
add_library(${PROJECT_NAME}::${SUB_MOD_NAME} ALIAS ${SUB_PROJ_NAME}) add_library(${PROJECT_NAME}::${SUB_MOD_NAME} ALIAS ${SUB_PROJ_NAME})
set(__import_base_dir ${PROJECT_BINARY_DIR}/imports) set_target_properties(${SUB_PROJ_NAME} PROPERTIES
if(DEFINED FRAMELESSHELPER_IMPORT_DIR) VERSION "${PROJECT_VERSION}"
set(__import_base_dir ${FRAMELESSHELPER_IMPORT_DIR}) SOVERSION "${PROJECT_VERSION_MAJOR}"
)
set(__prefix "")
if(NOT WIN32)
set(__prefix "lib")
endif() endif()
set(__import_uri org/wangwenx190/${PROJECT_NAME}) set(__suffix "")
set(__import_dir ${__import_base_dir}/${__import_uri}) 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") if(QT_VERSION VERSION_GREATER_EQUAL "6.2")
qt_add_qml_module(${SUB_PROJ_NAME} qt_add_qml_module(${SUB_PROJ_NAME}
@ -131,13 +172,10 @@ if(QT_VERSION VERSION_GREATER_EQUAL "6.2")
if(UNIX) if(UNIX)
set(__lib_prefix lib) set(__lib_prefix lib)
endif() endif()
set(__lib_suffix) set(__lib_suffix "$<$<CONFIG:Debug>:${CMAKE_DEBUG_POSTFIX}>")
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(__lib_suffix ${CMAKE_DEBUG_POSTFIX})
endif()
set(__lib_ext) set(__lib_ext)
if(FRAMELESSHELPER_BUILD_STATIC) if(FRAMELESSHELPER_BUILD_STATIC)
if(WIN32) if(MSVC)
set(__lib_ext lib) set(__lib_ext lib)
else() else()
set(__lib_ext a) set(__lib_ext a)
@ -151,19 +189,21 @@ if(QT_VERSION VERSION_GREATER_EQUAL "6.2")
set(__lib_ext so) set(__lib_ext so)
endif() endif()
endif() endif()
install(FILES install(
FILES
"${__import_dir}/qmldir" "${__import_dir}/qmldir"
"${__import_dir}/${SUB_PROJ_NAME}.qmltypes" "${__import_dir}/${SUB_PROJ_NAME}.qmltypes"
"${__import_dir}/${__lib_prefix}${SUB_PROJ_NAME}plugin${__lib_suffix}.${__lib_ext}" "${__import_dir}/${__lib_prefix}${SUB_PROJ_NAME}plugin${__lib_suffix}.${__lib_ext}"
DESTINATION "${CMAKE_INSTALL_PREFIX}/qml/${__import_uri}" DESTINATION "qml/${__import_uri}"
) )
endif() endif()
endif() endif()
if(FRAMELESSHELPER_BUILD_STATIC) if(FRAMELESSHELPER_BUILD_STATIC)
target_compile_definitions(${SUB_PROJ_NAME} PUBLIC set(__def FRAMELESSHELPER_QUICK_STATIC)
FRAMELESSHELPER_QUICK_STATIC target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def})
) list(APPEND SUB_MOD_DEFS ${__def})
unset(__def)
endif() endif()
if(FRAMELESSHELPER_NO_DEBUG_OUTPUT) if(FRAMELESSHELPER_NO_DEBUG_OUTPUT)
@ -173,24 +213,27 @@ if(FRAMELESSHELPER_NO_DEBUG_OUTPUT)
endif() endif()
if(FRAMELESSHELPER_NO_BUNDLE_RESOURCE) if(FRAMELESSHELPER_NO_BUNDLE_RESOURCE)
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE set(__def FRAMELESSHELPER_QUICK_NO_BUNDLE_RESOURCE)
FRAMELESSHELPER_QUICK_NO_BUNDLE_RESOURCE target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def})
) list(APPEND SUB_MOD_DEFS ${__def})
unset(__def)
endif() endif()
if(FRAMELESSHELPER_NO_PRIVATE) if(FRAMELESSHELPER_NO_PRIVATE)
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE set(__def FRAMELESSHELPER_QUICK_NO_PRIVATE)
FRAMELESSHELPER_QUICK_NO_PRIVATE target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def})
) list(APPEND SUB_MOD_DEFS ${__def})
unset(__def)
endif() endif()
if(DEFINED FRAMELESSHELPER_NAMESPACE) if(DEFINED FRAMELESSHELPER_NAMESPACE)
if("x${FRAMELESSHELPER_NAMESPACE}" STREQUAL "x") if("x${FRAMELESSHELPER_NAMESPACE}" STREQUAL "x")
message(FATAL_ERROR "FRAMELESSHELPER_NAMESPACE can't be empty!") message(FATAL_ERROR "FRAMELESSHELPER_NAMESPACE can't be empty!")
endif() endif()
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE set(__def FRAMELESSHELPER_NAMESPACE=${FRAMELESSHELPER_NAMESPACE})
FRAMELESSHELPER_NAMESPACE=${FRAMELESSHELPER_NAMESPACE} target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def})
) list(APPEND SUB_MOD_DEFS ${__def})
unset(__def)
endif() endif()
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE target_compile_definitions(${SUB_PROJ_NAME} PRIVATE
@ -244,13 +287,30 @@ if(FRAMELESSHELPER_ENABLE_CFGUARD)
endif() endif()
setup_compile_params(TARGETS ${SUB_PROJ_NAME} ${__extra_flags}) setup_compile_params(TARGETS ${SUB_PROJ_NAME} ${__extra_flags})
if(NOT FRAMELESSHELPER_NO_INSTALL) if(NOT FRAMELESSHELPER_NO_INSTALL)
setup_package_export( include(GNUInstallDirs)
TARGET ${SUB_PROJ_NAME} set(__cmake_dir "${CMAKE_CURRENT_BINARY_DIR}/cmake")
PACKAGE_NAME ${PROJECT_NAME} set(__config_file "${__cmake_dir}/${SUB_PROJ_NAME}Config.cmake")
NAMESPACE ${PROJECT_NAME} configure_file(../../FramelessHelperModuleConfig.cmake.in ${__config_file} @ONLY)
INCLUDE_PATH ${SUB_PROJ_PATH} set(__targets_file "${__cmake_dir}/${SUB_PROJ_NAME}Targets.cmake")
PUBLIC_HEADERS ${PUBLIC_HEADERS} configure_file(../../FramelessHelperModuleTargets.cmake.in ${__targets_file} @ONLY)
ALIAS_HEADERS ${PUBLIC_HEADERS_ALIAS} install(
PRIVATE_HEADERS ${PRIVATE_HEADERS} 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() endif()

View File

@ -88,17 +88,59 @@ endif()
set(ALL_SOURCES ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ${SOURCES}) set(ALL_SOURCES ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ${SOURCES})
if(FRAMELESSHELPER_BUILD_STATIC) 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 ${ALL_SOURCES})
add_library(${SUB_PROJ_NAME}_static ALIAS ${SUB_PROJ_NAME})
else() 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 ${ALL_SOURCES})
add_library(${SUB_PROJ_NAME}_shared ALIAS ${SUB_PROJ_NAME})
endif() endif()
add_library(${PROJECT_NAME}::${SUB_PROJ_NAME} ALIAS ${SUB_PROJ_NAME}) add_library(${PROJECT_NAME}::${SUB_PROJ_NAME} ALIAS ${SUB_PROJ_NAME})
add_library(${PROJECT_NAME}::${SUB_MOD_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(FRAMELESSHELPER_BUILD_STATIC)
target_compile_definitions(${SUB_PROJ_NAME} PUBLIC if(MSVC)
FRAMELESSHELPER_WIDGETS_STATIC 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() endif()
if(FRAMELESSHELPER_NO_DEBUG_OUTPUT) if(FRAMELESSHELPER_NO_DEBUG_OUTPUT)
@ -108,24 +150,27 @@ if(FRAMELESSHELPER_NO_DEBUG_OUTPUT)
endif() endif()
if(FRAMELESSHELPER_NO_BUNDLE_RESOURCE) if(FRAMELESSHELPER_NO_BUNDLE_RESOURCE)
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE set(__def FRAMELESSHELPER_WIDGETS_NO_BUNDLE_RESOURCE)
FRAMELESSHELPER_WIDGETS_NO_BUNDLE_RESOURCE target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def})
) list(APPEND SUB_MOD_DEFS ${__def})
unset(__def)
endif() endif()
if(FRAMELESSHELPER_NO_PRIVATE) if(FRAMELESSHELPER_NO_PRIVATE)
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE set(__def FRAMELESSHELPER_WIDGETS_NO_PRIVATE)
FRAMELESSHELPER_WIDGETS_NO_PRIVATE target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def})
) list(APPEND SUB_MOD_DEFS ${__def})
unset(__def)
endif() endif()
if(DEFINED FRAMELESSHELPER_NAMESPACE) if(DEFINED FRAMELESSHELPER_NAMESPACE)
if("x${FRAMELESSHELPER_NAMESPACE}" STREQUAL "x") if("x${FRAMELESSHELPER_NAMESPACE}" STREQUAL "x")
message(FATAL_ERROR "FRAMELESSHELPER_NAMESPACE can't be empty!") message(FATAL_ERROR "FRAMELESSHELPER_NAMESPACE can't be empty!")
endif() endif()
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE set(__def FRAMELESSHELPER_NAMESPACE=${FRAMELESSHELPER_NAMESPACE})
FRAMELESSHELPER_NAMESPACE=${FRAMELESSHELPER_NAMESPACE} target_compile_definitions(${SUB_PROJ_NAME} PUBLIC ${__def})
) list(APPEND SUB_MOD_DEFS ${__def})
unset(__def)
endif() endif()
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE target_compile_definitions(${SUB_PROJ_NAME} PRIVATE
@ -171,13 +216,30 @@ if(FRAMELESSHELPER_ENABLE_CFGUARD)
endif() endif()
setup_compile_params(TARGETS ${SUB_PROJ_NAME} ${__extra_flags}) setup_compile_params(TARGETS ${SUB_PROJ_NAME} ${__extra_flags})
if(NOT FRAMELESSHELPER_NO_INSTALL) if(NOT FRAMELESSHELPER_NO_INSTALL)
setup_package_export( include(GNUInstallDirs)
TARGET ${SUB_PROJ_NAME} set(__cmake_dir "${CMAKE_CURRENT_BINARY_DIR}/cmake")
PACKAGE_NAME ${PROJECT_NAME} set(__config_file "${__cmake_dir}/${SUB_PROJ_NAME}Config.cmake")
NAMESPACE ${PROJECT_NAME} configure_file(../../FramelessHelperModuleConfig.cmake.in ${__config_file} @ONLY)
INCLUDE_PATH ${SUB_PROJ_PATH} set(__targets_file "${__cmake_dir}/${SUB_PROJ_NAME}Targets.cmake")
PUBLIC_HEADERS ${PUBLIC_HEADERS} configure_file(../../FramelessHelperModuleTargets.cmake.in ${__targets_file} @ONLY)
ALIAS_HEADERS ${PUBLIC_HEADERS_ALIAS} install(
PRIVATE_HEADERS ${PRIVATE_HEADERS} 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() endif()