Merge branch 'feature/cmake-install-paths' of https://github.com/lgtmak/qskinny into cmake

This commit is contained in:
Uwe Rathmann 2024-01-08 08:36:33 +01:00
commit 9c6686e1db
11 changed files with 156 additions and 88 deletions

1
.gitignore vendored
View File

@ -1,6 +1,7 @@
Makefile
.qmake.stash
.uuid
build
obj
moc
rcc

View File

@ -62,8 +62,18 @@ macro(qsk_setup_build)
endmacro()
macro(qsk_setup_install)
set(QSK_INSTALL_HEADERS include)
set(QSK_INSTALL_LIBS lib)
# 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})
endmacro()
############################################################################
@ -76,6 +86,7 @@ project(QSkinny
VERSION 0.8.0)
set(QSK_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR})
set(QSK_CMAKE_DIR ${QSK_SOURCE_DIR}/cmake)
qsk_setup_options()
@ -95,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()
@ -118,48 +155,3 @@ endif()
if(BUILD_PLAYGROUND)
add_subdirectory(playground)
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})
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)

View File

@ -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`

View File

@ -1,2 +1 @@
include("${CMAKE_CURRENT_LIST_DIR}/QSkinnyTargets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/QskTools.cmake")

View File

@ -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 "${QSK_INSTALL_LIBS}/plugins/${TYPE}" )
set_target_properties(${target} PROPERTIES
INSTALL_RPATH "\${ORIGIN}/../../lib" )
@ -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()

View File

@ -11,21 +11,26 @@ 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
qtdeclarative5-dev qtdeclarative5-private-dev libqt5svg5-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:
[source,xml]
[source,shell]
....
cd /home/user/dev/
git clone https://github.com/uwerat/qskinny.git
cd qskinny
PREFIX=/opt/qskinny qmake -r
make
sudo make install
$ git clone https://github.com/uwerat/qskinny.git # clone
$ cd qskinny
$ mkdir build && cd build
$ 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
@ -52,40 +57,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(myapp 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 +109,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 <QskWindow.h>
#include <QskLinearBox.h>

View File

@ -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
{

View File

@ -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})
set_property(TARGET iotdashboard PROPERTY COMPILE_DEFINITIONS ${iotdashboard_COMPILE_DEFINITIONS})

View File

@ -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
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>)
set_target_properties(${target} PROPERTIES PUBLIC_HEADER QskQml.h)
if(BUILD_QSKDLL)
@ -20,6 +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 QmlExport)
set(QSKQE_INSTALL_HEADERS "${CMAKE_INSTALL_INCLUDEDIR}/${target}")
install(TARGETS ${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)

View File

@ -513,7 +513,30 @@ 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} )
install(TARGETS ${target} )
# packaging
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}
RUNTIME DESTINATION ${QSK_INSTALL_LIBS}
INCLUDES DESTINATION ${QSK_INSTALL_HEADERS}
PUBLIC_HEADER DESTINATION ${QSK_INSTALL_HEADERS})
# export QSkinnyTargets namespace
export(EXPORT ${PACKAGE_NAME}Targets
NAMESPACE ${PACKAGE_NAMESPACE})
# install QSkinnyTargets under QSkinny namespace
install(EXPORT ${PACKAGE_NAME}Targets
FILE
${PACKAGE_NAME}Targets.cmake
NAMESPACE
${PACKAGE_NAMESPACE}
DESTINATION
${PACKAGE_LOCATION})

View File

@ -1,3 +1,4 @@
if(TARGET Qt::Svg)
add_subdirectory(svg2qvg)
endif()
qsk_update_package_config_file(QskTools)
endif()