cmake: support ninja multi-config

Fixes: #231
This commit is contained in:
Yuhang Zhao 2023-06-30 16:19:17 +08:00
parent 6ccb25db0a
commit 2a49e9fcaf
10 changed files with 164 additions and 471 deletions

View File

@ -32,6 +32,7 @@ project(FramelessHelper
include(CMakeDependentOption) include(CMakeDependentOption)
# TODO: Use add_feature_info() for every option below? Is it worth doing?
option(FRAMELESSHELPER_BUILD_STATIC "Build FramelessHelper as a static library." OFF) option(FRAMELESSHELPER_BUILD_STATIC "Build FramelessHelper as a static library." OFF)
option(FRAMELESSHELPER_BUILD_WIDGETS "Build FramelessHelper's Widgets module." ON) option(FRAMELESSHELPER_BUILD_WIDGETS "Build FramelessHelper's Widgets module." ON)
option(FRAMELESSHELPER_BUILD_QUICK "Build FramelessHelper's Quick module." ON) option(FRAMELESSHELPER_BUILD_QUICK "Build FramelessHelper's Quick module." ON)
@ -121,6 +122,9 @@ if(MSVC)
endif() endif()
endif() endif()
if(FRAMELESSHELPER_ENABLE_YYTHUNKS) if(FRAMELESSHELPER_ENABLE_YYTHUNKS)
unset(YYTHUNKS_TARGET_OS)
unset(YYTHUNKS_TARGET_OS CACHE)
#unset(YYTHUNKS_TARGET_OS PARENT_SCOPE)
set(YYTHUNKS_TARGET_OS "WinXP" CACHE STRING "" FORCE) set(YYTHUNKS_TARGET_OS "WinXP" CACHE STRING "" FORCE)
include(cmake/YY-Thunks.cmake) include(cmake/YY-Thunks.cmake)
endif() endif()

View File

@ -28,12 +28,7 @@ set(_@PROJECT_NAME@_supported_components Core Widgets Quick)
foreach(_comp ${@PROJECT_NAME@_FIND_COMPONENTS}) foreach(_comp ${@PROJECT_NAME@_FIND_COMPONENTS})
if(_comp IN_LIST _@PROJECT_NAME@_supported_components) if(_comp IN_LIST _@PROJECT_NAME@_supported_components)
set(__proj_name "@PROJECT_NAME@${_comp}") include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@${_comp}Config.cmake")
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() 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}")
@ -52,3 +47,9 @@ if(NOT DEFINED @PROJECT_NAME@_FOUND)
set(@PROJECT_NAME@_COMMIT "@PROJECT_VERSION_COMMIT@") set(@PROJECT_NAME@_COMMIT "@PROJECT_VERSION_COMMIT@")
set(@PROJECT_NAME@_COMPILE_DATETIME "@PROJECT_COMPILE_DATETIME@") set(@PROJECT_NAME@_COMPILE_DATETIME "@PROJECT_COMPILE_DATETIME@")
endif() endif()
include(FeatureSummary)
set_package_properties(@PROJECT_NAME@ PROPERTIES
DESCRIPTION "@PROJECT_DESCRIPTION@"
URL "@PROJECT_HOMEPAGE_URL@"
)

View File

@ -1,59 +0,0 @@
#[[
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

@ -1,47 +0,0 @@
#[[
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_IMPLIB_FILE_NAME@"
VERSION "@PROJECT_VERSION@"
SOVERSION "@PROJECT_VERSION_MAJOR@"
__COMMIT "@PROJECT_VERSION_COMMIT@"
__COMPILE_DATETIME "@PROJECT_COMPILE_DATETIME@"
)
unset(__import_prefix)
endif()

View File

@ -147,7 +147,7 @@ cmake -DQt5_DIR=C:/Qt/5.15.2/msvc2019_64/lib/cmake/Qt5 [other parameters ...]
If there are any errors when cloning the submodules, try run `git submodule update --init --recursive --remote` in the project directory, that command will download & update all the submodules. If it fails again, try execute it multiple times until it finally succeeds. If there are any errors when cloning the submodules, try run `git submodule update --init --recursive --remote` in the project directory, that command will download & update all the submodules. If it fails again, try execute it multiple times until it finally succeeds.
Once the compilation and installation is done, you will be able to use the `find_package(FramelessHelper REQUIRED COMPONENTS Core Widgets Quick)` command to find and link to the FramelessHelper library. But before doing that, please make sure CMake knows where to find FramelessHelper, by passing the `CMAKE_PREFIX_PATH` variable to it. For example: `-DCMAKE_PREFIX_PATH=C:/my-cmake-packages;C:/my-toolchain;etc...`. Build FramelessHelper as a sub-directory of your CMake project is of course also supported. The supported FramelessHelper target names are `FramelessHelper::Core`, `FramelessHelper::Widgets` and `FramelessHelper::Quick`. Example code: Once the compilation and installation is done, you will be able to use the `find_package(FramelessHelper REQUIRED COMPONENTS Core Widgets Quick)` command to find and link to the FramelessHelper library. But before doing that, please make sure CMake knows where to find FramelessHelper, by passing the `CMAKE_PREFIX_PATH` or `FramelessHelper_DIR` variable to it. For example: `-DCMAKE_PREFIX_PATH=C:/my-cmake-packages;C:/my-toolchain;etc...` or `-DFramelessHelper_DIR=C:/Projects/FramelessHelper/lib64/cmake/FramelessHelper`. Build FramelessHelper as a sub-directory of your CMake project is of course also supported. The supported FramelessHelper target names are `FramelessHelper::Core`, `FramelessHelper::Widgets` and `FramelessHelper::Quick`. Example code:
```cmake ```cmake
# Find Qt: # Find Qt:
@ -182,8 +182,6 @@ list(REMOVE_DUPLICATES QML_IMPORT_PATH)
set(QML_IMPORT_PATH ${QML_IMPORT_PATH} CACHE STRING "Qt Creator extra QML import paths" FORCE) set(QML_IMPORT_PATH ${QML_IMPORT_PATH} CACHE STRING "Qt Creator extra QML import paths" FORCE)
``` ```
**IMPORTANT NOTE**: Currently *Ninja Multi-Config* is known to be **NOT** supported, you can only build one single configuration at a time, however, I'm planning to support it as soon as possible, in a future version.
## Use ## Use
### Qt Widgets ### Qt Widgets

