From b9e5acfca388d301edd24eec4ad21e78f581371c Mon Sep 17 00:00:00 2001 From: Alexandru Croitor Date: Tue, 22 Feb 2022 18:51:16 +0100 Subject: [PATCH] configure: CMake: Add -no-prefix option MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce a new -no-prefix option that can be used to build Qt without having to install it. Currently, -no-prefix is already implied by -developer-build, but -developer-build also implies -warnings-are-errors and -feature-private-tests, which not everyone might want to use. Some Qt builders likely use -developer-build for the no-prefix behavior, hence we introduce a standalone -no-prefix option to offer a nicer user experience without -Werror and friends. Previously it was possible to achieve the same by specifying -prefix $PWD, but that relies on $PWD expanding property in the used shell. The new -no-prefix doesn't depend on the type of the shell and is shorter to type. Internally this gets passed by configure as -DINPUT_no_prefix=yes to CMake, and transformed into a -DQT_FEATURE_no_prefix=ON feature. The feature also gets automatically auto-detected to ON if developer-build is set, -prefix is either unset or $PWD. CMake code should still query QT_WILL_INSTALL to decide whether files need to be installed or not. As a drive-by, we now also export QT_FEATURE_developer_build to be available for querying during configuration of other repos (previously it was only possible to query FEATURE_developer_build). Change-Id: Iaa6c8d8ae2b736282e9949d2a5d7f412e290a253 Reviewed-by: Alexey Edelev Reviewed-by: Kai Koehne (cherry picked from commit 32b596b7b10eac63293cf3bd3e04a15bd826fbf1) Reviewed-by: Jörg Bornemann --- cmake/QtProcessConfigureArgs.cmake | 8 ++++++++ cmake/QtSetup.cmake | 13 ++++++++++++- cmake/configure-cmake-mapping.md | 2 ++ config_help.txt | 4 ++++ configure.cmake | 10 +++++++++- qt_cmdline.cmake | 2 ++ 6 files changed, 37 insertions(+), 2 deletions(-) diff --git a/cmake/QtProcessConfigureArgs.cmake b/cmake/QtProcessConfigureArgs.cmake index 1940b250fdb..986c50cc06f 100644 --- a/cmake/QtProcessConfigureArgs.cmake +++ b/cmake/QtProcessConfigureArgs.cmake @@ -600,6 +600,10 @@ while(1) if(arg MATCHES "^--?enable-(.*)") set(opt "${CMAKE_MATCH_1}") set(val "yes") + # Handle -no-prefix so it's not interpreted as the negation of -prefix + elseif(arg MATCHES "-(no-prefix)") + set(opt "${CMAKE_MATCH_1}") + set(val "") elseif(arg MATCHES "^--?(disable|no)-(.*)") set(opt "${CMAKE_MATCH_2}") set(val "no") @@ -902,6 +906,10 @@ foreach(input ${config_inputs}) push("-DINPUT_${cmake_input}=${INPUT_${input}}") endforeach() +if(DEFINED INPUT_no-prefix AND DEFINED INPUT_prefix) + qtConfAddError("Can't specify both -prefix and -no-prefix options at the same time.") +endif() + if(NOT generator AND auto_detect_generator) find_program(ninja ninja) if(ninja) diff --git a/cmake/QtSetup.cmake b/cmake/QtSetup.cmake index 83f07cf98b5..e886428508a 100644 --- a/cmake/QtSetup.cmake +++ b/cmake/QtSetup.cmake @@ -11,6 +11,13 @@ if(NOT FEATURE_developer_build AND INPUT_developer_build set(FEATURE_developer_build ON) endif() +# Pre-calculate the no_prefix feature if it's set by configure via INPUT_no_prefix. +# This needs to be done before qtbase/configure.cmake is processed. +if(NOT FEATURE_no_prefix AND INPUT_no_prefix + AND NOT "${INPUT_no_prefix}" STREQUAL "undefined") + set(FEATURE_no_prefix ON) +endif() + set(_default_build_type "Release") if(FEATURE_developer_build) set(_default_build_type "Debug") @@ -95,7 +102,11 @@ set(CMAKE_LINK_DEPENDS_NO_SHARED ON) # QtBuildInternalsExtra.cmake file. if (PROJECT_NAME STREQUAL "QtBase" AND NOT QT_BUILD_STANDALONE_TESTS) if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - if(FEATURE_developer_build) + # Handle both FEATURE_ and QT_FEATURE_ cases when they are specified on the command line + # explicitly. It's possible for one to be set, but not the other, because + # qtbase/configure.cmake is not processed by this point. + if(FEATURE_developer_build OR QT_FEATURE_developer_build + OR FEATURE_no_prefix OR QT_FEATURE_no_prefix) # Handle non-prefix builds by setting the CMake install prefix to point to qtbase's # build dir. While building another repo (like qtsvg) the CMAKE_PREFIX_PATH should be # set on the command line to point to the qtbase build dir. diff --git a/cmake/configure-cmake-mapping.md b/cmake/configure-cmake-mapping.md index 01f7d5f164a..6874b909b39 100644 --- a/cmake/configure-cmake-mapping.md +++ b/cmake/configure-cmake-mapping.md @@ -3,6 +3,8 @@ The following table describes the mapping of configure options to CMake argument | configure | cmake | Notes | |---------------------------------------|---------------------------------------------------|-----------------------------------------------------------------| | -prefix /opt/qt6 | -DCMAKE_INSTALL_PREFIX=/opt/qta6 | | +| -no-prefix (only available in Qt6) | -DCMAKE_INSTALL_PREFIX=$PWD (with bash) | In Qt5 this was done by specifying -prefix $PWD | +| or -DFEATURE_no_prefix=ON | | | -extprefix /opt/qt6 | -DCMAKE_STAGING_PREFIX=/opt/qt6 | | | -bindir | -DINSTALL_BINDIR= | similar for -headerdir -libdir and so on | | -hostdatadir | -DINSTALL_MKSPECSDIR= | | diff --git a/config_help.txt b/config_help.txt index 095d036601d..48e1bfc9424 100644 --- a/config_help.txt +++ b/config_help.txt @@ -7,6 +7,10 @@ Top-level installation directories: -prefix ...... The deployment directory, as seen on the target device. [/usr/local/Qt-$QT_VERSION; qtbase build directory if -developer-build] + -no-prefix ......... The deployment directory is set to the qtbase build + directory. Can be used instead of -developer-build + to not have to install, as well as avoid + -developer-build's default of -warnings-are-errors. -extprefix ... The installation directory, as seen on the host machine. [SYSROOT/PREFIX] diff --git a/configure.cmake b/configure.cmake index 251da236cb3..e7e42cb9825 100644 --- a/configure.cmake +++ b/configure.cmake @@ -467,10 +467,18 @@ qt_feature("pkg-config" PUBLIC ) qt_feature_config("pkg-config" QMAKE_PUBLIC_QT_CONFIG NEGATE) -qt_feature("developer-build" +qt_feature("developer-build" PRIVATE LABEL "Developer build" AUTODETECT OFF ) +qt_feature("no-prefix" PRIVATE + LABEL "No prefix build" + # The var expansion on the right hand side is on purpose + # because the custom condition evaluator only expands the lhs + CONDITION (CMAKE_INSTALL_PREFIX STREQUAL "${QtBase_BINARY_DIR}") + OR CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT + AUTODETECT QT_FEATURE_developer_build +) qt_feature("private_tests" PRIVATE LABEL "Developer build: private_tests" CONDITION QT_FEATURE_developer_build diff --git a/qt_cmdline.cmake b/qt_cmdline.cmake index eb40df0061f..54f1b4ba399 100644 --- a/qt_cmdline.cmake +++ b/qt_cmdline.cmake @@ -9,6 +9,8 @@ qt_commandline_subconfig(src/plugins/sqldrivers) qt_commandline_subconfig(src/testlib) qt_commandline_subconfig(qmake) # special case qt_commandline_custom(qmakeArgs) +# no-prefix needs to be placed before prefix +qt_commandline_option(no-prefix TYPE void) qt_commandline_option(prefix TYPE string) qt_commandline_option(extprefix TYPE string) qt_commandline_option(archdatadir TYPE string)