b1ad7f938e
When packaging different Qt versions for Linux distributions (or any distribution with a common bin dir), Qt tools cannot be installed to /usr/bin, because the executable names of the different Qt versions clash. To solve this conflict, our recommendation is to install Qt's tools to /usr/lib/qt6/bin and to create versioned symlinks to user-facing tools in /usr/bin. User-facing tools are tools that are supposed to be started manually by the user. They are marked in Qt's build system. Distro package maintainers can now configure with -DCMAKE_INSTALL_PREFIX=/usr -DINSTALL_BINDIR=/usr/lib/qt6/bin -DINSTALL_PUBLICBINDIR=/usr/bin and will find a file called user_facing_tool_links.txt in the build directory after the cmake run. Nothing will be installed to INSTALL_PUBLICBINDIR. Each line of user_facing_tool_links.txt consists of the installation path of a user-facing application followed by a space and the versioned link name in INSTALL_PUBLICBINDIR. Example content: /usr/lib/qt6/bin/qmake /usr/bin/qmake6 To actually create the versioned symlinks, the content of this file can be fed to ln like this: xargs ln -s < build-dir/user_facing_tool_links.txt Or the package maintainer may decide to do something completely different as suits their needs. This patch adds the USER_FACING argument to qt_internal_add_tool to mark tools as user-facing. In addition, every Qt created by qt_internal_add_app is treated as user-facing. The only tool this patch marks as user-facing in qtbase is qmake. Pick-to: 6.1 Fixes: QTBUG-89170 Change-Id: I52673b1c8d40f40f56a74203065553115e2c4de5 Reviewed-by: Kai Koehne <kai.koehne@qt.io> Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
102 lines
3.8 KiB
CMake
102 lines
3.8 KiB
CMake
# 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_internal_add_executable("${target}"
|
|
QT_APP
|
|
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)
|
|
|
|
# Consider every app as user facing tool.
|
|
set_property(GLOBAL APPEND PROPERTY QT_USER_FACING_TOOL_TARGETS ${target})
|
|
|
|
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)
|
|
_qt_internal_generate_win32_rc_file("${target}")
|
|
endif()
|
|
|
|
# Rpaths need to be applied in the finalizer, because the MACOSX_BUNDLE property might be
|
|
# set after a qt_internal_add_app call.
|
|
qt_apply_rpaths(TARGET "${target}" INSTALL_PATH "${INSTALL_BINDIR}" RELATIVE_RPATH)
|
|
endfunction()
|