From 49836345683bb4bf859ddd5214b2abea2521dcd1 Mon Sep 17 00:00:00 2001 From: Alexander Kavon Date: Thu, 21 Dec 2023 02:43:22 -0500 Subject: [PATCH 01/13] updated cmake install() destinations --- cmake/QskBuildFunctions.cmake | 2 +- qmlexport/CMakeLists.txt | 4 +++- src/CMakeLists.txt | 6 +++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/cmake/QskBuildFunctions.cmake b/cmake/QskBuildFunctions.cmake index 38fee091..11de4bf2 100644 --- a/cmake/QskBuildFunctions.cmake +++ b/cmake/QskBuildFunctions.cmake @@ -65,7 +65,7 @@ function(qsk_add_plugin target TYPE CLASS_NAME) set_target_properties( ${target} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/plugins/${TYPE}) - install(TARGETS ${target} DESTINATION "plugins/${TYPE}" ) + install(TARGETS ${target} DESTINATION "${CMAKE_INSTALL_LIBDIR}/qskinny/plugins/${TYPE}" ) set_target_properties(${target} PROPERTIES INSTALL_RPATH "\${ORIGIN}/../../lib" ) diff --git a/qmlexport/CMakeLists.txt b/qmlexport/CMakeLists.txt index ef245952..d59ad5b4 100644 --- a/qmlexport/CMakeLists.txt +++ b/qmlexport/CMakeLists.txt @@ -22,4 +22,6 @@ endif() set_target_properties(${target} PROPERTIES FOLDER libs) -install(TARGETS ${target} ) +install(TARGETS ${target} + PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${target}" +) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3906ad94..f8e9ee0c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -514,4 +514,8 @@ set_target_properties(${target} PROPERTIES PUBLIC_HEADER "${HEADERS}") set_target_properties(${target} PROPERTIES VERSION ${CMAKE_PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} ) -install(TARGETS ${target} ) +# Set the library destination to ensure an organized library + plugins dir +install(TARGETS ${target} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/${target} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${target} +) From ffe2394d0bd930ed1bcc60d1c40e77e1a0d3f2c9 Mon Sep 17 00:00:00 2001 From: Alexander Kavon Date: Thu, 21 Dec 2023 02:58:01 -0500 Subject: [PATCH 02/13] updated README.md and chapter 3 docs to remove mention of qmake --- .gitignore | 1 + .../03-writing-your-first-application.asciidoc | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 32698b35..138bebe4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ Makefile .qmake.stash .uuid +build obj moc rcc diff --git a/doc/tutorials/03-writing-your-first-application.asciidoc b/doc/tutorials/03-writing-your-first-application.asciidoc index b912e892..1e7015c8 100644 --- a/doc/tutorials/03-writing-your-first-application.asciidoc +++ b/doc/tutorials/03-writing-your-first-application.asciidoc @@ -11,9 +11,8 @@ layout: docs === Building the QSkinny repository In this chapter we will write a simple QSkinny application on Linux from scratch. -As a prerequisite, a recent Qt version (>= 5.6) should be available and the directory of -its `qmake` binary in the current `$PATH`. On debian bullseye we need to install -these packages `build-essential qt-qmake qtbase5-dev qtbase5-private-dev +As a prerequisite, a recent Qt version (>= 5.6) should be available. On debian bullseye we need to install +these packages `build-essential qtbase5-dev qtbase5-private-dev qtdeclarative5-dev qtdeclarative5-private-dev libqt5svg5-dev`. Then we can build and install QSkinny to `/opt/qskinny` with the following commands: @@ -23,8 +22,9 @@ Then we can build and install QSkinny to `/opt/qskinny` with the following comma cd /home/user/dev/ git clone https://github.com/uwerat/qskinny.git cd qskinny -PREFIX=/opt/qskinny qmake -r -make +mkdir build +cd build +cmake ../ && make sudo make install .... From fc72a95aafd8e3eba215a7e21b3381f1e55b8191 Mon Sep 17 00:00:00 2001 From: Alexander Kavon Date: Thu, 21 Dec 2023 18:26:14 -0500 Subject: [PATCH 03/13] updated project paths to namespace qskinny, project namespace should be project name, reused qsk_install_* variables --- CMakeLists.txt | 15 ++++++++------- cmake/QskBuildFunctions.cmake | 2 +- src/CMakeLists.txt | 6 ++---- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 21ee66fd..1b058b56 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,8 +62,9 @@ macro(qsk_setup_build) endmacro() macro(qsk_setup_install) - set(QSK_INSTALL_HEADERS include) - set(QSK_INSTALL_LIBS lib) + string(TOLOWER "${PROJECT_NAME}" PACKAGE_DIR) + set(QSK_INSTALL_HEADERS "${CMAKE_INSTALL_INCLUDEDIR}/${PACKAGE_DIR}") + set(QSK_INSTALL_LIBS "${CMAKE_INSTALL_LIBDIR}/${PACKAGE_DIR}") endmacro() ############################################################################ @@ -122,8 +123,8 @@ endif() # packaging set(PACKAGE_NAME ${PROJECT_NAME}) set(PACKAGE_VERSION ${CMAKE_PROJECT_VERSION}) -set(PACKAGE_NAMESPACE Qsk) -set(PACKAGE_LOCATION ${QSK_INSTALL_LIBS}/cmake/${PROJECT_NAME}) +set(PACKAGE_NAMESPACE ${PROJECT_NAME}) +set(PACKAGE_LOCATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) install(TARGETS qskinny EXPORT ${PACKAGE_NAME}Targets LIBRARY DESTINATION ${QSK_INSTALL_LIBS} @@ -140,7 +141,7 @@ write_basic_package_version_file( export(EXPORT ${PACKAGE_NAME}Targets FILE ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}/${PACKAGE_NAME}Targets.cmake - NAMESPACE ${PACKAGE_NAMESPACE}::) + NAMESPACE "${PACKAGE_NAMESPACE}::") configure_file(cmake/${PACKAGE_NAME}Config.cmake ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}/${PACKAGE_NAME}Config.cmake @@ -150,7 +151,7 @@ install(EXPORT ${PACKAGE_NAME}Targets FILE ${PACKAGE_NAME}Targets.cmake NAMESPACE - ${PACKAGE_NAMESPACE}:: + "${PACKAGE_NAMESPACE}::" DESTINATION ${PACKAGE_LOCATION}) @@ -162,4 +163,4 @@ install( DESTINATION ${PACKAGE_LOCATION} COMPONENT - Devel) \ No newline at end of file + Devel) diff --git a/cmake/QskBuildFunctions.cmake b/cmake/QskBuildFunctions.cmake index 11de4bf2..748d849b 100644 --- a/cmake/QskBuildFunctions.cmake +++ b/cmake/QskBuildFunctions.cmake @@ -65,7 +65,7 @@ function(qsk_add_plugin target TYPE CLASS_NAME) set_target_properties( ${target} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/plugins/${TYPE}) - install(TARGETS ${target} DESTINATION "${CMAKE_INSTALL_LIBDIR}/qskinny/plugins/${TYPE}" ) + install(TARGETS ${target} DESTINATION "${QSK_INSTALL_LIBS}/plugins/${TYPE}" ) set_target_properties(${target} PROPERTIES INSTALL_RPATH "\${ORIGIN}/../../lib" ) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f8e9ee0c..80ed914a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -511,11 +511,9 @@ set_target_properties(${target} list(TRANSFORM HEADERS PREPEND "${CMAKE_CURRENT_LIST_DIR}/") set_target_properties(${target} PROPERTIES PUBLIC_HEADER "${HEADERS}") +set_target_properties(${target} PROPERTIES EXPORT_NAME ${PROJECT_NAME}) set_target_properties(${target} PROPERTIES VERSION ${CMAKE_PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} ) # Set the library destination to ensure an organized library + plugins dir -install(TARGETS ${target} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/${target} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${target} -) +install(TARGETS ${target}) From 7c4eac807bd2803c7b3113f52d60d9780a8bad76 Mon Sep 17 00:00:00 2001 From: Alexander Kavon Date: Fri, 22 Dec 2023 02:55:01 -0500 Subject: [PATCH 04/13] updated chapter 03 tutorial to use CmakeLists.txt and proper build commands --- ...03-writing-your-first-application.asciidoc | 59 +++++++++++-------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/doc/tutorials/03-writing-your-first-application.asciidoc b/doc/tutorials/03-writing-your-first-application.asciidoc index 1e7015c8..884998e9 100644 --- a/doc/tutorials/03-writing-your-first-application.asciidoc +++ b/doc/tutorials/03-writing-your-first-application.asciidoc @@ -17,15 +17,13 @@ qtdeclarative5-dev qtdeclarative5-private-dev libqt5svg5-dev`. Then we can build and install QSkinny to `/opt/qskinny` with the following commands: -[source,xml] +[source,shell] .... -cd /home/user/dev/ -git clone https://github.com/uwerat/qskinny.git -cd qskinny -mkdir build -cd build -cmake ../ && make -sudo make install +$ git clone https://github.com/uwerat/qskinny.git +$ cd qskinny +$ mkdir build && cd build +$ cmake ../ && make +$ sudo make install .... === Compiling our first app @@ -52,40 +50,49 @@ int main( int argc, char* argv[] ) For now this will just create an empty window (the `QskWindow`) without any controls. Next, we need to create a `myapp.pro` file in our `myapp` directory. -.myapp.pro -[source,xml] +.CMakeLists.txt +[source,cmake] .... -TEMPLATE = app -TARGET = myapp +cmake_minimum_required(VERSION 3.27) -QT *= quick +project(myapp + VERSION 1.0.0 + LANGUAGES CXX) -QSK_ROOT=/opt/qskinny +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) -INCLUDEPATH += $${QSK_ROOT}/include -LIBS += -L$${QSK_ROOT}/lib -lqskinny +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_AUTOUIC ON) -QMAKE_RPATHDIR *= $${QSK_ROOT}/lib +find_package(Qt5 REQUIRED COMPONENTS Widgets Quick) +find_package(QSkinny REQUIRED) -SOURCES += \ - main.cpp +add_executable(myapp + src/main.cpp) + +target_link_libraries(kue PRIVATE + Qt5::Widgets + Qt5::Quick + QSkinny::QSkinny) .... Now we can compile our app: -[source,xml] +[source,shell] .... -cd myapp -qmake -make +$ cd myapp +$ mkdir build && cd build +$ cmake ../ && make .... When running myapp it needs to find the skin plugins. Setting QT_PLUGIN_PATH is one option ( see https://doc.qt.io/qt-5/deployment-plugins.html ): -[source,xml] +[source,shell] .... -QT_PLUGIN_PATH=/opt/qskinny/plugins ./myapp +$ QT_PLUGIN_PATH=/opt/qskinny/plugins ./myapp .... This should show just an empty window. @@ -95,7 +102,7 @@ This should show just an empty window. Now that we have our app running, we can add some UI controls to it by extending the `main.cpp` file we created earlier. We will add some additional include directives, and then create a horizontal layout containing two push buttons. The layout with the two buttons will be shown in the window. Below is the complete updated source file: .main.cpp -[source] +[source, cpp] .... #include #include From e1f2a54ae3b9a93828c37b2b0eebdb8fdd3cccb3 Mon Sep 17 00:00:00 2001 From: Alexander Kavon Date: Fri, 22 Dec 2023 03:07:46 -0500 Subject: [PATCH 05/13] removed unneccessary quotes --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1b058b56..4be18444 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -141,7 +141,7 @@ write_basic_package_version_file( export(EXPORT ${PACKAGE_NAME}Targets FILE ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}/${PACKAGE_NAME}Targets.cmake - NAMESPACE "${PACKAGE_NAMESPACE}::") + NAMESPACE ${PACKAGE_NAMESPACE}::) configure_file(cmake/${PACKAGE_NAME}Config.cmake ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}/${PACKAGE_NAME}Config.cmake @@ -151,7 +151,7 @@ install(EXPORT ${PACKAGE_NAME}Targets FILE ${PACKAGE_NAME}Targets.cmake NAMESPACE - "${PACKAGE_NAMESPACE}::" + ${PACKAGE_NAMESPACE}:: DESTINATION ${PACKAGE_LOCATION}) From f87458bcb7df0ffd27a86a45bae58aa365df0be6 Mon Sep 17 00:00:00 2001 From: Alexander Kavon Date: Thu, 28 Dec 2023 14:15:07 -0500 Subject: [PATCH 06/13] add information about targeting other Qt versions --- .../03-writing-your-first-application.asciidoc | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/doc/tutorials/03-writing-your-first-application.asciidoc b/doc/tutorials/03-writing-your-first-application.asciidoc index 884998e9..496195db 100644 --- a/doc/tutorials/03-writing-your-first-application.asciidoc +++ b/doc/tutorials/03-writing-your-first-application.asciidoc @@ -12,18 +12,25 @@ layout: docs In this chapter we will write a simple QSkinny application on Linux from scratch. As a prerequisite, a recent Qt version (>= 5.6) should be available. On debian bullseye we need to install -these packages `build-essential qtbase5-dev qtbase5-private-dev -qtdeclarative5-dev qtdeclarative5-private-dev libqt5svg5-dev`. +these packages `build-essential qtbase6-dev qtbase6-private-dev +qtdeclarative6-dev qtdeclarative6-private-dev libqt5svg6-dev`. Then we can build and install QSkinny to `/opt/qskinny` with the following commands: [source,shell] .... -$ git clone https://github.com/uwerat/qskinny.git +$ git clone https://github.com/uwerat/qskinny.git # clone $ cd qskinny $ mkdir build && cd build -$ cmake ../ && make -$ sudo make install +$ cmake ../ && make # build +$ sudo make install # install +.... + +To target a specific Qt version simply pass the cmake build variable `QSK_QT_VERSION` during the build step: + +[source,shell] +.... +$ cmake -DQSK_QT_VERSION=Qt5 ../ && make .... === Compiling our first app From 3ec7d4fb137431f2312fad93be4c8b2b53f0c200 Mon Sep 17 00:00:00 2001 From: Alexander Kavon Date: Thu, 28 Dec 2023 14:21:28 -0500 Subject: [PATCH 07/13] update README to include cmake dep --- README.md | 4 ++-- doc/tutorials/03-writing-your-first-application.asciidoc | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 070079fe..a90e2688 100644 --- a/README.md +++ b/README.md @@ -35,9 +35,9 @@ It might support all versions Qt >= 5.15, but you can rely on: - current long term supported ( LTS ) version of Qt ( at the moment Qt 6.5.x ) - current version of Qt -On debian bullseye these packages need to be installed for Qt5: `build-essential +On debian bullseye these packages need to be installed for Qt5: `build-essential cmake qtbase5-dev qtbase5-private-dev qtdeclarative5-dev qtdeclarative5-private-dev libqt5svg5-dev`. -For Qt6 you need the corresponding ones. +For Qt6 you need the corresponding packages. > Optional: When enabling the `hunspell` feature the following package needs to be installed: `libhunspell-dev` diff --git a/doc/tutorials/03-writing-your-first-application.asciidoc b/doc/tutorials/03-writing-your-first-application.asciidoc index 496195db..4a08b84d 100644 --- a/doc/tutorials/03-writing-your-first-application.asciidoc +++ b/doc/tutorials/03-writing-your-first-application.asciidoc @@ -11,9 +11,9 @@ layout: docs === Building the QSkinny repository In this chapter we will write a simple QSkinny application on Linux from scratch. -As a prerequisite, a recent Qt version (>= 5.6) should be available. On debian bullseye we need to install -these packages `build-essential qtbase6-dev qtbase6-private-dev -qtdeclarative6-dev qtdeclarative6-private-dev libqt5svg6-dev`. +As a prerequisite, a recent Qt version (>= 5.15) should be available. On debian bullseye we need to install +these packages `build-essential cmake qtbase5-dev qtbase5-private-dev qtdeclarative5-dev qtdeclarative5-private-dev libqt5svg5-dev`. +For Qt6 you need the corresponding packages. Then we can build and install QSkinny to `/opt/qskinny` with the following commands: From 153f8a4228e3dfc9e3ae8c6f0e352bd66fde1453 Mon Sep 17 00:00:00 2001 From: Alexander Kavon Date: Thu, 28 Dec 2023 15:03:13 -0500 Subject: [PATCH 08/13] move export(), install() to src/CMakelists.txt from ./CMakelists.txt --- CMakeLists.txt | 51 ++++++---------------------------------------- src/CMakeLists.txt | 40 ++++++++++++++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 47 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4be18444..1530e5ee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -77,6 +77,12 @@ project(QSkinny VERSION 0.8.0) set(QSK_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}) +set(QSK_CMAKE_DIR ${QSK_SOURCE_DIR}/cmake) +# packaging +set(PACKAGE_NAME ${PROJECT_NAME}) +set(PACKAGE_VERSION ${CMAKE_PROJECT_VERSION}) +set(PACKAGE_NAMESPACE ${PROJECT_NAME}) +set(PACKAGE_LOCATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) qsk_setup_options() @@ -119,48 +125,3 @@ endif() if(BUILD_PLAYGROUND) add_subdirectory(playground) endif() - -# packaging -set(PACKAGE_NAME ${PROJECT_NAME}) -set(PACKAGE_VERSION ${CMAKE_PROJECT_VERSION}) -set(PACKAGE_NAMESPACE ${PROJECT_NAME}) -set(PACKAGE_LOCATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) - -install(TARGETS qskinny EXPORT ${PACKAGE_NAME}Targets - LIBRARY DESTINATION ${QSK_INSTALL_LIBS} - ARCHIVE DESTINATION ${QSK_INSTALL_LIBS} - RUNTIME DESTINATION ${QSK_INSTALL_LIBS} - INCLUDES DESTINATION ${QSK_INSTALL_HEADERS} - PUBLIC_HEADER DESTINATION ${QSK_INSTALL_HEADERS}) - -include(CMakePackageConfigHelpers) -write_basic_package_version_file( - ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}/${PACKAGE_NAME}ConfigVersion.cmake - VERSION ${PACKAGE_VERSION} - COMPATIBILITY AnyNewerVersion) - -export(EXPORT ${PACKAGE_NAME}Targets - FILE ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}/${PACKAGE_NAME}Targets.cmake - NAMESPACE ${PACKAGE_NAMESPACE}::) - -configure_file(cmake/${PACKAGE_NAME}Config.cmake - ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}/${PACKAGE_NAME}Config.cmake - COPYONLY) - -install(EXPORT ${PACKAGE_NAME}Targets - FILE - ${PACKAGE_NAME}Targets.cmake - NAMESPACE - ${PACKAGE_NAMESPACE}:: - DESTINATION - ${PACKAGE_LOCATION}) - -install( - FILES - cmake/${PACKAGE_NAME}Config.cmake - cmake/QskTools.cmake - ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}/${PACKAGE_NAME}ConfigVersion.cmake - DESTINATION - ${PACKAGE_LOCATION} - COMPONENT - Devel) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 80ed914a..b528ce6a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -515,5 +515,41 @@ set_target_properties(${target} PROPERTIES EXPORT_NAME ${PROJECT_NAME}) set_target_properties(${target} PROPERTIES VERSION ${CMAKE_PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} ) -# Set the library destination to ensure an organized library + plugins dir -install(TARGETS ${target}) +include(CMakePackageConfigHelpers) +write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PACKAGE_NAME}ConfigVersion.cmake + VERSION ${PACKAGE_VERSION} + COMPATIBILITY AnyNewerVersion) + +install(TARGETS ${target} EXPORT ${PACKAGE_NAME}Targets + LIBRARY DESTINATION ${QSK_INSTALL_LIBS} + ARCHIVE DESTINATION ${QSK_INSTALL_LIBS} + RUNTIME DESTINATION ${QSK_INSTALL_LIBS} + INCLUDES DESTINATION ${QSK_INSTALL_HEADERS} + PUBLIC_HEADER DESTINATION ${QSK_INSTALL_HEADERS}) + +export(EXPORT ${PACKAGE_NAME}Targets + FILE ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PACKAGE_NAME}Targets.cmake + NAMESPACE ${PACKAGE_NAMESPACE}::) + +configure_file(${QSK_CMAKE_DIR}/${PACKAGE_NAME}Config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PACKAGE_NAME}Config.cmake + COPYONLY) + +install(EXPORT ${PACKAGE_NAME}Targets + FILE + ${PACKAGE_NAME}Targets.cmake + NAMESPACE + ${PACKAGE_NAMESPACE}:: + DESTINATION + ${PACKAGE_LOCATION}) + +install( + FILES + ${QSK_CMAKE_DIR}/${PACKAGE_NAME}Config.cmake + ${QSK_CMAKE_DIR}/QskTools.cmake + ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PACKAGE_NAME}ConfigVersion.cmake + DESTINATION + ${PACKAGE_LOCATION} + COMPONENT + Devel) From dcc729b4d5d745c047922b1759ace1c0c4a1056d Mon Sep 17 00:00:00 2001 From: Alexander Kavon Date: Thu, 28 Dec 2023 17:04:55 -0500 Subject: [PATCH 09/13] move packaging vars for QSkinny core library to src/CMakeLists.txt --- CMakeLists.txt | 5 ----- src/CMakeLists.txt | 6 ++++++ 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1530e5ee..cd6cd57b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -78,11 +78,6 @@ project(QSkinny set(QSK_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}) set(QSK_CMAKE_DIR ${QSK_SOURCE_DIR}/cmake) -# packaging -set(PACKAGE_NAME ${PROJECT_NAME}) -set(PACKAGE_VERSION ${CMAKE_PROJECT_VERSION}) -set(PACKAGE_NAMESPACE ${PROJECT_NAME}) -set(PACKAGE_LOCATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) qsk_setup_options() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b528ce6a..79325eb1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -515,6 +515,12 @@ set_target_properties(${target} PROPERTIES EXPORT_NAME ${PROJECT_NAME}) set_target_properties(${target} PROPERTIES VERSION ${CMAKE_PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} ) +# packaging +set(PACKAGE_NAME ${PROJECT_NAME}) +set(PACKAGE_VERSION ${CMAKE_PROJECT_VERSION}) +set(PACKAGE_NAMESPACE ${PROJECT_NAME}) +set(PACKAGE_LOCATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) + include(CMakePackageConfigHelpers) write_basic_package_version_file( ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PACKAGE_NAME}ConfigVersion.cmake From 48e3ecef04311b3b10d179f12910deaf97732464 Mon Sep 17 00:00:00 2001 From: Alexander Kavon Date: Thu, 28 Dec 2023 17:46:11 -0500 Subject: [PATCH 10/13] standardized namespace, remove extra FILE option from export --- src/CMakeLists.txt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 79325eb1..23c2d66d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -518,7 +518,7 @@ set_target_properties(${target} PROPERTIES # packaging set(PACKAGE_NAME ${PROJECT_NAME}) set(PACKAGE_VERSION ${CMAKE_PROJECT_VERSION}) -set(PACKAGE_NAMESPACE ${PROJECT_NAME}) +set(PACKAGE_NAMESPACE ${PROJECT_NAME}::) set(PACKAGE_LOCATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) include(CMakePackageConfigHelpers) @@ -535,8 +535,7 @@ install(TARGETS ${target} EXPORT ${PACKAGE_NAME}Targets PUBLIC_HEADER DESTINATION ${QSK_INSTALL_HEADERS}) export(EXPORT ${PACKAGE_NAME}Targets - FILE ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PACKAGE_NAME}Targets.cmake - NAMESPACE ${PACKAGE_NAMESPACE}::) + NAMESPACE ${PACKAGE_NAMESPACE}) configure_file(${QSK_CMAKE_DIR}/${PACKAGE_NAME}Config.cmake ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PACKAGE_NAME}Config.cmake @@ -546,15 +545,15 @@ install(EXPORT ${PACKAGE_NAME}Targets FILE ${PACKAGE_NAME}Targets.cmake NAMESPACE - ${PACKAGE_NAMESPACE}:: + ${PACKAGE_NAMESPACE} DESTINATION ${PACKAGE_LOCATION}) install( FILES - ${QSK_CMAKE_DIR}/${PACKAGE_NAME}Config.cmake - ${QSK_CMAKE_DIR}/QskTools.cmake + ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PACKAGE_NAME}Config.cmake ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PACKAGE_NAME}ConfigVersion.cmake + ${QSK_CMAKE_DIR}/QskTools.cmake DESTINATION ${PACKAGE_LOCATION} COMPONENT From 0670623fbd9b695c4c410515115d667b3a745740 Mon Sep 17 00:00:00 2001 From: Alexander Kavon Date: Fri, 29 Dec 2023 01:11:43 -0500 Subject: [PATCH 11/13] build functions and QskQmlExportTargets.cmake file --- CMakeLists.txt | 39 +++++++++++++++++++++++++++++++++-- cmake/QSkinnyConfig.cmake | 1 - cmake/QskBuildFunctions.cmake | 8 +++++++ qmlexport/CMakeLists.txt | 29 +++++++++++++++++++++----- src/CMakeLists.txt | 28 ++++--------------------- tools/CMakeLists.txt | 3 ++- 6 files changed, 75 insertions(+), 33 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cd6cd57b..b971c6aa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,9 +62,18 @@ macro(qsk_setup_build) endmacro() macro(qsk_setup_install) + + # package vars + set(PACKAGE_NAME ${PROJECT_NAME}) + set(PACKAGE_VERSION ${CMAKE_PROJECT_VERSION}) + set(PACKAGE_NAMESPACE ${PROJECT_NAME}::) + set(PACKAGE_LOCATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) + + # install paths for headers and libraries string(TOLOWER "${PROJECT_NAME}" PACKAGE_DIR) - set(QSK_INSTALL_HEADERS "${CMAKE_INSTALL_INCLUDEDIR}/${PACKAGE_DIR}") - set(QSK_INSTALL_LIBS "${CMAKE_INSTALL_LIBDIR}/${PACKAGE_DIR}") + set(QSK_INSTALL_HEADERS ${CMAKE_INSTALL_INCLUDEDIR}/${PACKAGE_DIR}) + set(QSK_INSTALL_LIBS ${CMAKE_INSTALL_LIBDIR}/${PACKAGE_DIR}) + endmacro() ############################################################################ @@ -97,6 +106,32 @@ qsk_setup_install() add_subdirectory(src) add_subdirectory(skins) +include(CMakePackageConfigHelpers) + +# write QSkinnyConfigVersion.cmake file for cmake import +write_basic_package_version_file( + ${CMAKE_BINARY_DIR}/_QSkinny/${PACKAGE_NAME}ConfigVersion.cmake + VERSION ${PACKAGE_VERSION} + COMPATIBILITY AnyNewerVersion) + +# Copy QSkinnyConfig.cmake to build dir +configure_file(${QSK_CMAKE_DIR}/${PACKAGE_NAME}Config.cmake + ${CMAKE_BINARY_DIR}/_QSkinny/${PACKAGE_NAME}Config.cmake + COPYONLY) + +# install QSkinnyConfig.cmake and QSkinnyConfigVersion.cmake +# and QskTools.cmake file to lib/cmake/QSkinny directory +install( + FILES + ${CMAKE_BINARY_DIR}/_QSkinny/${PACKAGE_NAME}Config.cmake + ${CMAKE_BINARY_DIR}/_QSkinny/${PACKAGE_NAME}ConfigVersion.cmake + ${QSK_CMAKE_DIR}/QskTools.cmake + DESTINATION + ${PACKAGE_LOCATION} + COMPONENT + Devel) + +# Build other libraries if(BUILD_QML_EXPORT) add_subdirectory(qmlexport) endif() diff --git a/cmake/QSkinnyConfig.cmake b/cmake/QSkinnyConfig.cmake index e24cd20c..fbffae9e 100644 --- a/cmake/QSkinnyConfig.cmake +++ b/cmake/QSkinnyConfig.cmake @@ -1,2 +1 @@ include("${CMAKE_CURRENT_LIST_DIR}/QSkinnyTargets.cmake") -include("${CMAKE_CURRENT_LIST_DIR}/QskTools.cmake") \ No newline at end of file diff --git a/cmake/QskBuildFunctions.cmake b/cmake/QskBuildFunctions.cmake index 748d849b..a35151bc 100644 --- a/cmake/QskBuildFunctions.cmake +++ b/cmake/QskBuildFunctions.cmake @@ -99,3 +99,11 @@ function(qsk_add_example target) target_include_directories(${target} PRIVATE ${CMAKE_CURRENT_LIST_DIR}) endfunction() + +function(qsk_update_package_config_file target) + + file(APPEND + ${CMAKE_BINARY_DIR}/_QSkinny/QSkinnyConfig.cmake + "include(\"\${CMAKE_CURRENT_LIST_DIR}/${target}.cmake\")\n") + +endfunction() diff --git a/qmlexport/CMakeLists.txt b/qmlexport/CMakeLists.txt index d59ad5b4..7f008350 100644 --- a/qmlexport/CMakeLists.txt +++ b/qmlexport/CMakeLists.txt @@ -10,7 +10,8 @@ set(target qskqmlexport) qsk_add_library(${target} SHARED ${SOURCES} ${HEADERS}) target_link_libraries(${target} PRIVATE qskinny) -target_include_directories(${target} PUBLIC ${CMAKE_CURRENT_LIST_DIR}) +target_include_directories(${target} PUBLIC + $) set_target_properties(${target} PROPERTIES PUBLIC_HEADER QskQml.h) if(BUILD_QSKDLL) @@ -20,8 +21,26 @@ if(BUILD_QSKDLL) VERSION ${CMAKE_PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} ) endif() -set_target_properties(${target} PROPERTIES FOLDER libs) +# packaging +set(PACKAGE_NAME QskQmlExport) +set(QSKQE_INSTALL_HEADERS "${CMAKE_INSTALL_INCLUDEDIR}/${target}") -install(TARGETS ${target} - PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${target}" -) +set_target_properties(${target} PROPERTIES FOLDER libs) +set_target_properties(${target} PROPERTIES EXPORT_NAME ${PACKAGE_NAME}) + +install(TARGETS ${target} EXPORT ${PACKAGE_NAME}Targets + INCLUDES DESTINATION ${QSKQE_INSTALL_HEADERS} + PUBLIC_HEADER DESTINATION ${QSKQE_INSTALL_HEADERS}) + +export(EXPORT ${PACKAGE_NAME}Targets + NAMESPACE ${PACKAGE_NAMESPACE}) + +install(EXPORT ${PACKAGE_NAME}Targets + FILE + ${PACKAGE_NAME}Targets.cmake + NAMESPACE + ${PACKAGE_NAMESPACE} + DESTINATION + ${PACKAGE_LOCATION}) + +qsk_update_package_config_file(${PACKAGE_NAME}Targets) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 23c2d66d..b6fa1092 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -516,17 +516,9 @@ set_target_properties(${target} PROPERTIES VERSION ${CMAKE_PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} ) # packaging -set(PACKAGE_NAME ${PROJECT_NAME}) -set(PACKAGE_VERSION ${CMAKE_PROJECT_VERSION}) -set(PACKAGE_NAMESPACE ${PROJECT_NAME}::) -set(PACKAGE_LOCATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) - -include(CMakePackageConfigHelpers) -write_basic_package_version_file( - ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PACKAGE_NAME}ConfigVersion.cmake - VERSION ${PACKAGE_VERSION} - COMPATIBILITY AnyNewerVersion) +set(PACKAGE_NAME ${PROJECT_NAME}) +# setup destination file paths for qskinny target install(TARGETS ${target} EXPORT ${PACKAGE_NAME}Targets LIBRARY DESTINATION ${QSK_INSTALL_LIBS} ARCHIVE DESTINATION ${QSK_INSTALL_LIBS} @@ -534,13 +526,11 @@ install(TARGETS ${target} EXPORT ${PACKAGE_NAME}Targets INCLUDES DESTINATION ${QSK_INSTALL_HEADERS} PUBLIC_HEADER DESTINATION ${QSK_INSTALL_HEADERS}) +# export QSkinnyTargets namespace export(EXPORT ${PACKAGE_NAME}Targets NAMESPACE ${PACKAGE_NAMESPACE}) -configure_file(${QSK_CMAKE_DIR}/${PACKAGE_NAME}Config.cmake - ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PACKAGE_NAME}Config.cmake - COPYONLY) - +# install QSkinnyTargets under QSkinny namespace install(EXPORT ${PACKAGE_NAME}Targets FILE ${PACKAGE_NAME}Targets.cmake @@ -548,13 +538,3 @@ install(EXPORT ${PACKAGE_NAME}Targets ${PACKAGE_NAMESPACE} DESTINATION ${PACKAGE_LOCATION}) - -install( - FILES - ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PACKAGE_NAME}Config.cmake - ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PACKAGE_NAME}ConfigVersion.cmake - ${QSK_CMAKE_DIR}/QskTools.cmake - DESTINATION - ${PACKAGE_LOCATION} - COMPONENT - Devel) diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 74da26cc..74d10d19 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -1,3 +1,4 @@ if(TARGET Qt::Svg) add_subdirectory(svg2qvg) -endif() \ No newline at end of file + qsk_update_package_config_file(QskTools) +endif() From e922f53de4f3212b8a5303071d74eac8b7d36c66 Mon Sep 17 00:00:00 2001 From: Alexander Kavon Date: Fri, 29 Dec 2023 01:54:30 -0500 Subject: [PATCH 12/13] change name to QmlExport and update doc --- .../03-writing-your-first-application.asciidoc | 2 +- doc/tutorials/08-qskinny-and-qml.asciidoc | 11 ++++++++++- qmlexport/CMakeLists.txt | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/doc/tutorials/03-writing-your-first-application.asciidoc b/doc/tutorials/03-writing-your-first-application.asciidoc index 4a08b84d..b0d86d5d 100644 --- a/doc/tutorials/03-writing-your-first-application.asciidoc +++ b/doc/tutorials/03-writing-your-first-application.asciidoc @@ -79,7 +79,7 @@ find_package(QSkinny REQUIRED) add_executable(myapp src/main.cpp) -target_link_libraries(kue PRIVATE +target_link_libraries(myapp PRIVATE Qt5::Widgets Qt5::Quick QSkinny::QSkinny) diff --git a/doc/tutorials/08-qskinny-and-qml.asciidoc b/doc/tutorials/08-qskinny-and-qml.asciidoc index ef521bc4..f1570e23 100644 --- a/doc/tutorials/08-qskinny-and-qml.asciidoc +++ b/doc/tutorials/08-qskinny-and-qml.asciidoc @@ -18,7 +18,16 @@ When using a QSkinny control, all the methods exposed as either properties, slots or invokables can be used in QML. For example, the QSkinny control `QskLinearBox` defines the following properties: -[source] +.CMakeLists.txt +[source,cmake] +.... +target_link_libraries(myapp PRIVATE + ... + QSkinny::QmlExport) +... +.... + +[source,cpp] .... class QSK_EXPORT QskLinearBox : public QskIndexedLayoutBox { diff --git a/qmlexport/CMakeLists.txt b/qmlexport/CMakeLists.txt index 7f008350..e3ca96c0 100644 --- a/qmlexport/CMakeLists.txt +++ b/qmlexport/CMakeLists.txt @@ -22,7 +22,7 @@ if(BUILD_QSKDLL) endif() # packaging -set(PACKAGE_NAME QskQmlExport) +set(PACKAGE_NAME QmlExport) set(QSKQE_INSTALL_HEADERS "${CMAKE_INSTALL_INCLUDEDIR}/${target}") set_target_properties(${target} PROPERTIES FOLDER libs) From f4315ce4acb3da64e6786a39830b52566aa94201 Mon Sep 17 00:00:00 2001 From: Alexander Kavon Date: Fri, 29 Dec 2023 02:51:31 -0500 Subject: [PATCH 13/13] update iotdashboard_smoketest dep to correctly point --- examples/iotdashboard_smoketest/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/iotdashboard_smoketest/CMakeLists.txt b/examples/iotdashboard_smoketest/CMakeLists.txt index ea34d940..f9924b04 100644 --- a/examples/iotdashboard_smoketest/CMakeLists.txt +++ b/examples/iotdashboard_smoketest/CMakeLists.txt @@ -22,7 +22,7 @@ endfunction() function(qsk_add_example target) cmake_parse_arguments(PARSE_ARGV 1 arg "MANUAL_FINALIZATION" "" "") add_executable(${target} WIN32 MACOSX_BUNDLE ${arg_UNPARSED_ARGUMENTS} ) - target_link_libraries(${target} PRIVATE Qsk::qskinny ) + target_link_libraries(${target} PRIVATE QSkinny::QSkinny ) target_include_directories(${target} PRIVATE ${CMAKE_CURRENT_LIST_DIR}) endfunction() @@ -44,4 +44,4 @@ add_subdirectory(../iotdashboard ${CMAKE_CURRENT_BINARY_DIR}/../iotdashboard) # TODO we don't delivery the support library get_target_property(iotdashboard_COMPILE_DEFINITIONS iotdashboard COMPILE_DEFINITIONS) list(FILTER iotdashboard_COMPILE_DEFINITIONS EXCLUDE REGEX [[^USE_SHORTCUTS=1$]]) -set_property(TARGET iotdashboard PROPERTY COMPILE_DEFINITIONS ${iotdashboard_COMPILE_DEFINITIONS}) \ No newline at end of file +set_property(TARGET iotdashboard PROPERTY COMPILE_DEFINITIONS ${iotdashboard_COMPILE_DEFINITIONS})