diff options
Diffstat (limited to 'cmake')
-rw-r--r-- | cmake/CMakeLists.txt | 56 | ||||
-rw-r--r-- | cmake/FindDesignerComponents.cmake | 2 | ||||
-rw-r--r-- | cmake/Findelfutils.cmake | 70 | ||||
-rw-r--r-- | cmake/InstallDependentSharedObjects.cmake.in | 151 | ||||
-rw-r--r-- | cmake/QtCreatorAPI.cmake | 177 | ||||
-rw-r--r-- | cmake/QtCreatorIDEBranding.cmake | 9 |
6 files changed, 448 insertions, 17 deletions
diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt new file mode 100644 index 0000000000..96625d0a12 --- /dev/null +++ b/cmake/CMakeLists.txt @@ -0,0 +1,56 @@ +# Deployment of Qt, Clang, C++ Runtime libraries is being done in this script. +# +# It should be included as a subdirectory as last because of CMake's +# cmake_install.cmake script behviour of including subdirectories at the end +# of the script, not respecting the order of install commands from CMakeLists.txt +# +# This way we are sure that all the binaries have been installed before. + +option(DEPLOY_QTC_DEPENDENCIES + "Deployment of Qt, Clang, C++ Runtime libraries" ON) + +if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.16 AND DEPLOY_QTC_DEPENDENCIES) + get_target_property(moc_binary Qt5::moc IMPORTED_LOCATION) + get_filename_component(moc_dir "${moc_binary}" DIRECTORY) + get_filename_component(QT_BASE_DIR "${moc_dir}/../" ABSOLUTE) + + if (MSVC AND NOT CMAKE_BUILD_TYPE STREQUAL "Debug") + set(exclusion_mask PATTERN "*d.dll" EXCLUDE) + endif() + + foreach(plugin + assetimporters designer iconengines imageformats platforminputcontexts + platforms platformthemes printsupport qmltooling sqldrivers styles + xcbglintegrations) + if(NOT EXISTS "${QT_BASE_DIR}/plugins/${plugin}") + continue() + endif() + install( + DIRECTORY "${QT_BASE_DIR}/plugins/${plugin}" + DESTINATION ${QT_DEST_PLUGIN_PATH} + ${exclusion_mask} + ) + list(APPEND QT_PLUGIN_DIRECTORIES "${QT_DEST_PLUGIN_PATH}/${plugin}") + endforeach() + + install( + DIRECTORY "${QT_BASE_DIR}/qml/" + DESTINATION ${QT_DEST_QML_PATH} + PATTERN "qml/*" + ${exclusion_mask} + ) + + # Analyze the binaries and install missing dependencies if they are + # found the CMAKE_PREFIX_PATH e.g. Qt, Clang + configure_file(InstallDependentSharedObjects.cmake.in InstallDependentSharedObjects.cmake @ONLY) + install(SCRIPT ${CMAKE_CURRENT_BINARY_DIR}/InstallDependentSharedObjects.cmake) + + if (MSVC) + set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP ON) + include(InstallRequiredsystemLibraries) + + install(PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} + DESTINATION ${IDE_APP_PATH} + ) + endif() +endif() diff --git a/cmake/FindDesignerComponents.cmake b/cmake/FindDesignerComponents.cmake index 3d2b0255de..50073b8d6c 100644 --- a/cmake/FindDesignerComponents.cmake +++ b/cmake/FindDesignerComponents.cmake @@ -34,7 +34,7 @@ if (NOT _designer_location) get_target_property(_designer_location Qt5::Designer IMPORTED_LOCATION) endif() get_target_property(_designer_is_framework Qt5::Designer FRAMEWORK) -find_library(DesignerComponents_LIBRARIES NAMES Qt5DesignerComponents QtDesignerComponents +find_library(DesignerComponents_LIBRARIES NAMES Qt5DesignerComponents QtDesignerComponents Qt5DesignerComponentsd QtDesignerComponentsd HINTS "${_designer_location}/.." "${_designer_location}/../..") if (_designer_is_framework) diff --git a/cmake/Findelfutils.cmake b/cmake/Findelfutils.cmake new file mode 100644 index 0000000000..b4d043d53e --- /dev/null +++ b/cmake/Findelfutils.cmake @@ -0,0 +1,70 @@ +#.rst: +# Findelfutils +# ----------------- +# +# Try to locate the elfutils binary installation +# +# The ``ELFUTILS_INSTALL_DIR`` (CMake or Environment) variable should be used +# to pinpoint the elfutils binary installation +# +# If found, this will define the following variables: +# +# ``elfutils_FOUND`` +# True if the elfutils header and library files have been found +# +# ``elfutils::dw`` +# ``elfutils::elf`` +# Imported targets containing the includes and libraries need to build +# against +# + +if (TARGET elfutils::dw AND TARGET elfutils::elf) + set(elfutils_FOUND TRUE) + return() +endif() + +find_path(ELFUTILS_INCLUDE_DIR + NAMES libdwfl.h elfutils/libdwfl.h + PATH_SUFFIXES include + HINTS + "${ELFUTILS_INSTALL_DIR}" ENV ELFUTILS_INSTALL_DIR +) + +foreach(lib dw elf eu_compat) + find_library(ELFUTILS_LIB_${lib} + NAMES ${lib} + PATH_SUFFIXES lib + HINTS + "${ELFUTILS_INSTALL_DIR}" ENV ELFUTILS_INSTALL_DIR + ) +endforeach() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(elfutils + DEFAULT_MSG + ELFUTILS_INCLUDE_DIR ELFUTILS_LIB_dw ELFUTILS_LIB_elf +) + +if(elfutils_FOUND) + foreach(lib dw elf) + if (NOT TARGET elfutils::${lib}) + add_library(elfutils::${lib} UNKNOWN IMPORTED) + set_target_properties(elfutils::${lib} + PROPERTIES + IMPORTED_LOCATION "${ELFUTILS_LIB_${lib}}" + INTERFACE_INCLUDE_DIRECTORIES + "${ELFUTILS_INCLUDE_DIR};${ELFUTILS_INCLUDE_DIR}/elfutils" + ) + if (ELFUTILS_LIB_eu_compat) + target_link_libraries(elfutils::${lib} INTERFACE ${ELFUTILS_LIB_eu_compat}) + endif() + endif() + endforeach() +endif() + +mark_as_advanced(ELFUTILS_INCLUDE_DIR ELFUTILS_LIB_elf ELFUTILS_LIB_dw) + +include(FeatureSummary) +set_package_properties(elfutils PROPERTIES + URL "https://sourceware.org/elfutils/" + DESCRIPTION "a collection of utilities and libraries to read, create and modify ELF binary files") diff --git a/cmake/InstallDependentSharedObjects.cmake.in b/cmake/InstallDependentSharedObjects.cmake.in new file mode 100644 index 0000000000..a54e1fa542 --- /dev/null +++ b/cmake/InstallDependentSharedObjects.cmake.in @@ -0,0 +1,151 @@ +if (MINGW AND @CMAKE_CXX_COMPILER_ID@ MATCHES "Clang") + set(CMAKE_GET_RUNTIME_DEPENDENCIES_TOOL objdump) +endif() +if (WIN32) + set(filter_regex PRE_EXCLUDE_REGEXES "api-ms-.*|ext-ms-.*") +elseif (APPLE) + set(filter_regex PRE_EXCLUDE_REGEXES "libiodbc.*|libpq.*") +endif() + +get_filename_component(install_prefix "${CMAKE_INSTALL_PREFIX}" ABSOLUTE) + +# Get the dependencies of Qt's plugins +set(qt_plugin_directories "@QT_PLUGIN_DIRECTORIES@") +foreach(plugin IN LISTS qt_plugin_directories) + file(GLOB plugin_files "${install_prefix}/${plugin}/*@CMAKE_SHARED_LIBRARY_SUFFIX@") + list(APPEND qt_plugin_files "${plugin_files}") +endforeach() + +# Get the qml module dependencies +file(GLOB_RECURSE qml_plugin_files "${install_prefix}/@QT_DEST_QML_PATH@/*/*@CMAKE_SHARED_LIBRARY_SUFFIX@") +list(APPEND qt_plugin_files "${qml_plugin_files}") + +set(installed_EXECUTABLES_NOT_PREFIXED "@__QTC_INSTALLED_EXECUTABLES@") +set(installed_LIBRARIES_NOT_PREFIXED "@__QTC_INSTALLED_LIBRARIES@") +set(installed_MODULES_NOT_PREFIXED "@__QTC_INSTALLED_PLUGINS@") + +foreach(binary_type EXECUTABLES LIBRARIES MODULES) + foreach(element IN LISTS installed_${binary_type}_NOT_PREFIXED) + if (EXISTS "${install_prefix}/${element}") + list(APPEND installed_${binary_type} "${install_prefix}/${element}") + endif() + endforeach() +endforeach() + +# Install first the dependencies, and continue to install the dependencies +# of the installed dependencies e.g. libicu for libQt5Core on Linux. + +list(LENGTH installed_LIBRARIES installed_libraries_size) +unset(qt_plugins_installed) + +while(installed_libraries_size GREATER 0) + foreach(binary_type EXECUTABLES LIBRARIES MODULES) + list(LENGTH installed_${binary_type} list_size) + if (NOT list_size EQUAL 0) + set(${binary_type}_TO_ANALYZE ${binary_type} "${installed_${binary_type}}") + else() + set(${binary_type}_TO_ANALYZE "") + endif() + endforeach() + + file(GET_RUNTIME_DEPENDENCIES + UNRESOLVED_DEPENDENCIES_VAR unresolved_deps + RESOLVED_DEPENDENCIES_VAR resolved_deps + CONFLICTING_DEPENDENCIES_PREFIX conflicts + ${EXECUTABLES_TO_ANALYZE} + ${LIBRARIES_TO_ANALYZE} + ${MODULES_TO_ANALYZE} + DIRECTORIES + "${install_prefix}/@IDE_BIN_PATH@" + "${install_prefix}/@IDE_PLUGIN_PATH@" + "${install_prefix}/@IDE_LIBRARY_PATH@" + "${install_prefix}/@IDE_LIBRARY_BASE_PATH@/Qt/lib" + ${filter_regex} + ) + + # Clear for next step + set(installed_EXECUTABLES "") + set(installed_LIBRARIES "") + set(installed_MODULES "") + + if (NOT qt_plugins_installed) + if (WIN32) + # Needed by QmlDesigner, QmlProfiler, but they are not referenced directly. + list(APPEND unresolved_deps libEGL.dll libGLESv2.dll) + endif() + + set(qt_plugins_installed TRUE) + set(installed_MODULES "${qt_plugin_files}") + endif() + + list(REMOVE_DUPLICATES unresolved_deps) + list(REMOVE_DUPLICATES resolved_deps) + + file(TO_CMAKE_PATH "@CMAKE_PREFIX_PATH@" prefix_path) + + # Add parent link directory paths. Needed for e.g. MinGW choco libstdc++-6.dll + if (WIN32) + foreach(path "@CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES@") + get_filename_component(parent_path "${path}" DIRECTORY) + list(APPEND prefix_path "${parent_path}") + endforeach() + endif() + + # On Linux the Qt libraries might exist in the system, and they are passed + # as resolved, therefore scan the resolved dependencies too + if (NOT WIN32 AND NOT APPLE) + list(APPEND unresolved_deps "${resolved_deps}") + endif() + + foreach(so IN LISTS unresolved_deps) + + # Skip the installed dependencies + string(FIND "${so}" "${install_prefix}" found_prefix_path) + if (NOT found_prefix_path EQUAL -1) + continue() + endif() + + # On Linux get the name of the resolved Qt dependency, this would come from ldconfig + # with the full path on the system + if (NOT APPLE AND NOT WIN32) + get_filename_component(so "${so}" NAME) + endif() + + if (APPLE) + string(REPLACE "@rpath/" "" so "${so}") + get_filename_component(so_dir "${so}" DIRECTORY) + endif() + + message(STATUS "Dependency: ${so}") + foreach(p IN LISTS prefix_path) + if (WIN32) + set(so_src "${p}/bin/${so}") + set(so_dest "${install_prefix}/@IDE_BIN_PATH@") + elseif(APPLE) + set(so_src "${p}/lib/${so}") + set(so_dest "${install_prefix}/@IDE_LIBRARY_PATH@/${so_dir}") + else() + set(so_src "${p}/lib/${so}") + if (p STREQUAL "@QT_BASE_DIR@") + set(so_dest "${install_prefix}/@IDE_LIBRARY_BASE_PATH@/Qt/lib") + else() + set(so_dest "${install_prefix}/@IDE_LIBRARY_PATH@") + endif() + endif() + + message(STATUS "Looking at: ${so_src}") + if (EXISTS "${so_src}") + file(INSTALL "${so_src}" DESTINATION "${so_dest}" FOLLOW_SYMLINK_CHAIN) + if (APPLE) + get_filename_component(so "${so}" NAME) + endif() + list(APPEND installed_LIBRARIES "${so_dest}/${so}") + break() + endif() + + endforeach() + endforeach() + + list(LENGTH installed_LIBRARIES installed_libraries_size) + +endwhile() diff --git a/cmake/QtCreatorAPI.cmake b/cmake/QtCreatorAPI.cmake index 03df34bd44..fe1c1b2e76 100644 --- a/cmake/QtCreatorAPI.cmake +++ b/cmake/QtCreatorAPI.cmake @@ -1,3 +1,8 @@ +if(QT_CREATOR_API_DEFINED) + return() +endif() +set(QT_CREATOR_API_DEFINED TRUE) + include(FeatureSummary) # @@ -15,15 +20,21 @@ list(APPEND DEFAULT_DEFINES if (WIN32) list(APPEND DEFAULT_DEFINES UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS) + + if (NOT BUILD_WITH_PCH) + # Windows 8 0x0602 + list(APPEND DEFAULT_DEFINES + WINVER=0x0602 _WIN32_WINNT=0x0602 + WIN32_LEAN_AND_MEAN) + endif() endif() # # Setup path handling # -set(_IDE_APP_PATH "bin") - if (APPLE) + set(_IDE_APP_PATH ".") set(_IDE_APP_TARGET "${IDE_DISPLAY_NAME}") set(_IDE_OUTPUT_PATH "${_IDE_APP_PATH}/${_IDE_APP_TARGET}.app/Contents") @@ -35,7 +46,11 @@ if (APPLE) set(_IDE_DATA_PATH "${_IDE_OUTPUT_PATH}/Resources") set(_IDE_DOC_PATH "${_IDE_OUTPUT_PATH}/Resources/doc") set(_IDE_BIN_PATH "${_IDE_OUTPUT_PATH}/MacOS") + + set(QT_DEST_PLUGIN_PATH "${_IDE_PLUGIN_PATH}") + set(QT_DEST_QML_PATH "${_IDE_DATA_PATH}/../Imports/qtquick2") else () + set(_IDE_APP_PATH "bin") set(_IDE_APP_TARGET "${IDE_ID}") set(_IDE_LIBRARY_BASE_PATH "lib") @@ -43,8 +58,12 @@ else () set(_IDE_PLUGIN_PATH "lib/${IDE_ID}/plugins") if (WIN32) set(_IDE_LIBEXEC_PATH "bin") + set(QT_DEST_PLUGIN_PATH "bin/plugins") + set(QT_DEST_QML_PATH "bin/qml") else () set(_IDE_LIBEXEC_PATH "libexec/${IDE_ID}/bin") + set(QT_DEST_PLUGIN_PATH "lib/Qt/plugins") + set(QT_DEST_QML_PATH "lib/Qt/qml") endif () set(_IDE_DATA_PATH "share/${IDE_ID}") set(_IDE_DOC_PATH "share/doc/${IDE_ID}") @@ -74,6 +93,8 @@ list(APPEND DEFAULT_DEFINES ) file(RELATIVE_PATH _PLUGIN_TO_LIB "/${IDE_PLUGIN_PATH}" "/${IDE_LIBRARY_PATH}") +file(RELATIVE_PATH _PLUGIN_TO_QT "/${IDE_PLUGIN_PATH}" "/${IDE_LIBRARY_BASE_PATH}/Qt/lib") +file(RELATIVE_PATH _LIB_TO_QT "/${IDE_LIBRARY_PATH}" "/${IDE_LIBRARY_BASE_PATH}/Qt/lib") if (APPLE) set(_RPATH_BASE "@executable_path") @@ -85,13 +106,16 @@ elseif (WIN32) set(_PLUGIN_RPATH "") else() set(_RPATH_BASE "\$ORIGIN") - set(_LIB_RPATH "\$ORIGIN") - set(_PLUGIN_RPATH "\$ORIGIN;\$ORIGIN/${_PLUGIN_TO_LIB}") + set(_LIB_RPATH "\$ORIGIN;\$ORIGIN/${_LIB_TO_QT}") + set(_PLUGIN_RPATH "\$ORIGIN;\$ORIGIN/${_PLUGIN_TO_LIB};\$ORIGIN/${_PLUGIN_TO_QT}") endif () set(__QTC_PLUGINS "" CACHE INTERNAL "*** Internal ***") +set(__QTC_INSTALLED_PLUGINS "" CACHE INTERNAL "*** Internal ***") set(__QTC_LIBRARIES "" CACHE INTERNAL "*** Internal ***") +set(__QTC_INSTALLED_LIBRARIES "" CACHE INTERNAL "*** Internal ***") set(__QTC_EXECUTABLES "" CACHE INTERNAL "*** Internal ***") +set(__QTC_INSTALLED_EXECUTABLES "" CACHE INTERNAL "*** Internal ***") set(__QTC_TESTS "" CACHE INTERNAL "*** Internal ***") # @@ -211,7 +235,11 @@ endfunction() function(finalize_test_setup test_name) # Never translate tests: - set_tests_properties(${name} PROPERTIES QT_SKIP_TRANSLATION ON) + set_tests_properties(${name} + PROPERTIES + QT_SKIP_TRANSLATION ON + TIMEOUT 5 + ) if (WIN32) list(APPEND env_path $ENV{PATH}) @@ -222,6 +250,10 @@ function(finalize_test_setup test_name) list(APPEND env_path $<TARGET_FILE_DIR:libclang>) endif() + if (TARGET elfutils::elf) + list(APPEND env_path $<TARGET_FILE_DIR:elfutils::elf>) + endif() + string(REPLACE "/" "\\" env_path "${env_path}") string(REPLACE ";" "\\;" env_path "${env_path}") @@ -384,10 +416,16 @@ endfunction() # function(add_qtc_library name) - cmake_parse_arguments(_arg "STATIC;OBJECT;SKIP_TRANSLATION;BUILD_BY_DEFAULT" "DESTINATION" + cmake_parse_arguments(_arg "STATIC;OBJECT;SKIP_TRANSLATION;BUILD_BY_DEFAULT;ALLOW_ASCII_CASTS" + "DESTINATION" "DEFINES;DEPENDS;EXTRA_TRANSLATIONS;INCLUDES;PUBLIC_DEFINES;PUBLIC_DEPENDS;PUBLIC_INCLUDES;SOURCES;EXPLICIT_MOC;SKIP_AUTOMOC;PROPERTIES" ${ARGN} ) + set(default_defines_copy ${DEFAULT_DEFINES}) + if (_arg_ALLOW_ASCII_CASTS) + list(REMOVE_ITEM default_defines_copy QT_NO_CAST_TO_ASCII QT_RESTRICTED_CAST_FROM_ASCII) + endif() + if (${_arg_UNPARSED_ARGUMENTS}) message(FATAL_ERROR "add_qtc_library had unparsed arguments") endif() @@ -435,7 +473,7 @@ function(add_qtc_library name) set_public_includes(${name} "${_arg_PUBLIC_INCLUDES}") target_compile_definitions(${name} - PRIVATE ${EXPORT_SYMBOL} ${DEFAULT_DEFINES} ${_arg_DEFINES} ${TEST_DEFINES} + PRIVATE ${EXPORT_SYMBOL} ${default_defines_copy} ${_arg_DEFINES} ${TEST_DEFINES} PUBLIC ${_arg_PUBLIC_DEFINES} ) @@ -478,6 +516,14 @@ function(add_qtc_library name) ) enable_pch(${name}) + if (WIN32 AND library_type STREQUAL "SHARED") + # Match qmake naming scheme e.g. Library4.dll + set_target_properties(${name} PROPERTIES + SUFFIX "${PROJECT_VERSION_MAJOR}${CMAKE_SHARED_LIBRARY_SUFFIX}" + PREFIX "" + ) + endif() + unset(NAMELINK_OPTION) if (library_type STREQUAL "SHARED") set(NAMELINK_OPTION NAMELINK_SKIP) @@ -499,6 +545,24 @@ function(add_qtc_library name) OPTIONAL ) + if (library_type STREQUAL "SHARED") + set(target_prefix ${CMAKE_SHARED_LIBRARY_PREFIX}) + if (WIN32) + set(target_suffix ${PROJECT_VERSION_MAJOR}${CMAKE_SHARED_LIBRARY_SUFFIX}) + set(target_prefix "") + elseif(APPLE) + set(target_suffix .${PROJECT_VERSION_MAJOR}${CMAKE_SHARED_LIBRARY_SUFFIX}) + else() + set(target_suffix ${CMAKE_SHARED_LIBRARY_SUFFIX}.${PROJECT_VERSION_MAJOR}) + endif() + set(lib_dir "${IDE_LIBRARY_PATH}") + if (WIN32) + set(lib_dir "${_DESTINATION}") + endif() + update_cached_list(__QTC_INSTALLED_LIBRARIES + "${lib_dir}/${target_prefix}${name}${target_suffix}") + endif() + if (NAMELINK_OPTION) install(TARGETS ${name} LIBRARY @@ -690,6 +754,14 @@ function(add_qtc_plugin target_name) QT_SKIP_TRANSLATION "${skip_translation}" ${_arg_PROPERTIES} ) + + if (WIN32) + # Match qmake naming scheme e.g. Plugin4.dll + set_target_properties(${target_name} PROPERTIES + SUFFIX "${PROJECT_VERSION_MAJOR}${CMAKE_SHARED_LIBRARY_SUFFIX}" + PREFIX "" + ) + endif() append_extra_translations("${target_name}" "${_arg_EXTRA_TRANSLATIONS}") enable_pch(${target_name}) @@ -707,6 +779,16 @@ function(add_qtc_plugin target_name) COMPONENT Devel EXCLUDE_FROM_ALL OPTIONAL ) + get_target_property(target_suffix ${target_name} SUFFIX) + get_target_property(target_prefix ${target_name} PREFIX) + if (target_suffix STREQUAL "target_suffix-NOTFOUND") + set(target_suffix ${CMAKE_SHARED_LIBRARY_SUFFIX}) + endif() + if (target_prefix STREQUAL "target_prefix-NOTFOUND") + set(target_prefix ${CMAKE_SHARED_LIBRARY_PREFIX}) + endif() + update_cached_list(__QTC_INSTALLED_PLUGINS + "${plugin_dir}/${target_prefix}${target_name}${target_suffix}") endif() endfunction() @@ -790,7 +872,7 @@ function(extend_qtc_plugin target_name) endfunction() function(add_qtc_executable name) - cmake_parse_arguments(_arg "SKIP_INSTALL;SKIP_TRANSLATION" + cmake_parse_arguments(_arg "SKIP_INSTALL;SKIP_TRANSLATION;ALLOW_ASCII_CASTS" "DESTINATION" "DEFINES;DEPENDS;EXTRA_TRANSLATIONS;INCLUDES;SOURCES;PROPERTIES" ${ARGN}) @@ -798,6 +880,11 @@ function(add_qtc_executable name) message(FATAL_ERROR "add_qtc_executable had unparsed arguments!") endif() + set(default_defines_copy ${DEFAULT_DEFINES}) + if (_arg_ALLOW_ASCII_CASTS) + list(REMOVE_ITEM default_defines_copy QT_NO_CAST_TO_ASCII QT_RESTRICTED_CAST_FROM_ASCII) + endif() + update_cached_list(__QTC_EXECUTABLES "${name}") string(TOUPPER "BUILD_EXECUTABLE_${name}" _build_executable_var) @@ -829,11 +916,9 @@ function(add_qtc_executable name) endif() endif() - file(RELATIVE_PATH _RELATIVE_LIB_PATH "/${_EXECUTABLE_PATH}" "/${IDE_LIBRARY_PATH}") - add_executable("${name}" ${_arg_SOURCES}) target_include_directories("${name}" PRIVATE "${CMAKE_BINARY_DIR}/src" ${_arg_INCLUDES}) - target_compile_definitions("${name}" PRIVATE ${_arg_DEFINES} ${TEST_DEFINES} ${DEFAULT_DEFINES}) + target_compile_definitions("${name}" PRIVATE ${default_defines_copy} ${TEST_DEFINES} ${_arg_DEFINES} ) target_link_libraries("${name}" PRIVATE ${_arg_DEPENDS} ${IMPLICIT_DEPENDS}) set(skip_translation OFF) @@ -841,10 +926,20 @@ function(add_qtc_executable name) set(skip_translation ON) endif() + file(RELATIVE_PATH relative_lib_path "/${_EXECUTABLE_PATH}" "/${IDE_LIBRARY_PATH}") + + set(build_rpath "${_RPATH_BASE}/${relative_lib_path}") + set(install_rpath "${_RPATH_BASE}/${relative_lib_path}") + if (NOT WIN32 AND NOT APPLE) + file(RELATIVE_PATH relative_qt_path "/${_EXECUTABLE_PATH}" "/${IDE_LIBRARY_BASE_PATH}/Qt/lib") + file(RELATIVE_PATH relative_plugins_path "/${_EXECUTABLE_PATH}" "/${IDE_PLUGIN_PATH}") + set(install_rpath "${install_rpath};${_RPATH_BASE}/${relative_qt_path};${_RPATH_BASE}/${relative_plugins_path}") + endif() + qtc_output_binary_dir(_output_binary_dir) set_target_properties("${name}" PROPERTIES - BUILD_RPATH "${_RPATH_BASE}/${_RELATIVE_LIB_PATH}" - INSTALL_RPATH "${_RPATH_BASE}/${_RELATIVE_LIB_PATH}" + BUILD_RPATH "${build_rpath}" + INSTALL_RPATH "${install_rpath}" RUNTIME_OUTPUT_DIRECTORY "${_output_binary_dir}/${_DESTINATION}" QT_SKIP_TRANSLATION "${skip_translation}" CXX_VISIBILITY_PRESET hidden @@ -856,6 +951,50 @@ function(add_qtc_executable name) if (NOT _arg_SKIP_INSTALL) install(TARGETS ${name} DESTINATION "${_DESTINATION}" OPTIONAL) + update_cached_list(__QTC_INSTALLED_EXECUTABLES + "${_DESTINATION}/${name}${CMAKE_EXECUTABLE_SUFFIX}") + + install(CODE " + function(create_qt_conf location base_dir) + get_filename_component(install_prefix \"\${CMAKE_INSTALL_PREFIX}\" ABSOLUTE) + file(RELATIVE_PATH qt_conf_binaries + \"\${install_prefix}/\${location}\" + \"\${install_prefix}/\${base_dir}\" + ) + if (NOT qt_conf_binaries) + set(qt_conf_binaries .) + endif() + file(RELATIVE_PATH qt_conf_plugins + \"\${install_prefix}/\${base_dir}\" + \"\${install_prefix}/${QT_DEST_PLUGIN_PATH}\" + ) + file(RELATIVE_PATH qt_conf_qml + \"\${install_prefix}/\${base_dir}\" + \"\${install_prefix}/${QT_DEST_QML_PATH}\" + ) + file(WRITE \"\${CMAKE_INSTALL_PREFIX}/\${location}/qt.conf\" + \"[Paths]\n\" + \"Plugins=\${qt_conf_plugins}\n\" + \"Qml2Imports=\${qt_conf_qml}\n\" + ) + # For Apple for Qt Creator do not add a Prefix + if (NOT APPLE OR NOT qt_conf_binaries STREQUAL \"../\") + file(APPEND \"\${CMAKE_INSTALL_PREFIX}/\${location}/qt.conf\" + \"Prefix=\${qt_conf_binaries}\n\" + ) + endif() + + endfunction() + if(APPLE) + create_qt_conf(\"${_EXECUTABLE_PATH}\" \"${IDE_DATA_PATH}/..\") + elseif (WIN32) + create_qt_conf(\"${_EXECUTABLE_PATH}\" \"${IDE_APP_PATH}\") + else() + create_qt_conf(\"${_EXECUTABLE_PATH}\" \"${IDE_LIBRARY_BASE_PATH}/Qt\") + endif() + " + ) + endif() endfunction() @@ -871,6 +1010,15 @@ endfunction() function(add_qtc_test name) cmake_parse_arguments(_arg "GTEST" "" "DEFINES;DEPENDS;INCLUDES;SOURCES" ${ARGN}) + foreach(dependency ${_arg_DEPENDS}) + if (NOT TARGET ${dependency} AND NOT _arg_GTEST) + if (WITH_DEBUG_CMAKE) + message(STATUS "'${dependency}' is not a target") + endif() + return() + endif() + endforeach() + if ($_arg_UNPARSED_ARGUMENTS) message(FATAL_ERROR "add_qtc_test had unparsed arguments!") endif() @@ -902,6 +1050,9 @@ function(add_qtc_test name) endfunction() function(finalize_qtc_gtest test_name) + if (NOT TARGET ${test_name}) + return() + endif() get_target_property(test_sources ${test_name} SOURCES) include(GoogleTest) gtest_add_tests(TARGET ${test_name} SOURCES ${test_sources} TEST_LIST test_list) diff --git a/cmake/QtCreatorIDEBranding.cmake b/cmake/QtCreatorIDEBranding.cmake index a4494c1b35..b8c8f560b8 100644 --- a/cmake/QtCreatorIDEBranding.cmake +++ b/cmake/QtCreatorIDEBranding.cmake @@ -1,9 +1,9 @@ #BINARY_ARTIFACTS_BRANCH = master #PROJECT_USER_FILE_EXTENSION = .user -set(IDE_VERSION "4.11.2") # The IDE version. -set(IDE_VERSION_COMPAT "4.11.0") # The IDE Compatibility version. -set(IDE_VERSION_DISPLAY "4.11.2") # The IDE display version. +set(IDE_VERSION "4.11.82") # The IDE version. +set(IDE_VERSION_COMPAT "4.11.82") # The IDE Compatibility version. +set(IDE_VERSION_DISPLAY "4.12.0-beta1") # The IDE display version. set(IDE_COPYRIGHT_YEAR "2020") # The IDE current copyright year. set(IDE_SETTINGSVARIANT "QtProject") # The IDE settings variation. @@ -12,3 +12,6 @@ set(IDE_DISPLAY_NAME "Qt Creator") # The IDE display name. set(IDE_ID "qtcreator") # The IDE id (no spaces, lowercase!) set(IDE_CASED_ID "QtCreator") # The cased IDE id (no spaces!) set(IDE_BUNDLE_IDENTIFIER "org.qt-project.${IDE_ID}") # The macOS application bundle identifier. + +set(IDE_REVISION_URL_STR "https://code.qt.io/cgit/qt-creator/qt-creator.git/log/?id=%1") + # The revision url in the version dialog |