From 870c36c2c56e2f063d29af7044a79135ba6743d7 Mon Sep 17 00:00:00 2001
From: Stephen Kelly <stephen.kelly@kdab.com>
Date: Tue, 2 Apr 2013 11:02:51 +0200
Subject: [PATCH] Update the CMake documentation with 2.8.11 specific
 information.

Change-Id: I42387a178097598a52b4cd3dbdcd8b093147a740
Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
---
 doc/src/development/cmake-manual.qdoc | 60 +++++++++++++++++----------
 doc/src/modules.qdoc                  |  2 +-
 doc/src/qtmodules.qdoc                |  2 +-
 doc/src/snippets/cmake/CMakeLists.pro | 26 ++++++------
 4 files changed, 52 insertions(+), 38 deletions(-)

diff --git a/doc/src/development/cmake-manual.qdoc b/doc/src/development/cmake-manual.qdoc
index 4b879079..4624b4f2 100644
--- a/doc/src/development/cmake-manual.qdoc
+++ b/doc/src/development/cmake-manual.qdoc
@@ -33,11 +33,12 @@
 
     \c {CMake} is a tool that helps simplify the build process for
     development projects across different platforms.  \c{CMake}
-    automates the generation of buildsystems such as Makefiles.
+    automates the generation of buildsystems such as Makefiles and Visual Studio project
+    files.
 
     \c{CMake} is a 3rd party tool with its own \l{CMake Documentation}{documentation}.
     The rest of this manual details the specifics of how to use Qt 5 with \c{CMake}.
-    The minimum version required to use Qt5 is \c{CMake} 2.8.3, but 2.8.9 is recommended.
+    The minimum version required to use Qt5 is \c{CMake} 2.8.3, but 2.8.11 is recommended.
 
     \section1 Getting Started
 
@@ -45,38 +46,33 @@
     and header files shipped with Qt. These libraries and header files can then be used
     to build libraries and applications based on Qt.
 
-    The recommended way to use Qt libraries and headers with \c{CMake} 2.8.9 is to use
-    the \c{qt5_use_modules} macro.
+    The recommended way to use Qt libraries and headers with \c{CMake} 2.8.11 is to use
+    the \c{target_link_libraries} command. In \c{CMake} 2.8.11 and later versions, this
+    command automatically adds appropriate include directories, compile definitions, the
+    position-independent-code flag, and links to the qtmain.lib library on Windows.
 
-    To build a helloworld executable, typical usage would be:
+    To build a helloworld GUI executable, typical usage would be:
 
     \snippet doc/src/snippets/cmake/CMakeLists.pro 0
 
-    Note that it is necessary to use \c{find_package} to find a Qt module before using the macro.
-    See the documentation for the
-    \l{CMake find_package Documentation}
-    command for the full options it supports.
+    Note that setting the minimum required CMake version to 2.8.11 is required for
+    automatic linking to the qtmain.lib library on Windows.
 
     In order for \c{find_package} to be successful, Qt 5 must be found below the CMAKE_PREFIX_PATH,
     or the Qt5<Module>_DIR must be set in the \c{CMake} cache to the location of the
     Qt5WidgetsConfig.cmake file. The easiest way to use \c{CMake} is to set the CMAKE_PREFIX_PATH
     environment variable to the install prefix of Qt 5.
 
-    The \c{qt5_use_modules} macro encapsulates all of the variable usage required to use a Qt module.
-    It automatically finds the modules given to it on the command line if they have not already been found.
-
-    \snippet doc/src/snippets/cmake/CMakeLists.pro 1
-
     The CMAKE_AUTOMOC setting runs moc automatically when required. For more on this feature see
     the \l{CMake AUTOMOC documentation}
 
     \section2 Imported targets
 
-    Imported targets are created for each Qt module. That means that the Qt5<Module>_LIBRARIES contains
-    a name of an imported target, rather than a path to a library. The actual path to the library can be
-    obtained using the \l{CMake LOCATION Documentation}{LOCATION property}:
+    Imported targets are created for each Qt module. Imported target names should be preferred instead of
+    using a variable like Qt5<Module>_LIBRARIES in CMake commands such as \c{target_link_libraries}.
+    The actual path to the library can be obtained using the \l{CMake LOCATION Documentation}{LOCATION property}:
 
-    \snippet doc/src/snippets/cmake/CMakeLists.pro 2
+    \snippet doc/src/snippets/cmake/CMakeLists.pro 1
 
     Note however that it is rare to require the full location to the library in \c{CMake} code. Most
     \c{CMake} APIs are aware of imported targets and can automatically use them instead of the full path.
@@ -93,6 +89,21 @@
     If your project has custom CMake build configurations, it may be necessary to set a mapping from your
     custom configuration to either the debug or release Qt configuration.
 
+    \snippet doc/src/snippets/cmake/CMakeLists.pro 2
+
+    \section2 Using Qt 5 with \c{CMake} older than 2.8.11
+
+    The recommended way to use Qt libraries and headers with \c{CMake} prior to 2.8.11 is to use
+    the \c{qt5_use_modules} macro.
+
+    Note that it is necessary to use \c{find_package} to find a Qt module before using the macro.
+    See the documentation for the
+    \l{CMake find_package Documentation}
+    command for the full options it supports.
+
+    The \c{qt5_use_modules} macro encapsulates all of the variable usage required to use a Qt module.
+    It automatically finds the modules given to it on the command line if they have not already been found.
+
     \snippet doc/src/snippets/cmake/CMakeLists.pro 3
 
     \section2 Using Qt 5 with \c{CMake} older than 2.8.9
