diff options
-rw-r--r-- | cmake/QtBuild.cmake | 106 | ||||
-rw-r--r-- | cmake/QtPostProcess.cmake | 19 |
2 files changed, 89 insertions, 36 deletions
diff --git a/cmake/QtBuild.cmake b/cmake/QtBuild.cmake index defbe066d3..cd03cd992c 100644 --- a/cmake/QtBuild.cmake +++ b/cmake/QtBuild.cmake @@ -1,14 +1,43 @@ include(CMakePackageConfigHelpers) include(QtSeparateDebugInfo) +function(qt_configure_process_path name default docstring) + # Values are computed once for qtbase, and then exported and reused for other projects. + if(NOT PROJECT_NAME STREQUAL "QtBase") + return() + endif() + + # No value provided, set the default. + if(NOT DEFINED "${name}") + set("${name}" "${default}" CACHE STRING "${docstring}") + else() + get_filename_component(given_path_as_abs "${${name}}" ABSOLUTE BASE_DIR + "${CMAKE_INSTALL_PREFIX}") + file(RELATIVE_PATH rel_path "${CMAKE_INSTALL_PREFIX}" "${given_path_as_abs}") + + # If absolute path given, check that it's inside the prefix (error out if not). + # TODO: Figure out if we need to support paths that are outside the prefix. + # + # If relative path given, it's relative to the install prefix (rather than the binary dir, + # which is what qmake does for some reason). + # In both cases, store the value as a relative path. + if(rel_path MATCHES "^\.\./") + message(FATAL_ERROR + "Path component '${name}' is outside computed install prefix: ${rel_path} ") + endif() + set("${name}" "${rel_path}" CACHE STRING "${docstring}" FORCE) + endif() +endfunction() + # Install locations: -set(INSTALL_BINDIR "bin" CACHE STRING "Executables [PREFIX/bin]") -set(INSTALL_INCLUDEDIR "include" CACHE STRING "Header files [PREFIX/include]") -set(INSTALL_LIBDIR "lib" CACHE STRING "Libraries [PREFIX/lib]") -set(INSTALL_MKSPECSDIR "mkspecs" CACHE STRING "Mkspecs files [PREFIX/mkspecs]") -set(INSTALL_ARCHDATADIR "." CACHE STRING "Arch-dependent data [PREFIX]") -set(INSTALL_PLUGINSDIR "${INSTALL_ARCHDATADIR}/plugins" CACHE STRING - "Plugins [ARCHDATADIR/plugins]") +qt_configure_process_path(INSTALL_BINDIR "bin" "Executables [PREFIX/bin]") +qt_configure_process_path(INSTALL_INCLUDEDIR "include" "Header files [PREFIX/include]") +qt_configure_process_path(INSTALL_LIBDIR "lib" "Libraries [PREFIX/lib]") +qt_configure_process_path(INSTALL_MKSPECSDIR "mkspecs" "Mkspecs files [PREFIX/mkspecs]") +qt_configure_process_path(INSTALL_ARCHDATADIR "." "Arch-dependent data [PREFIX]") +qt_configure_process_path(INSTALL_PLUGINSDIR + "${INSTALL_ARCHDATADIR}/plugins" + "Plugins [ARCHDATADIR/plugins]") set(INSTALL_TARGETS_DEFAULT_ARGS RUNTIME DESTINATION "${INSTALL_BINDIR}" @@ -23,20 +52,25 @@ else() set(_default_libexec "${INSTALL_ARCHDATADIR}/libexec") endif() -set(INSTALL_LIBEXECDIR "${_default_libexec}" CACHE STRING +qt_configure_process_path( + INSTALL_LIBEXECDIR + "${_default_libexec}" "Helper programs [ARCHDATADIR/bin on Windows, ARCHDATADIR/libexec otherwise]") -set(INSTALL_QMLDIR "${INSTALL_ARCHDATADIR}/qml" CACHE STRING - "QML2 imports [ARCHDATADIR/qml]") -set(INSTALL_DATADIR "." CACHE STRING "Arch-independent data [PREFIX]") -set(INSTALL_DOCDIR "${INSTALL_DATADIR}/doc" CACHE STRING "Documentation [DATADIR/doc]") -set(INSTALL_TRANSLATIONSDIR "${INSTALL_DATADIR}/translations" CACHE STRING +qt_configure_process_path(INSTALL_QMLDIR + "${INSTALL_ARCHDATADIR}/qml" + "QML2 imports [ARCHDATADIR/qml]") +qt_configure_process_path(INSTALL_DATADIR "." "Arch-independent data [PREFIX]") +qt_configure_process_path(INSTALL_DOCDIR "${INSTALL_DATADIR}/doc" "Documentation [DATADIR/doc]") +qt_configure_process_path(INSTALL_TRANSLATIONSDIR "${INSTALL_DATADIR}/translations" "Translations [DATADIR/translations]") -set(INSTALL_SYSCONFDIR "etc/xdg" CACHE STRING - "Settings used by Qt programs [PREFIX/etc/xdg]") -set(INSTALL_EXAMPLESDIR "examples" CACHE STRING "Examples [PREFIX/examples]") -set(INSTALL_TESTSDIR "tests" CACHE STRING "Tests [PREFIX/tests]") -set(INSTALL_DESCRIPTIONSDIR "${INSTALL_DATADIR}/modules" CACHE STRING - "Module description files directory") +qt_configure_process_path(INSTALL_SYSCONFDIR + "etc/xdg" + "Settings used by Qt programs [PREFIX/etc/xdg]") +qt_configure_process_path(INSTALL_EXAMPLESDIR "examples" "Examples [PREFIX/examples]") +qt_configure_process_path(INSTALL_TESTSDIR "tests" "Tests [PREFIX/tests]") +qt_configure_process_path(INSTALL_DESCRIPTIONSDIR + "${INSTALL_DATADIR}/modules" + "Module description files directory") # The variables might have already been set in QtBuildInternalsExtra.cmake if the file is included # while building a new module and not QtBase. In that case, stop overriding the value. @@ -4047,18 +4081,18 @@ function(qt_generate_qconfig_cpp) set(QT_CONFIG_STRS "") # Start first part. - qt_add_string_to_qconfig_cpp("doc") - qt_add_string_to_qconfig_cpp("include") - qt_add_string_to_qconfig_cpp("lib") - qt_add_string_to_qconfig_cpp("libexec") - qt_add_string_to_qconfig_cpp("bin") - qt_add_string_to_qconfig_cpp("plugins") - qt_add_string_to_qconfig_cpp("qml") - qt_add_string_to_qconfig_cpp(".") - qt_add_string_to_qconfig_cpp(".") - qt_add_string_to_qconfig_cpp("translations") - qt_add_string_to_qconfig_cpp("examples") - qt_add_string_to_qconfig_cpp("tests") + qt_add_string_to_qconfig_cpp("${INSTALL_DOCDIR}") + qt_add_string_to_qconfig_cpp("${INSTALL_INCLUDEDIR}") + qt_add_string_to_qconfig_cpp("${INSTALL_LIBDIR}") + qt_add_string_to_qconfig_cpp("${INSTALL_LIBEXECDIR}") + qt_add_string_to_qconfig_cpp("${INSTALL_BINDIR}") + qt_add_string_to_qconfig_cpp("${INSTALL_PLUGINSDIR}") + qt_add_string_to_qconfig_cpp("${INSTALL_QMLDIR}") + qt_add_string_to_qconfig_cpp("${INSTALL_ARCHDATADIR}") + qt_add_string_to_qconfig_cpp("${INSTALL_DATADIR}") + qt_add_string_to_qconfig_cpp("${INSTALL_TRANSLATIONSDIR}") + qt_add_string_to_qconfig_cpp("${INSTALL_EXAMPLESDIR}") + qt_add_string_to_qconfig_cpp("${INSTALL_TESTSDIR}") # Save first part. set(QT_CONFIG_STR_OFFSETS_FIRST "${QT_CONFIG_STR_OFFSETS}") @@ -4068,11 +4102,11 @@ function(qt_generate_qconfig_cpp) set(QT_CONFIG_STR_OFFSETS "") set(QT_CONFIG_STRS "") - qt_add_string_to_qconfig_cpp("") - qt_add_string_to_qconfig_cpp("false") - qt_add_string_to_qconfig_cpp("bin") - qt_add_string_to_qconfig_cpp("lib") - qt_add_string_to_qconfig_cpp(".") + qt_add_string_to_qconfig_cpp("") # config.input.sysroot + qt_add_string_to_qconfig_cpp("false") # qmake_sysrootify + qt_add_string_to_qconfig_cpp("${INSTALL_BINDIR}") # TODO: Host-specific + qt_add_string_to_qconfig_cpp("${INSTALL_LIBDIR}") # TODO: Host-specific + qt_add_string_to_qconfig_cpp("${INSTALL_DATADIR}") # TODO: Host-specific qt_add_string_to_qconfig_cpp("${QT_QMAKE_TARGET_MKSPEC}") qt_add_string_to_qconfig_cpp("${QT_QMAKE_HOST_MKSPEC}") diff --git a/cmake/QtPostProcess.cmake b/cmake/QtPostProcess.cmake index c4c4510c65..531feb0ca0 100644 --- a/cmake/QtPostProcess.cmake +++ b/cmake/QtPostProcess.cmake @@ -307,6 +307,21 @@ function(qt_internal_create_plugins_files) endforeach() endfunction() +function(qt_generate_install_prefixes out_var) + set(content "\n") + set(vars INSTALL_BINDIR INSTALL_INCLUDEDIR INSTALL_LIBDIR INSTALL_MKSPECSDIR INSTALL_ARCHDATADIR + INSTALL_PLUGINSDIR INSTALL_LIBEXECDIR INSTALL_QMLDIR INSTALL_DATADIR INSTALL_DOCDIR + INSTALL_TRANSLATIONSDIR INSTALL_SYSCONFDIR INSTALL_EXAMPLESDIR INSTALL_TESTSDIR + INSTALL_DESCRIPTIONSDIR) + + foreach(var ${vars}) + get_property(docstring CACHE "${var}" PROPERTY HELPSTRING) + string(APPEND content "set(${var} \"${${var}}\" CACHE STRING \"${docstring}\" FORCE)\n") + endforeach() + + set(${out_var} "${content}" PARENT_SCOPE) +endfunction() + function(qt_generate_build_internals_extra_cmake_code) if(PROJECT_NAME STREQUAL "QtBase") foreach(var IN LISTS QT_BASE_CONFIGURE_TESTS_VARS_TO_EXPORT) @@ -347,6 +362,10 @@ function(qt_generate_build_internals_extra_cmake_code) "set(CMAKE_DEFAULT_BUILD_TYPE \"${CMAKE_DEFAULT_BUILD_TYPE}\" CACHE STRING \"\")\n") endif() + qt_generate_install_prefixes(install_prefix_content) + + string(APPEND QT_EXTRA_BUILD_INTERNALS_VARS "${install_prefix_content}") + configure_file( "${CMAKE_CURRENT_LIST_DIR}/QtBuildInternalsExtra.cmake.in" "${extra_file_path}" |