summaryrefslogtreecommitdiffstats
path: root/cmake/QtAppHelpers.cmake
diff options
context:
space:
mode:
authorAlexandru Croitor <alexandru.croitor@qt.io>2020-08-13 17:37:47 +0200
committerAlexandru Croitor <alexandru.croitor@qt.io>2020-08-14 13:17:11 +0200
commit44cce1a2ea9dadd8b2de93f40de34269dda703c0 (patch)
treeeca02c6e828da9e84c4c2de6ff643cafad794024 /cmake/QtAppHelpers.cmake
parent9d3a908e9ed154294ed4c58429d22a9ff8541ba4 (diff)
CMake: Split QtBuild.cmake into smaller files
QtBuild.cmake is huge. Split it. Move module, plugin, tools, executables and test related functions out of QtBuild.cmake into separate files. Do the same for many other things too. An additional requirement is that all the new Helpers files only define functions and macros. No global variable definitions are allowed, nor execution of commands with side effects. Some notes: qt_install_qml_files is removed because it's dead code. Some functions still need to be figured out, because they are interspersed and depend on various global state assignments. Task-number: QTBUG-86035 Change-Id: I21d79ff02eef923c202eb1000422888727cb0e2c Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'cmake/QtAppHelpers.cmake')
-rw-r--r--cmake/QtAppHelpers.cmake98
1 files changed, 98 insertions, 0 deletions
diff --git a/cmake/QtAppHelpers.cmake b/cmake/QtAppHelpers.cmake
new file mode 100644
index 0000000000..0c99356db3
--- /dev/null
+++ b/cmake/QtAppHelpers.cmake
@@ -0,0 +1,98 @@
+# This function creates a CMake target for a Qt internal app.
+# Such projects had a load(qt_app) command.
+function(qt_internal_add_app target)
+ qt_parse_all_arguments(arg
+ "qt_internal_add_app"
+ "NO_INSTALL"
+ "${__default_target_info_args}"
+ "${__default_private_args}"
+ ${ARGN})
+
+ set(output_directory "${QT_BUILD_DIR}/${INSTALL_BINDIR}")
+
+ set(no_install "")
+ if(arg_NO_INSTALL)
+ set(no_install NO_INSTALL)
+ endif()
+
+ qt_add_executable("${target}"
+ DELAY_RC
+ DELAY_TARGET_INFO
+ OUTPUT_DIRECTORY "${output_directory}"
+ ${no_install}
+ SOURCES ${arg_SOURCES}
+ INCLUDE_DIRECTORIES
+ ${arg_INCLUDE_DIRECTORIES}
+ DEFINES
+ ${arg_DEFINES}
+ LIBRARIES ${arg_LIBRARIES} Qt::PlatformAppInternal
+ COMPILE_OPTIONS ${arg_COMPILE_OPTIONS}
+ LINK_OPTIONS ${arg_LINK_OPTIONS}
+ MOC_OPTIONS ${arg_MOC_OPTIONS}
+ ENABLE_AUTOGEN_TOOLS ${arg_ENABLE_AUTOGEN_TOOLS}
+ DISABLE_AUTOGEN_TOOLS ${arg_DISABLE_AUTOGEN_TOOLS}
+ TARGET_VERSION "${arg_TARGET_VERSION}"
+ TARGET_PRODUCT "${arg_TARGET_PRODUCT}"
+ TARGET_DESCRIPTION "${arg_TARGET_DESCRIPTION}"
+ TARGET_COMPANY "${arg_TARGET_COMPANY}"
+ TARGET_COPYRIGHT "${arg_TARGET_COPYRIGHT}"
+ )
+ qt_internal_add_target_aliases("${target}")
+ _qt_internal_apply_strict_cpp("${target}")
+
+ # To mimic the default behaviors of qt_app.prf, we by default enable GUI Windows applications,
+ # but don't enable macOS bundles.
+ # Bundles are enabled in a separate set_target_properties call if an Info.plist file
+ # is provided.
+ # Similary, the Windows GUI flag is disabled in a separate call
+ # if CONFIG += console was encountered during conversion.
+ set_target_properties("${target}" PROPERTIES WIN32_EXECUTABLE TRUE)
+
+ if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.19.0" AND QT_FEATURE_debug_and_release)
+ set_property(TARGET "${target}"
+ PROPERTY EXCLUDE_FROM_ALL "$<NOT:$<CONFIG:${QT_MULTI_CONFIG_FIRST_CONFIG}>>")
+ endif()
+
+ qt_add_list_file_finalizer(qt_internal_finalize_app ${target})
+endfunction()
+
+function(qt_internal_get_title_case value out_var)
+ if(NOT value)
+ set(${out_var} "" PARENT_SCOPE)
+ return()
+ endif()
+ string(SUBSTRING "${value}" 0 1 first_char)
+ string(TOUPPER "${first_char}" first_char_upper)
+ string(SUBSTRING "${target}" 1 -1 rest_of_value)
+ set(title_value "${first_char_upper}${rest_of_value}")
+ set(${out_var} "${title_value}" PARENT_SCOPE)
+endfunction()
+
+function(qt_internal_update_app_target_info_properties target)
+ # First update the delayed properties with any values that might have been set after the
+ # qt_internal_add_app() call.
+ qt_internal_update_delayed_target_info_properties(${target})
+
+ # Set defaults in case if no values were set.
+ get_target_property(target_version ${target} QT_DELAYED_TARGET_VERSION)
+ if(NOT target_version)
+ set_target_properties(${target} PROPERTIES QT_DELAYED_TARGET_VERSION "${PROJECT_VERSION}")
+ endif()
+
+ get_target_property(target_description ${target} QT_DELAYED_TARGET_DESCRIPTION)
+ if(NOT target_description)
+ qt_internal_get_title_case("${target}" upper_name)
+ set_target_properties(${target} PROPERTIES QT_DELAYED_TARGET_DESCRIPTION "Qt ${upper_name}")
+ endif()
+
+ # Finally set the final values.
+ qt_internal_set_target_info_properties_from_delayed_properties("${target}")
+endfunction()
+
+function(qt_internal_finalize_app target)
+ qt_internal_update_app_target_info_properties("${target}")
+
+ if(WIN32)
+ qt6_generate_win32_rc_file("${target}")
+ endif()
+endfunction()