cmake: Modernize build system
[quassel.git] / cmake / QuasselMacros.cmake
index bc66572..8512866 100644 (file)
@@ -1,50 +1,46 @@
-# This file contains various macros useful for building Quassel.
+# This file contains various functions and macros useful for building Quassel.
 #
-# (C) 2014 by the Quassel Project <devel@quassel-irc.org>
-#
-# The qt5_use_modules function was taken from Qt 5.10.1 (and modified):
-# (C) 2005-2011 Kitware, Inc.
+# (C) 2014-2018 by the Quassel Project <devel@quassel-irc.org>
 #
 # Redistribution and use is allowed according to the terms of the BSD license.
 # For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+###################################################################################################
+
+###################################################################################################
+# Adds a library target for a Quassel module.
+#
+# It expects the (CamelCased) module name as a parameter, and derives various
+# strings from it. For example, quassel_add_module(Client) produces
+#  - a library target named quassel_client with output name (lib)quassel-client(.so)
+#  - an alias target named Quassel::Client in global scope
+#
+# The function exports the TARGET variable which can be used in the current scope
+# for setting source files, properties, link dependencies and so on.
+# To refer to the target outside of the current scope, e.g. for linking, use
+# the alias name.
+#
+function(quassel_add_module _module)
+    # Derive target, alias target, output name from the given module name
+    set(alias "Quassel::${_module}")
+    set(target ${alias})
+    string(TOLOWER ${target} target)
+    string(REPLACE "::" "_" target ${target})
+    string(REPLACE "_" "-" output_name ${target})
+
+    add_library(${target} STATIC "")
+    add_library(${alias} ALIAS ${target})
 
-############################
-# Macros for dealing with Qt
-############################
+    set_target_properties(${target} PROPERTIES
+        OUTPUT_NAME ${output_name}
+    )
 
-# Qt 5.11 removed the qt5_use_modules function, so we need to provide it until we can switch to a modern CMake version.
-# If present, the Qt-provided version will be used automatically instead.
-function(qt5_use_modules _target _link_type)
-    if (NOT TARGET ${_target})
-        message(FATAL_ERROR "The first argument to qt5_use_modules must be an existing target.")
-    endif()
-    if ("${_link_type}" STREQUAL "LINK_PUBLIC" OR "${_link_type}" STREQUAL "LINK_PRIVATE" )
-        set(_qt5_modules ${ARGN})
-        set(_qt5_link_type ${_link_type})
-    else()
-        set(_qt5_modules ${_link_type} ${ARGN})
-    endif()
+    target_include_directories(${target}
+        PUBLIC  ${CMAKE_CURRENT_SOURCE_DIR}
+        PRIVATE ${CMAKE_CURRENT_BINARY_DIR} # for generated files
+    )
 
-    if ("${_qt5_modules}" STREQUAL "")
-        message(FATAL_ERROR "qt5_use_modules requires at least one Qt module to use.")
-    endif()
-    foreach(_module ${_qt5_modules})
-        if (NOT Qt5${_module}_FOUND)
-            find_package(Qt5${_module} PATHS "${_Qt5_COMPONENT_PATH}" NO_DEFAULT_PATH)
-            if (NOT Qt5${_module}_FOUND)
-                message(FATAL_ERROR "Can not use \"${_module}\" module which has not yet been found.")
-            endif()
-        endif()
-        target_link_libraries(${_target} ${_qt5_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})
-        if (Qt5_POSITION_INDEPENDENT_CODE
-                AND (CMAKE_VERSION VERSION_LESS 2.8.12
-                    AND (NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU"
-                    OR CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)))
-            set_property(TARGET ${_target} PROPERTY POSITION_INDEPENDENT_CODE ${Qt5_POSITION_INDEPENDENT_CODE})
-        endif()
-    endforeach()
+    # Export the target name for further use
+    set(TARGET ${target} PARENT_SCOPE)
 endfunction()
 
 ######################################