Allow build as a CMake package, support the install command

Signed-off-by: Yuhang Zhao <2546789017@qq.com>
This commit is contained in:
Yuhang Zhao 2022-07-07 18:02:28 +08:00
parent 9a93475f2b
commit 2a113ee8ab
6 changed files with 177 additions and 23 deletions

View File

@ -36,6 +36,9 @@ option(FRAMELESSHELPER_BUILD_WIDGETS "Build FramelessHelper's Widgets module." O
option(FRAMELESSHELPER_BUILD_QUICK "Build FramelessHelper's Quick module." ON)
option(FRAMELESSHELPER_BUILD_EXAMPLES "Build FramelessHelper demo applications." ON)
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
if(NOT DEFINED CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
@ -99,6 +102,24 @@ find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Gui)
find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets Quick)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets Quick)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
VERSION ${PROJECT_VERSION}
COMPATIBILITY AnyNewerVersion
)
configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
NO_CHECK_REQUIRED_COMPONENTS_MACRO
)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
)
if(TARGET Qt${QT_VERSION_MAJOR}::Core AND TARGET Qt${QT_VERSION_MAJOR}::Gui)
add_subdirectory(src)
endif()

View File

@ -0,0 +1,11 @@
@PACKAGE_INIT@
set(_@PROJECT_NAME@_supported_components Core Widgets Quick)
foreach(_comp ${@PROJECT_NAME@_FIND_COMPONENTS})
if(NOT _comp IN_LIST _@PROJECT_NAME@_supported_components)
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()

View File

@ -88,14 +88,17 @@ There are some additional restrictions for each platform, please refer to the _P
```bash
git clone https://github.com/wangwenx190/framelesshelper.git
mkdir build
cd build
cmake -DCMAKE_PREFIX_PATH=<YOUR_QT_SDK_DIR_PATH> -DCMAKE_BUILD_TYPE=Release -GNinja ../framelesshelper
mkdir A_TEMP_DIR
cd A_TEMP_DIR
cmake -DCMAKE_PREFIX_PATH=<YOUR_QT_SDK_DIR_PATH> -DCMAKE_INSTALL_PREFIX=<WHERE_YOU_WANT_TO_INSTALL> -DCMAKE_BUILD_TYPE=Release -GNinja <PATH_TO_THE_REPOSITORY>
cmake --build . --config Release --target all --parallel
cmake --install . --config Release --strip
```
**IMPORTANT NOTE**: On Linux you need to install the _GTK3_ and _X11_ development packages first.
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.
## Use
### Qt Widgets

View File

