CMake with Qt Stephen Kelly stephen.kelly@kdab.com Qt Buildsystems - - PowerPoint PPT Presentation

cmake with qt
SMART_READER_LITE
LIVE PREVIEW

CMake with Qt Stephen Kelly stephen.kelly@kdab.com Qt Buildsystems - - PowerPoint PPT Presentation

CMake with Qt Stephen Kelly stephen.kelly@kdab.com Qt Buildsystems Why CMake? Finding dependencies Providing shared libraries Platform independence Configure checks Code generators Extendible Scalable Related tools


slide-1
SLIDE 1

CMake with Qt

Stephen Kelly stephen.kelly@kdab.com

slide-2
SLIDE 2

Qt Buildsystems

slide-3
SLIDE 3

Why CMake?

  • Finding dependencies
  • Providing shared libraries
  • Platform independence
  • Configure checks
  • Code generators
  • Extendible
  • Scalable
slide-4
SLIDE 4

Related tools CPack CTest CDash

slide-5
SLIDE 5

Stages of building Configure Generate

moc Compile Link

slide-6
SLIDE 6

Finding Dependencies

slide-7
SLIDE 7

CMake today

find_package(Qt4 REQUIRED QtCore QtGui) include_directories(${QT_INCLUDES}) add_definitions(${QT_DEFINITIONS}) add_executable(myexe WIN32 main.cpp) target_link_libraries(myexe ${QT_QTCORE_LIBRARIES} ${QT_QTGUI_LIBRARIES} )

slide-8
SLIDE 8

CMake today

find_package(Qt5Widgets) include_directories(${Qt5Widgets_INCLUDE_DIRS}) add_definitions(${Qt5Widgets_DEFINITIONS}) set(CMAKE_POSITION_INDEPENDENT_CODE ON) add_executable(myexe WIN32 main.cpp) target_link_libraries(myexe ${Qt5Widgets_LIBRARIES} )

slide-9
SLIDE 9

QMake (Qt 5)

TARGET = myexe SOURCES = main.cpp QT += widgets

slide-10
SLIDE 10

CMake today

find_package(Qt5Widgets) include_directories(${Qt5Widgets_INCLUDE_DIRS}) add_definitions(${Qt5Widgets_DEFINITIONS}) set(CMAKE_POSITION_INDEPENDENT_CODE ON) add_executable(myexe WIN32 main.cpp) target_link_libraries(myexe ${Qt5Widgets_LIBRARIES} )

slide-11
SLIDE 11

CMake tomorrow (2013)

find_package(Qt5Widgets) add_executable(myexe WIN32 main.cpp) target_link_libraries(myexe Qt5::Widgets )

slide-12
SLIDE 12

CMake tomorrow (2013)

find_package(Qt4) add_executable(myexe WIN32 main.cpp) target_link_libraries(myexe Qt4::Gui )

slide-13
SLIDE 13

Finding dependencies find_package(Qt5Widgets) find_package(boost …) add_executable(dependent …) target_link_libraries(dependent Qt5::Widgets boost::spirit boost::mpl)

slide-14
SLIDE 14

The QTestLib problem

slide-15
SLIDE 15

Finding dependencies find_package(LibXml2)

  • Libraries
  • Header files
  • Defines
  • Version variables

find_package(Squish)

  • Executables
  • Test macros
slide-16
SLIDE 16

Finding dependencies

  • Treasure maps
  • FindLibXml2.cmake
  • FindSquish.cmake
  • FindQt4.cmake
  • Not part of upstream
  • Local Guide
  • Qt5WidgetsConfig.cmake
  • PulseAudioConfig.cmake
  • Part of upstream package
slide-17
SLIDE 17

Generating Code

slide-18
SLIDE 18

Generated code CMake

qt4_wrap_cpp(moc_files mywidget.h) qt4_wrap_ui(ui_files mywidget.ui) add_library(mylib ${sources} ${moc_files} ${ui_files})

slide-19
SLIDE 19

Generated code CMake

qt4_wrap_cpp(moc_files mywidget.h) qt4_wrap_ui(ui_files mywidget.ui) add_library(mylib ${sources} ${moc_files} ${ui_files})

QMake

SOURCES += mywidget.cpp HEADERS += mywidget.h mycontrol.h

slide-20
SLIDE 20

Automoc CMake (2.8.8)

  • No need for qt[4|5]_wrap_cpp
  • #include “moc_mywidget.cpp”
  • Or don't!
  • Finds Q_OBJECT in .h and .cpp files
slide-21
SLIDE 21