2
cmake

@ -1 +1 @@
Subproject commit 35a5dbbb0ea3fe1431c1dbf75d4bc329c86d61e5 Subproject commit f41e3f888db144b5d30a3bd8d227905a391531f1

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup> <PropertyGroup>
<LibraryPath>$(MSBuildThisFileDirectory)lib;$(LibraryPath)</LibraryPath> <LibraryPath>$(MSBuildThisFileDirectory)lib64;$(MSBuildThisFileDirectory)lib64\debug;$(MSBuildThisFileDirectory)lib64\release;$(LibraryPath)</LibraryPath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="QtSettings"> <PropertyGroup Label="QtSettings">
<QtHeaderSearchPath>$(MSBuildThisFileDirectory)include;$(MSBuildThisFileDirectory)include\FramelessHelper;$(MSBuildThisFileDirectory)include\FramelessHelper\Core;$(MSBuildThisFileDirectory)include\FramelessHelper\Core\private;$(MSBuildThisFileDirectory)include\FramelessHelper\Widgets;$(MSBuildThisFileDirectory)include\FramelessHelper\Widgets\private;$(MSBuildThisFileDirectory)include\FramelessHelper\Quick;$(MSBuildThisFileDirectory)include\FramelessHelper\Quick\private;$(QtHeaderSearchPath)</QtHeaderSearchPath> <QtHeaderSearchPath>$(MSBuildThisFileDirectory)include;$(MSBuildThisFileDirectory)include\FramelessHelper;$(MSBuildThisFileDirectory)include\FramelessHelper\Core;$(MSBuildThisFileDirectory)include\FramelessHelper\Core\private;$(MSBuildThisFileDirectory)include\FramelessHelper\Widgets;$(MSBuildThisFileDirectory)include\FramelessHelper\Widgets\private;$(MSBuildThisFileDirectory)include\FramelessHelper\Quick;$(MSBuildThisFileDirectory)include\FramelessHelper\Quick\private;$(QtHeaderSearchPath)</QtHeaderSearchPath>

View File

