Provide a way to specify extra tool package dependencies
In the qtwayland repo, both WaylandClient and WaylandCompositor packages need access to the qtwaylandscanner tool. That means that the add_qt_tool(qtwaylandscanner) can't use the TOOLS_TARGET argument to associate a dependency with only one of the above modules. Instead add_qt_tool now allows specifying a non-existent module name for the TOOLS_TARGET argument, which can be manually depended on by other packages. Actually, you could specify the non-existent module before as well, but that didn't do everything that had to be done. This required a bit of refactoring in how the Dependencies file for Tools packages is created. Now the file is created in qt_export_tools. Two new functions were also added to allow recording additional dependencies between packages. Also some bug fixes were done to make it all work. Specifically the _FOUND variable generated in the Dependencies file was incorrect. Also there are some quotes missing when appending extra package dependencies via the QT_EXTRA_PACKAGE_DEPENDENCIES property. Change-Id: I167efec16dff8d036e191df3572ea72764e22bc5 Reviewed-by: Leander Beernaert <leander.beernaert@qt.io> Reviewed-by: Qt CMake Build Bot Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
This commit is contained in:
parent
1c655fb0fc
commit
9061f29872
@ -1715,7 +1715,18 @@ function(qt_export_tools module_name)
|
|||||||
# Also assemble a list of tool targets to expose in the config file for informational purposes.
|
# Also assemble a list of tool targets to expose in the config file for informational purposes.
|
||||||
set(extra_cmake_statements "")
|
set(extra_cmake_statements "")
|
||||||
set(tool_targets "")
|
set(tool_targets "")
|
||||||
|
|
||||||
|
# List of package dependencies that need be find_package'd when using the Tools package.
|
||||||
|
set(package_deps "")
|
||||||
|
|
||||||
foreach(tool_name ${QT_KNOWN_MODULE_${module_name}_TOOLS})
|
foreach(tool_name ${QT_KNOWN_MODULE_${module_name}_TOOLS})
|
||||||
|
# Specific tools can have package dependencies.
|
||||||
|
# e.g. qtwaylandscanner depends on WaylandScanner (non-qt package).
|
||||||
|
get_target_property(extra_packages "${tool_name}" QT_EXTRA_PACKAGE_DEPENDENCIES)
|
||||||
|
if(extra_packages)
|
||||||
|
list(APPEND package_deps "${extra_packages}")
|
||||||
|
endif()
|
||||||
|
|
||||||
set(extra_cmake_statements "${extra_cmake_statements}
|
set(extra_cmake_statements "${extra_cmake_statements}
|
||||||
if (NOT QT_NO_CREATE_TARGETS)
|
if (NOT QT_NO_CREATE_TARGETS)
|
||||||
get_property(is_global TARGET ${INSTALL_CMAKE_NAMESPACE}::${tool_name} PROPERTY IMPORTED_GLOBAL)
|
get_property(is_global TARGET ${INSTALL_CMAKE_NAMESPACE}::${tool_name} PROPERTY IMPORTED_GLOBAL)
|
||||||
@ -1730,6 +1741,31 @@ endif()
|
|||||||
string(APPEND extra_cmake_statements
|
string(APPEND extra_cmake_statements
|
||||||
"set(${QT_CMAKE_EXPORT_NAMESPACE}${module_name}Tools_TARGETS \"${tool_targets}\")")
|
"set(${QT_CMAKE_EXPORT_NAMESPACE}${module_name}Tools_TARGETS \"${tool_targets}\")")
|
||||||
|
|
||||||
|
# Extract package dependencies that were determined in QtPostProcess, but only if ${module_name}
|
||||||
|
# is an actual target.
|
||||||
|
# module_name can be a non-existent target, if the tool doesn't have an existing associated
|
||||||
|
# module, e.g. qtwaylandscanner.
|
||||||
|
if(TARGET "${module_name}")
|
||||||
|
get_target_property(module_package_deps "${module_name}" _qt_tools_package_deps)
|
||||||
|
if(module_package_deps)
|
||||||
|
list(APPEND package_deps "${module_package_deps}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Configure and install dependencies file for the ${module_name}Tools package.
|
||||||
|
configure_file(
|
||||||
|
"${QT_CMAKE_DIR}/QtModuleToolsDependencies.cmake.in"
|
||||||
|
"${config_build_dir}/${INSTALL_CMAKE_NAMESPACE}${target}Dependencies.cmake"
|
||||||
|
@ONLY
|
||||||
|
)
|
||||||
|
|
||||||
|
qt_install(FILES
|
||||||
|
"${config_build_dir}/${INSTALL_CMAKE_NAMESPACE}${target}Dependencies.cmake"
|
||||||
|
DESTINATION "${config_install_dir}"
|
||||||
|
COMPONENT Devel
|
||||||
|
)
|
||||||
|
|
||||||
|
# Configure and install the ${module_name}Tools package Config file.
|
||||||
configure_package_config_file(
|
configure_package_config_file(
|
||||||
"${QT_CMAKE_DIR}/QtModuleToolsConfig.cmake.in"
|
"${QT_CMAKE_DIR}/QtModuleToolsConfig.cmake.in"
|
||||||
"${config_build_dir}/${INSTALL_CMAKE_NAMESPACE}${target}Config.cmake"
|
"${config_build_dir}/${INSTALL_CMAKE_NAMESPACE}${target}Config.cmake"
|
||||||
@ -1760,6 +1796,38 @@ endif()
|
|||||||
# CONFIG_INSTALL_DIR ${config_install_dir})
|
# CONFIG_INSTALL_DIR ${config_install_dir})
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
# This function records a dependency between ${target_name} and ${dep_package_name}.
|
||||||
|
# at the CMake package level.
|
||||||
|
# E.g. The Tools package that provides the qtwaylandscanner target
|
||||||
|
# needs to call find_package(WaylandScanner) (non-qt-package).
|
||||||
|
# main_target_name = qtwaylandscanner
|
||||||
|
# dep_package_name = WaylandScanner
|
||||||
|
function(qt_record_extra_package_dependency main_target_name dep_package_name dep_package_version)
|
||||||
|
get_target_property(extra_packages "${main_target_name}" QT_EXTRA_PACKAGE_DEPENDENCIES)
|
||||||
|
if(NOT extra_packages)
|
||||||
|
set(extra_packages "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
list(APPEND extra_packages "${dep_package_name}\;${dep_package_version}")
|
||||||
|
set_target_properties("${main_target_name}" PROPERTIES QT_EXTRA_PACKAGE_DEPENDENCIES
|
||||||
|
"${extra_packages}")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# This function records a dependency between ${main_target_name} and ${dep_target_name}
|
||||||
|
# at the CMake package level.
|
||||||
|
# E.g. Qt6CoreConfig.cmake needs to find_package(Qt6WinMain).
|
||||||
|
# main_target_name = Core
|
||||||
|
# dep_target_name = WinMain
|
||||||
|
# This is just a convenience function that deals with Qt targets and their associated packages
|
||||||
|
# instead of raw package names.
|
||||||
|
function(qt_record_extra_qt_package_dependency main_target_name dep_target_name
|
||||||
|
dep_package_version)
|
||||||
|
# WinMain -> Qt6WinMain.
|
||||||
|
qt_internal_module_info(qtfied_target_name "${dep_target_name}")
|
||||||
|
qt_record_extra_package_dependency("${main_target_name}" "${qtfied_target_name_versioned}"
|
||||||
|
"${dep_package_version}")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
function(qt_internal_check_directory_or_type name dir type default result_var)
|
function(qt_internal_check_directory_or_type name dir type default result_var)
|
||||||
if ("x${dir}" STREQUAL x)
|
if ("x${dir}" STREQUAL x)
|
||||||
if("x${type}" STREQUAL x)
|
if("x${type}" STREQUAL x)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# Find "ModuleTools" dependencies, which are other ModuleTools packages.
|
# Find "ModuleTools" dependencies, which are other ModuleTools packages.
|
||||||
set(_tool_deps "@tool_deps@")
|
set(_tool_deps "@package_deps@")
|
||||||
foreach(_target_dep ${_tool_deps})
|
foreach(_target_dep ${_tool_deps})
|
||||||
list(GET _target_dep 0 pkg)
|
list(GET _target_dep 0 pkg)
|
||||||
list(GET _target_dep 1 version)
|
list(GET _target_dep 1 version)
|
||||||
@ -9,7 +9,7 @@ foreach(_target_dep ${_tool_deps})
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT ${pkg}_FOUND)
|
if (NOT ${pkg}_FOUND)
|
||||||
set(@INSTALL_CMAKE_NAMESPACE@@target@Tools_FOUND FALSE)
|
set(@INSTALL_CMAKE_NAMESPACE@@target@_FOUND FALSE)
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
|
@ -82,7 +82,7 @@ function(qt_internal_create_module_depends_file target)
|
|||||||
get_target_property(extra_depends "${target}" QT_EXTRA_PACKAGE_DEPENDENCIES)
|
get_target_property(extra_depends "${target}" QT_EXTRA_PACKAGE_DEPENDENCIES)
|
||||||
endif()
|
endif()
|
||||||
if(NOT extra_depends STREQUAL "${extra_depends}-NOTFOUND")
|
if(NOT extra_depends STREQUAL "${extra_depends}-NOTFOUND")
|
||||||
list(APPEND target_deps ${extra_depends})
|
list(APPEND target_deps "${extra_depends}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Used for assembling the content of an include/Module/ModuleDepends.h header.
|
# Used for assembling the content of an include/Module/ModuleDepends.h header.
|
||||||
@ -183,23 +183,8 @@ function(qt_internal_create_module_depends_file target)
|
|||||||
|
|
||||||
endif()
|
endif()
|
||||||
if(tool_deps)
|
if(tool_deps)
|
||||||
set(path_suffix "${INSTALL_CMAKE_NAMESPACE}${target}Tools")
|
# The value of the property will be used by qt_export_tools.
|
||||||
qt_path_join(config_build_dir ${QT_CONFIG_BUILD_DIR} ${path_suffix})
|
set_property(TARGET "${target}" PROPERTY _qt_tools_package_deps "${tool_deps}")
|
||||||
qt_path_join(config_install_dir ${QT_CONFIG_INSTALL_DIR} ${path_suffix})
|
|
||||||
|
|
||||||
# Configure and install ModuleToolDependencies file.
|
|
||||||
configure_file(
|
|
||||||
"${QT_CMAKE_DIR}/QtModuleToolsDependencies.cmake.in"
|
|
||||||
"${config_build_dir}/${INSTALL_CMAKE_NAMESPACE}${target}ToolsDependencies.cmake"
|
|
||||||
@ONLY
|
|
||||||
)
|
|
||||||
|
|
||||||
qt_install(FILES
|
|
||||||
"${config_build_dir}/${INSTALL_CMAKE_NAMESPACE}${target}ToolsDependencies.cmake"
|
|
||||||
DESTINATION "${config_install_dir}"
|
|
||||||
COMPONENT Devel
|
|
||||||
)
|
|
||||||
|
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
@ -378,12 +363,14 @@ function(qt_internal_create_config_file_for_standalone_tests)
|
|||||||
)
|
)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
qt_create_tools_config_files()
|
|
||||||
qt_internal_create_depends_files()
|
qt_internal_create_depends_files()
|
||||||
qt_generate_build_internals_extra_cmake_code()
|
qt_generate_build_internals_extra_cmake_code()
|
||||||
qt_internal_create_plugins_files()
|
qt_internal_create_plugins_files()
|
||||||
qt_internal_create_config_file_for_standalone_tests()
|
qt_internal_create_config_file_for_standalone_tests()
|
||||||
|
|
||||||
|
# Needs to run after qt_internal_create_depends_files.
|
||||||
|
qt_create_tools_config_files()
|
||||||
|
|
||||||
if (ANDROID)
|
if (ANDROID)
|
||||||
qt_modules_process_android_dependencies()
|
qt_modules_process_android_dependencies()
|
||||||
endif()
|
endif()
|
||||||
|
@ -1154,8 +1154,7 @@ if(WIN32)
|
|||||||
set(isPolicyNEW $<TARGET_POLICY:CMP0020>)
|
set(isPolicyNEW $<TARGET_POLICY:CMP0020>)
|
||||||
|
|
||||||
target_link_libraries(Core INTERFACE $<$<AND:${isExe},${isWin32},${isNotExcluded},${isPolicyNEW}>:Qt::WinMain>)
|
target_link_libraries(Core INTERFACE $<$<AND:${isExe},${isWin32},${isNotExcluded},${isPolicyNEW}>:Qt::WinMain>)
|
||||||
qt_internal_module_info(win_main_module WinMain)
|
qt_record_extra_qt_package_dependency(Core WinMain "${PROJECT_VERSION}")
|
||||||
set_property(TARGET Core APPEND PROPERTY QT_EXTRA_PACKAGE_DEPENDENCIES "${win_main_module_versioned}\\\;${PROJECT_VERSION}")
|
|
||||||
endif()
|
endif()
|
||||||
# special case end
|
# special case end
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user