@@ -112,7 +123,8 @@
 
     If not using the \c{qt5_use_modules} macro, and if using CMake 2.8.9 or later, the
     \l{CMake POSITION_INDEPENDENT_CODE Documentation}{POSITION_INDEPENDENT_CODE property} can be set on
-    targets using Qt instead, or it can be set globally for all targets:
+    targets using Qt instead, or it can be set globally for all targets. Note that this is not necessary
+    with CMake 2.8.11:
 
     \snippet doc/src/snippets/cmake/CMakeLists.pro 5
 
@@ -127,11 +139,13 @@
 
     \section2 Module variables
 
-    The result of a \c{find_package} call is that some variables will be populated with
+    The result of a \c{find_package} call is that imported targets will be created for
+    use with \c{target_link_libraries}, some variables will be populated with
     information required to configure the build, and macros will be made available
-    for use. All of the package-specific variables have a consistent name with a prefix
-    of the name of the package. For example, \c{find_package}(Qt5Widgets) will make the
-    following variables available if successfully found:
+    for use. The name of the imported target for each module matches the name of the module with a
+    prefix of 'Qt5::', for example Qt5::Widgets. All of the package-specific variables have a
+    consistent name with a prefix of the name of the package. For example,
+    \c{find_package}(Qt5Widgets) will make the following variables available if successfully found:
 
     \list
     \li Qt5Widgets_VERSION_STRING
diff --git a/doc/src/modules.qdoc b/doc/src/modules.qdoc
index c7bfe6a6..6ac10c10 100644
--- a/doc/src/modules.qdoc
+++ b/doc/src/modules.qdoc
@@ -43,7 +43,7 @@
 
     qtmain is a helper library that enables the developer to write a
     cross-platform main() function on Windows.
-    If you do not use \l qmake or other build tools such as CMake, then you
+    If you do not use \l qmake or other build tools such as \l{CMake Manual}{CMake}, then you
     need to link against the \c qtmain library.
 
     \section1 License Information
diff --git a/doc/src/qtmodules.qdoc b/doc/src/qtmodules.qdoc
index 2d648d70..51844b95 100644
--- a/doc/src/qtmodules.qdoc
+++ b/doc/src/qtmodules.qdoc
@@ -106,7 +106,7 @@
     \snippet doc/src/snippets/code/doc_src_modules.pro 0
 
     On Windows, if you do not use \l qmake
-    or other build tools such as CMake, you also need to link against
+    or other build tools such as \l{CMake Manual}{CMake}, you also need to link against
     the \c qtmain library.
 
     \section1 Qt Add-Ons
diff --git a/doc/src/snippets/cmake/CMakeLists.pro b/doc/src/snippets/cmake/CMakeLists.pro
index 482f7773..834e075b 100644
--- a/doc/src/snippets/cmake/CMakeLists.pro
+++ b/doc/src/snippets/cmake/CMakeLists.pro
@@ -1,5 +1,5 @@
 #! [0]
-cmake_minimum_required(VERSION 2.8.9)
+cmake_minimum_required(VERSION 2.8.11)
 
 project(testproject)
 
@@ -12,34 +12,34 @@ set(CMAKE_AUTOMOC ON)
 find_package(Qt5Widgets)
 
 # Tell CMake to create the helloworld executable
-add_executable(helloworld main.cpp)
+add_executable(helloworld WIN32 main.cpp)
 
 # Use the Widgets module from Qt 5.
-qt5_use_modules(helloworld Widgets)
+target_link_libraries(helloworld Qt5::Widgets)
 #! [0]
 
 #! [1]
 find_package(Qt5Core)
 
-# Find the Widgets Sql and Network modules, and
-# use them in helloworld.
-qt5_use_modules(helloworld Widgets Sql Network)
+get_target_property(QtCore_location Qt5::Core LOCATION)
 #! [1]
 
 #! [2]
 find_package(Qt5Core)
 
-get_target_property(QtCore_location Qt5::Core LOCATION)
-#! [2]
-
-#! [3]
-find_package(Qt5Core)
-
 set(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_RELEASE} -fprofile-arcs -ftest-coverage")
 
 # set up a mapping so that the Release configuration for the Qt imported target is
 # used in the COVERAGE CMake configuration.
 set_target_properties(Qt5::Core PROPERTIES MAP_IMPORTED_CONFIG_COVERAGE "RELEASE")
+#! [2]
+
+#! [3]
+find_package(Qt5Widgets)
+
+add_executable(helloworld WIN32 main.cpp)
+
+qt5_use_modules(helloworld Widgets)
 #! [3]
 
 #! [4]
@@ -69,7 +69,7 @@ qt5_generate_moc(main.cpp main.moc)
 add_executable(helloworld main.cpp main.moc)
 
 #Link the helloworld executable to the Qt 5 widgets library.
-target_link_libraries(${Qt5Widgets_LIBRARIES})
+target_link_libraries(helloworld Qt5::Widgets)
 #! [4]
 
 #! [5]
-- 
GitLab