@ -30,23 +30,30 @@ endif()
set(SUB_MOD_NAME Core)
set(SUB_PROJ_NAME ${PROJECT_NAME}${SUB_MOD_NAME})
set(SUB_PROJ_PATH ${PROJECT_NAME}/${SUB_MOD_NAME})
set(INCLUDE_PREFIX ../../include/${PROJECT_NAME}/${SUB_MOD_NAME})
set(INCLUDE_PREFIX ../../include/${SUB_PROJ_PATH})
configure_file(framelesshelper_version.inc.in
${PROJECT_BINARY_DIR}/framelesshelper_version.inc @ONLY)
${CMAKE_CURRENT_BINARY_DIR}/framelesshelper_version.inc @ONLY)
set(SOURCES
${PROJECT_BINARY_DIR}/framelesshelper_version.inc
set(PUBLIC_HEADERS
${CMAKE_CURRENT_BINARY_DIR}/framelesshelper_version.inc
${INCLUDE_PREFIX}/framelesshelpercore_global.h
${INCLUDE_PREFIX}/framelesshelper_qt.h
${INCLUDE_PREFIX}/framelessmanager.h
${INCLUDE_PREFIX}/utils.h
${INCLUDE_PREFIX}/chromepalette.h
)
set(PRIVATE_HEADERS
${INCLUDE_PREFIX}/private/framelessmanager_p.h
${INCLUDE_PREFIX}/private/framelessconfig_p.h
${INCLUDE_PREFIX}/private/sysapiloader_p.h
${INCLUDE_PREFIX}/private/chromepalette_p.h
)
set(SOURCES
framelesshelpercore.qrc
utils.cpp
framelesshelper_qt.cpp
@ -58,9 +65,11 @@ set(SOURCES
)
if(WIN32)
list(APPEND SOURCES
list(APPEND PUBLIC_HEADERS
${INCLUDE_PREFIX}/framelesshelper_windows.h
${INCLUDE_PREFIX}/framelesshelper_win.h
)
list(APPEND SOURCES
utils_win.cpp
framelesshelper_win.cpp
)
@ -80,11 +89,14 @@ if(WIN32 AND NOT FRAMELESSHELPER_BUILD_STATIC)
)
endif()
set(ALL_SOURCES ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ${SOURCES})
if(FRAMELESSHELPER_BUILD_STATIC)
add_library(${SUB_PROJ_NAME} STATIC ${SOURCES})
add_library(${SUB_PROJ_NAME} STATIC ${ALL_SOURCES})
else()
add_library(${SUB_PROJ_NAME} SHARED ${SOURCES})
add_library(${SUB_PROJ_NAME} SHARED ${ALL_SOURCES})
endif()
add_library(${PROJECT_NAME}::${SUB_PROJ_NAME} ALIAS ${SUB_PROJ_NAME})
add_library(${PROJECT_NAME}::${SUB_MOD_NAME} ALIAS ${SUB_PROJ_NAME})
if(FRAMELESSHELPER_BUILD_STATIC)
@ -152,5 +164,29 @@ target_link_libraries(${SUB_PROJ_NAME} PRIVATE
target_include_directories(${SUB_PROJ_NAME} PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>/${INCLUDE_PREFIX}"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>/${INCLUDE_PREFIX}/private"
"$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>/${SUB_PROJ_PATH}"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>/${SUB_PROJ_PATH}/private"
)
install(TARGETS ${SUB_PROJ_NAME}
EXPORT ${SUB_PROJ_NAME}Targets
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${SUB_PROJ_PATH}
)
export(EXPORT ${SUB_PROJ_NAME}Targets
FILE "${CMAKE_CURRENT_BINARY_DIR}/cmake/${SUB_PROJ_NAME}Targets.cmake"
NAMESPACE ${PROJECT_NAME}::
)
install(FILES ${PUBLIC_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${SUB_PROJ_PATH})
install(FILES ${PRIVATE_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${SUB_PROJ_PATH}/private)
install(EXPORT ${SUB_PROJ_NAME}Targets
FILE ${SUB_PROJ_NAME}Targets.cmake
NAMESPACE ${PROJECT_NAME}::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
)

View File

@ -27,20 +27,27 @@ find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS QuickTemplates2 QuickCont
set(SUB_MOD_NAME Quick)
set(SUB_PROJ_NAME ${PROJECT_NAME}${SUB_MOD_NAME})
set(SUB_PROJ_PATH ${PROJECT_NAME}/${SUB_MOD_NAME})
set(INCLUDE_PREFIX ../../include/${PROJECT_NAME}/${SUB_MOD_NAME})
set(INCLUDE_PREFIX ../../include/${SUB_PROJ_PATH})
set(SOURCES
set(PUBLIC_HEADERS
${INCLUDE_PREFIX}/framelesshelperquick_global.h
${INCLUDE_PREFIX}/framelessquickmodule.h
${INCLUDE_PREFIX}/framelessquickhelper.h
${INCLUDE_PREFIX}/framelessquickutils.h
${INCLUDE_PREFIX}/quickchromepalette.h
)
set(PRIVATE_HEADERS
${INCLUDE_PREFIX}/private/quickstandardsystembutton_p.h
${INCLUDE_PREFIX}/private/quickstandardtitlebar_p.h
${INCLUDE_PREFIX}/private/framelessquickhelper_p.h
${INCLUDE_PREFIX}/private/framelessquickwindow_p.h
${INCLUDE_PREFIX}/private/framelessquickwindow_p_p.h
)
set(SOURCES
quickstandardsystembutton.cpp
quickstandardtitlebar.cpp
framelessquickutils.cpp
@ -61,29 +68,47 @@ if(WIN32 AND NOT FRAMELESSHELPER_BUILD_STATIC)
)
endif()
set(ALL_SOURCES ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ${SOURCES})
if(FRAMELESSHELPER_BUILD_STATIC)
add_library(${SUB_PROJ_NAME} STATIC ${SOURCES})
add_library(${SUB_PROJ_NAME} STATIC ${ALL_SOURCES})
else()
add_library(${SUB_PROJ_NAME} SHARED ${SOURCES})
add_library(${SUB_PROJ_NAME} SHARED ${ALL_SOURCES})
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_dir ${PROJECT_BINARY_DIR}/imports)
set(__import_base_dir ${PROJECT_BINARY_DIR}/imports)
if(${FRAMELESSHELPER_IMPORT_DIR})
set(_import_dir ${FRAMELESSHELPER_IMPORT_DIR})
set(__import_base_dir ${FRAMELESSHELPER_IMPORT_DIR})
endif()
string(APPEND _import_dir /org/wangwenx190/${PROJECT_NAME})
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}
URI org.wangwenx190.${PROJECT_NAME}
VERSION 1.0
OUTPUT_DIRECTORY ${_import_dir}
OUTPUT_DIRECTORY ${__import_dir}
IMPORTS
QtQml
QtQuick
QtQuick.Controls.Basic
)
set(__lib_ext)
if(WIN32)
set(__lib_ext dll)
elseif(APPLE)
set(__lib_ext dylib)
elseif(UNIX)
set(__lib_ext so)
endif()
install(FILES
"${__import_dir}/qmldir"
"${__import_dir}/${SUB_PROJ_NAME}.qmltypes"
"${__import_dir}/${SUB_PROJ_NAME}plugin.${__lib_ext}"
DESTINATION ${CMAKE_INSTALL_PREFIX}/imports/${__import_uri}
)
endif()
if(FRAMELESSHELPER_BUILD_STATIC)
@ -138,4 +163,28 @@ target_link_libraries(${SUB_PROJ_NAME} PUBLIC
target_include_directories(${SUB_PROJ_NAME} PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>/${INCLUDE_PREFIX}"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>/${INCLUDE_PREFIX}/private"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>/${SUB_PROJ_PATH}"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>/${SUB_PROJ_PATH}/private"
)
install(TARGETS ${SUB_PROJ_NAME}
EXPORT ${SUB_PROJ_NAME}Targets
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${SUB_PROJ_PATH}
)
export(EXPORT ${SUB_PROJ_NAME}Targets
FILE "${CMAKE_CURRENT_BINARY_DIR}/cmake/${SUB_PROJ_NAME}Targets.cmake"
NAMESPACE ${PROJECT_NAME}::
)
install(FILES ${PUBLIC_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${SUB_PROJ_PATH})
install(FILES ${PRIVATE_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${SUB_PROJ_PATH}/private)
install(EXPORT ${SUB_PROJ_NAME}Targets
FILE ${SUB_PROJ_NAME}Targets.cmake
NAMESPACE ${PROJECT_NAME}::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
)

View File

@ -24,22 +24,29 @@
set(SUB_MOD_NAME Widgets)
set(SUB_PROJ_NAME ${PROJECT_NAME}${SUB_MOD_NAME})
set(SUB_PROJ_PATH ${PROJECT_NAME}/${SUB_MOD_NAME})
set(INCLUDE_PREFIX ../../include/${PROJECT_NAME}/${SUB_MOD_NAME})
set(INCLUDE_PREFIX ../../include/${SUB_PROJ_PATH})
set(SOURCES
set(PUBLIC_HEADERS
${INCLUDE_PREFIX}/framelesshelperwidgets_global.h
${INCLUDE_PREFIX}/framelesswidget.h
${INCLUDE_PREFIX}/framelessmainwindow.h
${INCLUDE_PREFIX}/standardsystembutton.h
${INCLUDE_PREFIX}/framelesswidgetshelper.h
${INCLUDE_PREFIX}/standardtitlebar.h
)
set(PRIVATE_HEADERS
${INCLUDE_PREFIX}/private/framelesswidgetshelper_p.h
${INCLUDE_PREFIX}/private/standardsystembutton_p.h
${INCLUDE_PREFIX}/private/standardtitlebar_p.h
${INCLUDE_PREFIX}/private/framelesswidget_p.h
${INCLUDE_PREFIX}/private/framelessmainwindow_p.h
${INCLUDE_PREFIX}/private/widgetssharedhelper_p.h
)
set(SOURCES
framelessmainwindow.cpp
framelesswidgetshelper.cpp
framelesswidget.cpp
@ -59,11 +66,14 @@ if(WIN32 AND NOT FRAMELESSHELPER_BUILD_STATIC)
)
endif()
set(ALL_SOURCES ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ${SOURCES})
if(FRAMELESSHELPER_BUILD_STATIC)
add_library(${SUB_PROJ_NAME} STATIC ${SOURCES})
add_library(${SUB_PROJ_NAME} STATIC ${ALL_SOURCES})
else()
add_library(${SUB_PROJ_NAME} SHARED ${SOURCES})
add_library(${SUB_PROJ_NAME} SHARED ${ALL_SOURCES})
endif()
add_library(${PROJECT_NAME}::${SUB_PROJ_NAME} ALIAS ${SUB_PROJ_NAME})
add_library(${PROJECT_NAME}::${SUB_MOD_NAME} ALIAS ${SUB_PROJ_NAME})
if(FRAMELESSHELPER_BUILD_STATIC)
@ -107,4 +117,28 @@ target_link_libraries(${SUB_PROJ_NAME} PUBLIC
target_include_directories(${SUB_PROJ_NAME} PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>/${INCLUDE_PREFIX}"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>/${INCLUDE_PREFIX}/private"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>/${SUB_PROJ_PATH}"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>/${SUB_PROJ_PATH}/private"
)
install(TARGETS ${SUB_PROJ_NAME}
EXPORT ${SUB_PROJ_NAME}Targets
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${SUB_PROJ_PATH}
)
export(EXPORT ${SUB_PROJ_NAME}Targets
FILE "${CMAKE_CURRENT_BINARY_DIR}/cmake/${SUB_PROJ_NAME}Targets.cmake"
NAMESPACE ${PROJECT_NAME}::
)
install(FILES ${PUBLIC_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${SUB_PROJ_PATH})
install(FILES ${PRIVATE_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${SUB_PROJ_PATH}/private)
install(EXPORT ${SUB_PROJ_NAME}Targets
FILE ${SUB_PROJ_NAME}Targets.cmake
NAMESPACE ${PROJECT_NAME}::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
)