summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib')
-rw-r--r--src/corelib/Qt6CoreMacros.cmake113
1 files changed, 66 insertions, 47 deletions
diff --git a/src/corelib/Qt6CoreMacros.cmake b/src/corelib/Qt6CoreMacros.cmake
index 88cdd3ce96..557bb6b140 100644
--- a/src/corelib/Qt6CoreMacros.cmake
+++ b/src/corelib/Qt6CoreMacros.cmake
@@ -567,9 +567,11 @@ endif()
# MANUAL_MOC_JSON_FILES parameter. The latter can be obtained by running moc with
# the --output-json parameter.
# Params:
-# INSTALL_DIR: Location where to install the metatypes file (Optional)
-# COPY_OVER_INSTALL: When present will install the file via a post build step
-# copy rather than using install
+# INSTALL_DIR: Location where to install the metatypes file. For public consumption,
+# defaults to a ${CMAKE_INSTALL_PREFIX}/lib/metatypes directory.
+# Executable metatypes files are never installed.
+# COPY_OVER_INSTALL: (Qt Internal) When present will install the file via a post build step
+# copy rather than using install.
function(qt6_generate_meta_types_json_file target)
get_target_property(existing_meta_types_file ${target} INTERFACE_QT_META_TYPES_BUILD_FILE)
@@ -579,22 +581,6 @@ function(qt6_generate_meta_types_json_file target)
cmake_parse_arguments(arg "COPY_OVER_INSTALL" "INSTALL_DIR" "MANUAL_MOC_JSON_FILES" ${ARGN})
- if (NOT QT_BUILDING_QT)
- if (NOT arg_INSTALL_DIR)
- message(FATAL_ERROR "Please specify an install directory using INSTALL_DIR")
- endif()
- else()
- # Automatically fill install args when building qt
- set(metatypes_install_dir ${INSTALL_LIBDIR}/metatypes)
- set(args)
- if (NOT QT_WILL_INSTALL)
- set(arg_COPY_OVER_INSTALL TRUE)
- endif()
- if (NOT arg_INSTALL_DIR)
- set(arg_INSTALL_DIR "${metatypes_install_dir}")
- endif()
- endif()
-
get_target_property(target_type ${target} TYPE)
if (target_type STREQUAL "INTERFACE_LIBRARY")
message(FATAL_ERROR "Meta types generation does not work on interface libraries")
@@ -606,6 +592,19 @@ function(qt6_generate_meta_types_json_file target)
return()
endif()
+ # Whether the generated json file needs to be installed for prefix-builds, or copied for
+ # non-prefix builds. Regardless of the type of build, executable metatypes.json files should
+ # not be installed. Only library .json files should be installed.
+ set(should_install "TRUE")
+ if (target_type STREQUAL "EXECUTABLE")
+ set(should_install "FALSE")
+ endif()
+
+ # Automatically fill default install args when not specified.
+ if (NOT arg_INSTALL_DIR)
+ set(arg_INSTALL_DIR "lib/metatypes")
+ endif()
+
get_target_property(target_binary_dir ${target} BINARY_DIR)
set(type_list_file "${target_binary_dir}/meta_types/${target}_json_file_list.txt")
set(type_list_file_manual "${target_binary_dir}/meta_types/${target}_json_file_list_manual.txt")
@@ -613,7 +612,7 @@ function(qt6_generate_meta_types_json_file target)
get_target_property(uses_automoc ${target} AUTOMOC)
set(automoc_args)
set(automoc_dependencies)
- #Handle automoc generated data
+ # Handle automoc generated data
if (uses_automoc)
# Tell automoc to output json files)
set_property(TARGET "${target}" APPEND PROPERTY
@@ -729,7 +728,8 @@ function(qt6_generate_meta_types_json_file target)
set(arg_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${arg_INSTALL_DIR}")
endif()
- if (arg_COPY_OVER_INSTALL AND NOT EXISTS ${arg_INSTALL_DIR}/${metatypes_file_name})
+ if (should_install AND arg_COPY_OVER_INSTALL
+ AND NOT EXISTS ${arg_INSTALL_DIR}/${metatypes_file_name})
file(MAKE_DIRECTORY "${arg_INSTALL_DIR}")
file(TOUCH "${arg_INSTALL_DIR}/${metatypes_file_name}")
endif()
@@ -751,50 +751,69 @@ function(qt6_generate_meta_types_json_file target)
set(metatypes_file_genex_build)
set(metatypes_file_genex_install)
if (arg_COPY_OVER_INSTALL)
- set(metatypes_file_genex_build
- "$<BUILD_INTERFACE:$<$<BOOL:$<TARGET_PROPERTY:QT_CONSUMES_METATYPES>>:${arg_INSTALL_DIR}/${metatypes_file_name}>>"
- )
+ if(should_install)
+ set(metatypes_file_genex_build
+ "$<BUILD_INTERFACE:$<$<BOOL:$<TARGET_PROPERTY:QT_CONSUMES_METATYPES>>:${arg_INSTALL_DIR}/${metatypes_file_name}>>"
+ )
+ endif()
else()
set(metatypes_file_genex_build
"$<BUILD_INTERFACE:$<$<BOOL:$<TARGET_PROPERTY:QT_CONSUMES_METATYPES>>:${metatypes_file}>>"
)
- set(metatypes_file_genex_install
- "$<INSTALL_INTERFACE:$<$<BOOL:$<TARGET_PROPERTY:QT_CONSUMES_METATYPES>>:$<INSTALL_PREFIX>/${arg_INSTALL_DIR}/${metatypes_file_name}>>"
- )
+ if(should_install)
+ set(metatypes_file_genex_install
+ "$<INSTALL_INTERFACE:$<$<BOOL:$<TARGET_PROPERTY:QT_CONSUMES_METATYPES>>:$<INSTALL_PREFIX>/${arg_INSTALL_DIR}/${metatypes_file_name}>>"
+ )
+ endif()
endif()
set_source_files_properties(${metatypes_file} PROPERTIES HEADER_FILE_ONLY TRUE)
set_target_properties(${target} PROPERTIES
INTERFACE_QT_MODULE_HAS_META_TYPES YES
INTERFACE_QT_MODULE_META_TYPES_FROM_BUILD YES
- INTERFACE_QT_META_TYPES_BUILD_FILE ${metatypes_file}
+ INTERFACE_QT_META_TYPES_BUILD_FILE "${metatypes_file}"
QT_MODULE_META_TYPES_FILE_GENEX_BUILD "${metatypes_file_genex_build}"
QT_MODULE_META_TYPES_FILE_GENEX_INSTALL "${metatypes_file_genex_install}"
)
target_sources(${target} INTERFACE ${metatypes_file_genex_build} ${metatypes_file_genex_install})
- if (arg_COPY_OVER_INSTALL)
- get_target_property(target_type ${target} TYPE)
- set(command_args
- COMMAND ${CMAKE_COMMAND} -E copy_if_different
- "${metatypes_file}"
- "${arg_INSTALL_DIR}/${metatypes_file_name}"
- )
- if (target_type STREQUAL "OBJECT_LIBRARY")
- add_custom_target(${target}_metatypes_copy
- DEPENDS "${metatypes_file}"
- ${command_args}
+ # Installation is complicated, because there are multiple combinations.
+ # In non-prefix builds (signaled by arg_COPY_OVER_INSTALL == TRUE), Qt modules are /copied/
+ # into the qt_prefix/lib/metatypes.
+ # In prefix builds (signaled by arg_COPY_OVER_INSTALL == FALSE), Qt modules are /installed/
+ # into the qt_prefix/lib/metatypes.
+ # Currently only the internal qt_add_module sets arg_COPY_OVER_INSTALL.
+ #
+ # Tests and examples are executables, and thus will not have their meta types installed, but
+ # they will have them generated (if this function is called).
+ #
+ # Regular libraries and plugins (which are not part of the Qt build), will be /installed/
+ # into a lib/metatypes directory relative to their prefix, rather than the Qt prefix (only
+ # outside of a Qt build).
+ # We don't support non-prefix builds for libraries or plugins which are not part of the official
+ # Qt build. Aka everything non-prefix / COPY_OVER_INSTALL related are implementation details
+ # that users shouldn't use.
+ if(should_install)
+ if (arg_COPY_OVER_INSTALL)
+ set(command_args
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different
+ "${metatypes_file}"
+ "${arg_INSTALL_DIR}/${metatypes_file_name}"
)
- add_dependencies(${target} ${target}_metatypes_copy)
+ if (target_type STREQUAL "OBJECT_LIBRARY")
+ add_custom_target(${target}_metatypes_copy
+ DEPENDS "${metatypes_file}"
+ ${command_args}
+ )
+ add_dependencies(${target} ${target}_metatypes_copy)
+ else()
+ add_custom_command(TARGET ${target} POST_BUILD
+ ${command_args}
+ )
+ endif()
else()
- add_custom_command(TARGET ${target} POST_BUILD
- ${command_args}
- )
+ install(FILES "${metatypes_file}" DESTINATION "${arg_INSTALL_DIR}")
endif()
- else()
- install(FILES "${metatypes_file}"
- DESTINATION "${arg_INSTALL_DIR}"
- )
endif()
endfunction()