Allow build as a CMake package, support the install command
Signed-off-by: Yuhang Zhao <2546789017@qq.com>
This commit is contained in:
parent
9a93475f2b
commit
2a113ee8ab
|
@ -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()
|
||||
|
|
|
@ -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()
|
|
@ -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
|
||||
|
|
|
@ -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}
|
||||
)
|
||||
|
|
|
@ -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}
|
||||
)
|
||||
|
|
|
@ -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}
|
||||
)
|
||||
|
|
Loading…
Reference in New Issue