From fb9cbd3b2a12dfcddb8ef66d39ed4475ff1d56a7 Mon Sep 17 00:00:00 2001 From: Alexandru Croitor Date: Mon, 12 Jul 2021 16:19:31 +0200 Subject: [PATCH] CMake: Clean up and simplify qt6_extract_metatypes implementation Remove copying of json files in non-prefix builds. Previously, this was done to mimic the directory layout of prefix builds in a non-prefix build, but the extra complexity is not worth it. Keeping the files in the build directories of each repo in a non-prefix build should be good enough. As a result, we don't need to distinguish which file path should be passed in INTERFACE_SOURCES. Now we have only 2 paths to consider, the BUILD_INTERFACE one and the INSTALL_PREFIX one, rather than 3 different paths. Move the code that handles installation closer together. Rename the internal COPY_OVER_INSTALL option to ___QT_INTERNAL_NO_INSTALL. We might want to expose it as a public option later, but it depends on whether we will disable default installation for user projects. Remove assignment of some properties that are not used anymore. Amends c431e2d33c2b13dee8b43a08c267c20ec1ae9654 Pick-to: 6.2 Task-number: QTBUG-94942 Change-Id: I3a26d1988987b2ce7c7d01d2311c13b3da3175a8 Reviewed-by: Qt CI Bot Reviewed-by: Joerg Bornemann --- cmake/QtModuleHelpers.cmake | 2 +- src/corelib/CMakeLists.txt | 3 +- src/corelib/Qt6CoreMacros.cmake | 111 +++++++++++--------------------- 3 files changed, 41 insertions(+), 75 deletions(-) diff --git a/cmake/QtModuleHelpers.cmake b/cmake/QtModuleHelpers.cmake index ec09984522..512772b287 100644 --- a/cmake/QtModuleHelpers.cmake +++ b/cmake/QtModuleHelpers.cmake @@ -601,7 +601,7 @@ set(QT_LIBINFIX \"${QT_LIBINFIX}\")") set(metatypes_install_dir ${INSTALL_LIBDIR}/metatypes) set(args) if (NOT QT_WILL_INSTALL) - set(args COPY_OVER_INSTALL INSTALL_DIR "${QT_BUILD_DIR}/${metatypes_install_dir}") + set(args __QT_INTERNAL_NO_INSTALL) else() set(args INSTALL_DIR "${metatypes_install_dir}") endif() diff --git a/src/corelib/CMakeLists.txt b/src/corelib/CMakeLists.txt index 4878c45008..2df53a0a00 100644 --- a/src/corelib/CMakeLists.txt +++ b/src/corelib/CMakeLists.txt @@ -317,8 +317,7 @@ set(core_metatype_args MANUAL_MOC_JSON_FILES ${core_qobject_metatypes_json_list} set(metatypes_install_dir ${INSTALL_LIBDIR}/metatypes) if (NOT QT_WILL_INSTALL) - list(APPEND core_metatype_args - COPY_OVER_INSTALL INSTALL_DIR "${QT_BUILD_DIR}/${metatypes_install_dir}") + list(APPEND core_metatype_args __QT_INTERNAL_NO_INSTALL) else() list(APPEND core_metatype_args INSTALL_DIR "${metatypes_install_dir}") endif() diff --git a/src/corelib/Qt6CoreMacros.cmake b/src/corelib/Qt6CoreMacros.cmake index 79cd6f7a1c..370e703a4d 100644 --- a/src/corelib/Qt6CoreMacros.cmake +++ b/src/corelib/Qt6CoreMacros.cmake @@ -934,8 +934,7 @@ endif() # INSTALL_DIR: Location where to install the metatypes file. For public consumption, # defaults to a ${CMAKE_INSTALL_PREFIX}/${INSTALL_LIBDIR}/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. +# __QT_INTERNAL_NO_INSTALL: When passed, will skip installation of the metatype file. function(qt6_extract_metatypes target) get_target_property(existing_meta_types_file ${target} INTERFACE_QT_META_TYPES_BUILD_FILE) @@ -943,7 +942,8 @@ function(qt6_extract_metatypes target) return() endif() - cmake_parse_arguments(arg "COPY_OVER_INSTALL" "INSTALL_DIR" "MANUAL_MOC_JSON_FILES" ${ARGN}) + cmake_parse_arguments(arg + "__QT_INTERNAL_NO_INSTALL" "INSTALL_DIR" "MANUAL_MOC_JSON_FILES" ${ARGN}) get_target_property(target_type ${target} TYPE) if (target_type STREQUAL "INTERFACE_LIBRARY") @@ -956,24 +956,6 @@ function(qt6_extract_metatypes 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) - # INSTALL_LIBDIR is not set when QtBuildInternals is not loaded (when not doing a Qt build). - if(INSTALL_LIBDIR) - set(arg_INSTALL_DIR "${INSTALL_LIBDIR}/metatypes") - else() - set(arg_INSTALL_DIR "lib/metatypes") - endif() - 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") @@ -1117,33 +1099,10 @@ function(qt6_extract_metatypes target) file(TOUCH ${metatypes_file}) endif() - # Need to make the path absolute during a Qt non-prefix build, otherwise files are written - # to the source dir because the paths are relative to the source dir when using file(TOUCH). - if(arg_COPY_OVER_INSTALL AND NOT IS_ABSOLUTE "${arg_INSTALL_DIR}/${metatypes_file_name}") - set(arg_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${arg_INSTALL_DIR}") - endif() - - set(metatypes_file_non_prefix) - if(should_install AND arg_COPY_OVER_INSTALL) - set(metatypes_file_non_prefix "${arg_INSTALL_DIR}/${metatypes_file_name}") - set(metatypes_non_prefix_copy - COMMAND ${CMAKE_COMMAND} -E copy_if_different - "${metatypes_file}" - "${metatypes_file_non_prefix}" - ) - - # The reason for this configure-time file creation is described in a comment slightly above. - if(NOT EXISTS "${metatypes_file_non_prefix}") - file(MAKE_DIRECTORY "${arg_INSTALL_DIR}") - file(TOUCH "${metatypes_file_non_prefix}") - endif() - endif() - add_custom_command( OUTPUT ${metatypes_file_gen} ${metatypes_file} - ${metatypes_file_non_prefix} DEPENDS ${QT_CMAKE_EXPORT_NAMESPACE}::moc ${automoc_dependencies} ${manual_dependencies} COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::moc -o ${metatypes_file_gen} @@ -1151,48 +1110,56 @@ function(qt6_extract_metatypes target) COMMAND ${CMAKE_COMMAND} -E copy_if_different ${metatypes_file_gen} ${metatypes_file} - # One more command - ${metatypes_non_prefix_copy} COMMENT "Running moc --collect-json for target ${target}" ) - # We still need to add this file as a source of Core, otherwise the file + # We still need to add this file as a source of the target, otherwise the file # rule above is not triggered. INTERFACE_SOURCES do not properly register # as dependencies to build the current target. + # TODO: Can we pass ${metatypes_file} instead of ${metatypes_file_gen} as a source? + # TODO: Do we still need the _gen variant at all? target_sources(${target} PRIVATE ${metatypes_file_gen}) - set(metatypes_file_genex_build) - set(metatypes_file_genex_install) - if (arg_COPY_OVER_INSTALL) - if(should_install) - set(metatypes_file_genex_build - "$>:${arg_INSTALL_DIR}/${metatypes_file_name}>>" - ) - endif() - else() - set(metatypes_file_genex_build - "$>:${metatypes_file}>>" - ) - if(should_install) - set(metatypes_file_genex_install - "$>:$/${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}" - 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}) + + # Set up consumption of files via INTERFACE_SOURCES. + set(consumes_metatypes "$>") + set(metatypes_file_genex_build + "$>" + ) + target_sources(${target} INTERFACE ${metatypes_file_genex_build}) + + # Chech whether the generated json file needs to be installed. + # Executable metatypes.json files should not be installed. Qt non-prefix builds should also + # not install the files. + set(should_install TRUE) + if (target_type STREQUAL "EXECUTABLE" OR arg___QT_INTERNAL_NO_INSTALL) + set(should_install "FALSE") + endif() + + # Automatically fill default install args when not specified. + if (NOT arg_INSTALL_DIR) + # INSTALL_LIBDIR is not set when QtBuildInternals is not loaded (when not doing a Qt build). + # Default to a hardcoded location for user projects. + if(INSTALL_LIBDIR) + set(arg_INSTALL_DIR "${INSTALL_LIBDIR}/metatypes") + else() + set(arg_INSTALL_DIR "lib/metatypes") + endif() + endif() if(should_install) - if(NOT arg_COPY_OVER_INSTALL) - install(FILES "${metatypes_file}" DESTINATION "${arg_INSTALL_DIR}") - endif() + set(metatypes_file_install_path "${arg_INSTALL_DIR}/${metatypes_file_name}") + set(metatypes_file_install_path_genex "$/${metatypes_file_install_path}") + set(metatypes_file_genex_install + "$>" + ) + target_sources(${target} INTERFACE ${metatypes_file_genex_install}) + install(FILES "${metatypes_file}" DESTINATION "${arg_INSTALL_DIR}") endif() endfunction()