@ -52,11 +52,11 @@ if(UNIX AND NOT APPLE)
endif() endif()
endif() endif()
set(SUB_MOD_NAME Core) set(SUB_MODULE Core)
set(SUB_PROJ_NAME ${PROJECT_NAME}${SUB_MOD_NAME}) set(SUB_MODULE_FULL_NAME ${PROJECT_NAME}${SUB_MODULE})
set(SUB_PROJ_PATH ${PROJECT_NAME}/${SUB_MOD_NAME}) set(SUB_MODULE_PATH ${PROJECT_NAME}/${SUB_MODULE})
set(INCLUDE_PREFIX ../../include/${SUB_PROJ_PATH}) set(INCLUDE_PREFIX ../../include/${SUB_MODULE_PATH})
configure_file(framelesshelper.version.in configure_file(framelesshelper.version.in
${CMAKE_CURRENT_BINARY_DIR}/framelesshelper.version @ONLY) ${CMAKE_CURRENT_BINARY_DIR}/framelesshelper.version @ONLY)
@ -142,18 +142,20 @@ elseif(UNIX)
endif() endif()
if(WIN32 AND NOT FRAMELESSHELPER_BUILD_STATIC) if(WIN32 AND NOT FRAMELESSHELPER_BUILD_STATIC)
set(__rc_path "${CMAKE_CURRENT_BINARY_DIR}/${SUB_PROJ_NAME}.rc") set(__rc_path "${CMAKE_CURRENT_BINARY_DIR}/${SUB_MODULE_FULL_NAME}.rc")
if(NOT EXISTS "${__rc_path}")
generate_win32_rc_file( generate_win32_rc_file(
PATH "${__rc_path}" PATH "${__rc_path}"
VERSION "${PROJECT_VERSION}" VERSION "${PROJECT_VERSION}"
COMPANY "wangwenx190" COMPANY "wangwenx190"
DESCRIPTION "${PROJECT_NAME} ${SUB_MOD_NAME} Module" DESCRIPTION "${PROJECT_NAME} ${SUB_MODULE} Module"
COPYRIGHT "MIT License" COPYRIGHT "MIT License"
ORIGINAL_FILENAME "${PROJECT_NAME}${SUB_MOD_NAME}.dll" ORIGINAL_FILENAME "${PROJECT_NAME}${SUB_MODULE}.dll"
PRODUCT "${PROJECT_NAME}" PRODUCT "${PROJECT_NAME}"
COMMENTS "Built from commit ${PROJECT_VERSION_COMMIT} on ${PROJECT_COMPILE_DATETIME} (UTC)." COMMENTS "Built from commit ${PROJECT_VERSION_COMMIT} on ${PROJECT_COMPILE_DATETIME} (UTC)."
LIBRARY LIBRARY
) )
endif()
list(APPEND SOURCES "${__rc_path}") list(APPEND SOURCES "${__rc_path}")
endif() endif()
@ -164,63 +166,20 @@ if(FRAMELESSHELPER_BUILD_STATIC)
else() else()
set(SUB_MOD_LIB_TYPE "SHARED") set(SUB_MOD_LIB_TYPE "SHARED")
endif() endif()
add_library(${SUB_PROJ_NAME} ${SUB_MOD_LIB_TYPE} ${ALL_SOURCES}) add_library(${SUB_MODULE} ${SUB_MOD_LIB_TYPE} ${ALL_SOURCES})
add_library(${PROJECT_NAME}::${SUB_PROJ_NAME} ALIAS ${SUB_PROJ_NAME}) add_library(${SUB_MODULE_FULL_NAME} ALIAS ${SUB_MODULE})
add_library(${PROJECT_NAME}::${SUB_MOD_NAME} ALIAS ${SUB_PROJ_NAME}) add_library(${PROJECT_NAME}::${SUB_MODULE} ALIAS ${SUB_MODULE})
add_library(${PROJECT_NAME}::${SUB_MODULE_FULL_NAME} ALIAS ${SUB_MODULE})
set_target_properties(${SUB_PROJ_NAME} PROPERTIES set_target_properties(${SUB_MODULE} PROPERTIES
VERSION "${PROJECT_VERSION}" VERSION "${PROJECT_VERSION}"
SOVERSION "${PROJECT_VERSION_MAJOR}" SOVERSION "${PROJECT_VERSION_MAJOR}"
OUTPUT_NAME "${SUB_MODULE_FULL_NAME}"
) )
set(SUB_MOD_TARGETS ${SUB_PROJ_NAME})
if(WIN32 AND NOT FRAMELESSHELPER_BUILD_STATIC)
set(SUB_MOD_LIB_DIR "${CMAKE_INSTALL_BINDIR}")
else()
set(SUB_MOD_LIB_DIR "${CMAKE_INSTALL_LIBDIR}")
endif()
set(SUB_MOD_FILE_PREFIX "")
if(NOT MSVC)
set(SUB_MOD_FILE_PREFIX "lib")
endif()
set(SUB_MOD_FILE_SUFFIX "")
set(SUB_MOD_IMPLIB_FILE_SUFFIX "")
if(FRAMELESSHELPER_BUILD_STATIC)
if(MSVC)
set(SUB_MOD_FILE_SUFFIX "lib")
set(SUB_MOD_IMPLIB_FILE_SUFFIX "lib")
else()
set(SUB_MOD_FILE_SUFFIX "a")
set(SUB_MOD_IMPLIB_FILE_SUFFIX "a")
endif()
else()
if(WIN32)
set(SUB_MOD_FILE_SUFFIX "dll")
if(MSVC)
set(SUB_MOD_IMPLIB_FILE_SUFFIX "lib")
else()
set(SUB_MOD_IMPLIB_FILE_SUFFIX "dll.a")
endif()
elseif(APPLE)
set(SUB_MOD_FILE_SUFFIX "dylib")
set(SUB_MOD_IMPLIB_FILE_SUFFIX "a")
else()
set(SUB_MOD_FILE_SUFFIX "so")
set(SUB_MOD_IMPLIB_FILE_SUFFIX "a")
endif()
endif()
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}")
set(SUB_MOD_IMPLIB_FILE_NAME "${SUB_MOD_FILE_BASENAME}.${SUB_MOD_IMPLIB_FILE_SUFFIX}")
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_MODULE} framelesshelpercore
PREFIX PREFIX
"/org.wangwenx190.${PROJECT_NAME}" "/org.wangwenx190.${PROJECT_NAME}"
FILES FILES
@ -230,114 +189,101 @@ if(NOT FRAMELESSHELPER_NO_BUNDLE_RESOURCE)
) )
if(__qrc_targets) if(__qrc_targets)
foreach(__target ${__qrc_targets}) foreach(__target ${__qrc_targets})
list(APPEND SUB_MOD_TARGETS ${__target})
if(FRAMELESSHELPER_BUILD_STATIC) if(FRAMELESSHELPER_BUILD_STATIC)
target_sources(${SUB_PROJ_NAME} PRIVATE target_sources(${SUB_MODULE} PRIVATE
$<TARGET_OBJECTS:${__target}> $<TARGET_OBJECTS:${__target}>
) )
endif() endif()
endforeach() endforeach()
endif() endif()
else() else()
target_sources(${SUB_PROJ_NAME} PRIVATE target_sources(${SUB_MODULE} PRIVATE
framelesshelpercore.qrc framelesshelpercore.qrc
) )
endif() endif()
endif() endif()
if(FRAMELESSHELPER_BUILD_STATIC) if(FRAMELESSHELPER_BUILD_STATIC)
set(__def FRAMELESSHELPER_CORE_STATIC) target_compile_definitions(${SUB_MODULE} PUBLIC 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)
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE target_compile_definitions(${SUB_MODULE} PRIVATE
FRAMELESSHELPER_CORE_NO_DEBUG_OUTPUT FRAMELESSHELPER_CORE_NO_DEBUG_OUTPUT
) )
endif() endif()
if(FRAMELESSHELPER_NO_BUNDLE_RESOURCE) if(FRAMELESSHELPER_NO_BUNDLE_RESOURCE)
set(__def FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE) target_compile_definitions(${SUB_MODULE} PUBLIC 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)
set(__def FRAMELESSHELPER_CORE_NO_PRIVATE) target_compile_definitions(${SUB_MODULE} PUBLIC 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()
set(__def FRAMELESSHELPER_NAMESPACE=${FRAMELESSHELPER_NAMESPACE}) target_compile_definitions(${SUB_MODULE} PUBLIC 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_MODULE} PRIVATE
FRAMELESSHELPER_CORE_LIBRARY FRAMELESSHELPER_CORE_LIBRARY
) )
if(APPLE) if(APPLE)
target_link_libraries(${SUB_PROJ_NAME} PRIVATE target_link_libraries(${SUB_MODULE} PRIVATE
"-framework Foundation" "-framework Foundation"
"-framework Cocoa" "-framework Cocoa"
"-framework AppKit" "-framework AppKit"
) )
elseif(UNIX) elseif(UNIX)
if(TARGET X11::xcb) if(TARGET X11::xcb)
target_link_libraries(${SUB_PROJ_NAME} PRIVATE target_link_libraries(${SUB_MODULE} PRIVATE
X11::xcb X11::xcb
) )
endif() endif()
if(TARGET PkgConfig::GTK3) if(TARGET PkgConfig::GTK3)
target_link_libraries(${SUB_PROJ_NAME} PRIVATE target_link_libraries(${SUB_MODULE} PRIVATE
PkgConfig::GTK3 PkgConfig::GTK3
) )
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE target_compile_definitions(${SUB_MODULE} PRIVATE
GDK_VERSION_MIN_REQUIRED=GDK_VERSION_3_6 GDK_VERSION_MIN_REQUIRED=GDK_VERSION_3_6
) )
endif() endif()
endif() endif()
if(FRAMELESSHELPER_NO_PRIVATE) if(FRAMELESSHELPER_NO_PRIVATE)
target_link_libraries(${SUB_PROJ_NAME} PRIVATE target_link_libraries(${SUB_MODULE} PRIVATE
Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Gui
) )
# Qt X11Extras was first introduced in 5.1 and got removed in 6.0 # Qt X11Extras was first introduced in 5.1 and got removed in 6.0
# But it was again brought back as a private feature of QtGui in 6.2 # But it was again brought back as a private feature of QtGui in 6.2
if(TARGET Qt5::X11Extras) if(TARGET Qt5::X11Extras)
target_link_libraries(${SUB_PROJ_NAME} PRIVATE target_link_libraries(${SUB_MODULE} PRIVATE
Qt5::X11Extras Qt5::X11Extras
) )
endif() endif()
else() else()
target_link_libraries(${SUB_PROJ_NAME} PRIVATE target_link_libraries(${SUB_MODULE} PRIVATE
Qt${QT_VERSION_MAJOR}::CorePrivate Qt${QT_VERSION_MAJOR}::CorePrivate
Qt${QT_VERSION_MAJOR}::GuiPrivate Qt${QT_VERSION_MAJOR}::GuiPrivate
) )
endif() endif()
target_include_directories(${SUB_PROJ_NAME} PUBLIC target_include_directories(${SUB_MODULE} PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_PREFIX}/../..>" "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_PREFIX}/../..>"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_PREFIX}>" "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_PREFIX}>"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_PREFIX}/private>" "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_PREFIX}/private>"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>" "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>" "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${SUB_PROJ_PATH}>" "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${SUB_MODULE_PATH}>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${SUB_PROJ_PATH}/private>" "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${SUB_MODULE_PATH}/private>"
) )
setup_qt_stuff(TARGETS ${SUB_PROJ_NAME}) setup_qt_stuff(TARGETS ${SUB_MODULE})
set(__extra_flags) set(__extra_flags)
if(NOT FRAMELESSHELPER_NO_PERMISSIVE_CHECKS) if(NOT FRAMELESSHELPER_NO_PERMISSIVE_CHECKS)
list(APPEND __extra_flags PERMISSIVE) list(APPEND __extra_flags PERMISSIVE)
@ -360,35 +306,19 @@ endif()
if(FRAMELESSHELPER_FORCE_LTO) if(FRAMELESSHELPER_FORCE_LTO)
list(APPEND __extra_flags FORCE_LTO) list(APPEND __extra_flags FORCE_LTO)
endif() endif()
setup_compile_params(TARGETS ${SUB_PROJ_NAME} ${__extra_flags}) setup_compile_params(TARGETS ${SUB_MODULE} ${__extra_flags})
if(NOT FRAMELESSHELPER_NO_INSTALL) if(NOT FRAMELESSHELPER_NO_INSTALL)
set(__cmake_dir "${CMAKE_CURRENT_BINARY_DIR}/cmake") setup_package_export(
set(__config_file "${__cmake_dir}/${SUB_PROJ_NAME}Config.cmake") TARGET ${SUB_MODULE}
configure_file(../../FramelessHelperModuleConfig.cmake.in ${__config_file} @ONLY) NAMESPACE ${PROJECT_NAME}
set(__targets_file "${__cmake_dir}/${SUB_PROJ_NAME}Targets.cmake") PACKAGE_NAME ${PROJECT_NAME}
configure_file(../../FramelessHelperModuleTargets.cmake.in ${__targets_file} @ONLY) INCLUDE_DIR ${SUB_MODULE}
install( PUBLIC_HEADERS ${PUBLIC_HEADERS}
FILES "${__config_file}" "${__targets_file}" ALIAS_HEADERS ${PUBLIC_HEADERS_ALIAS}
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${SUB_PROJ_NAME}" PRIVATE_HEADERS ${PRIVATE_HEADERS}
)
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_MOD_TARGETS}
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
INCLUDES DESTINATION "${__inc_dir}"
) )
endif() endif()
if(NOT FRAMELESSHELPER_NO_SUMMARY) if(NOT FRAMELESSHELPER_NO_SUMMARY)
dump_target_info(TARGETS ${SUB_PROJ_NAME}) dump_target_info(TARGETS ${SUB_MODULE})
endif() endif()

