diff --git a/CMakeLists.txt b/CMakeLists.txt index 6eb9b8c..771586f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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() diff --git a/FramelessHelperConfig.cmake.in b/FramelessHelperConfig.cmake.in new file mode 100644 index 0000000..dffe6f5 --- /dev/null +++ b/FramelessHelperConfig.cmake.in @@ -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() diff --git a/README.md b/README.md index a6bd0ff..3656434 100644 --- a/README.md +++ b/README.md @@ -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= -DCMAKE_BUILD_TYPE=Release -GNinja ../framelesshelper +mkdir A_TEMP_DIR +cd A_TEMP_DIR +cmake -DCMAKE_PREFIX_PATH= -DCMAKE_INSTALL_PREFIX= -DCMAKE_BUILD_TYPE=Release -GNinja 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 diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 1fc4d34..e1224e0 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -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 "$/${INCLUDE_PREFIX}" "$/${INCLUDE_PREFIX}/private" - "$" + "$" + "$/${SUB_PROJ_PATH}" + "$/${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} ) diff --git a/src/quick/CMakeLists.txt b/src/quick/CMakeLists.txt index 97b82c4..f936afb 100644 --- a/src/quick/CMakeLists.txt +++ b/src/quick/CMakeLists.txt @@ -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 "$/${INCLUDE_PREFIX}" "$/${INCLUDE_PREFIX}/private" + "$/${SUB_PROJ_PATH}" + "$/${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} ) diff --git a/src/widgets/CMakeLists.txt b/src/widgets/CMakeLists.txt index 00dd024..b84f62b 100644 --- a/src/widgets/CMakeLists.txt +++ b/src/widgets/CMakeLists.txt @@ -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 "$/${INCLUDE_PREFIX}" "$/${INCLUDE_PREFIX}/private" + "$/${SUB_PROJ_PATH}" + "$/${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} )