Automoc CMake (2.8.8)

qt4_wrap_ui(ui_files mywidget.ui) add_library(mylib ${sources} ${ui_files}) set_target_property(mylib AUTOMOC ON)

slide-22
SLIDE 22

Automoc CMake (2.8.8)

set(CMAKE_AUTOMOC ON) qt4_wrap_ui(ui_files mywidget.ui) add_library(mylib ${sources} ${ui_files})

slide-23
SLIDE 23

Extended code generation

qt4_create_translation(qm_files ${mylib_SRCS} mylib_de.ts )

slide-24
SLIDE 24

Extended code generation

qt4_generate_dbus_interface(mywidget.h com.kdab.mywidget.xml ) qt4_add_dbus_interfaces(dbus_files com.kdab.mywidget.xml)

slide-25
SLIDE 25

Platform independence

slide-26
SLIDE 26

Platform checks

check_include_file(“limits.h” HAVE_LIMITS) check_source_compiles( “#include <qglobal.h> #ifndef __PIC__ #error \"Compile your code with -fPIC or -fPIE.\" #endif “ HAVE_PIC )

slide-27
SLIDE 27

Creating Dependencies

slide-28
SLIDE 28

Providing dependencies install(TARGETS mylib EXPORT myexports …) install(TARGETS otherlib EXPORT myexports …) install(EXPORT myexport …)

slide-29
SLIDE 29

Providing dependencies install(EXPORT myexport FILENAME mytargets.cmake) … # mylibConfig.cmake include(mytargets.cmake) mylib_helpful_macro(...)

slide-30
SLIDE 30

Providing dependencies # No Findmylib.cmake needed! find_package(mylib) add_executable(dependent …) target_link_libraries(dependent mylib

  • therlib)
slide-31
SLIDE 31

Imported targets # Qt5GuiConfig.cmake add_library(Qt5::Gui IMPORTED) set_target_property(Qt5::Gui LOCATION “/opt/qt5/lib/Qt5Gui.so” )

slide-32
SLIDE 32

Imported targets # Qt5GuiConfig.cmake add_library(Qt5::Gui IMPORTED) set_target_property(Qt5::Gui INTERFACE_INCLUDE_DIRECTORIES “/opt/qt5/include/Qt5Gui” “$<TARGET_INCLUDES:Qt5::Core>” )

slide-33
SLIDE 33

Imported targets # Qt5GuiConfig.cmake add_library(Qt5::Gui IMPORTED) set_target_property(Qt5::Gui INTERFACE_INCLUDE_DIRECTORIES “/opt/qt5/include/Qt5Gui” “$<TARGET_PROPERTY:Qt5::Core,INTERFACE_INCLUDE_DIRECTRIES>” )

slide-34
SLIDE 34

Imported targets # Qt5GuiConfig.cmake add_library(Qt5::Gui IMPORTED) set_target_property(Qt5::Gui INTERFACE_INCLUDE_DIRECTORIES “/opt/qt5/include/Qt5Gui” “$<TARGET_INCLUDES:Qt5::Core>” )

slide-35
SLIDE 35

qtmain.lib QMake

CONFIG -= console

CMake (Qt 4)

add_executable(exec WIN32 …) target_link_libraries(${QT_QTMAIN_LIBS})

slide-36
SLIDE 36

qtmain.lib CMake (Qt 5)

add_executable(exec WIN32 …) target_link_libraries(${QT_QTMAIN_LIBS})

slide-37
SLIDE 37

Imported targets # Qt5GuiConfig.cmake add_library(Qt5::Gui IMPORTED) set_target_property(Qt5::Gui INTERFACE_LINK_LIBRARIES “$<TARGET_LIBRARIES:Qt5::Core>” “$<$<WIN32_EXECUTABLE>:Qt5::WinMain>” )

slide-38
SLIDE 38

Declarative expressions add_executable(CoolApp …) target_link_libraries(CoolApp Qt5::Widgets $<$<CONFIG:Debug>:Qt5::Test> )

slide-39
SLIDE 39

Declarative expressions add_executable(CoolApp …) set_target_property(CoolApp INCLUDE_DIRECTORIES $<$<CONFIG:Debug>:/usr/include/valgrind> )

slide-40
SLIDE 40
  • Object orientated
  • Declarative
slide-41
SLIDE 41

Qt Buildsystems

QBS

slide-42
SLIDE 42

Configure Generate

moc Compile Link

QBS

slide-43
SLIDE 43

Questions?

Stephen Kelly stephen.kelly@kdab.com