View File

@ -31,11 +31,11 @@ endif()
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS QuickTemplates2 QuickControls2) find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS QuickTemplates2 QuickControls2)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS QuickTemplates2 QuickControls2) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS QuickTemplates2 QuickControls2)
set(SUB_MOD_NAME Quick) set(SUB_MODULE Quick)
set(SUB_PROJ_NAME ${PROJECT_NAME}${SUB_MOD_NAME}) set(SUB_MODULE_FULL_NAME ${PROJECT_NAME}${SUB_MODULE})
set(SUB_PROJ_PATH ${PROJECT_NAME}/${SUB_MOD_NAME}) set(SUB_MODULE_PATH ${PROJECT_NAME}/${SUB_MODULE})
set(INCLUDE_PREFIX ../../include/${SUB_PROJ_PATH}) set(INCLUDE_PREFIX ../../include/${SUB_MODULE_PATH})
set(PUBLIC_HEADERS set(PUBLIC_HEADERS
${INCLUDE_PREFIX}/framelesshelperquick_global.h ${INCLUDE_PREFIX}/framelesshelperquick_global.h
@ -88,18 +88,20 @@ set(SOURCES
) )
if(WIN32 AND NOT FRAMELESSHELPER_BUILD_STATIC) if(WIN32 AND NOT FRAMELESSHELPER_BUILD_STATIC)
set(__rc_path "${CMAKE_CURRENT_BINARY_DIR}/${SUB_PROJ_NAME}.rc") set(__rc_path "${CMAKE_CURRENT_BINARY_DIR}/${SUB_MODULE_FULL_NAME}.rc")
if(NOT EXISTS "${__rc_path}")
generate_win32_rc_file( generate_win32_rc_file(
PATH "${__rc_path}" PATH "${__rc_path}"
VERSION "${PROJECT_VERSION}" VERSION "${PROJECT_VERSION}"
COMPANY "wangwenx190" COMPANY "wangwenx190"
DESCRIPTION "${PROJECT_NAME} ${SUB_MOD_NAME} Module" DESCRIPTION "${PROJECT_NAME} ${SUB_MODULE} Module"
COPYRIGHT "MIT License" COPYRIGHT "MIT License"
ORIGINAL_FILENAME "${PROJECT_NAME}${SUB_MOD_NAME}.dll" ORIGINAL_FILENAME "${PROJECT_NAME}${SUB_MODULE}.dll"
PRODUCT "${PROJECT_NAME}" PRODUCT "${PROJECT_NAME}"
COMMENTS "Built from commit ${PROJECT_VERSION_COMMIT} on ${PROJECT_COMPILE_DATETIME} (UTC)." COMMENTS "Built from commit ${PROJECT_VERSION_COMMIT} on ${PROJECT_COMPILE_DATETIME} (UTC)."
LIBRARY LIBRARY
) )
endif()
list(APPEND SOURCES "${__rc_path}") list(APPEND SOURCES "${__rc_path}")
endif() endif()
@ -110,58 +112,17 @@ if(FRAMELESSHELPER_BUILD_STATIC)
else() else()
set(SUB_MOD_LIB_TYPE "SHARED") set(SUB_MOD_LIB_TYPE "SHARED")
endif() endif()
add_library(${SUB_PROJ_NAME} ${SUB_MOD_LIB_TYPE} ${ALL_SOURCES}) add_library(${SUB_MODULE} ${SUB_MOD_LIB_TYPE} ${ALL_SOURCES})
add_library(${PROJECT_NAME}::${SUB_PROJ_NAME} ALIAS ${SUB_PROJ_NAME}) add_library(${SUB_MODULE_FULL_NAME} ALIAS ${SUB_MODULE})
add_library(${PROJECT_NAME}::${SUB_MOD_NAME} ALIAS ${SUB_PROJ_NAME}) add_library(${PROJECT_NAME}::${SUB_MODULE} ALIAS ${SUB_MODULE})
add_library(${PROJECT_NAME}::${SUB_MODULE_FULL_NAME} ALIAS ${SUB_MODULE})
set_target_properties(${SUB_PROJ_NAME} PROPERTIES set_target_properties(${SUB_MODULE} PROPERTIES
VERSION "${PROJECT_VERSION}" VERSION "${PROJECT_VERSION}"
SOVERSION "${PROJECT_VERSION_MAJOR}" SOVERSION "${PROJECT_VERSION_MAJOR}"
OUTPUT_NAME "${SUB_MODULE_FULL_NAME}"
) )
if(WIN32 AND NOT FRAMELESSHELPER_BUILD_STATIC)
set(SUB_MOD_LIB_DIR "${CMAKE_INSTALL_BINDIR}")
else()
set(SUB_MOD_LIB_DIR "${CMAKE_INSTALL_LIBDIR}")
endif()
set(SUB_MOD_FILE_PREFIX "")
if(NOT MSVC)
set(SUB_MOD_FILE_PREFIX "lib")
endif()
set(SUB_MOD_FILE_SUFFIX "")
set(SUB_MOD_IMPLIB_FILE_SUFFIX "")
if(FRAMELESSHELPER_BUILD_STATIC)
if(MSVC)
set(SUB_MOD_FILE_SUFFIX "lib")
set(SUB_MOD_IMPLIB_FILE_SUFFIX "lib")
else()
set(SUB_MOD_FILE_SUFFIX "a")
set(SUB_MOD_IMPLIB_FILE_SUFFIX "a")
endif()
else()
if(WIN32)
set(SUB_MOD_FILE_SUFFIX "dll")
if(MSVC)
set(SUB_MOD_IMPLIB_FILE_SUFFIX "lib")
else()
set(SUB_MOD_IMPLIB_FILE_SUFFIX "dll.a")
endif()
elseif(APPLE)
set(SUB_MOD_FILE_SUFFIX "dylib")
set(SUB_MOD_IMPLIB_FILE_SUFFIX "a")
else()
set(SUB_MOD_FILE_SUFFIX "so")
set(SUB_MOD_IMPLIB_FILE_SUFFIX "a")
endif()
endif()
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}")
set(SUB_MOD_IMPLIB_FILE_NAME "${SUB_MOD_FILE_BASENAME}.${SUB_MOD_IMPLIB_FILE_SUFFIX}")
set(__import_base_dir "${PROJECT_BINARY_DIR}/imports") set(__import_base_dir "${PROJECT_BINARY_DIR}/imports")
if(DEFINED FRAMELESSHELPER_IMPORT_DIR) if(DEFINED FRAMELESSHELPER_IMPORT_DIR)
set(__import_base_dir "${FRAMELESSHELPER_IMPORT_DIR}") set(__import_base_dir "${FRAMELESSHELPER_IMPORT_DIR}")
@ -173,7 +134,7 @@ endif()
# calculate the generated files, which will also break Ninja Multi-Config # calculate the generated files, which will also break Ninja Multi-Config
# builds. # builds.
if(QT_VERSION VERSION_GREATER_EQUAL "6.3") if(QT_VERSION VERSION_GREATER_EQUAL "6.3")
qt_add_qml_module(${SUB_PROJ_NAME} qt_add_qml_module(${SUB_MODULE}
URI "org.wangwenx190.${PROJECT_NAME}" URI "org.wangwenx190.${PROJECT_NAME}"
VERSION "1.0" VERSION "1.0"
OUTPUT_DIRECTORY "${__import_base_dir}/org/wangwenx190/${PROJECT_NAME}" OUTPUT_DIRECTORY "${__import_base_dir}/org/wangwenx190/${PROJECT_NAME}"
@ -193,14 +154,14 @@ if(QT_VERSION VERSION_GREATER_EQUAL "6.3")
# and thus it causes linker errors for our users, # and thus it causes linker errors for our users,
# so we need this hack here. # so we need this hack here.
if(FRAMELESSHELPER_BUILD_STATIC) if(FRAMELESSHELPER_BUILD_STATIC)
target_sources(${SUB_PROJ_NAME} PRIVATE target_sources(${SUB_MODULE} PRIVATE
$<TARGET_OBJECTS:${__target}> $<TARGET_OBJECTS:${__target}>
) )
endif() endif()
endforeach() endforeach()
endif() endif()
if(NOT FRAMELESSHELPER_NO_INSTALL) if(NOT FRAMELESSHELPER_NO_INSTALL)
qt_query_qml_module(${SUB_PROJ_NAME} qt_query_qml_module(${SUB_MODULE}
URI module_uri URI module_uri
VERSION module_version VERSION module_version
PLUGIN_TARGET module_plugin_target PLUGIN_TARGET module_plugin_target
@ -252,72 +213,60 @@ if(QT_VERSION VERSION_GREATER_EQUAL "6.3")
endif() endif()
if(FRAMELESSHELPER_BUILD_STATIC) if(FRAMELESSHELPER_BUILD_STATIC)
set(__def FRAMELESSHELPER_QUICK_STATIC) target_compile_definitions(${SUB_MODULE} PUBLIC 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)
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE target_compile_definitions(${SUB_MODULE} PRIVATE
FRAMELESSHELPER_QUICK_NO_DEBUG_OUTPUT FRAMELESSHELPER_QUICK_NO_DEBUG_OUTPUT
) )
endif() endif()
if(FRAMELESSHELPER_NO_BUNDLE_RESOURCE) if(FRAMELESSHELPER_NO_BUNDLE_RESOURCE)
set(__def FRAMELESSHELPER_QUICK_NO_BUNDLE_RESOURCE) target_compile_definitions(${SUB_MODULE} PUBLIC 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)
set(__def FRAMELESSHELPER_QUICK_NO_PRIVATE) target_compile_definitions(${SUB_MODULE} PUBLIC 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()
set(__def FRAMELESSHELPER_NAMESPACE=${FRAMELESSHELPER_NAMESPACE}) target_compile_definitions(${SUB_MODULE} PUBLIC 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_MODULE} PRIVATE
FRAMELESSHELPER_QUICK_LIBRARY FRAMELESSHELPER_QUICK_LIBRARY
) )
if(FRAMELESSHELPER_NO_PRIVATE) if(FRAMELESSHELPER_NO_PRIVATE)
target_link_libraries(${SUB_PROJ_NAME} PRIVATE target_link_libraries(${SUB_MODULE} PRIVATE
Qt${QT_VERSION_MAJOR}::Quick Qt${QT_VERSION_MAJOR}::Quick
) )
else() else()
target_link_libraries(${SUB_PROJ_NAME} PRIVATE target_link_libraries(${SUB_MODULE} PRIVATE
Qt${QT_VERSION_MAJOR}::QuickPrivate Qt${QT_VERSION_MAJOR}::QuickPrivate
Qt${QT_VERSION_MAJOR}::QuickTemplates2Private Qt${QT_VERSION_MAJOR}::QuickTemplates2Private
Qt${QT_VERSION_MAJOR}::QuickControls2Private Qt${QT_VERSION_MAJOR}::QuickControls2Private
) )
endif() endif()
target_link_libraries(${SUB_PROJ_NAME} PUBLIC target_link_libraries(${SUB_MODULE} PUBLIC
${PROJECT_NAME}::Core ${PROJECT_NAME}::Core
) )
target_include_directories(${SUB_PROJ_NAME} PUBLIC target_include_directories(${SUB_MODULE} PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_PREFIX}/../..>" "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_PREFIX}/../..>"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_PREFIX}>" "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_PREFIX}>"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_PREFIX}/private>" "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_PREFIX}/private>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>" "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${SUB_PROJ_PATH}>" "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${SUB_MODULE_PATH}>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${SUB_PROJ_PATH}/private>" "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${SUB_MODULE_PATH}/private>"
) )
setup_qt_stuff(TARGETS ${SUB_PROJ_NAME} ALLOW_KEYWORD) setup_qt_stuff(TARGETS ${SUB_MODULE} ALLOW_KEYWORD)
set(__extra_flags) set(__extra_flags)
if(NOT FRAMELESSHELPER_NO_PERMISSIVE_CHECKS) if(NOT FRAMELESSHELPER_NO_PERMISSIVE_CHECKS)
list(APPEND __extra_flags PERMISSIVE) list(APPEND __extra_flags PERMISSIVE)
@ -340,35 +289,19 @@ endif()
if(FRAMELESSHELPER_FORCE_LTO) if(FRAMELESSHELPER_FORCE_LTO)
list(APPEND __extra_flags FORCE_LTO) list(APPEND __extra_flags FORCE_LTO)
endif() endif()
setup_compile_params(TARGETS ${SUB_PROJ_NAME} ${__extra_flags}) setup_compile_params(TARGETS ${SUB_MODULE} ${__extra_flags})
if(NOT FRAMELESSHELPER_NO_INSTALL) if(NOT FRAMELESSHELPER_NO_INSTALL)
set(__cmake_dir "${CMAKE_CURRENT_BINARY_DIR}/cmake") setup_package_export(
set(__config_file "${__cmake_dir}/${SUB_PROJ_NAME}Config.cmake") TARGET ${SUB_MODULE}
configure_file(../../FramelessHelperModuleConfig.cmake.in ${__config_file} @ONLY) NAMESPACE ${PROJECT_NAME}
set(__targets_file "${__cmake_dir}/${SUB_PROJ_NAME}Targets.cmake") PACKAGE_NAME ${PROJECT_NAME}
configure_file(../../FramelessHelperModuleTargets.cmake.in ${__targets_file} @ONLY) INCLUDE_DIR ${SUB_MODULE}
install( PUBLIC_HEADERS ${PUBLIC_HEADERS}
FILES "${__config_file}" "${__targets_file}" ALIAS_HEADERS ${PUBLIC_HEADERS_ALIAS}
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${SUB_PROJ_NAME}" PRIVATE_HEADERS ${PRIVATE_HEADERS}
)
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()
if(NOT FRAMELESSHELPER_NO_SUMMARY) if(NOT FRAMELESSHELPER_NO_SUMMARY)
dump_target_info(TARGETS ${SUB_PROJ_NAME}) dump_target_info(TARGETS ${SUB_MODULE})
endif() endif()

View File

@ -28,11 +28,11 @@ if(FRAMELESSHELPER_ENABLE_UNIVERSAL_BUILD)
set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64" CACHE STRING "" FORCE) set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64" CACHE STRING "" FORCE)
endif() endif()
set(SUB_MOD_NAME Widgets) set(SUB_MODULE Widgets)
set(SUB_PROJ_NAME ${PROJECT_NAME}${SUB_MOD_NAME}) set(SUB_MODULE_FULL_NAME ${PROJECT_NAME}${SUB_MODULE})
set(SUB_PROJ_PATH ${PROJECT_NAME}/${SUB_MOD_NAME}) set(SUB_MODULE_PATH ${PROJECT_NAME}/${SUB_MODULE})
set(INCLUDE_PREFIX ../../include/${SUB_PROJ_PATH}) set(INCLUDE_PREFIX ../../include/${SUB_MODULE_PATH})
set(PUBLIC_HEADERS set(PUBLIC_HEADERS
${INCLUDE_PREFIX}/framelesshelperwidgets_global.h ${INCLUDE_PREFIX}/framelesshelperwidgets_global.h
@ -76,18 +76,20 @@ set(SOURCES
) )
if(WIN32 AND NOT FRAMELESSHELPER_BUILD_STATIC) if(WIN32 AND NOT FRAMELESSHELPER_BUILD_STATIC)
set(__rc_path "${CMAKE_CURRENT_BINARY_DIR}/${SUB_PROJ_NAME}.rc") set(__rc_path "${CMAKE_CURRENT_BINARY_DIR}/${SUB_MODULE_FULL_NAME}.rc")
if(NOT EXISTS "${__rc_path}")
generate_win32_rc_file( generate_win32_rc_file(
PATH "${__rc_path}" PATH "${__rc_path}"
VERSION "${PROJECT_VERSION}" VERSION "${PROJECT_VERSION}"
COMPANY "wangwenx190" COMPANY "wangwenx190"
DESCRIPTION "${PROJECT_NAME} ${SUB_MOD_NAME} Module" DESCRIPTION "${PROJECT_NAME} ${SUB_MODULE} Module"
COPYRIGHT "MIT License" COPYRIGHT "MIT License"
ORIGINAL_FILENAME "${PROJECT_NAME}${SUB_MOD_NAME}.dll" ORIGINAL_FILENAME "${PROJECT_NAME}${SUB_MODULE}.dll"
PRODUCT "${PROJECT_NAME}" PRODUCT "${PROJECT_NAME}"
COMMENTS "Built from commit ${PROJECT_VERSION_COMMIT} on ${PROJECT_COMPILE_DATETIME} (UTC)." COMMENTS "Built from commit ${PROJECT_VERSION_COMMIT} on ${PROJECT_COMPILE_DATETIME} (UTC)."
LIBRARY LIBRARY
) )
endif()
list(APPEND SOURCES "${__rc_path}") list(APPEND SOURCES "${__rc_path}")
endif() endif()
@ -98,117 +100,64 @@ if(FRAMELESSHELPER_BUILD_STATIC)
else() else()
set(SUB_MOD_LIB_TYPE "SHARED") set(SUB_MOD_LIB_TYPE "SHARED")
endif() endif()
add_library(${SUB_PROJ_NAME} ${SUB_MOD_LIB_TYPE} ${ALL_SOURCES}) add_library(${SUB_MODULE} ${SUB_MOD_LIB_TYPE} ${ALL_SOURCES})
add_library(${PROJECT_NAME}::${SUB_PROJ_NAME} ALIAS ${SUB_PROJ_NAME}) add_library(${SUB_MODULE_FULL_NAME} ALIAS ${SUB_MODULE})
add_library(${PROJECT_NAME}::${SUB_MOD_NAME} ALIAS ${SUB_PROJ_NAME}) add_library(${PROJECT_NAME}::${SUB_MODULE} ALIAS ${SUB_MODULE})
add_library(${PROJECT_NAME}::${SUB_MODULE_FULL_NAME} ALIAS ${SUB_MODULE})
set_target_properties(${SUB_PROJ_NAME} PROPERTIES set_target_properties(${SUB_MODULE} PROPERTIES
VERSION "${PROJECT_VERSION}" VERSION "${PROJECT_VERSION}"
SOVERSION "${PROJECT_VERSION_MAJOR}" SOVERSION "${PROJECT_VERSION_MAJOR}"
OUTPUT_NAME "${SUB_MODULE_FULL_NAME}"
) )
if(WIN32 AND NOT FRAMELESSHELPER_BUILD_STATIC)
set(SUB_MOD_LIB_DIR "${CMAKE_INSTALL_BINDIR}")
else()
set(SUB_MOD_LIB_DIR "${CMAKE_INSTALL_LIBDIR}")
endif()
set(SUB_MOD_FILE_PREFIX "")
if(NOT MSVC)
set(SUB_MOD_FILE_PREFIX "lib")
endif()
set(SUB_MOD_FILE_SUFFIX "")
set(SUB_MOD_IMPLIB_FILE_SUFFIX "")
if(FRAMELESSHELPER_BUILD_STATIC) if(FRAMELESSHELPER_BUILD_STATIC)
if(MSVC) target_compile_definitions(${SUB_MODULE} PUBLIC FRAMELESSHELPER_WIDGETS_STATIC)
set(SUB_MOD_FILE_SUFFIX "lib")
set(SUB_MOD_IMPLIB_FILE_SUFFIX "lib")
else()
set(SUB_MOD_FILE_SUFFIX "a")
set(SUB_MOD_IMPLIB_FILE_SUFFIX "a")
endif()
else()
if(WIN32)
set(SUB_MOD_FILE_SUFFIX "dll")
if(MSVC)
set(SUB_MOD_IMPLIB_FILE_SUFFIX "lib")
else()
set(SUB_MOD_IMPLIB_FILE_SUFFIX "dll.a")
endif()
elseif(APPLE)
set(SUB_MOD_FILE_SUFFIX "dylib")
set(SUB_MOD_IMPLIB_FILE_SUFFIX "a")
else()
set(SUB_MOD_FILE_SUFFIX "so")
set(SUB_MOD_IMPLIB_FILE_SUFFIX "a")
endif()
endif()
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}")
set(SUB_MOD_IMPLIB_FILE_NAME "${SUB_MOD_FILE_BASENAME}.${SUB_MOD_IMPLIB_FILE_SUFFIX}")
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)
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE target_compile_definitions(${SUB_MODULE} PRIVATE
FRAMELESSHELPER_WIDGETS_NO_DEBUG_OUTPUT FRAMELESSHELPER_WIDGETS_NO_DEBUG_OUTPUT
) )
endif() endif()
if(FRAMELESSHELPER_NO_BUNDLE_RESOURCE) if(FRAMELESSHELPER_NO_BUNDLE_RESOURCE)
set(__def FRAMELESSHELPER_WIDGETS_NO_BUNDLE_RESOURCE) target_compile_definitions(${SUB_MODULE} PUBLIC 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)
set(__def FRAMELESSHELPER_WIDGETS_NO_PRIVATE) target_compile_definitions(${SUB_MODULE} PUBLIC 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()
set(__def FRAMELESSHELPER_NAMESPACE=${FRAMELESSHELPER_NAMESPACE}) target_compile_definitions(${SUB_MODULE} PUBLIC 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_MODULE} PRIVATE
FRAMELESSHELPER_WIDGETS_LIBRARY FRAMELESSHELPER_WIDGETS_LIBRARY
) )
target_link_libraries(${SUB_PROJ_NAME} PRIVATE target_link_libraries(${SUB_MODULE} PRIVATE
Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Widgets
) )
target_link_libraries(${SUB_PROJ_NAME} PUBLIC target_link_libraries(${SUB_MODULE} PUBLIC
${PROJECT_NAME}::Core ${PROJECT_NAME}::Core
) )
target_include_directories(${SUB_PROJ_NAME} PUBLIC target_include_directories(${SUB_MODULE} PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_PREFIX}/../..>" "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_PREFIX}/../..>"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_PREFIX}>" "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_PREFIX}>"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_PREFIX}/private>" "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_PREFIX}/private>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>" "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${SUB_PROJ_PATH}>" "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${SUB_MODULE_PATH}>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${SUB_PROJ_PATH}/private>" "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${SUB_MODULE_PATH}/private>"
) )
setup_qt_stuff(TARGETS ${SUB_PROJ_NAME}) setup_qt_stuff(TARGETS ${SUB_MODULE})
set(__extra_flags) set(__extra_flags)
if(NOT FRAMELESSHELPER_NO_PERMISSIVE_CHECKS) if(NOT FRAMELESSHELPER_NO_PERMISSIVE_CHECKS)
list(APPEND __extra_flags PERMISSIVE) list(APPEND __extra_flags PERMISSIVE)
@ -231,35 +180,19 @@ endif()
if(FRAMELESSHELPER_FORCE_LTO) if(FRAMELESSHELPER_FORCE_LTO)
list(APPEND __extra_flags FORCE_LTO) list(APPEND __extra_flags FORCE_LTO)
endif() endif()
setup_compile_params(TARGETS ${SUB_PROJ_NAME} ${__extra_flags}) setup_compile_params(TARGETS ${SUB_MODULE} ${__extra_flags})
if(NOT FRAMELESSHELPER_NO_INSTALL) if(NOT FRAMELESSHELPER_NO_INSTALL)
set(__cmake_dir "${CMAKE_CURRENT_BINARY_DIR}/cmake") setup_package_export(
set(__config_file "${__cmake_dir}/${SUB_PROJ_NAME}Config.cmake") TARGET ${SUB_MODULE}
configure_file(../../FramelessHelperModuleConfig.cmake.in ${__config_file} @ONLY) NAMESPACE ${PROJECT_NAME}
set(__targets_file "${__cmake_dir}/${SUB_PROJ_NAME}Targets.cmake") PACKAGE_NAME ${PROJECT_NAME}
configure_file(../../FramelessHelperModuleTargets.cmake.in ${__targets_file} @ONLY) INCLUDE_DIR ${SUB_MODULE}
install( PUBLIC_HEADERS ${PUBLIC_HEADERS}
FILES "${__config_file}" "${__targets_file}" ALIAS_HEADERS ${PUBLIC_HEADERS_ALIAS}
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${SUB_PROJ_NAME}" PRIVATE_HEADERS ${PRIVATE_HEADERS}
)
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()
if(NOT FRAMELESSHELPER_NO_SUMMARY) if(NOT FRAMELESSHELPER_NO_SUMMARY)
dump_target_info(TARGETS ${SUB_PROJ_NAME}) dump_target_info(TARGETS ${SUB_MODULE})
endif() endif()