Make the qt5_use_modules public API.
authorStephen Kelly <stephen.kelly@kdab.com>
Sat, 5 May 2012 21:40:19 +0000 (23:40 +0200)
committerQt by Nokia <qt-info@nokia.com>
Thu, 10 May 2012 21:15:56 +0000 (23:15 +0200)
This cmake function handles all of the necessary logic for using the
include directories of Qt modules, linking to Qt modules, adding
the required definitions, and most importantly, adding the position
independent flags required on UNIX systems to use Qt by default.

The function relies on functionality available in CMake 2.8.8, so it
is only available if that version of CMake or greater is used.

Change-Id: Ibe698e06819129479348c240844264c41553b5fb
Reviewed-by: Alexander Neundorf <neundorf@kde.org>
Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
src/corelib/Qt5CoreMacros.cmake
tests/auto/cmake/CMakeLists.txt
tests/auto/cmake/pass1/CMakeLists.txt

index 4a10fad..41748b5 100644 (file)
@@ -202,3 +202,35 @@ function(QT5_ADD_RESOURCES outfiles )
     endforeach()
     set(${outfiles} ${${outfiles}} PARENT_SCOPE)
 endfunction()
+
+
+if (NOT CMAKE_VERSION VERSION_LESS 2.8.8)
+    function(qt5_use_modules _target _link_type)
+        if ("${_link_type}" STREQUAL "LINK_PUBLIC" OR "${_link_type}" STREQUAL "LINK_PRIVATE" )
+            set(modules ${ARGN})
+            set(link_type ${_link_type})
+        else()
+            set(modules ${_link_type} ${ARGN})
+        endif()
+        foreach(_module ${modules})
+            if (NOT Qt5${_module}_FOUND)
+                message(FATAL_ERROR "Can not use \"${_module}\" module which has not yet been found.")
+            endif()
+            target_link_libraries(${_target} ${link_type} ${Qt5${_module}_LIBRARIES})
+            set_property(TARGET ${_target} APPEND PROPERTY INCLUDE_DIRECTORIES ${Qt5${_module}_INCLUDE_DIRS})
+            set_property(TARGET ${_target} APPEND PROPERTY COMPILE_DEFINITIONS ${Qt5${_module}_COMPILE_DEFINITIONS})
+
+            # We can't just append to the COMPILE_FLAGS property. That creats a ';' separated list
+            # which breaks the compile commmand line.
+            # Ensure non-duplication here manually instead.
+            get_property(_target_type TARGET ${_target} PROPERTY TYPE)
+            if ("${_target_type}" STREQUAL "EXECUTABLE" AND Qt5${_module}_EXECUTABLE_COMPILE_FLAGS)
+              get_target_property(_flags ${_target} COMPILE_FLAGS)
+              string(FIND "${_flags}" "${Qt5${_module}_EXECUTABLE_COMPILE_FLAGS}" _find_result)
+              if (NOT _find_result)
+                set_target_properties(${_target} PROPERTIES COMPILE_FLAGS "${_flags} ${Qt5${_module}_EXECUTABLE_COMPILE_FLAGS}")
+              endif()
+            endif()
+        endforeach()
+    endfunction()
+endif()
index dfcb225..64b2b8a 100644 (file)
@@ -78,11 +78,11 @@ macro(expect_fail _dir)
   )
 endmacro()
 
-if(NOT ${CMAKE_VERSION} VERSION_LESS 2.8.7)
-    # Requires CMAKE_AUTOMOC function in CMake 2.8.7
+if(NOT ${CMAKE_VERSION} VERSION_LESS 2.8.8)
+    # Requires INCLUDE_DIRECTORIES target property in CMake 2.8.8
     expect_pass(pass1)
 else()
-    message("CMake version older than 2.8.7 (Found ${CMAKE_VERSION}). Not running test \"pass1\"")
+    message("CMake version older than 2.8.8 (Found ${CMAKE_VERSION}). Not running test \"pass1\"")
 endif()
 expect_pass(pass2)
 expect_pass(pass3)
index cbe3afc..d8efadc 100644 (file)
@@ -7,42 +7,11 @@ set(CMAKE_AUTOMOC ON)
 
 set(CMAKE_INCLUDE_CURRENT_DIR ON)
 
-macro(qt5_use_package _target _package)
-    if (NOT Qt5${_package}_FOUND)
-        find_package(Qt5${_package} ${ARG1})
-    endif()
-    if (Qt5${_package}_FOUND)
-        # TODO: Handle public/private keywords?
-        target_link_libraries(${_target} ${Qt5${_package}_LIBRARIES})
-        # ### Requires CMake 2.8.8:
-        # set_property(TARGET ${_target} APPEND PROPERTY INCLUDE_DIRECTORIES ${Qt5${_package}_INCLUDE_DIRS})
-        include_directories(${Qt5${_package}_INCLUDE_DIRS})
-        set_property(TARGET ${_target} APPEND PROPERTY COMPILE_DEFINITIONS ${Qt5${_package}_COMPILE_DEFINITIONS})
-
-        # We can't just append to the COMPILE_FLAGS property. That creats a ';' separated list
-        # which breaks the compile commmand line.
-        # Ensure non-duplication here manually instead.
-        get_property(_taget_type TARGET ${_target} PROPERTY TYPE)
-        if ("${_taget_type}" STREQUAL "EXECUTABLE")
-          get_target_property(_flags ${_target} COMPILE_FLAGS)
-          if (_flags)
-            list(APPEND _flags ${Qt5${_package}_EXECUTABLE_COMPILE_FLAGS})
-            list(REMOVE_DUPLICATES _flags)
-          else()
-            set(_flags ${Qt5${_package}_EXECUTABLE_COMPILE_FLAGS})
-          endif()
-          if (_flags)
-            set_target_properties(${_target} PROPERTIES COMPILE_FLAGS ${_flags})
-          endif()
-        endif()
-    else()
-        message(FATAL_ERROR "NOT FOUND: Qt5${_package}")
-    endif()
-endmacro()
-
 add_executable(two two.cpp)
 add_executable(three three.cpp)
 
-qt5_use_package(two Test)
-qt5_use_package(three Widgets)
-qt5_use_package(three Test)
+find_package(Qt5Test)
+find_package(Qt5Widgets)
+
+qt5_use_modules(two Test)
+qt5_use_modules(three Widgets Test)