diff options
207 files changed, 1507 insertions, 664 deletions
diff --git a/.gitlab/ci/cmake.ps1 b/.gitlab/ci/cmake.ps1 index 3b42cae..80fd0cd 100755 --- a/.gitlab/ci/cmake.ps1 +++ b/.gitlab/ci/cmake.ps1 @@ -7,6 +7,7 @@ $tarball = "$filename.zip" $outdir = $pwd.Path $outdir = "$outdir\.gitlab" +$ProgressPreference = 'SilentlyContinue' Invoke-WebRequest -Uri "https://github.com/Kitware/CMake/releases/download/v$version/$tarball" -OutFile "$outdir\$tarball" $hash = Get-FileHash "$outdir\$tarball" -Algorithm SHA256 if ($hash.Hash -ne $sha256sum) { diff --git a/.gitlab/ci/ninja.ps1 b/.gitlab/ci/ninja.ps1 index 91f8b02..cd08954 100755 --- a/.gitlab/ci/ninja.ps1 +++ b/.gitlab/ci/ninja.ps1 @@ -7,6 +7,7 @@ $tarball = "$filename.zip" $outdir = $pwd.Path $outdir = "$outdir\.gitlab" +$ProgressPreference = 'SilentlyContinue' Invoke-WebRequest -Uri "https://github.com/ninja-build/ninja/releases/download/v$version/$tarball" -OutFile "$outdir\$tarball" $hash = Get-FileHash "$outdir\$tarball" -Algorithm SHA256 if ($hash.Hash -ne $sha256sum) { diff --git a/.gitlab/ci/wix.ps1 b/.gitlab/ci/wix.ps1 new file mode 100755 index 0000000..a9322b6 --- /dev/null +++ b/.gitlab/ci/wix.ps1 @@ -0,0 +1,18 @@ +$erroractionpreference = "stop" + +$release = "wix3112rtm" +$sha256sum = "2C1888D5D1DBA377FC7FA14444CF556963747FF9A0A289A3599CF09DA03B9E2E" +$filename = "wix311-binaries" +$tarball = "$filename.zip" + +$outdir = $pwd.Path +$outdir = "$outdir\.gitlab" +$ProgressPreference = 'SilentlyContinue' +Invoke-WebRequest -Uri "https://github.com/wixtoolset/wix3/releases/download/$release/$tarball" -OutFile "$outdir\$tarball" +$hash = Get-FileHash "$outdir\$tarball" -Algorithm SHA256 +if ($hash.Hash -ne $sha256sum) { + exit 1 +} + +Add-Type -AssemblyName System.IO.Compression.FileSystem +[System.IO.Compression.ZipFile]::ExtractToDirectory("$outdir\$tarball", "$outdir\wix\bin") diff --git a/.gitlab/os-linux.yml b/.gitlab/os-linux.yml index 1c97377..9ad8fc7 100644 --- a/.gitlab/os-linux.yml +++ b/.gitlab/os-linux.yml @@ -99,12 +99,14 @@ .linux_builder_tags: tags: + - cmake - build - docker - linux .linux_builder_tags_qt: tags: + - cmake - build - docker - linux @@ -112,6 +114,7 @@ .linux_builder_tags_cuda: tags: + - cmake - cuda-rt - docker - linux diff --git a/.gitlab/os-macos.yml b/.gitlab/os-macos.yml index 9d123ec..74e27f6 100644 --- a/.gitlab/os-macos.yml +++ b/.gitlab/os-macos.yml @@ -7,7 +7,7 @@ GIT_CLONE_PATH: "$CI_BUILDS_DIR/cmake ci ext/$CI_CONCURRENT_ID" # TODO: Factor this out so that each job selects the Xcode version to # use so that different versions can be tested in a single pipeline. - DEVELOPER_DIR: "/Applications/Xcode-11.5.app/Contents/Developer" + DEVELOPER_DIR: "/Applications/Xcode-11.7.app/Contents/Developer" ### Build and test @@ -53,7 +53,7 @@ - cmake # Since this is a bare runner, pin to a project. - macos - shell - - xcode-11.5 + - xcode-11.7 - nonconcurrent .macos_builder_ext_tags: @@ -61,7 +61,7 @@ - cmake # Since this is a bare runner, pin to a project. - macos - shell - - xcode-11.5 + - xcode-11.7 - concurrent ## macOS-specific scripts diff --git a/.gitlab/os-windows.yml b/.gitlab/os-windows.yml index 910a232..6b46573 100644 --- a/.gitlab/os-windows.yml +++ b/.gitlab/os-windows.yml @@ -36,7 +36,7 @@ CMAKE_CONFIGURATION: windows_vs2019_x64_ninja VCVARSALL: "${VS160COMNTOOLS}\\..\\..\\VC\\Auxiliary\\Build\\vcvarsall.bat" VCVARSPLATFORM: "x64" - VCVARSVERSION: "14.26" + VCVARSVERSION: "14.27" ### External testing @@ -47,7 +47,7 @@ CMAKE_CONFIGURATION: windows_vs2019_x64 CMAKE_GENERATOR: "Visual Studio 16 2019" CMAKE_GENERATOR_PLATFORM: "x64" - CMAKE_GENERATOR_TOOLSET: "v142,version=14.26" + CMAKE_GENERATOR_TOOLSET: "v142,version=14.27" ## Tags @@ -57,7 +57,7 @@ - windows - shell - vs2019 - - msvc-19.25 + - msvc-19.27 - nonconcurrent .windows_builder_ext_tags: @@ -66,15 +66,18 @@ - windows - shell - vs2019 - - msvc-19.25 + - msvc-19.27 - concurrent ## Windows-specific scripts .before_script_windows: &before_script_windows + - Invoke-Expression -Command .gitlab/ci/wix.ps1 - Invoke-Expression -Command .gitlab/ci/cmake.ps1 - Invoke-Expression -Command .gitlab/ci/ninja.ps1 - $pwdpath = $pwd.Path + - Set-Item -Force -Path "env:WIX" -Value "$pwdpath\.gitlab\wix" + - (& "$env:WIX\bin\light.exe" -help) | Select -First 1 - Set-Item -Force -Path "env:PATH" -Value "$pwdpath\.gitlab;$pwdpath\.gitlab\cmake\bin;$env:PATH" - cmake --version - ninja --version diff --git a/.gitlab/rules.yml b/.gitlab/rules.yml index 96b95c8..3bb8ae4 100644 --- a/.gitlab/rules.yml +++ b/.gitlab/rules.yml @@ -2,17 +2,17 @@ .run_manually: rules: + - if: '$CI_MERGE_REQUEST_ID' + when: manual - if: '$CI_PROJECT_PATH == "cmake/cmake"' when: delayed start_in: 5 minutes - - if: '$CI_MERGE_REQUEST_ID' - when: manual - when: never .run_automatically: rules: - - if: '$CI_PROJECT_PATH == "cmake/cmake"' - when: always - if: '$CI_MERGE_REQUEST_ID' - when: always + when: on_success + - if: '$CI_PROJECT_PATH == "cmake/cmake"' + when: on_success - when: never diff --git a/Auxiliary/CMakeLists.txt b/Auxiliary/CMakeLists.txt index a833c79..c0aebef 100644 --- a/Auxiliary/CMakeLists.txt +++ b/Auxiliary/CMakeLists.txt @@ -1,4 +1,16 @@ -install(DIRECTORY vim/indent vim/syntax DESTINATION ${CMAKE_XDGDATA_DIR}/vim/vimfiles) -install(FILES cmake-mode.el DESTINATION ${CMAKE_XDGDATA_DIR}/emacs/site-lisp) +# Install Vim files to a typical system integration directory. +# Packagers can set CMake_INSTALL_VIMFILES_DIR to control this. +if(NOT CMake_INSTALL_VIMFILES_DIR) + set(CMake_INSTALL_VIMFILES_DIR ${CMAKE_XDGDATA_DIR}/vim/vimfiles) +endif() +install(DIRECTORY vim/indent vim/syntax DESTINATION ${CMake_INSTALL_VIMFILES_DIR}) + +# Install Emacs files to a typical system integration directory. +# Packagers can set CMake_INSTALL_EMACS_DIR to control this. +if(NOT CMake_INSTALL_EMACS_DIR) + set(CMake_INSTALL_EMACS_DIR ${CMAKE_XDGDATA_DIR}/emacs/site-lisp) +endif() +install(FILES cmake-mode.el DESTINATION ${CMake_INSTALL_EMACS_DIR}) + install(FILES cmake.m4 DESTINATION ${CMAKE_XDGDATA_DIR}/aclocal) add_subdirectory (bash-completion) diff --git a/Auxiliary/bash-completion/CMakeLists.txt b/Auxiliary/bash-completion/CMakeLists.txt index 06d22c2..93b6ffd 100644 --- a/Auxiliary/bash-completion/CMakeLists.txt +++ b/Auxiliary/bash-completion/CMakeLists.txt @@ -6,11 +6,16 @@ # with) as well as a simple installation by a local user into their home # directory *if* the prefix is `$HOME/.local` since `.local/share/` is part of # the bash-completion search path too. -# For more complex installations, packagers can set CMAKE_BASH_COMP_DIR to -# another system location. +# For more complex installations, packagers can set CMake_INSTALL_BASH_COMP_DIR +# to another system location. -set(CMAKE_BASH_COMP_DIR_DEFAULT ${CMAKE_XDGDATA_DIR}/bash-completion/completions) -if (NOT CMAKE_BASH_COMP_DIR) - set(CMAKE_BASH_COMP_DIR "${CMAKE_BASH_COMP_DIR_DEFAULT}") +if(NOT CMake_INSTALL_BASH_COMP_DIR) + if(CMAKE_BASH_COMP_DIR) + # Honor previous customization option. + set(CMake_INSTALL_BASH_COMP_DIR "${CMAKE_BASH_COMP_DIR}") + else() + # Default. + set(CMake_INSTALL_BASH_COMP_DIR ${CMAKE_XDGDATA_DIR}/bash-completion/completions) + endif() endif() -install(FILES cmake cpack ctest DESTINATION ${CMAKE_BASH_COMP_DIR}) +install(FILES cmake cpack ctest DESTINATION ${CMake_INSTALL_BASH_COMP_DIR}) diff --git a/Help/command/add_test.rst b/Help/command/add_test.rst index c0677d2..a77ba37 100644 --- a/Help/command/add_test.rst +++ b/Help/command/add_test.rst @@ -10,9 +10,8 @@ Add a test to the project to be run by :manual:`ctest(1)`. [WORKING_DIRECTORY <dir>] [COMMAND_EXPAND_LISTS]) -Adds a test called ``<name>``. The test name may contain arbitrary -characters except for double-quotes. However, if it contains spaces -or semicolons it must be enclosed in double-quotes. The options are: +Adds a test called ``<name>``. The test name may not contain spaces, +quotes, or other characters special in CMake syntax. The options are: ``COMMAND`` Specify the test command-line. If ``<command>`` specifies an diff --git a/Help/command/file.rst b/Help/command/file.rst index e7bc8d2..693c059 100644 --- a/Help/command/file.rst +++ b/Help/command/file.rst @@ -250,8 +250,8 @@ be resolved. See below for a full description of how they work. List of post-exclude regexes through which to filter the names of resolved dependencies. -These arguments can be used to blacklist unwanted system libraries when -resolving the dependencies, or to whitelist libraries from a specific +These arguments can be used to exclude unwanted system libraries when +resolving the dependencies, or to include libraries from a specific directory. The filtering works as follows: 1. If the not-yet-resolved dependency matches any of the diff --git a/Help/prop_tgt/AUTOMOC_PATH_PREFIX.rst b/Help/prop_tgt/AUTOMOC_PATH_PREFIX.rst index 3e3059d..5ed504f 100644 --- a/Help/prop_tgt/AUTOMOC_PATH_PREFIX.rst +++ b/Help/prop_tgt/AUTOMOC_PATH_PREFIX.rst @@ -13,7 +13,7 @@ the ``-p`` path prefix option. ``moc`` usually generates a relative include path in that case. :prop_tgt:`AUTOMOC_PATH_PREFIX` is initialized from the variable -:variable:`CMAKE_AUTOMOC_PATH_PREFIX`, which is ``ON`` by default. +:variable:`CMAKE_AUTOMOC_PATH_PREFIX`, which is ``OFF`` by default. See the :manual:`cmake-qt(7)` manual for more information on using CMake with Qt. @@ -24,8 +24,7 @@ Reproducible builds For reproducible builds it is recommended to keep headers that are ``moc`` compiled in one of the target :command:`include directories <target_include_directories>` and set -:prop_tgt:`AUTOMOC_PATH_PREFIX` to ``ON`` (which is the default). This ensures -that: +:prop_tgt:`AUTOMOC_PATH_PREFIX` to ``ON``. This ensures that: - ``moc`` output files are identical on different build setups, - ``moc`` output files will compile correctly when the source and/or diff --git a/Help/release/3.16.rst b/Help/release/3.16.rst index f3fdb08..84d96cd 100644 --- a/Help/release/3.16.rst +++ b/Help/release/3.16.rst @@ -178,17 +178,15 @@ Modules Autogen ------- -* When using :prop_tgt:`AUTOMOC`, CMake now generates the ``-p`` path prefix +* When using :prop_tgt:`AUTOMOC`, the new :variable:`CMAKE_AUTOMOC_PATH_PREFIX` + variable or :prop_tgt:`AUTOMOC_PATH_PREFIX` target property may be enabled + to generate the ``-p`` path prefix option for ``moc``. This ensures that ``moc`` output files are identical on different build setups (given, that the headers compiled by ``moc`` are in an :command:`include directory <target_include_directories>`). Also it ensures that ``moc`` output files will compile correctly when the source and/or build directory is a symbolic link. - The ``moc`` path prefix generation behavior can be configured by setting - the new :variable:`CMAKE_AUTOMOC_PATH_PREFIX` variable and/or - :prop_tgt:`AUTOMOC_PATH_PREFIX` target property. - CTest ----- @@ -316,3 +314,11 @@ Changes made since CMake 3.16.0 include the following. :prop_tgt:`INTERFACE_INCLUDE_DIRECTORIES` target properties. Previously they would be places in ``*_CFLAGS_OTHER`` variables and :prop_tgt:`INTERFACE_COMPILE_OPTIONS` target properties. + +3.16.9 +------ + +* The default value of :variable:`CMAKE_AUTOMOC_PATH_PREFIX` was changed to + ``OFF`` because this feature can break existing projects that have + identically named header files in different include directories. + This restores compatibility with behavior of CMake 3.15 and below. diff --git a/Help/release/3.17.rst b/Help/release/3.17.rst index b7c66d8..abd7463 100644 --- a/Help/release/3.17.rst +++ b/Help/release/3.17.rst @@ -346,3 +346,12 @@ Changes made since CMake 3.17.0 include the following. :prop_tgt:`INTERFACE_INCLUDE_DIRECTORIES` target properties. Previously they would be places in ``*_CFLAGS_OTHER`` variables and :prop_tgt:`INTERFACE_COMPILE_OPTIONS` target properties. + +3.17.5 +------ + +* The default value of :variable:`CMAKE_AUTOMOC_PATH_PREFIX` was changed to + ``OFF`` because this feature can break existing projects that have + identically named header files in different include directories. + This restores compatibility with behavior of CMake 3.15 and below. + The default was also changed to ``OFF`` in 3.16.9. diff --git a/Help/release/3.18.rst b/Help/release/3.18.rst index 386b61b..f97e4df 100644 --- a/Help/release/3.18.rst +++ b/Help/release/3.18.rst @@ -264,6 +264,11 @@ Other * :manual:`ccmake(1)` learned to read a :envvar:`CCMAKE_COLORS` environment variable to customize colors. +* The :manual:`Compile Features <cmake-compile-features(7)>` functionality + is now aware of the availability of C11 features in MSVC 19.27 and 19.28, + including support for the ``c_restrict``, ``c_static_assert`` features and + the ``-std:c11`` flag. + Deprecated and Removed Features =============================== @@ -318,3 +323,42 @@ Other Changes * The :manual:`cmake-file-api(7)` "codemodel" version 2 "target" object gained a new ``precompileHeaders`` field in the ``compileGroups`` objects. + +Updates +======= + +Changes made since CMake 3.18.0 include the following. + +3.18.1 +------ + +* The :generator:`Xcode` generator, when :variable:`CMAKE_OSX_ARCHITECTURES` + is not defined, now selects ``$(NATIVE_ARCH_ACTUAL)`` as the default + architecture (the Xcode ``ARCHS`` setting). This is needed for Xcode 12 + to select the host's architecture, which older versions of Xcode did + by default. + +* In CMake 3.18.0 the :command:`add_test` command learned to support + special characters in test names. This was accidentally left out of + its release notes. Unfortunately the fix breaks existing projects + that were using manual quoting or escaping to work around the prior + limitation. This fix has been reverted in 3.18.1, but may be + re-introduced in future versions of CMake with a policy for compatibility. + +3.18.2 +------ + +* The default value of :variable:`CMAKE_AUTOMOC_PATH_PREFIX` was changed to + ``OFF`` because this feature can break existing projects that have + identically named header files in different include directories. + This restores compatibility with behavior of CMake 3.15 and below. + The default was also changed to ``OFF`` in 3.16.9 and 3.17.5. + +* The :manual:`Compile Features <cmake-compile-features(7)>` functionality + was updated for MSVC 19.27 as mentioned above (``c_restrict``). + +3.18.3 +------ + +* The :manual:`Compile Features <cmake-compile-features(7)>` functionality + was updated for MSVC 19.28 as mentioned above (``c_static_assert``). diff --git a/Help/variable/CMAKE_AUTOMOC_PATH_PREFIX.rst b/Help/variable/CMAKE_AUTOMOC_PATH_PREFIX.rst index dca0b06..1e9790f 100644 --- a/Help/variable/CMAKE_AUTOMOC_PATH_PREFIX.rst +++ b/Help/variable/CMAKE_AUTOMOC_PATH_PREFIX.rst @@ -8,4 +8,4 @@ This variable is used to initialize the :prop_tgt:`AUTOMOC_PATH_PREFIX` property on all the targets. See that target property for additional information. -The default value is ``ON``. +The default value is ``OFF``. diff --git a/Modules/CMakeDetermineCCompiler.cmake b/Modules/CMakeDetermineCCompiler.cmake index 86683d1..664d089 100644 --- a/Modules/CMakeDetermineCCompiler.cmake +++ b/Modules/CMakeDetermineCCompiler.cmake @@ -109,7 +109,7 @@ if(NOT CMAKE_C_COMPILER_ID_RUN) # ... # /path/to/cc ...CompilerIdC/... # to extract the compiler front-end for the language. - set(CMAKE_C_COMPILER_ID_TOOL_MATCH_REGEX "\nLd[^\n]*(\n[ \t]+[^\n]*)*\n[ \t]+([^ \t\r\n]+)[^\r\n]*-o[^\r\n]*CompilerIdC/(\\./)?(CompilerIdC.(framework|xctest)/)?CompilerIdC[ \t\n\\\"]") + set(CMAKE_C_COMPILER_ID_TOOL_MATCH_REGEX "\nLd[^\n]*(\n[ \t]+[^\n]*)*\n[ \t]+([^ \t\r\n]+)[^\r\n]*-o[^\r\n]*CompilerIdC/(\\./)?(CompilerIdC.(framework|xctest|build/[^ \t\r\n]+)/)?CompilerIdC[ \t\n\\\"]") set(CMAKE_C_COMPILER_ID_TOOL_MATCH_INDEX 2) include(${CMAKE_ROOT}/Modules/CMakeDetermineCompilerId.cmake) diff --git a/Modules/CMakeDetermineCXXCompiler.cmake b/Modules/CMakeDetermineCXXCompiler.cmake index 662b831..ea241cf 100644 --- a/Modules/CMakeDetermineCXXCompiler.cmake +++ b/Modules/CMakeDetermineCXXCompiler.cmake @@ -104,7 +104,7 @@ if(NOT CMAKE_CXX_COMPILER_ID_RUN) # ... # /path/to/cc ...CompilerIdCXX/... # to extract the compiler front-end for the language. - set(CMAKE_CXX_COMPILER_ID_TOOL_MATCH_REGEX "\nLd[^\n]*(\n[ \t]+[^\n]*)*\n[ \t]+([^ \t\r\n]+)[^\r\n]*-o[^\r\n]*CompilerIdCXX/(\\./)?(CompilerIdCXX.(framework|xctest)/)?CompilerIdCXX[ \t\n\\\"]") + set(CMAKE_CXX_COMPILER_ID_TOOL_MATCH_REGEX "\nLd[^\n]*(\n[ \t]+[^\n]*)*\n[ \t]+([^ \t\r\n]+)[^\r\n]*-o[^\r\n]*CompilerIdCXX/(\\./)?(CompilerIdCXX.(framework|xctest|build/[^ \t\r\n]+)/)?CompilerIdCXX[ \t\n\\\"]") set(CMAKE_CXX_COMPILER_ID_TOOL_MATCH_INDEX 2) include(${CMAKE_ROOT}/Modules/CMakeDetermineCompilerId.cmake) diff --git a/Modules/CMakeDetermineCompiler.cmake b/Modules/CMakeDetermineCompiler.cmake index 7cd7c47..cb1ab1d 100644 --- a/Modules/CMakeDetermineCompiler.cmake +++ b/Modules/CMakeDetermineCompiler.cmake @@ -140,7 +140,9 @@ function(_cmake_find_compiler_sysroot lang) OUTPUT_VARIABLE _cmake_sysroot_run_out ERROR_VARIABLE _cmake_sysroot_run_err) - if(_cmake_sysroot_run_out AND NOT _cmake_sysroot_run_err AND IS_DIRECTORY "${_cmake_sysroot_run_out}/usr") + if(_cmake_sysroot_run_out AND NOT _cmake_sysroot_run_err + AND NOT _cmake_sysroot_run_out STREQUAL "/" + AND IS_DIRECTORY "${_cmake_sysroot_run_out}/usr") file(TO_CMAKE_PATH "${_cmake_sysroot_run_out}/usr" _cmake_sysroot_run_out_usr) set(CMAKE_${lang}_COMPILER_SYSROOT "${_cmake_sysroot_run_out_usr}" PARENT_SCOPE) else() diff --git a/Modules/CMakeDetermineCompilerId.cmake b/Modules/CMakeDetermineCompilerId.cmake index df48fa5..1feaf91 100644 --- a/Modules/CMakeDetermineCompilerId.cmake +++ b/Modules/CMakeDetermineCompilerId.cmake @@ -368,7 +368,14 @@ Id flags: ${testflags} ${CMAKE_${lang}_COMPILER_ID_FLAGS_ALWAYS} endif() set(cuda_tools "CUDA ${CMAKE_VS_PLATFORM_TOOLSET_CUDA}") set(id_compile "CudaCompile") - set(id_ItemDefinitionGroup_entry "<CudaCompile><AdditionalOptions>%(AdditionalOptions)-v</AdditionalOptions></CudaCompile>") + if(CMAKE_VS_PLATFORM_NAME STREQUAL x64) + set(cuda_target "<TargetMachinePlatform>64</TargetMachinePlatform>") + endif() + foreach(arch ${CMAKE_CUDA_ARCHITECTURES}) + string(REGEX MATCH "[0-9]+" arch_name "${arch}") + string(APPEND cuda_codegen "compute_${arch_name},sm_${arch_name};") + endforeach() + set(id_ItemDefinitionGroup_entry "<CudaCompile>${cuda_target}<AdditionalOptions>%(AdditionalOptions)-v</AdditionalOptions><CodeGeneration>${cuda_codegen}</CodeGeneration></CudaCompile>") set(id_PostBuildEvent_Command [[echo CMAKE_CUDA_COMPILER=$(CudaToolkitBinDir)\nvcc.exe]]) if(CMAKE_VS_PLATFORM_TOOLSET_CUDA_CUSTOM_DIR) set(id_CudaToolkitCustomDir "<CudaToolkitCustomDir>${CMAKE_VS_PLATFORM_TOOLSET_CUDA_CUSTOM_DIR}nvcc</CudaToolkitCustomDir>") @@ -378,9 +385,6 @@ Id flags: ${testflags} ${CMAKE_${lang}_COMPILER_ID_FLAGS_ALWAYS} string(CONCAT id_Import_props [[<Import Project="$(VCTargetsPath)\BuildCustomizations\]] "${cuda_tools}" [[.props" />]]) string(CONCAT id_Import_targets [[<Import Project="$(VCTargetsPath)\BuildCustomizations\]] "${cuda_tools}" [[.targets" />]]) endif() - if(CMAKE_VS_PLATFORM_NAME STREQUAL x64) - set(id_ItemDefinitionGroup_entry "<CudaCompile><TargetMachinePlatform>64</TargetMachinePlatform><AdditionalOptions>%(AdditionalOptions)-v</AdditionalOptions></CudaCompile>") - endif() if(CMAKE_CUDA_FLAGS MATCHES "(^| )-cudart +shared( |$)") set(id_Link_AdditionalDependencies "<AdditionalDependencies>cudart.lib</AdditionalDependencies>") else() @@ -469,6 +473,12 @@ Id flags: ${testflags} ${CMAKE_${lang}_COMPILER_ID_FLAGS_ALWAYS} set(id_clang_cxx_library "CLANG_CXX_LIBRARY = \"${CMAKE_MATCH_3}\";") endif() endif() + if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_OSX_SYSROOT MATCHES "^$|[Mm][Aa][Cc][Oo][Ss]") + # When targeting macOS, use only the host architecture. + set(id_archs [[ARCHS = "$(NATIVE_ARCH_ACTUAL)";]]) + else() + set(id_archs "") + endif() configure_file(${CMAKE_ROOT}/Modules/CompilerId/Xcode-3.pbxproj.in ${id_dir}/CompilerId${lang}.xcodeproj/project.pbxproj @ONLY) unset(_ENV_MACOSX_DEPLOYMENT_TARGET) diff --git a/Modules/CMakeDetermineOBJCCompiler.cmake b/Modules/CMakeDetermineOBJCCompiler.cmake index 11b47fd..da09ebb 100644 --- a/Modules/CMakeDetermineOBJCCompiler.cmake +++ b/Modules/CMakeDetermineOBJCCompiler.cmake @@ -115,7 +115,7 @@ if(NOT CMAKE_OBJC_COMPILER_ID_RUN) # ... # /path/to/cc ...CompilerIdOBJC/... # to extract the compiler front-end for the language. - set(CMAKE_OBJC_COMPILER_ID_TOOL_MATCH_REGEX "\nLd[^\n]*(\n[ \t]+[^\n]*)*\n[ \t]+([^ \t\r\n]+)[^\r\n]*-o[^\r\n]*CompilerIdOBJC/(\\./)?(CompilerIdOBJC.(framework|xctest)/)?CompilerIdOBJC[ \t\n\\\"]") + set(CMAKE_OBJC_COMPILER_ID_TOOL_MATCH_REGEX "\nLd[^\n]*(\n[ \t]+[^\n]*)*\n[ \t]+([^ \t\r\n]+)[^\r\n]*-o[^\r\n]*CompilerIdOBJC/(\\./)?(CompilerIdOBJC.(framework|xctest|build/[^ \t\r\n]+)/)?CompilerIdOBJC[ \t\n\\\"]") set(CMAKE_OBJC_COMPILER_ID_TOOL_MATCH_INDEX 2) include(${CMAKE_ROOT}/Modules/CMakeDetermineCompilerId.cmake) diff --git a/Modules/CMakeDetermineOBJCXXCompiler.cmake b/Modules/CMakeDetermineOBJCXXCompiler.cmake index 99ad6c3..f96394c 100644 --- a/Modules/CMakeDetermineOBJCXXCompiler.cmake +++ b/Modules/CMakeDetermineOBJCXXCompiler.cmake @@ -120,7 +120,7 @@ if(NOT CMAKE_OBJCXX_COMPILER_ID_RUN) # ... # /path/to/cc ...CompilerIdOBJCXX/... # to extract the compiler front-end for the language. - set(CMAKE_OBJCXX_COMPILER_ID_TOOL_MATCH_REGEX "\nLd[^\n]*(\n[ \t]+[^\n]*)*\n[ \t]+([^ \t\r\n]+)[^\r\n]*-o[^\r\n]*CompilerIdOBJCXX/(\\./)?(CompilerIdOBJCXX.(framework|xctest)/)?CompilerIdOBJCXX[ \t\n\\\"]") + set(CMAKE_OBJCXX_COMPILER_ID_TOOL_MATCH_REGEX "\nLd[^\n]*(\n[ \t]+[^\n]*)*\n[ \t]+([^ \t\r\n]+)[^\r\n]*-o[^\r\n]*CompilerIdOBJCXX/(\\./)?(CompilerIdOBJCXX.(framework|xctest|build/[^ \t\r\n]+)/)?CompilerIdOBJCXX[ \t\n\\\"]") set(CMAKE_OBJCXX_COMPILER_ID_TOOL_MATCH_INDEX 2) include(${CMAKE_ROOT}/Modules/CMakeDetermineCompilerId.cmake) diff --git a/Modules/CMakeFindBinUtils.cmake b/Modules/CMakeFindBinUtils.cmake index de9ef9a..73d57f0 100644 --- a/Modules/CMakeFindBinUtils.cmake +++ b/Modules/CMakeFindBinUtils.cmake @@ -72,10 +72,11 @@ if(("x${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_SIMULATE_ID}" STREQUAL "xMSVC" AND if("x${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_ID}" STREQUAL "xClang") find_program(CMAKE_NM NAMES ${_CMAKE_TOOLCHAIN_PREFIX}nm llvm-nm HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) set(_CMAKE_ADDITIONAL_LINKER_NAMES "lld-link") + set(_CMAKE_ADDITIONAL_AR_NAMES "llvm-lib") endif() find_program(CMAKE_LINKER NAMES ${_CMAKE_ADDITIONAL_LINKER_NAMES} link HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) - find_program(CMAKE_AR NAMES lib HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) + find_program(CMAKE_AR NAMES ${_CMAKE_ADDITIONAL_AR_NAMES} lib HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) find_program(CMAKE_MT NAMES mt HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) list(APPEND _CMAKE_TOOL_VARS LINKER MT) @@ -102,6 +103,19 @@ else() set(_CMAKE_ADDITIONAL_ADDR2LINE_NAMES "llvm-addr2line") endif() + if(NOT CMAKE_CROSSCOMPILING AND NOT "${_CMAKE_TOOLCHAIN_PREFIX}" STREQUAL "") + list(APPEND _CMAKE_ADDITIONAL_AR_NAMES "ar") + list(APPEND _CMAKE_ADDITIONAL_RANLIB_NAMES "ranlib") + list(APPEND _CMAKE_ADDITIONAL_STRIP_NAMES "strip") + list(APPEND _CMAKE_ADDITIONAL_LINKER_NAMES "ld") + list(APPEND _CMAKE_ADDITIONAL_NM_NAMES "nm") + list(APPEND _CMAKE_ADDITIONAL_OBJDUMP_NAMES "objdump") + list(APPEND _CMAKE_ADDITIONAL_OBJCOPY_NAMES "objcopy") + list(APPEND _CMAKE_ADDITIONAL_READELF_NAMES "readelf") + list(APPEND _CMAKE_ADDITIONAL_DLLTOOL_NAMES "dlltool") + list(APPEND _CMAKE_ADDITIONAL_ADDR2LINE_NAMES "addr2line") + endif() + find_program(CMAKE_AR NAMES ${_CMAKE_TOOLCHAIN_PREFIX}ar${_CMAKE_TOOLCHAIN_SUFFIX} ${_CMAKE_ADDITIONAL_AR_NAMES} HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) find_program(CMAKE_RANLIB NAMES ${_CMAKE_TOOLCHAIN_PREFIX}ranlib ${_CMAKE_ADDITIONAL_RANLIB_NAMES} HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) diff --git a/Modules/CMakeGenericSystem.cmake b/Modules/CMakeGenericSystem.cmake index 000fba1..6f665a6 100644 --- a/Modules/CMakeGenericSystem.cmake +++ b/Modules/CMakeGenericSystem.cmake @@ -26,7 +26,9 @@ set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a") set(CMAKE_AUTOGEN_ORIGIN_DEPENDS ON) set(CMAKE_AUTOMOC_COMPILER_PREDEFINES ON) -set(CMAKE_AUTOMOC_PATH_PREFIX ON) +if(NOT DEFINED CMAKE_AUTOMOC_PATH_PREFIX) + set(CMAKE_AUTOMOC_PATH_PREFIX OFF) +endif() set(CMAKE_AUTOMOC_MACRO_NAMES "Q_OBJECT" "Q_GADGET" "Q_NAMESPACE" "Q_NAMESPACE_EXPORT") # basically all general purpose OSs support shared libs diff --git a/Modules/CMakeOBJCInformation.cmake b/Modules/CMakeOBJCInformation.cmake index b3da82d..d530191 100644 --- a/Modules/CMakeOBJCInformation.cmake +++ b/Modules/CMakeOBJCInformation.cmake @@ -170,7 +170,7 @@ endif() # compile an Objective-C file into an object file if(NOT CMAKE_OBJC_COMPILE_OBJECT) set(CMAKE_OBJC_COMPILE_OBJECT - "<CMAKE_OBJC_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -x objective-c -o <OBJECT> -c <SOURCE>") + "<CMAKE_OBJC_COMPILER> <DEFINES> <INCLUDES> -x objective-c <FLAGS> -o <OBJECT> -c <SOURCE>") endif() if(NOT CMAKE_OBJC_LINK_EXECUTABLE) diff --git a/Modules/CMakeOBJCXXInformation.cmake b/Modules/CMakeOBJCXXInformation.cmake index 71beb7f..7a3b9d7 100644 --- a/Modules/CMakeOBJCXXInformation.cmake +++ b/Modules/CMakeOBJCXXInformation.cmake @@ -263,7 +263,7 @@ endif() # compile an Objective-C++ file into an object file if(NOT CMAKE_OBJCXX_COMPILE_OBJECT) set(CMAKE_OBJCXX_COMPILE_OBJECT - "<CMAKE_OBJCXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -x objective-c++ -o <OBJECT> -c <SOURCE>") + "<CMAKE_OBJCXX_COMPILER> <DEFINES> <INCLUDES> -x objective-c++ <FLAGS> -o <OBJECT> -c <SOURCE>") endif() if(NOT CMAKE_OBJCXX_LINK_EXECUTABLE) diff --git a/Modules/CheckCCompilerFlag.cmake b/Modules/CheckCCompilerFlag.cmake index 6d65313..1452b51 100644 --- a/Modules/CheckCCompilerFlag.cmake +++ b/Modules/CheckCCompilerFlag.cmake @@ -54,5 +54,4 @@ function(check_c_compiler_flag _flag _var) foreach(v IN LISTS _locale_vars) set(ENV{${v}} ${_locale_vars_saved_${v}}) endforeach() - set(${_var} "${${_var}}" PARENT_SCOPE) endfunction() diff --git a/Modules/CheckCXXCompilerFlag.cmake b/Modules/CheckCXXCompilerFlag.cmake index 5e07c25..544e9ac 100644 --- a/Modules/CheckCXXCompilerFlag.cmake +++ b/Modules/CheckCXXCompilerFlag.cmake @@ -54,5 +54,4 @@ function(check_cxx_compiler_flag _flag _var) foreach(v IN LISTS _locale_vars) set(ENV{${v}} ${_locale_vars_saved_${v}}) endforeach() - set(${_var} "${${_var}}" PARENT_SCOPE) endfunction() diff --git a/Modules/Compiler/ARMClang.cmake b/Modules/Compiler/ARMClang.cmake index 01ce91d..f100af8 100644 --- a/Modules/Compiler/ARMClang.cmake +++ b/Modules/Compiler/ARMClang.cmake @@ -115,11 +115,12 @@ macro(__compiler_armclang lang) endif() if(__CMAKE_ARMClang_USING_armlink) + unset(CMAKE_${lang}_LINKER_WRAPPER_FLAG) set(__CMAKE_ARMClang_USING_armlink_WRAPPER "") else() - set(__CMAKE_ARMClang_USING_armlink_WRAPPER ${CMAKE_${lang}_LINKER_WRAPPER_FLAG}) + set(__CMAKE_ARMClang_USING_armlink_WRAPPER "-Xlinker") endif() - set(CMAKE_${lang}_LINK_EXECUTABLE "<CMAKE_LINKER> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <LINK_LIBRARIES> <OBJECTS> -o <TARGET> ${__CMAKE_ARMClang_USING_armlink_WRAPPER} --list <TARGET_BASE>.map") + set(CMAKE_${lang}_LINK_EXECUTABLE "<CMAKE_LINKER> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <LINK_LIBRARIES> <OBJECTS> -o <TARGET> ${__CMAKE_ARMClang_USING_armlink_WRAPPER} --list=<TARGET_BASE>.map") set(CMAKE_${lang}_CREATE_STATIC_LIBRARY "<CMAKE_AR> --create -cr <TARGET> <LINK_FLAGS> <OBJECTS>") set(CMAKE_${lang}_ARCHIVE_CREATE "<CMAKE_AR> --create -cr <TARGET> <LINK_FLAGS> <OBJECTS>") set(CMAKE_${lang}_RESPONSE_FILE_LINK_FLAG "${__CMAKE_ARMClang_USING_armlink_WRAPPER} --via=") diff --git a/Modules/Compiler/Clang.cmake b/Modules/Compiler/Clang.cmake index bb516d3..f7858d7 100644 --- a/Modules/Compiler/Clang.cmake +++ b/Modules/Compiler/Clang.cmake @@ -10,6 +10,11 @@ set(__COMPILER_CLANG 1) include(Compiler/CMakeCommonCompilerMacros) +set(__pch_header_C "c-header") +set(__pch_header_CXX "c++-header") +set(__pch_header_OBJC "objective-c-header") +set(__pch_header_OBJCXX "objective-c++-header") + if("x${CMAKE_C_SIMULATE_ID}" STREQUAL "xMSVC" OR "x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC" OR "x${CMAKE_Fortran_SIMULATE_ID}" STREQUAL "xMSVC") @@ -102,7 +107,7 @@ else() set(CMAKE_PCH_PROLOGUE "#pragma clang system_header") endif() set(CMAKE_${lang}_COMPILE_OPTIONS_USE_PCH -Xclang -include-pch -Xclang <PCH_FILE> -Xclang -include -Xclang <PCH_HEADER>) - set(CMAKE_${lang}_COMPILE_OPTIONS_CREATE_PCH -Xclang -emit-pch -Xclang -include -Xclang <PCH_HEADER>) + set(CMAKE_${lang}_COMPILE_OPTIONS_CREATE_PCH -Xclang -emit-pch -Xclang -include -Xclang <PCH_HEADER> -x ${__pch_header_${lang}}) endmacro() endif() @@ -222,11 +227,11 @@ macro(__compiler_clang_cxx_standards lang) # can be attempted. macro(cmake_record_${lang}_compile_features) list(APPEND CMAKE_${lang}_COMPILE_FEATURES - ${lang}_std_98 - ${lang}_std_11 - ${lang}_std_14 - ${lang}_std_17 - ${lang}_std_20 + cxx_std_98 + cxx_std_11 + cxx_std_14 + cxx_std_17 + cxx_std_20 ) _record_compiler_features(${lang} "" CMAKE_${lang}_COMPILE_FEATURES) endmacro() diff --git a/Modules/Compiler/MSVC-C-FeatureTests.cmake b/Modules/Compiler/MSVC-C-FeatureTests.cmake index 3f09be2..4024c12 100644 --- a/Modules/Compiler/MSVC-C-FeatureTests.cmake +++ b/Modules/Compiler/MSVC-C-FeatureTests.cmake @@ -1,8 +1,7 @@ set(_cmake_oldestSupported "_MSC_VER >= 1600") -# Not yet supported: -#set(_cmake_feature_test_c_static_assert "") -#set(_cmake_feature_test_c_restrict "") +set(_cmake_feature_test_c_restrict "_MSC_VER >= 1927") +set(_cmake_feature_test_c_static_assert "_MSC_VER >= 1928") set(_cmake_feature_test_c_variadic_macros "${_cmake_oldestSupported}") set(_cmake_feature_test_c_function_prototypes "${_cmake_oldestSupported}") diff --git a/Modules/Compiler/MSVC-C.cmake b/Modules/Compiler/MSVC-C.cmake index bca9764..31ae7fd 100644 --- a/Modules/Compiler/MSVC-C.cmake +++ b/Modules/Compiler/MSVC-C.cmake @@ -1,15 +1,31 @@ -# MSVC has no specific options to set C language standards, but set them as -# empty strings anyways so the feature test infrastructure can at least check -# to see if they are defined. -set(CMAKE_C90_STANDARD_COMPILE_OPTION "") -set(CMAKE_C90_EXTENSION_COMPILE_OPTION "") -set(CMAKE_C99_STANDARD_COMPILE_OPTION "") -set(CMAKE_C99_EXTENSION_COMPILE_OPTION "") -set(CMAKE_C11_STANDARD_COMPILE_OPTION "") -set(CMAKE_C11_EXTENSION_COMPILE_OPTION "") +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. -# There is no meaningful default for this -set(CMAKE_C_STANDARD_DEFAULT "") +include(Compiler/CMakeCommonCompilerMacros) + +if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.27) + set(CMAKE_C90_STANDARD_COMPILE_OPTION "") + set(CMAKE_C90_EXTENSION_COMPILE_OPTION "") + set(CMAKE_C99_STANDARD_COMPILE_OPTION "") + set(CMAKE_C99_EXTENSION_COMPILE_OPTION "") + set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std:c11") + set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std:c11") + + __compiler_check_default_language_standard(C 19.27 99) +else() + # MSVC has no specific options to set C language standards, but set them as + # empty strings anyways so the feature test infrastructure can at least check + # to see if they are defined. + set(CMAKE_C90_STANDARD_COMPILE_OPTION "") + set(CMAKE_C90_EXTENSION_COMPILE_OPTION "") + set(CMAKE_C99_STANDARD_COMPILE_OPTION "") + set(CMAKE_C99_EXTENSION_COMPILE_OPTION "") + set(CMAKE_C11_STANDARD_COMPILE_OPTION "") + set(CMAKE_C11_EXTENSION_COMPILE_OPTION "") + + # There is no meaningful default for this + set(CMAKE_C_STANDARD_DEFAULT "") +endif() set(CMAKE_C_CLANG_TIDY_DRIVER_MODE "cl") @@ -31,6 +47,14 @@ macro(cmake_record_c_compile_features) list(APPEND CMAKE_C_COMPILE_FEATURES c_variadic_macros) list(APPEND CMAKE_C99_COMPILE_FEATURES c_variadic_macros) endif() + if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.27) + list(APPEND CMAKE_C_COMPILE_FEATURES c_restrict) + list(APPEND CMAKE_C99_COMPILE_FEATURES c_restrict) + endif() + if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.28) + list(APPEND CMAKE_C_COMPILE_FEATURES c_static_assert) + list(APPEND CMAKE_C11_COMPILE_FEATURES c_static_assert) + endif() set(_result 0) # expected by cmake_determine_compile_features endmacro() diff --git a/Modules/Compiler/NVIDIA-CUDA.cmake b/Modules/Compiler/NVIDIA-CUDA.cmake index feb5ecc..3187294 100644 --- a/Modules/Compiler/NVIDIA-CUDA.cmake +++ b/Modules/Compiler/NVIDIA-CUDA.cmake @@ -68,20 +68,22 @@ if(UNIX) endif() if("x${CMAKE_CUDA_SIMULATE_ID}" STREQUAL "xMSVC") + # MSVC requires c++14 as the minimum level set(CMAKE_CUDA03_STANDARD_COMPILE_OPTION "") set(CMAKE_CUDA03_EXTENSION_COMPILE_OPTION "") + # MSVC requires c++14 as the minimum level set(CMAKE_CUDA11_STANDARD_COMPILE_OPTION "") set(CMAKE_CUDA11_EXTENSION_COMPILE_OPTION "") if (NOT CMAKE_CUDA_COMPILER_VERSION VERSION_LESS 9.0) - set(CMAKE_CUDA14_STANDARD_COMPILE_OPTION "") - set(CMAKE_CUDA14_EXTENSION_COMPILE_OPTION "") + set(CMAKE_CUDA14_STANDARD_COMPILE_OPTION "-std=c++14") + set(CMAKE_CUDA14_EXTENSION_COMPILE_OPTION "-std=c++14") endif() if (NOT CMAKE_CUDA_COMPILER_VERSION VERSION_LESS 11.0) - set(CMAKE_CUDA17_STANDARD_COMPILE_OPTION "") - set(CMAKE_CUDA17_EXTENSION_COMPILE_OPTION "") + set(CMAKE_CUDA17_STANDARD_COMPILE_OPTION "-std=c++17") + set(CMAKE_CUDA17_EXTENSION_COMPILE_OPTION "-std=c++17") endif() else() diff --git a/Modules/CompilerId/Xcode-3.pbxproj.in b/Modules/CompilerId/Xcode-3.pbxproj.in index 672044e..6fe17e5 100644 --- a/Modules/CompilerId/Xcode-3.pbxproj.in +++ b/Modules/CompilerId/Xcode-3.pbxproj.in @@ -84,6 +84,7 @@ CODE_SIGNING_REQUIRED = NO; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)"; SYMROOT = .; + @id_archs@ @id_toolset@ @id_lang_version@ @id_clang_cxx_library@ diff --git a/Modules/ExternalProject.cmake b/Modules/ExternalProject.cmake index 3a47090..fcff5dd 100644 --- a/Modules/ExternalProject.cmake +++ b/Modules/ExternalProject.cmake @@ -747,7 +747,7 @@ control needed to implement such step-level capabilities. ``<name>`` is the same as the name passed to the original call to :command:`ExternalProject_Add`. The specified ``<step>`` must not be one of - the pre-defined steps (``mkdir``, ``download``, ``update``, ``skip-update``, + the pre-defined steps (``mkdir``, ``download``, ``update``, ``patch``, ``configure``, ``build``, ``install`` or ``test``). The supported options are: @@ -1124,7 +1124,11 @@ function(_ep_write_gitclone_script script_filename source_dir git_EXECUTABLE git message(FATAL_ERROR "Tag for git checkout should not be empty.") endif() - set(git_clone_options "--no-checkout") + if(GIT_VERSION_STRING VERSION_LESS 2.20 OR 2.21 VERSION_LESS_EQUAL GIT_VERSION_STRING) + set(git_clone_options "--no-checkout") + else() + set(git_clone_options) + endif() if(git_shallow) if(NOT GIT_VERSION_STRING VERSION_LESS 1.7.10) list(APPEND git_clone_options "--depth 1 --no-single-branch") @@ -2758,21 +2762,6 @@ Update to Mercurial >= 2.1.1. )" ) - if(update_disconnected) - _ep_get_step_stampfile(${name} skip-update skip-update_stamp_file) - string(REPLACE "Performing" "Skipping" comment "${comment}") - ExternalProject_Add_Step(${name} skip-update - COMMENT ${comment} - ALWAYS ${always} - EXCLUDE_FROM_MAIN 1 - WORKING_DIRECTORY ${work_dir} - DEPENDEES download - ${log} - ${uses_terminal} - ) - set_property(SOURCE ${skip-update_stamp_file} PROPERTY SYMBOLIC 1) - endif() - endfunction() @@ -2797,9 +2786,9 @@ function(_ep_add_patch_command name) _ep_get_update_disconnected(update_disconnected ${name}) if(update_disconnected) - set(update_dep skip-update) + set(patch_dep download) else() - set(update_dep update) + set(patch_dep update) endif() set(__cmdQuoted) @@ -2810,7 +2799,7 @@ function(_ep_add_patch_command name) ExternalProject_Add_Step(${name} patch COMMAND ${__cmdQuoted} WORKING_DIRECTORY \${work_dir} - DEPENDEES download \${update_dep} + DEPENDEES \${patch_dep} ${log} )" ) @@ -2966,13 +2955,6 @@ function(_ep_add_configure_command name) set(uses_terminal "") endif() - _ep_get_update_disconnected(update_disconnected ${name}) - if(update_disconnected) - set(update_dep skip-update) - else() - set(update_dep update) - endif() - set(__cmdQuoted) foreach(__item IN LISTS cmd) string(APPEND __cmdQuoted " [==[${__item}]==]") @@ -2981,7 +2963,7 @@ function(_ep_add_configure_command name) ExternalProject_Add_Step(${name} configure COMMAND ${__cmdQuoted} WORKING_DIRECTORY \${binary_dir} - DEPENDEES \${update_dep} patch + DEPENDEES patch DEPENDS \${file_deps} ${log} ${uses_terminal} diff --git a/Modules/FindCUDA/select_compute_arch.cmake b/Modules/FindCUDA/select_compute_arch.cmake index c11725d..9351288 100644 --- a/Modules/FindCUDA/select_compute_arch.cmake +++ b/Modules/FindCUDA/select_compute_arch.cmake @@ -7,7 +7,7 @@ # ARCH_AND_PTX : NAME | NUM.NUM | NUM.NUM(NUM.NUM) | NUM.NUM+PTX # NAME: Fermi Kepler Maxwell Kepler+Tegra Kepler+Tesla Maxwell+Tegra Pascal Volta Turing Ampere # NUM: Any number. Only those pairs are currently accepted by NVCC though: -# 2.0 2.1 3.0 3.2 3.5 3.7 5.0 5.2 5.3 6.0 6.2 7.0 7.2 7.5 8.0 +# 2.0 2.1 3.0 3.2 3.5 3.7 5.0 5.2 5.3 6.0 6.2 7.0 7.2 7.5 8.0 8.6 # Returns LIST of flags to be added to CUDA_NVCC_FLAGS in ${out_variable} # Additionally, sets ${out_variable}_readable to the resulting numeric list # Example: @@ -82,16 +82,26 @@ if(CUDA_VERSION VERSION_GREATER_EQUAL "10.0") list(APPEND CUDA_ALL_GPU_ARCHITECTURES "7.5") if(CUDA_VERSION VERSION_LESS "11.0") - set(CUDA_LIMIT_GPU_ARCHITECTURE "8.0") list(APPEND CUDA_COMMON_GPU_ARCHITECTURES "7.5+PTX") + set(CUDA_LIMIT_GPU_ARCHITECTURE "8.0") endif() endif() if(CUDA_VERSION VERSION_GREATER_EQUAL "11.0") list(APPEND CUDA_KNOWN_GPU_ARCHITECTURES "Ampere") - list(APPEND CUDA_COMMON_GPU_ARCHITECTURES "8.0" "8.0+PTX") + list(APPEND CUDA_COMMON_GPU_ARCHITECTURES "8.0") list(APPEND CUDA_ALL_GPU_ARCHITECTURES "8.0") + if(CUDA_VERSION VERSION_LESS "11.1") + list(APPEND CUDA_COMMON_GPU_ARCHITECTURES "8.0+PTX") + set(CUDA_LIMIT_GPU_ARCHITECTURE "8.6") + endif() +endif() + +if(CUDA_VERSION VERSION_GREATER_EQUAL "11.1") + list(APPEND CUDA_COMMON_GPU_ARCHITECTURES "8.6" "8.6+PTX") + list(APPEND CUDA_ALL_GPU_ARCHITECTURES "8.6") + if(CUDA_VERSION VERSION_LESS "12.0") set(CUDA_LIMIT_GPU_ARCHITECTURE "9.0") endif() diff --git a/Modules/FindCURL.cmake b/Modules/FindCURL.cmake index 919babc..be7e16e 100644 --- a/Modules/FindCURL.cmake +++ b/Modules/FindCURL.cmake @@ -148,16 +148,16 @@ if(CURL_FIND_COMPONENTS) endif() foreach(component IN LISTS CURL_FIND_COMPONENTS) list(FIND CURL_KNOWN_PROTOCOLS ${component} _found) - if(_found) + if(NOT _found EQUAL -1) list(FIND CURL_SUPPORTED_PROTOCOLS ${component} _found) - if(_found) + if(NOT _found EQUAL -1) set(CURL_${component}_FOUND TRUE) elseif(CURL_FIND_REQUIRED) message(FATAL_ERROR "CURL: Required protocol ${component} is not found") endif() else() list(FIND CURL_SUPPORTED_FEATURES ${component} _found) - if(_found) + if(NOT _found EQUAL -1) set(CURL_${component}_FOUND TRUE) elseif(CURL_FIND_REQUIRED) message(FATAL_ERROR "CURL: Required feature ${component} is not found") diff --git a/Modules/FindHDF5.cmake b/Modules/FindHDF5.cmake index 60a313d..c9d1598 100644 --- a/Modules/FindHDF5.cmake +++ b/Modules/FindHDF5.cmake @@ -208,7 +208,6 @@ function(_HDF5_test_regular_compiler_C success version is_parallel) set(test_file ${scratch_directory}/cmake_hdf5_test.c) file(WRITE ${test_file} "#include <hdf5.h>\n" - "#include <hdf5_hl.h>\n" "const char* info_ver = \"INFO\" \":\" H5_VERSION;\n" "#ifdef H5_HAVE_PARALLEL\n" "const char* info_parallel = \"INFO\" \":\" \"PARALLEL\";\n" diff --git a/Modules/FindJNI.cmake b/Modules/FindJNI.cmake index 3a5bd31..bbca952 100644 --- a/Modules/FindJNI.cmake +++ b/Modules/FindJNI.cmake @@ -59,6 +59,8 @@ macro(java_append_library_directories _var) endif() elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$") set(_java_libarch "i386") + elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64") + set(_java_libarch "arm64" "aarch64") elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^alpha") set(_java_libarch "alpha") elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm") diff --git a/Modules/FindMPI.cmake b/Modules/FindMPI.cmake index 25de562..bbd40a4 100644 --- a/Modules/FindMPI.cmake +++ b/Modules/FindMPI.cmake @@ -1157,7 +1157,7 @@ macro(_MPI_create_imported_target LANG) string(REPLACE "-pthread" "$<$<COMPILE_LANG_AND_ID:CUDA,NVIDIA>:SHELL:-Xcompiler >-pthread" _MPI_${LANG}_COMPILE_OPTIONS "${MPI_${LANG}_COMPILE_OPTIONS}") string(REPLACE "-fexceptions" "$<$<COMPILE_LANG_AND_ID:CUDA,NVIDIA>:SHELL:-Xcompiler >-fexceptions" - _MPI_${LANG}_COMPILE_OPTIONS "${MPI_${LANG}_COMPILE_OPTIONS}") + _MPI_${LANG}_COMPILE_OPTIONS "${_MPI_${LANG}_COMPILE_OPTIONS}") set_property(TARGET MPI::MPI_${LANG} PROPERTY INTERFACE_COMPILE_OPTIONS "${_MPI_${LANG}_COMPILE_OPTIONS}") unset(_MPI_${LANG}_COMPILE_OPTIONS) diff --git a/Modules/FindMatlab.cmake b/Modules/FindMatlab.cmake index e42c206..d268717 100644 --- a/Modules/FindMatlab.cmake +++ b/Modules/FindMatlab.cmake @@ -241,6 +241,7 @@ if(NOT MATLAB_ADDITIONAL_VERSIONS) endif() set(MATLAB_VERSIONS_MAPPING + "R2020b=9.9" "R2020a=9.8" "R2019b=9.7" "R2019a=9.6" diff --git a/Modules/FindOpenGL.cmake b/Modules/FindOpenGL.cmake index 74392da..17ffe85 100644 --- a/Modules/FindOpenGL.cmake +++ b/Modules/FindOpenGL.cmake @@ -424,8 +424,15 @@ if(OPENGL_EGL_INCLUDE_DIR) endif() include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) +if (CMAKE_FIND_PACKAGE_NAME STREQUAL "GLU") + # FindGLU include()'s this module. It's an old pattern, but rather than + # trying to suppress this from outside the module (which is then sensitive to + # the contents, detect the case in this module and suppress it explicitly. + set(FPHSA_NAME_MISMATCHED 1) +endif () FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenGL REQUIRED_VARS ${_OpenGL_REQUIRED_VARS} HANDLE_COMPONENTS) +unset(FPHSA_NAME_MISMATCHED) unset(_OpenGL_REQUIRED_VARS) # OpenGL:: targets diff --git a/Modules/FindPerl.cmake b/Modules/FindPerl.cmake index fd120bf..c14e059 100644 --- a/Modules/FindPerl.cmake +++ b/Modules/FindPerl.cmake @@ -73,8 +73,15 @@ endif() set(PERL ${PERL_EXECUTABLE}) include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) +if (CMAKE_FIND_PACKAGE_NAME STREQUAL "PerlLibs") + # FindPerlLibs include()'s this module. It's an old pattern, but rather than + # trying to suppress this from outside the module (which is then sensitive to + # the contents, detect the case in this module and suppress it explicitly. + set(FPHSA_NAME_MISMATCHED 1) +endif () FIND_PACKAGE_HANDLE_STANDARD_ARGS(Perl REQUIRED_VARS PERL_EXECUTABLE VERSION_VAR PERL_VERSION_STRING) +unset(FPHSA_NAME_MISMATCHED) mark_as_advanced(PERL_EXECUTABLE) diff --git a/Modules/FindPython/Support.cmake b/Modules/FindPython/Support.cmake index 1be0625..3732463 100644 --- a/Modules/FindPython/Support.cmake +++ b/Modules/FindPython/Support.cmake @@ -5,17 +5,16 @@ # This file is a "template" file used by various FindPython modules. # -cmake_policy (GET CMP0094 _${_PYTHON_PREFIX}_LOOKUP_POLICY) - -cmake_policy (VERSION 3.7) - -if (_${_PYTHON_PREFIX}_LOOKUP_POLICY) - cmake_policy (SET CMP0094 ${_${_PYTHON_PREFIX}_LOOKUP_POLICY}) -endif() - # # Initial configuration # + +cmake_policy(PUSH) +# numbers and boolean constants +cmake_policy (SET CMP0012 NEW) +# IN_LIST operator +cmake_policy (SET CMP0057 NEW) + if (NOT DEFINED _PYTHON_PREFIX) message (FATAL_ERROR "FindPython: INTERNAL ERROR") endif() @@ -48,7 +47,6 @@ macro (_PYTHON_DISPLAY_FAILURE _PYTHON_MSG) set (${_PYTHON_PREFIX}_FOUND FALSE) string (TOUPPER "${_PYTHON_PREFIX}" _${_PYTHON_PREFIX}_UPPER_PREFIX) set (${_PYTHON_UPPER_PREFIX}_FOUND FALSE) - return() endmacro() @@ -454,7 +452,11 @@ function (_PYTHON_GET_CONFIG_VAR _PYTHON_PGCV_VALUE NAME) list (REMOVE_DUPLICATES _values) elseif (NAME STREQUAL "SOABI") # clean-up: remove prefix character and suffix - string (REGEX REPLACE "^[.-](.+)(${CMAKE_SHARED_LIBRARY_SUFFIX}|\\.(so|pyd))$" "\\1" _values "${_values}") + if (_values MATCHES "^(\\.${CMAKE_SHARED_LIBRARY_SUFFIX}|\\.so|\\.pyd)$") + set(_values "") + else() + string (REGEX REPLACE "^[.-](.+)(${CMAKE_SHARED_LIBRARY_SUFFIX}|\\.(so|pyd))$" "\\1" _values "${_values}") + endif() endif() endif() endif() @@ -490,7 +492,7 @@ function (_PYTHON_GET_CONFIG_VAR _PYTHON_PGCV_VALUE NAME) endif() elseif (NAME STREQUAL "SOABI") execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c - "import sys\ntry:\n from distutils import sysconfig\n sys.stdout.write(';'.join([sysconfig.get_config_var('SOABI') or '',sysconfig.get_config_var('EXT_SUFFIX') or '']))\nexcept Exception:\n import sysconfig;sys.stdout.write(';'.join([sysconfig.get_config_var('SOABI') or '',sysconfig.get_config_var('EXT_SUFFIX') or '']))" + "import sys\ntry:\n from distutils import sysconfig\n sys.stdout.write(';'.join([sysconfig.get_config_var('SOABI') or '',sysconfig.get_config_var('EXT_SUFFIX') or '',sysconfig.get_config_var('SO') or '']))\nexcept Exception:\n import sysconfig;sys.stdout.write(';'.join([sysconfig.get_config_var('SOABI') or '',sysconfig.get_config_var('EXT_SUFFIX') or '',sysconfig.get_config_var('SO') or '']))" RESULT_VARIABLE _result OUTPUT_VARIABLE _soabi ERROR_QUIET @@ -506,7 +508,11 @@ function (_PYTHON_GET_CONFIG_VAR _PYTHON_PGCV_VALUE NAME) endforeach() if (_values) # clean-up: remove prefix character and suffix - string (REGEX REPLACE "^[.-](.+)(${CMAKE_SHARED_LIBRARY_SUFFIX}|\\.(so|pyd))$" "\\1" _values "${_values}") + if (_values MATCHES "^(\\.${CMAKE_SHARED_LIBRARY_SUFFIX}|\\.so|\\.pyd)$") + set(_values "") + else() + string (REGEX REPLACE "^[.-](.+)(${CMAKE_SHARED_LIBRARY_SUFFIX}|\\.(so|pyd))$" "\\1" _values "${_values}") + endif() endif() endif() else() @@ -526,7 +532,7 @@ function (_PYTHON_GET_CONFIG_VAR _PYTHON_PGCV_VALUE NAME) endif() endif() - if (config_flag STREQUAL "ABIFLAGS") + if (NAME STREQUAL "ABIFLAGS" OR NAME STREQUAL "SOABI") set (${_PYTHON_PGCV_VALUE} "${_values}" PARENT_SCOPE) return() endif() @@ -562,18 +568,19 @@ function (_PYTHON_GET_VERSION) if (_PGV_LIBRARY) # retrieve version and abi from library name if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE) + get_filename_component (library_name "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" NAME) # extract version from library name - if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "python([23])([0-9]+)") + if (library_name MATCHES "python([23])([0-9]+)") set (${_PGV_PREFIX}VERSION_MAJOR "${CMAKE_MATCH_1}" PARENT_SCOPE) set (${_PGV_PREFIX}VERSION_MINOR "${CMAKE_MATCH_2}" PARENT_SCOPE) set (${_PGV_PREFIX}VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}" PARENT_SCOPE) set (${_PGV_PREFIX}ABI "" PARENT_SCOPE) - elseif (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "python([23])\\.([0-9]+)([dmu]*)") + elseif (library_name MATCHES "python([23])\\.([0-9]+)([dmu]*)") set (${_PGV_PREFIX}VERSION_MAJOR "${CMAKE_MATCH_1}" PARENT_SCOPE) set (${_PGV_PREFIX}VERSION_MINOR "${CMAKE_MATCH_2}" PARENT_SCOPE) set (${_PGV_PREFIX}VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}" PARENT_SCOPE) set (${_PGV_PREFIX}ABI "${CMAKE_MATCH_3}" PARENT_SCOPE) - elseif (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "pypy(3)?") + elseif (library_name MATCHES "pypy(3)?-c") set (version "${CMAKE_MATCH_1}") if (version EQUAL "3") set (${_PGV_PREFIX}VERSION_MAJOR "3" PARENT_SCOPE) @@ -610,14 +617,24 @@ function (_PYTHON_GET_VERSION) # ABI not used on Windows set (abi "") else() - if (config MATCHES "#[ ]*define[ ]+Py_DEBUG[ ]+1") - string (APPEND abi "d") - endif() - if (config MATCHES "#[ ]*define[ ]+WITH_PYMALLOC[ ]+1") - string (APPEND abi "m") - endif() - if (config MATCHES "#[ ]*define[ ]+Py_UNICODE_SIZE[ ]+4") - string (APPEND abi "u") + if (NOT config) + # pyconfig.h can be a wrapper to a platform specific pyconfig.h + # In this case, try to identify ABI from include directory + if (_${_PYTHON_PREFIX}_INCLUDE_DIR MATCHES "python${version_major}\\.${version_minor}+([dmu]*)") + set (abi "${CMAKE_MATCH_1}") + else() + set (abi "") + endif() + else() + if (config MATCHES "#[ ]*define[ ]+Py_DEBUG[ ]+1") + string (APPEND abi "d") + endif() + if (config MATCHES "#[ ]*define[ ]+WITH_PYMALLOC[ ]+1") + string (APPEND abi "m") + endif() + if (config MATCHES "#[ ]*define[ ]+Py_UNICODE_SIZE[ ]+4") + string (APPEND abi "u") + endif() endif() set (${_PGV_PREFIX}ABI "${abi}" PARENT_SCOPE) endif() @@ -1015,6 +1032,9 @@ endfunction() if (DEFINED ${_PYTHON_PREFIX}_FIND_VERSION_MAJOR AND NOT ${_PYTHON_PREFIX}_FIND_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) _python_display_failure ("Could NOT find ${_PYTHON_PREFIX}: Wrong major version specified is \"${${_PYTHON_PREFIX}_FIND_VERSION_MAJOR}\", but expected major version is \"${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}\"") + + cmake_policy(POP) + return() endif() @@ -1097,6 +1117,7 @@ endif() unset (${_PYTHON_PREFIX}_SOABI) # Define lookup strategy +cmake_policy (GET CMP0094 _${_PYTHON_PREFIX}_LOOKUP_POLICY) if (_${_PYTHON_PREFIX}_LOOKUP_POLICY STREQUAL "NEW") set (_${_PYTHON_PREFIX}_FIND_STRATEGY "LOCATION") else() @@ -1771,9 +1792,7 @@ if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS) unset (${_PYTHON_PREFIX}_SITEARCH) endif() - if (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR VERSION_GREATER_EQUAL "3") - _python_get_config_var (${_PYTHON_PREFIX}_SOABI SOABI) - endif() + _python_get_config_var (${_PYTHON_PREFIX}_SOABI SOABI) # store properties in the cache to speed-up future searches set (_${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES @@ -2844,8 +2863,7 @@ if (("Development.Module" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS ${_PYTHON_PREFIX}_PyPy_VERSION "${${_PYTHON_PREFIX}_PyPy_VERSION}") endif() - if (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR VERSION_GREATER_EQUAL "3" - AND NOT DEFINED ${_PYTHON_PREFIX}_SOABI) + if (NOT DEFINED ${_PYTHON_PREFIX}_SOABI) _python_get_config_var (${_PYTHON_PREFIX}_SOABI SOABI) endif() @@ -2957,6 +2975,9 @@ endif() if (${_PYTHON_PREFIX}_VERSION_MAJOR AND NOT ${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) _python_display_failure ("Could NOT find ${_PYTHON_PREFIX}: Found unsuitable major version \"${${_PYTHON_PREFIX}_VERSION_MAJOR}\", but required major version is exact version \"${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}\"") + + cmake_policy(POP) + return() endif() unset (_${_PYTHON_PREFIX}_REASON_FAILURE) @@ -3095,11 +3116,6 @@ if(_${_PYTHON_PREFIX}_CMAKE_ROLE STREQUAL "PROJECT") function (__${_PYTHON_PREFIX}_ADD_LIBRARY prefix name) cmake_parse_arguments (PARSE_ARGV 2 PYTHON_ADD_LIBRARY "STATIC;SHARED;MODULE;WITH_SOABI" "" "") - if (prefix STREQUAL "Python2" AND PYTHON_ADD_LIBRARY_WITH_SOABI) - message (AUTHOR_WARNING "FindPython2: Option `WITH_SOABI` is not supported for Python2 and will be ignored.") - unset (PYTHON_ADD_LIBRARY_WITH_SOABI) - endif() - if (PYTHON_ADD_LIBRARY_STATIC) set (type STATIC) elseif (PYTHON_ADD_LIBRARY_SHARED) @@ -3170,3 +3186,5 @@ if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK) else() unset (CMAKE_FIND_FRAMEWORK) endif() + +cmake_policy(POP) diff --git a/Modules/FindQt3.cmake b/Modules/FindQt3.cmake index 563ed46..b5bc8b1 100644 --- a/Modules/FindQt3.cmake +++ b/Modules/FindQt3.cmake @@ -201,9 +201,16 @@ endif() # if the include a library are found then we have it include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) +if (CMAKE_FIND_PACKAGE_NAME STREQUAL "Qt") + # FindQt include()'s this module. It's an old pattern, but rather than trying + # to suppress this from outside the module (which is then sensitive to the + # contents, detect the case in this module and suppress it explicitly. + set(FPHSA_NAME_MISMATCHED 1) +endif () FIND_PACKAGE_HANDLE_STANDARD_ARGS(Qt3 REQUIRED_VARS QT_QT_LIBRARY QT_INCLUDE_DIR QT_MOC_EXECUTABLE VERSION_VAR QT_VERSION_STRING) +unset(FPHSA_NAME_MISMATCHED) set(QT_FOUND ${QT3_FOUND} ) if(QT_FOUND) diff --git a/Modules/FindQt4.cmake b/Modules/FindQt4.cmake index 3993968..2e3da74 100644 --- a/Modules/FindQt4.cmake +++ b/Modules/FindQt4.cmake @@ -1318,10 +1318,18 @@ if (NOT QT_VERSION_MAJOR EQUAL 4) endif() endif() else() + if (CMAKE_FIND_PACKAGE_NAME STREQUAL "Qt") + # FindQt include()'s this module. It's an old pattern, but rather than + # trying to suppress this from outside the module (which is then sensitive + # to the contents, detect the case in this module and suppress it + # explicitly. + set(FPHSA_NAME_MISMATCHED 1) + endif () FIND_PACKAGE_HANDLE_STANDARD_ARGS(Qt4 FOUND_VAR Qt4_FOUND REQUIRED_VARS ${_QT4_FOUND_REQUIRED_VARS} VERSION_VAR QTVERSION ) + unset(FPHSA_NAME_MISMATCHED) endif() ####################################### diff --git a/Modules/FindRuby.cmake b/Modules/FindRuby.cmake index 1bdee60..a0cdf3b 100644 --- a/Modules/FindRuby.cmake +++ b/Modules/FindRuby.cmake @@ -48,10 +48,21 @@ This module will set the following variables in your project: Ruby patch version. -Also: - -``Ruby_INCLUDE_PATH`` - same as Ruby_INCLUDE_DIRS, only provided for compatibility reasons, don't use it +The following variables are also provided for compatibility reasons, +don't use them in new code: + +``RUBY_EXECUTABLE`` + same as Ruby_EXECUTABLE. +``RUBY_INCLUDE_DIRS`` + same as Ruby_INCLUDE_DIRS. +``RUBY_INCLUDE_PATH`` + same as Ruby_INCLUDE_DIRS. +``RUBY_LIBRARY`` + same as Ruby_LIBRARY. +``RUBY_VERSION`` + same as Ruby_VERSION. +``RUBY_FOUND`` + same as Ruby_FOUND. Hints ^^^^^ @@ -493,7 +504,6 @@ foreach(Camel Ruby_VERSION_MAJOR Ruby_VERSION_MINOR Ruby_VERSION_PATCH - Ruby_INCLUDE_PATH Ruby_ARCH_DIR Ruby_ARCH @@ -505,6 +515,7 @@ foreach(Camel Ruby_SITELIB_DIR Ruby_HAS_VENDOR_RUBY Ruby_VENDORARCH_DIR + Ruby_VENDORLIB_DIR ) string(TOUPPER ${Camel} UPPER) diff --git a/Modules/FindTCL.cmake b/Modules/FindTCL.cmake index 960265f..9b771dc 100644 --- a/Modules/FindTCL.cmake +++ b/Modules/FindTCL.cmake @@ -223,6 +223,12 @@ find_path(TK_INCLUDE_PATH include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) +if (CMAKE_FIND_PACKAGE_NAME STREQUAL "TclStub") + # FindTclStub include()'s this module. It's an old pattern, but rather than + # trying to suppress this from outside the module (which is then sensitive to + # the contents, detect the case in this module and suppress it explicitly. + set(FPHSA_NAME_MISMATCHED 1) +endif () FIND_PACKAGE_HANDLE_STANDARD_ARGS(TCL DEFAULT_MSG TCL_LIBRARY TCL_INCLUDE_PATH) set(FPHSA_NAME_MISMATCHED 1) set(TCLTK_FIND_REQUIRED ${TCL_FIND_REQUIRED}) diff --git a/Modules/FindTclsh.cmake b/Modules/FindTclsh.cmake index 82be473..5555d59 100644 --- a/Modules/FindTclsh.cmake +++ b/Modules/FindTclsh.cmake @@ -92,8 +92,17 @@ if(TCL_TCLSH) endif() include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) +if (CMAKE_FIND_PACKAGE_NAME STREQUAL "TCL" OR + CMAKE_FIND_PACKAGE_NAME STREQUAL "TclStub") + # FindTCL include()'s this module. It's an old pattern, but rather than + # trying to suppress this from outside the module (which is then sensitive to + # the contents, detect the case in this module and suppress it explicitly. + # Transitively, FindTclStub includes FindTCL. + set(FPHSA_NAME_MISMATCHED 1) +endif () FIND_PACKAGE_HANDLE_STANDARD_ARGS(Tclsh REQUIRED_VARS TCL_TCLSH VERSION_VAR TCLSH_VERSION_STRING) +unset(FPHSA_NAME_MISMATCHED) mark_as_advanced(TCL_TCLSH) diff --git a/Modules/FindX11.cmake b/Modules/FindX11.cmake index aa83575..ccd0252 100644 --- a/Modules/FindX11.cmake +++ b/Modules/FindX11.cmake @@ -404,9 +404,17 @@ if (UNIX) endif () include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) + if (CMAKE_FIND_PACKAGE_NAME STREQUAL "FLTK") + # FindFLTK include()'s this module. It's an old pattern, but rather than + # trying to suppress this from outside the module (which is then sensitive + # to the contents, detect the case in this module and suppress it + # explicitly. + set(FPHSA_NAME_MISMATCHED 1) + endif () find_package_handle_standard_args(X11 REQUIRED_VARS X11_X11_INCLUDE_PATH X11_X11_LIB HANDLE_COMPONENTS) + unset(FPHSA_NAME_MISMATCHED) if(X11_FOUND) include(${CMAKE_CURRENT_LIST_DIR}/CheckFunctionExists.cmake) diff --git a/Modules/FindXalanC.cmake b/Modules/FindXalanC.cmake index 3adaa44..54783e3 100644 --- a/Modules/FindXalanC.cmake +++ b/Modules/FindXalanC.cmake @@ -47,9 +47,9 @@ The following cache variables may also be set: function(_XalanC_GET_VERSION version_hdr) file(STRINGS ${version_hdr} _contents REGEX "^[ \t]*#define XALAN_VERSION_.*") if(_contents) - string(REGEX REPLACE "[^*]*#define XALAN_VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" XalanC_MAJOR "${_contents}") - string(REGEX REPLACE "[^*]*#define XALAN_VERSION_MINOR[ \t]+([0-9]+).*" "\\1" XalanC_MINOR "${_contents}") - string(REGEX REPLACE "[^*]*#define XALAN_VERSION_REVISION[ \t]+([0-9]+).*" "\\1" XalanC_PATCH "${_contents}") + string(REGEX REPLACE "[^*]*#define XALAN_VERSION_MAJOR[ \t(]+([0-9]+).*" "\\1" XalanC_MAJOR "${_contents}") + string(REGEX REPLACE "[^*]*#define XALAN_VERSION_MINOR[ \t(]+([0-9]+).*" "\\1" XalanC_MINOR "${_contents}") + string(REGEX REPLACE "[^*]*#define XALAN_VERSION_REVISION[ \t(]+([0-9]+).*" "\\1" XalanC_PATCH "${_contents}") if(NOT XalanC_MAJOR MATCHES "^[0-9]+$") message(FATAL_ERROR "Version parsing failed for XALAN_VERSION_MAJOR!") diff --git a/Modules/GoogleTestAddTests.cmake b/Modules/GoogleTestAddTests.cmake index 5d098d9..883e1f4 100644 --- a/Modules/GoogleTestAddTests.cmake +++ b/Modules/GoogleTestAddTests.cmake @@ -44,8 +44,8 @@ function(gtest_discover_tests_impl) cmake_parse_arguments( "" "" - "NO_PRETTY_TYPES;NO_PRETTY_VALUES;TEST_EXECUTABLE;TEST_EXECUTOR;TEST_WORKING_DIR;TEST_PREFIX;TEST_SUFFIX;TEST_LIST;CTEST_FILE;TEST_DISCOVERY_TIMEOUT;TEST_XML_OUTPUT_DIR" - "TEST_EXTRA_ARGS;TEST_PROPERTIES" + "NO_PRETTY_TYPES;NO_PRETTY_VALUES;TEST_EXECUTABLE;TEST_WORKING_DIR;TEST_PREFIX;TEST_SUFFIX;TEST_LIST;CTEST_FILE;TEST_DISCOVERY_TIMEOUT;TEST_XML_OUTPUT_DIR" + "TEST_EXTRA_ARGS;TEST_PROPERTIES;TEST_EXECUTOR" ${ARGN} ) diff --git a/Modules/Platform/Windows-Clang.cmake b/Modules/Platform/Windows-Clang.cmake index dff8166..a23d664 100644 --- a/Modules/Platform/Windows-Clang.cmake +++ b/Modules/Platform/Windows-Clang.cmake @@ -8,6 +8,11 @@ if(__WINDOWS_CLANG) endif() set(__WINDOWS_CLANG 1) +set(__pch_header_C "c-header") +set(__pch_header_CXX "c++-header") +set(__pch_header_OBJC "objective-c-header") +set(__pch_header_OBJCXX "objective-c++-header") + macro(__windows_compiler_clang_gnu lang) set(CMAKE_LIBRARY_PATH_FLAG "-L") set(CMAKE_LINK_LIBRARY_FLAG "-l") @@ -87,7 +92,7 @@ macro(__windows_compiler_clang_gnu lang) set(CMAKE_PCH_EXTENSION .pch) set(CMAKE_PCH_PROLOGUE "#pragma clang system_header") set(CMAKE_${lang}_COMPILE_OPTIONS_USE_PCH -Xclang -include-pch -Xclang <PCH_FILE> -Xclang -include -Xclang <PCH_HEADER>) - set(CMAKE_${lang}_COMPILE_OPTIONS_CREATE_PCH -Xclang -emit-pch -Xclang -include -Xclang <PCH_HEADER>) + set(CMAKE_${lang}_COMPILE_OPTIONS_CREATE_PCH -Xclang -emit-pch -Xclang -include -Xclang <PCH_HEADER> -x ${__pch_header_${lang}}) unset(__ADDED_FLAGS) unset(__ADDED_FLAGS_DEBUG) @@ -142,7 +147,7 @@ if("x${CMAKE_C_SIMULATE_ID}" STREQUAL "xMSVC" endif() if(DEFINED CMAKE_RC_PREPROCESSOR) set(CMAKE_DEPFILE_FLAGS_RC "-clang:-MD -clang:-MF -clang:<DEPFILE>") - set(CMAKE_RC_COMPILE_OBJECT "${CMAKE_COMMAND} -E cmake_llvm_rc <SOURCE> <OBJECT>.pp <${CMAKE_RC_PREPROCESSOR}> <DEFINES> -DRC_INVOKED <INCLUDES> <FLAGS> -E <SOURCE> -- <CMAKE_RC_COMPILER> <DEFINES> -I <SOURCE_DIR> <INCLUDES> /fo <OBJECT> <OBJECT>.pp") + set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_COMMAND> -E cmake_llvm_rc <SOURCE> <OBJECT>.pp <${CMAKE_RC_PREPROCESSOR}> <DEFINES> -DRC_INVOKED <INCLUDES> <FLAGS> -E <SOURCE> -- <CMAKE_RC_COMPILER> <DEFINES> -I <SOURCE_DIR> <INCLUDES> /fo <OBJECT> <OBJECT>.pp") if(CMAKE_GENERATOR STREQUAL "Ninja") set(CMAKE_NINJA_CMCLDEPS_RC 0) set(CMAKE_NINJA_DEP_TYPE_RC gcc) diff --git a/Modules/Platform/Windows-Embarcadero.cmake b/Modules/Platform/Windows-Embarcadero.cmake index 0c24739..59f3ca5 100644 --- a/Modules/Platform/Windows-Embarcadero.cmake +++ b/Modules/Platform/Windows-Embarcadero.cmake @@ -10,6 +10,11 @@ set(__WINDOWS_EMBARCADERO 1) set(BORLAND 1) +set(__pch_header_C "c-header") +set(__pch_header_CXX "c++-header") +set(__pch_header_OBJC "objective-c-header") +set(__pch_header_OBJCXX "objective-c++-header") + if("${CMAKE_${_lang}_COMPILER_VERSION}" VERSION_LESS 6.30) # Borland target type flags (bcc32 -h -t): set(_tW "-tW") # -tW GUI App (implies -U__CONSOLE__) @@ -123,7 +128,7 @@ macro(__embarcadero_language lang) if (EMBARCADERO) set(CMAKE_PCH_EXTENSION .pch) set(CMAKE_${lang}_COMPILE_OPTIONS_USE_PCH -Xclang -include-pch -Xclang <PCH_FILE> -Xclang -include -Xclang <PCH_HEADER>) - set(CMAKE_${lang}_COMPILE_OPTIONS_CREATE_PCH -Xclang -emit-pch -Xclang -include -Xclang <PCH_HEADER>) + set(CMAKE_${lang}_COMPILE_OPTIONS_CREATE_PCH -Xclang -emit-pch -Xclang -include -Xclang <PCH_HEADER> -x ${__pch_header_${lang}}) endif() # Initial configuration flags. diff --git a/Modules/UseSWIG.cmake b/Modules/UseSWIG.cmake index a60e05e..b47a8cb 100644 --- a/Modules/UseSWIG.cmake +++ b/Modules/UseSWIG.cmake @@ -496,7 +496,8 @@ function(SWIG_ADD_SOURCE_TO_MODULE name outfiles infile) endif() endif() if (SWIG_MODULE_${name}_LANGUAGE STREQUAL "PYTHON" AND NOT SWIG_MODULE_${name}_NOPROXY) - if(NOT ("-interface" IN_LIST swig_source_file_flags OR "-interface" IN_LIST SWIG_MODULE_${name}_EXTRA_FLAGS)) + if(SWIG_USE_INTERFACE AND + NOT ("-interface" IN_LIST swig_source_file_flags OR "-interface" IN_LIST SWIG_MODULE_${name}_EXTRA_FLAGS)) # This makes sure that the name used in the proxy code # matches the library name created by CMake list (APPEND SWIG_MODULE_${name}_EXTRA_FLAGS "-interface" "$<TARGET_FILE_PREFIX:${target_name}>$<TARGET_FILE_BASE_NAME:${target_name}>") @@ -724,6 +725,13 @@ function(SWIG_ADD_LIBRARY name) set(swig_generated_sources) set(swig_generated_timestamps) + list(LENGTH swig_dot_i_sources swig_sources_count) + if (swig_sources_count GREATER "1") + # option -interface cannot be used + set(SWIG_USE_INTERFACE FALSE) + else() + set(SWIG_USE_INTERFACE TRUE) + endif() foreach(swig_it IN LISTS swig_dot_i_sources) SWIG_ADD_SOURCE_TO_MODULE(${name} swig_generated_source "${swig_it}") list (APPEND swig_generated_sources "${swig_generated_source}") diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index 1b6bb00..2026ab1 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -193,6 +193,8 @@ set(SRCS cmComputeLinkInformation.h cmComputeTargetDepends.h cmComputeTargetDepends.cxx + cmConsoleBuf.h + cmConsoleBuf.cxx cmCPackPropertiesGenerator.h cmCPackPropertiesGenerator.cxx cmCryptoHash.cxx diff --git a/Source/CMakeVersion.cmake b/Source/CMakeVersion.cmake index 9c3df38..5439a69 100644 --- a/Source/CMakeVersion.cmake +++ b/Source/CMakeVersion.cmake @@ -1,7 +1,7 @@ # CMake version number components. set(CMake_VERSION_MAJOR 3) set(CMake_VERSION_MINOR 18) -set(CMake_VERSION_PATCH 0) +set(CMake_VERSION_PATCH 6) #set(CMake_VERSION_RC 0) set(CMake_VERSION_IS_DIRTY 0) diff --git a/Source/CPack/cpack.cxx b/Source/CPack/cpack.cxx index 3a400b7..cc1ddf5 100644 --- a/Source/CPack/cpack.cxx +++ b/Source/CPack/cpack.cxx @@ -1,12 +1,22 @@ /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ +#include <cstddef> +#include <iostream> +#include <map> +#include <memory> +#include <sstream> +#include <string> +#include <utility> +#include <vector> + #include "cmsys/CommandLineArguments.hxx" #include "cmsys/Encoding.hxx" #include "cmCPackGenerator.h" #include "cmCPackGeneratorFactory.h" #include "cmCPackLog.h" +#include "cmConsoleBuf.h" #include "cmDocumentation.h" #include "cmDocumentationEntry.h" #include "cmDocumentationFormatter.h" @@ -18,19 +28,6 @@ #include "cmSystemTools.h" #include "cmake.h" -#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) -# include "cmsys/ConsoleBuf.hxx" -#endif - -#include <cstddef> -#include <iostream> -#include <map> -#include <memory> -#include <sstream> -#include <string> -#include <utility> -#include <vector> - namespace { const char* cmDocumentationName[][2] = { { nullptr, " cpack - Packaging driver provided by CMake." }, @@ -103,13 +100,11 @@ void cpackProgressCallback(const std::string& message, float /*unused*/) int main(int argc, char const* const* argv) { cmSystemTools::EnsureStdPipes(); -#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) + // Replace streambuf so we can output Unicode to console - cmsys::ConsoleBuf::Manager consoleOut(std::cout); - consoleOut.SetUTF8Pipes(); - cmsys::ConsoleBuf::Manager consoleErr(std::cerr, true); - consoleErr.SetUTF8Pipes(); -#endif + cmConsoleBuf consoleBuf; + consoleBuf.SetUTF8Pipes(); + cmsys::Encoding::CommandLineArguments args = cmsys::Encoding::CommandLineArguments::Main(argc, argv); argc = args.argc(); diff --git a/Source/QtDialog/QCMakeCacheView.cxx b/Source/QtDialog/QCMakeCacheView.cxx index b1f4a82..9b24fbd 100644 --- a/Source/QtDialog/QCMakeCacheView.cxx +++ b/Source/QtDialog/QCMakeCacheView.cxx @@ -226,8 +226,9 @@ void QCMakeCacheModel::setProperties(const QCMakePropertyList& props) #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) QSet<QCMakeProperty> oldProps = this->properties().toSet(); #else - QSet<QCMakeProperty> oldProps = QSet<QCMakeProperty>( - this->properties().begin(), this->properties().end()); + QCMakePropertyList const& oldPropsList = this->properties(); + QSet<QCMakeProperty> oldProps = + QSet<QCMakeProperty>(oldPropsList.begin(), oldPropsList.end()); #endif oldProps.intersect(newProps); newProps.subtract(oldProps); diff --git a/Source/cmConsoleBuf.cxx b/Source/cmConsoleBuf.cxx new file mode 100644 index 0000000..70be481 --- /dev/null +++ b/Source/cmConsoleBuf.cxx @@ -0,0 +1,23 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#include "cmConsoleBuf.h" + +#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) +cmConsoleBuf::cmConsoleBuf() + : m_ConsoleOut(std::cout) + , m_ConsoleErr(std::cerr, true) +{ +} +#else +cmConsoleBuf::cmConsoleBuf() = default; +#endif + +cmConsoleBuf::~cmConsoleBuf() = default; + +void cmConsoleBuf::SetUTF8Pipes() +{ +#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) + m_ConsoleOut.SetUTF8Pipes(); + m_ConsoleErr.SetUTF8Pipes(); +#endif +} diff --git a/Source/cmConsoleBuf.h b/Source/cmConsoleBuf.h new file mode 100644 index 0000000..3564598 --- /dev/null +++ b/Source/cmConsoleBuf.h @@ -0,0 +1,23 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#pragma once + +#include "cmConfigure.h" // IWYU pragma: keep + +#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) +# include "cmsys/ConsoleBuf.hxx" +#endif + +class cmConsoleBuf +{ +#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) + cmsys::ConsoleBuf::Manager m_ConsoleOut; + cmsys::ConsoleBuf::Manager m_ConsoleErr; +#endif +public: + cmConsoleBuf(); + ~cmConsoleBuf(); + cmConsoleBuf(cmConsoleBuf const&) = delete; + cmConsoleBuf& operator=(cmConsoleBuf const&) = delete; + void SetUTF8Pipes(); +}; diff --git a/Source/cmForEachCommand.cxx b/Source/cmForEachCommand.cxx index 3b82e0a..c68b785 100644 --- a/Source/cmForEachCommand.cxx +++ b/Source/cmForEachCommand.cxx @@ -365,6 +365,12 @@ bool TryParseInteger(cmExecutionStatus& status, const std::string& str, int& i) status.SetError(e.str()); cmSystemTools::SetFatalErrorOccured(); return false; + } catch (std::out_of_range&) { + std::ostringstream e; + e << "Integer out of range: '" << str << "'"; + status.SetError(e.str()); + cmSystemTools::SetFatalErrorOccured(); + return false; } return true; diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index f2011ee..b7bf4a6 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -1309,6 +1309,9 @@ void AddSwiftImplicitIncludeDirectories( for (const cmLinkImplItem& library : libraries->Libraries) { if (const cmGeneratorTarget* dependency = library.Target) { + if (dependency->GetType() == cmStateEnums::INTERFACE_LIBRARY) { + continue; + } if (cm::contains(dependency->GetAllConfigCompileLanguages(), "Swift")) { EvaluatedTargetPropertyEntry entry{ library, library.Backtrace }; @@ -3029,6 +3032,9 @@ std::string cmGeneratorTarget::GetCompilePDBDirectory( void cmGeneratorTarget::GetAppleArchs(const std::string& config, std::vector<std::string>& archVec) const { + if (!this->Makefile->IsOn("APPLE")) { + return; + } cmProp archs = nullptr; if (!config.empty()) { std::string defVarName = @@ -6908,6 +6914,14 @@ void cmGeneratorTarget::GetLanguages(std::set<std::string>& languages, } } +bool cmGeneratorTarget::IsLanguageUsed(std::string const& language, + std::string const& config) const +{ + std::set<std::string> languages; + this->GetLanguages(languages, config); + return languages.count(language); +} + bool cmGeneratorTarget::IsCSharpOnly() const { // Only certain target types may compile CSharp. diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index 3aedbf5..ea3a684 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -397,6 +397,8 @@ public: // until we have per-target object file properties. void GetLanguages(std::set<std::string>& languages, std::string const& config) const; + bool IsLanguageUsed(std::string const& language, + std::string const& config) const; bool IsCSharpOnly() const; diff --git a/Source/cmGhsMultiTargetGenerator.cxx b/Source/cmGhsMultiTargetGenerator.cxx index 358d65a..97580d6 100644 --- a/Source/cmGhsMultiTargetGenerator.cxx +++ b/Source/cmGhsMultiTargetGenerator.cxx @@ -550,8 +550,9 @@ void cmGhsMultiTargetGenerator::WriteSources(std::ostream& fout_proj) */ for (auto& sg : groupFilesList) { std::ostream* fout; - bool useProjectFile = cmIsOn(*this->GeneratorTarget->GetProperty( - "GHS_NO_SOURCE_GROUP_FILE")) || + cmProp noSourceGroupFile = + this->GeneratorTarget->GetProperty("GHS_NO_SOURCE_GROUP_FILE"); + bool useProjectFile = (noSourceGroupFile && cmIsOn(*noSourceGroupFile)) || cmIsOn(this->Makefile->GetDefinition("CMAKE_GHS_NO_SOURCE_GROUP_FILE")); if (useProjectFile || sg.empty()) { fout = &fout_proj; diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index 4dc4092..bf8f6cb 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -1611,6 +1611,8 @@ bool cmGlobalGenerator::AddAutomaticSources() { for (const auto& lg : this->LocalGenerators) { lg->CreateEvaluationFileOutputs(); + } + for (const auto& lg : this->LocalGenerators) { for (const auto& gt : lg->GetGeneratorTargets()) { if (gt->GetType() == cmStateEnums::INTERFACE_LIBRARY || gt->GetType() == cmStateEnums::UTILITY || diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx index 843b0f4..7f01b9c 100644 --- a/Source/cmGlobalNinjaGenerator.cxx +++ b/Source/cmGlobalNinjaGenerator.cxx @@ -571,18 +571,9 @@ void cmGlobalNinjaGenerator::CleanMetaData() // Skip some ninja tools if they need 'build.ninja' but it is missing. bool const missingBuildManifest = expectBuildManifest && - (this->NinjaSupportsCleanDeadTool || - this->NinjaSupportsUnconditionalRecompactTool) && + this->NinjaSupportsUnconditionalRecompactTool && !cmSystemTools::FileExists("build.ninja"); - // The `cleandead` tool needs to know about all outputs in the build we just - // wrote out. Ninja-Multi doesn't have a single `build.ninja` we can use that - // is the union of all generated configurations, so we can't run it reliably - // in that case. - if (this->NinjaSupportsCleanDeadTool && expectBuildManifest && - !missingBuildManifest) { - run_ninja_tool({ "cleandead" }); - } // The `recompact` tool loads the manifest. As above, we don't have a single // `build.ninja` to load for this in Ninja-Multi. This may be relaxed in the // future pending further investigation into how Ninja works upstream @@ -669,9 +660,6 @@ void cmGlobalNinjaGenerator::CheckNinjaFeatures() } } } - this->NinjaSupportsCleanDeadTool = !cmSystemTools::VersionCompare( - cmSystemTools::OP_LESS, this->NinjaVersion.c_str(), - RequiredNinjaVersionForCleanDeadTool().c_str()); this->NinjaSupportsUnconditionalRecompactTool = !cmSystemTools::VersionCompare( cmSystemTools::OP_LESS, this->NinjaVersion.c_str(), @@ -1170,7 +1158,9 @@ void cmGlobalNinjaGenerator::AppendTargetDependsClosure( for (auto const& dep_target : this->GetTargetDirectDepends(target)) { if (dep_target->GetType() == cmStateEnums::INTERFACE_LIBRARY || - (this->EnableCrossConfigBuild() && !dep_target.IsCross())) { + (target->GetType() != cmStateEnums::UTILITY && + dep_target->GetType() != cmStateEnums::UTILITY && + this->EnableCrossConfigBuild() && !dep_target.IsCross())) { continue; } @@ -1200,7 +1190,9 @@ void cmGlobalNinjaGenerator::AddTargetAlias(const std::string& alias, std::string outputPath = this->NinjaOutputPath(alias); std::string buildAlias = this->BuildAlias(outputPath, config); cmNinjaDeps outputs; - this->AppendTargetOutputs(target, outputs, config); + if (config != "all") { + this->AppendTargetOutputs(target, outputs, config); + } // Mark the target's outputs as ambiguous to ensure that no other target // uses the output as an alias. for (std::string const& output : outputs) { @@ -1863,6 +1855,7 @@ void cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os) byproducts.push_back( this->BuildAlias(GetByproductsForCleanTargetName(), config)); } + byproducts.emplace_back(GetByproductsForCleanTargetName()); build.Variables["TARGETS"] = cmJoin(byproducts, " "); for (auto const& fileConfig : configs) { diff --git a/Source/cmGlobalNinjaGenerator.h b/Source/cmGlobalNinjaGenerator.h index 44e632f..8373de3 100644 --- a/Source/cmGlobalNinjaGenerator.h +++ b/Source/cmGlobalNinjaGenerator.h @@ -370,7 +370,6 @@ public: { return "1.10"; } - static std::string RequiredNinjaVersionForCleanDeadTool() { return "1.10"; } bool SupportsConsolePool() const; bool SupportsImplicitOuts() const; bool SupportsManifestRestat() const; @@ -533,7 +532,6 @@ private: bool NinjaSupportsDyndeps = false; bool NinjaSupportsRestatTool = false; bool NinjaSupportsUnconditionalRecompactTool = false; - bool NinjaSupportsCleanDeadTool = false; private: void InitOutputPathPrefix(); diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index a5ce5d1..b28395a 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -12,6 +12,7 @@ #include <cm/memory> #include <cmext/algorithm> +#include <cmext/string_view> #include "cmsys/RegularExpression.hxx" @@ -271,6 +272,13 @@ std::string cmGlobalXCodeGenerator::FindXcodeBuildCommand() return makeProgram; } +bool cmGlobalXCodeGenerator::SetSystemName(std::string const& s, + cmMakefile* mf) +{ + this->SystemName = s; + return this->cmGlobalGenerator::SetSystemName(s, mf); +} + bool cmGlobalXCodeGenerator::SetGeneratorToolset(std::string const& ts, bool build, cmMakefile* mf) { @@ -3111,6 +3119,14 @@ bool cmGlobalXCodeGenerator::CreateXCodeObjects( if (archs.empty()) { // Tell Xcode to use NATIVE_ARCH instead of ARCHS. buildSettings->AddAttribute("ONLY_ACTIVE_ARCH", this->CreateString("YES")); + // When targeting macOS, use only the host architecture. + if (this->SystemName == "Darwin"_s && + (!sysroot || !*sysroot || + cmSystemTools::LowerCase(sysroot).find("macos") != + std::string::npos)) { + buildSettings->AddAttribute("ARCHS", + this->CreateString("$(NATIVE_ARCH_ACTUAL)")); + } } else { // Tell Xcode to use ARCHS (ONLY_ACTIVE_ARCH defaults to NO). buildSettings->AddAttribute("ARCHS", this->CreateString(archs)); @@ -3142,6 +3158,12 @@ bool cmGlobalXCodeGenerator::CreateXCodeObjects( std::string symroot = cmStrCat(root->GetCurrentBinaryDirectory(), "/build"); buildSettings->AddAttribute("SYMROOT", this->CreateString(symroot)); + // Inside a try_compile project, do not require signing on any platform. + if (this->CMakeInstance->GetIsInTryCompile()) { + buildSettings->AddAttribute("CODE_SIGNING_ALLOWED", + this->CreateString("NO")); + } + for (auto& config : configs) { cmXCodeObject* buildSettingsForCfg = this->CreateFlatClone(buildSettings); @@ -3210,7 +3232,8 @@ void cmGlobalXCodeGenerator::ComputeArchitectures(cmMakefile* mf) } if (this->Architectures.empty()) { - // With no ARCHS we use ONLY_ACTIVE_ARCH. + // With no ARCHS we use ONLY_ACTIVE_ARCH and possibly a + // platform-specific default ARCHS placeholder value. // Look up the arch that Xcode chooses in this case. if (const char* arch = mf->GetDefinition("CMAKE_XCODE_ARCHS")) { this->ObjectDirArchDefault = arch; @@ -3466,6 +3489,8 @@ void cmGlobalXCodeGenerator::OutputXCodeWorkspaceSettings( if (this->XcodeVersion >= 100) { xout.Element("key", "BuildSystemType"); xout.Element("string", "Original"); + xout.Element("key", "DisableBuildSystemDeprecationWarning"); + xout.Element("true"); } if (hasGeneratedSchemes) { xout.Element("key", diff --git a/Source/cmGlobalXCodeGenerator.h b/Source/cmGlobalXCodeGenerator.h index e380f1c..e2d1b3a 100644 --- a/Source/cmGlobalXCodeGenerator.h +++ b/Source/cmGlobalXCodeGenerator.h @@ -109,6 +109,7 @@ public: bool ShouldStripResourcePath(cmMakefile*) const override; + bool SetSystemName(std::string const& s, cmMakefile* mf) override; bool SetGeneratorToolset(std::string const& ts, bool build, cmMakefile* mf) override; void AppendFlag(std::string& flags, std::string const& flag) const; @@ -298,6 +299,7 @@ private: std::vector<std::string> Architectures; std::string ObjectDirArchDefault; std::string ObjectDirArch; + std::string SystemName; std::string GeneratorToolset; std::map<cmGeneratorTarget const*, size_t> TargetOrderIndex; }; diff --git a/Source/cmGraphVizWriter.cxx b/Source/cmGraphVizWriter.cxx index 0fcda4e..c23156d 100644 --- a/Source/cmGraphVizWriter.cxx +++ b/Source/cmGraphVizWriter.cxx @@ -67,6 +67,36 @@ const char* getShapeForTarget(const cmLinkItem& item) return GRAPHVIZ_NODE_SHAPE_LIBRARY_UNKNOWN; } } + +struct DependeesDir +{ + template <typename T> + static const cmLinkItem& src(const T& con) + { + return con.src; + } + + template <typename T> + static const cmLinkItem& dst(const T& con) + { + return con.dst; + } +}; + +struct DependersDir +{ + template <typename T> + static const cmLinkItem& src(const T& con) + { + return con.dst; + } + + template <typename T> + static const cmLinkItem& dst(const T& con) + { + return con.src; + } +}; } cmGraphVizWriter::cmGraphVizWriter(std::string const& fileName, @@ -173,18 +203,16 @@ void cmGraphVizWriter::VisitLink(cmLinkItem const& depender, return; } + // write global data directly this->WriteConnection(this->GlobalFileStream, depender, dependee, scopeType); if (this->GeneratePerTarget) { - auto fileStream = PerTargetFileStreams[depender.AsStr()].get(); - this->WriteNode(*fileStream, dependee); - this->WriteConnection(*fileStream, depender, dependee, scopeType); + PerTargetConnections[depender].emplace_back(depender, dependee, scopeType); } if (this->GenerateDependers) { - auto fileStream = TargetDependersFileStreams[dependee.AsStr()].get(); - this->WriteNode(*fileStream, depender); - this->WriteConnection(*fileStream, depender, dependee, scopeType); + TargetDependersConnections[dependee].emplace_back(dependee, depender, + scopeType); } } @@ -288,10 +316,86 @@ void cmGraphVizWriter::Write() } } + // write global data and collect all connection data for per target graphs for (auto const gt : sortedGeneratorTargets) { auto item = cmLinkItem(gt, false, gt->GetBacktrace()); this->VisitItem(item); } + + if (this->GeneratePerTarget) { + WritePerTargetConnections<DependeesDir>(PerTargetConnections, + PerTargetFileStreams); + } + + if (this->GenerateDependers) { + WritePerTargetConnections<DependersDir>(TargetDependersConnections, + TargetDependersFileStreams); + } +} + +void cmGraphVizWriter::FindAllConnections(const ConnectionsMap& connectionMap, + const cmLinkItem& rootItem, + Connections& extendedCons, + std::set<cmLinkItem>& visitedItems) +{ + // some "targets" are not in map, e.g. linker flags as -lm or + // targets without dependency. + // in both cases we are finished with traversing the graph + if (connectionMap.find(rootItem) == connectionMap.cend()) { + return; + } + + const Connections& origCons = connectionMap.at(rootItem); + + for (const Connection& con : origCons) { + extendedCons.emplace_back(con); + const cmLinkItem& dstItem = con.dst; + bool const visited = visitedItems.find(dstItem) != visitedItems.cend(); + if (!visited) { + visitedItems.insert(dstItem); + FindAllConnections(connectionMap, dstItem, extendedCons, visitedItems); + } + } +} + +void cmGraphVizWriter::FindAllConnections(const ConnectionsMap& connectionMap, + const cmLinkItem& rootItem, + Connections& extendedCons) +{ + std::set<cmLinkItem> visitedItems = { rootItem }; + FindAllConnections(connectionMap, rootItem, extendedCons, visitedItems); +} + +template <typename DirFunc> +void cmGraphVizWriter::WritePerTargetConnections( + const ConnectionsMap& connections, const FileStreamMap& streams) +{ + // the per target connections must be extended by indirect dependencies + ConnectionsMap extendedConnections; + for (auto const& conPerTarget : connections) { + const cmLinkItem& rootItem = conPerTarget.first; + Connections& extendedCons = extendedConnections[conPerTarget.first]; + FindAllConnections(connections, rootItem, extendedCons); + } + + for (auto const& conPerTarget : extendedConnections) { + const cmLinkItem& rootItem = conPerTarget.first; + + // some of the nodes are excluded completely and are not written + if (this->ItemExcluded(rootItem)) { + continue; + } + + const Connections& cons = conPerTarget.second; + auto fileStream = streams.at(rootItem.AsStr()).get(); + + for (const Connection& con : cons) { + const cmLinkItem& src = DirFunc::src(con); + const cmLinkItem& dst = DirFunc::dst(con); + this->WriteNode(*fileStream, con.dst); + this->WriteConnection(*fileStream, src, dst, con.scopeType); + } + } } void cmGraphVizWriter::WriteHeader(cmGeneratedFileStream& fs, diff --git a/Source/cmGraphVizWriter.h b/Source/cmGraphVizWriter.h index 578660d..9766068 100644 --- a/Source/cmGraphVizWriter.h +++ b/Source/cmGraphVizWriter.h @@ -7,16 +7,18 @@ #include <map> #include <memory> +#include <set> #include <string> +#include <utility> #include <vector> #include "cmsys/RegularExpression.hxx" #include "cmGeneratedFileStream.h" +#include "cmLinkItem.h" #include "cmLinkItemGraphVisitor.h" #include "cmStateTypes.h" -class cmLinkItem; class cmGlobalGenerator; /** This class implements writing files for graphviz (dot) for graphs @@ -47,6 +49,22 @@ private: using FileStreamMap = std::map<std::string, std::unique_ptr<cmGeneratedFileStream>>; + struct Connection + { + Connection(cmLinkItem s, cmLinkItem d, std::string scope) + : src(std::move(s)) + , dst(std::move(d)) + , scopeType(std::move(scope)) + { + } + + cmLinkItem src; + cmLinkItem dst; + std::string scopeType; + }; + using Connections = std::vector<Connection>; + using ConnectionsMap = std::map<cmLinkItem, Connections>; + void VisitLink(cmLinkItem const& depender, cmLinkItem const& dependee, bool isDirectLink, std::string const& scopeType = ""); @@ -66,6 +84,19 @@ private: cmLinkItem const& dependeeTargetName, std::string const& edgeStyle); + void FindAllConnections(const ConnectionsMap& connectionMap, + const cmLinkItem& rootItem, + Connections& extendedCons, + std::set<cmLinkItem>& visitedItems); + + void FindAllConnections(const ConnectionsMap& connectionMap, + const cmLinkItem& rootItem, + Connections& extendedCons); + + template <typename DirFunc> + void WritePerTargetConnections(const ConnectionsMap& connections, + const FileStreamMap& streams); + bool ItemExcluded(cmLinkItem const& item); bool ItemNameFilteredOut(std::string const& itemName); bool TargetTypeEnabled(cmStateEnums::TargetType targetType) const; @@ -83,6 +114,9 @@ private: FileStreamMap PerTargetFileStreams; FileStreamMap TargetDependersFileStreams; + ConnectionsMap PerTargetConnections; + ConnectionsMap TargetDependersConnections; + std::string GraphName; std::string GraphHeader; std::string GraphNodePrefix; diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 3b3f110..d1ab62b 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -2682,17 +2682,29 @@ void cmLocalGenerator::AddPchDependencies(cmGeneratorTarget* target) this->Makefile->GetSafeDefinition( cmStrCat("CMAKE_", lang, "_FLAGS_", configUpper)); + bool editAndContinueDebugInfo = + langFlags.find("/ZI") != std::string::npos || + langFlags.find("-ZI") != std::string::npos; + + bool enableDebuggingInformation = + langFlags.find("/Zi") != std::string::npos || + langFlags.find("-Zi") != std::string::npos; + // MSVC 2008 is producing both .pdb and .idb files with /Zi. - if ((langFlags.find("/ZI") != std::string::npos || - langFlags.find("-ZI") != std::string::npos) || - (cmSystemTools::VersionCompare(cmSystemTools::OP_LESS, - compilerVersion.c_str(), - "16.0") && - compilerId == "MSVC")) { + bool msvc2008OrLess = + cmSystemTools::VersionCompare( + cmSystemTools::OP_LESS, compilerVersion.c_str(), "16.0") && + compilerId == "MSVC"; + // but not when used via toolset -Tv90 + if (this->Makefile->GetSafeDefinition( + "CMAKE_VS_PLATFORM_TOOLSET") == "v90") { + msvc2008OrLess = false; + } + + if (editAndContinueDebugInfo || msvc2008OrLess) { CopyPchCompilePdb(config, target, *ReuseFrom, reuseTarget, { ".pdb", ".idb" }); - } else if ((langFlags.find("/Zi") != std::string::npos || - langFlags.find("-Zi") != std::string::npos)) { + } else if (enableDebuggingInformation) { CopyPchCompilePdb(config, target, *ReuseFrom, reuseTarget, { ".pdb" }); } @@ -2789,7 +2801,7 @@ void cmLocalGenerator::CopyPchCompilePdb( } file << " break()\n" << " endif()\n"; - file << " else()\n" + file << " elseif(NOT EXISTS \"" << from_file << "\")\n" << " execute_process(COMMAND ${CMAKE_COMMAND}" << " -E sleep 1)\n" << " endif()\n"; @@ -2848,7 +2860,6 @@ inline void RegisterUnitySources(cmGeneratorTarget* target, cmSourceFile* sf, { target->AddSourceFileToUnityBatch(sf->ResolveFullPath()); sf->SetProperty("UNITY_SOURCE_FILE", filename.c_str()); - sf->SetProperty("SKIP_AUTOGEN", "ON"); } inline void IncludeFileInUnitySources(cmGeneratedFileStream& unity_file, diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx index b92548f..32ab9f8 100644 --- a/Source/cmNinjaNormalTargetGenerator.cxx +++ b/Source/cmNinjaNormalTargetGenerator.cxx @@ -733,8 +733,9 @@ void cmNinjaNormalTargetGenerator::WriteDeviceLinkStatement( static_cast<int>(cmSystemTools::CalculateCommandLineLengthLimit()) - globalGen->GetRuleCmdLength(this->LanguageLinkerDeviceRule(config)); - build.RspFile = this->ConvertToNinjaPath(std::string("CMakeFiles/") + - genTarget->GetName() + ".rsp"); + build.RspFile = this->ConvertToNinjaPath( + cmStrCat("CMakeFiles/", genTarget->GetName(), + globalGen->IsMultiConfig() ? cmStrCat('.', config) : "", ".rsp")); // Gather order-only dependencies. this->GetLocalGenerator()->AppendTargetDepends( @@ -1154,8 +1155,9 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement( globalGen->GetRuleCmdLength(linkBuild.Rule); } - linkBuild.RspFile = this->ConvertToNinjaPath(std::string("CMakeFiles/") + - gt->GetName() + ".rsp"); + linkBuild.RspFile = this->ConvertToNinjaPath( + cmStrCat("CMakeFiles/", gt->GetName(), + globalGen->IsMultiConfig() ? cmStrCat('.', config) : "", ".rsp")); // Gather order-only dependencies. this->GetLocalGenerator()->AppendTargetDepends(gt, linkBuild.OrderOnlyDeps, diff --git a/Source/cmNinjaUtilityTargetGenerator.cxx b/Source/cmNinjaUtilityTargetGenerator.cxx index 8d863c3..c964bc1 100644 --- a/Source/cmNinjaUtilityTargetGenerator.cxx +++ b/Source/cmNinjaUtilityTargetGenerator.cxx @@ -100,6 +100,8 @@ void cmNinjaUtilityTargetGenerator::Generate(const std::string& config) if (genTarget->Target->GetType() != cmStateEnums::GLOBAL_TARGET) { lg->AppendTargetOutputs(genTarget, gg->GetByproductsForCleanTarget(), config); + std::copy(util_outputs.begin(), util_outputs.end(), + std::back_inserter(gg->GetByproductsForCleanTarget())); } lg->AppendTargetDepends(genTarget, deps, config, config); diff --git a/Source/cmQtAutoGenInitializer.cxx b/Source/cmQtAutoGenInitializer.cxx index 511a018..bd0d6bf 100644 --- a/Source/cmQtAutoGenInitializer.cxx +++ b/Source/cmQtAutoGenInitializer.cxx @@ -1182,11 +1182,58 @@ bool cmQtAutoGenInitializer::InitAutogenTarget() if (useNinjaDepfile) { // Create a custom command that generates a timestamp file and // has a depfile assigned. The depfile is created by JobDepFilesMergeT. - - // Add additional autogen target dependencies + // + // Also create an additional '_autogen_timestamp_deps' that the custom + // command will depend on. It will have no sources or commands to + // execute, but it will have dependencies that would originally be + // assigned to the pre-Qt 5.15 'autogen' target. These dependencies will + // serve as a list of order-only dependencies for the custom command, + // without forcing the custom command to re-execute. + // + // The dependency tree would then look like + // '_autogen_timestamp_deps (order-only)' <- '/timestamp' file <- + // '_autogen' target. + const auto timestampTargetName = + cmStrCat(this->GenTarget->GetName(), "_autogen_timestamp_deps"); + std::vector<std::string> timestampTargetProvides; + cmCustomCommandLines timestampTargetCommandLines; + + // Add additional autogen target dependencies to + // '_autogen_timestamp_deps'. for (const cmTarget* t : this->AutogenTarget.DependTargets) { dependencies.push_back(t->GetName()); } + + cmTarget* timestampTarget = this->LocalGen->AddUtilityCommand( + timestampTargetName, true, this->Dir.Work.c_str(), + /*byproducts=*/timestampTargetProvides, + /*depends=*/dependencies, timestampTargetCommandLines, false, nullptr); + this->LocalGen->AddGeneratorTarget( + cm::make_unique<cmGeneratorTarget>(timestampTarget, this->LocalGen)); + + // Set FOLDER property on the timestamp target, so it appears in the + // appropriate folder in an IDE or in the file api. + if (!this->TargetsFolder.empty()) { + timestampTarget->SetProperty("FOLDER", this->TargetsFolder); + } + + // Make '/timestamp' file depend on '_autogen_timestamp_deps' and on the + // moc and uic executables (whichever are enabled). + dependencies.clear(); + dependencies.push_back(timestampTargetName); + + if (this->Moc.ExecutableTarget != nullptr) { + dependencies.push_back(this->Moc.ExecutableTarget->Target->GetName()); + } else if (!this->Moc.Executable.empty()) { + dependencies.push_back(this->Moc.Executable); + } + if (this->Uic.ExecutableTarget != nullptr) { + dependencies.push_back(this->Uic.ExecutableTarget->Target->GetName()); + } else if (!this->Uic.Executable.empty()) { + dependencies.push_back(this->Uic.Executable); + } + + // Create the custom command that outputs the timestamp file. const char timestampFileName[] = "timestamp"; const std::string outputFile = cmStrCat(this->Dir.Build, "/", timestampFileName); @@ -1471,6 +1518,7 @@ bool cmQtAutoGenInitializer::SetupWriteAutogenInfo() info.SetConfig("PARSE_CACHE_FILE", this->AutogenTarget.ParseCacheFile); info.Set("DEP_FILE", this->AutogenTarget.DepFile); info.Set("DEP_FILE_RULE_NAME", this->AutogenTarget.DepFileRuleName); + info.SetArray("CMAKE_LIST_FILES", this->Makefile->GetListFiles()); info.SetArray("HEADER_EXTENSIONS", this->Makefile->GetCMakeInstance()->GetHeaderExtensions()); info.SetArrayArray( diff --git a/Source/cmQtAutoMocUic.cxx b/Source/cmQtAutoMocUic.cxx index 9adcabb..9cb172b 100644 --- a/Source/cmQtAutoMocUic.cxx +++ b/Source/cmQtAutoMocUic.cxx @@ -184,6 +184,7 @@ public: std::string DepFile; std::string DepFileRuleName; std::vector<std::string> HeaderExtensions; + std::vector<std::string> ListFiles; }; /** Shared common variables. */ @@ -191,7 +192,7 @@ public: { public: // -- Parse Cache - bool ParseCacheChanged = false; + std::atomic<bool> ParseCacheChanged = ATOMIC_VAR_INIT(false); cmFileTime ParseCacheTime; ParseCacheT ParseCache; @@ -1776,16 +1777,24 @@ bool cmQtAutoMocUicT::JobProbeDepsMocT::Probe(MappingT const& mapping, { // Check dependency timestamps std::string const sourceDir = SubDirPrefix(sourceFile); - for (std::string const& dep : mapping.SourceFile->ParseData->Moc.Depends) { + auto& dependencies = mapping.SourceFile->ParseData->Moc.Depends; + for (auto it = dependencies.begin(); it != dependencies.end(); ++it) { + auto& dep = *it; + // Find dependency file auto const depMatch = FindDependency(sourceDir, dep); if (depMatch.first.empty()) { - Log().Warning(GenT::MOC, - cmStrCat(MessagePath(sourceFile), " depends on ", - MessagePath(dep), - " but the file does not exist.")); - continue; + if (reason != nullptr) { + *reason = + cmStrCat("Generating ", MessagePath(outputFile), " from ", + MessagePath(sourceFile), ", because its dependency ", + MessagePath(dep), " vanished."); + } + dependencies.erase(it); + BaseEval().ParseCacheChanged = true; + return true; } + // Test if dependency file is older if (outputFileTime.Older(depMatch.second)) { if (reason != nullptr) { @@ -2163,7 +2172,9 @@ std::string escapeDependencyPath(cm::string_view path) void cmQtAutoMocUicT::JobDepFilesMergeT::Process() { if (Log().Verbose()) { - Log().Info(GenT::MOC, "Merging MOC dependencies"); + Log().Info(GenT::MOC, + cmStrCat("Merging MOC dependencies into ", + MessagePath(BaseConst().DepFile.c_str()))); } auto processDepFile = [](const std::string& mocOutputFile) -> std::vector<std::string> { @@ -2174,7 +2185,7 @@ void cmQtAutoMocUicT::JobDepFilesMergeT::Process() return dependenciesFromDepFile(f.c_str()); }; - std::vector<std::string> dependencies; + std::vector<std::string> dependencies = BaseConst().ListFiles; ParseCacheT& parseCache = BaseEval().ParseCache; auto processMappingEntry = [&](const MappingMapT::value_type& m) { auto cacheEntry = parseCache.GetOrInsert(m.first); @@ -2255,6 +2266,7 @@ bool cmQtAutoMocUicT::InitFromInfo(InfoT const& info) !info.GetString("DEP_FILE_RULE_NAME", BaseConst_.DepFileRuleName, false) || !info.GetStringConfig("SETTINGS_FILE", SettingsFile_, true) || + !info.GetArray("CMAKE_LIST_FILES", BaseConst_.ListFiles, true) || !info.GetArray("HEADER_EXTENSIONS", BaseConst_.HeaderExtensions, true) || !info.GetString("QT_MOC_EXECUTABLE", MocConst_.Executable, false) || !info.GetString("QT_UIC_EXECUTABLE", UicConst_.Executable, false)) { diff --git a/Source/cmStandardLexer.h b/Source/cmStandardLexer.h index cc67ac2..b248b91 100644 --- a/Source/cmStandardLexer.h +++ b/Source/cmStandardLexer.h @@ -3,7 +3,11 @@ #ifndef cmStandardLexer_h #define cmStandardLexer_h -#if !defined(_WIN32) && !defined(__sun) +#if defined(__linux) +/* Needed for glibc < 2.12 */ +# define _XOPEN_SOURCE 600 +#endif +#if !defined(_POSIX_C_SOURCE) && !defined(_WIN32) && !defined(__sun) /* POSIX APIs are needed */ # define _POSIX_C_SOURCE 200809L #endif diff --git a/Source/cmTestGenerator.cxx b/Source/cmTestGenerator.cxx index e10a8e2..af91177 100644 --- a/Source/cmTestGenerator.cxx +++ b/Source/cmTestGenerator.cxx @@ -77,7 +77,7 @@ void cmTestGenerator::GenerateScriptForConfig(std::ostream& os, cmGeneratorExpression ge(this->Test->GetBacktrace()); // Start the test command. - os << indent << "add_test(\"" << this->Test->GetName() << "\" "; + os << indent << "add_test(" << this->Test->GetName() << " "; // Evaluate command line arguments std::vector<std::string> argv = @@ -127,8 +127,8 @@ void cmTestGenerator::GenerateScriptForConfig(std::ostream& os, os << ")\n"; // Output properties for the test. - os << indent << "set_tests_properties(\"" << this->Test->GetName() - << "\" PROPERTIES "; + os << indent << "set_tests_properties(" << this->Test->GetName() + << " PROPERTIES "; for (auto const& i : this->Test->GetProperties().GetList()) { os << " " << i.first << " " << cmOutputConverter::EscapeForCMake( @@ -140,8 +140,7 @@ void cmTestGenerator::GenerateScriptForConfig(std::ostream& os, void cmTestGenerator::GenerateScriptNoConfig(std::ostream& os, Indent indent) { - os << indent << "add_test(\"" << this->Test->GetName() - << "\" NOT_AVAILABLE)\n"; + os << indent << "add_test(" << this->Test->GetName() << " NOT_AVAILABLE)\n"; } bool cmTestGenerator::NeedsScriptNoConfig() const @@ -161,8 +160,9 @@ void cmTestGenerator::GenerateOldStyle(std::ostream& fout, Indent indent) std::string exe = command[0]; cmSystemTools::ConvertToUnixSlashes(exe); - fout << indent << "add_test(\"" << this->Test->GetName() << "\" \"" << exe - << "\""; + fout << indent; + fout << "add_test("; + fout << this->Test->GetName() << " \"" << exe << "\""; for (std::string const& arg : cmMakeRange(command).advance(1)) { // Just double-quote all arguments so they are re-parsed diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index a3ccd2b..2ea2839 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -2884,6 +2884,12 @@ bool cmVisualStudio10TargetGenerator::ComputeClOptions( clOptions.RemoveFlag("SpectreMitigation"); } + // Remove any target-wide -TC or -TP flag added by the project. + // Such flags are unnecessary and break our model of language selection. + if (langForClCompile == "C" || langForClCompile == "CXX") { + clOptions.RemoveFlag("CompileAs"); + } + this->ClOptions[configName] = std::move(pOptions); return true; } @@ -3012,7 +3018,8 @@ bool cmVisualStudio10TargetGenerator::ComputeCudaOptions() return true; } for (std::string const& c : this->Configurations) { - if (!this->ComputeCudaOptions(c)) { + if (this->GeneratorTarget->IsLanguageUsed("CUDA", c) && + !this->ComputeCudaOptions(c)) { return false; } } @@ -3152,7 +3159,8 @@ bool cmVisualStudio10TargetGenerator::ComputeCudaOptions( void cmVisualStudio10TargetGenerator::WriteCudaOptions( Elem& e1, std::string const& configName) { - if (!this->MSTools || !this->GlobalGenerator->IsCudaEnabled()) { + if (!this->MSTools || !this->GlobalGenerator->IsCudaEnabled() || + !this->GeneratorTarget->IsLanguageUsed("CUDA", configName)) { return; } Elem e2(e1, "CudaCompile"); @@ -4921,6 +4929,7 @@ std::string cmVisualStudio10TargetGenerator::GetCSharpSourceLink( // for this file exists, otherwise we check if the path relative to current // source- or binary-dir is used within the link and return that std::string link; + std::string sourceGroupedFile; std::string const& fullFileName = source->GetFullPath(); std::string const& srcDir = this->Makefile->GetCurrentSourceDirectory(); std::string const& binDir = this->Makefile->GetCurrentBinaryDirectory(); @@ -4930,8 +4939,14 @@ std::string cmVisualStudio10TargetGenerator::GetCSharpSourceLink( cmSourceGroup* sourceGroup = this->Makefile->FindSourceGroup(fullFileName, sourceGroups); if (sourceGroup && !sourceGroup->GetFullName().empty()) { - link = sourceGroup->GetFullName() + "/" + + sourceGroupedFile = sourceGroup->GetFullName() + "/" + cmsys::SystemTools::GetFilenameName(fullFileName); + cmsys::SystemTools::ConvertToUnixSlashes(sourceGroupedFile); + } + + if (!sourceGroupedFile.empty() && + cmHasSuffix(fullFileName, sourceGroupedFile)) { + link = sourceGroupedFile; } else if (cmHasPrefix(fullFileName, srcDir)) { link = fullFileName.substr(srcDir.length() + 1); } else if (cmHasPrefix(fullFileName, binDir)) { diff --git a/Source/cmakemain.cxx b/Source/cmakemain.cxx index d662a9a..7e589c0 100644 --- a/Source/cmakemain.cxx +++ b/Source/cmakemain.cxx @@ -9,12 +9,15 @@ #include <cstring> #include <iostream> #include <string> +#include <utility> #include <vector> +#include <cm/memory> #include <cmext/algorithm> #include <cm3p/uv.h> +#include "cmConsoleBuf.h" #include "cmDocumentationEntry.h" // IWYU pragma: keep #include "cmGlobalGenerator.h" #include "cmMakefile.h" @@ -32,9 +35,6 @@ #endif #include "cmsys/Encoding.hxx" -#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) -# include "cmsys/ConsoleBuf.hxx" -#endif namespace { #ifndef CMAKE_BOOTSTRAP @@ -109,13 +109,14 @@ const char* cmDocumentationOptions[][2] = { #endif -int do_command(int ac, char const* const* av) +int do_command(int ac, char const* const* av, + std::unique_ptr<cmConsoleBuf> consoleBuf) { std::vector<std::string> args; args.reserve(ac - 1); args.emplace_back(av[0]); cm::append(args, av + 2, av + ac); - return cmcmd::ExecuteCMakeCommand(args); + return cmcmd::ExecuteCMakeCommand(args, std::move(consoleBuf)); } cmMakefile* cmakemainGetMakefile(cmake* cm) @@ -687,13 +688,11 @@ int do_open(int ac, char const* const* av) int main(int ac, char const* const* av) { cmSystemTools::EnsureStdPipes(); -#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) + // Replace streambuf so we can output Unicode to console - cmsys::ConsoleBuf::Manager consoleOut(std::cout); - consoleOut.SetUTF8Pipes(); - cmsys::ConsoleBuf::Manager consoleErr(std::cerr, true); - consoleErr.SetUTF8Pipes(); -#endif + auto consoleBuf = cm::make_unique<cmConsoleBuf>(); + consoleBuf->SetUTF8Pipes(); + cmsys::Encoding::CommandLineArguments args = cmsys::Encoding::CommandLineArguments::Main(ac, av); ac = args.argc(); @@ -712,7 +711,7 @@ int main(int ac, char const* const* av) return do_open(ac, av); } if (strcmp(av[1], "-E") == 0) { - return do_command(ac, av); + return do_command(ac, av, std::move(consoleBuf)); } } int ret = do_cmake(ac, av); diff --git a/Source/cmcmd.cxx b/Source/cmcmd.cxx index de76d73..a1fafcb 100644 --- a/Source/cmcmd.cxx +++ b/Source/cmcmd.cxx @@ -7,6 +7,7 @@ #include <cm3p/uv.h> #include <fcntl.h> +#include "cmConsoleBuf.h" #include "cmDuration.h" #include "cmGlobalGenerator.h" #include "cmLocalGenerator.h" @@ -33,10 +34,6 @@ # include "bindexplib.h" #endif -#if !defined(CMAKE_BOOTSTRAP) && defined(_WIN32) -# include "cmsys/ConsoleBuf.hxx" -#endif - #if !defined(CMAKE_BOOTSTRAP) && defined(_WIN32) && !defined(__CYGWIN__) # include "cmVisualStudioWCEPlatformParser.h" #endif @@ -51,6 +48,12 @@ #include <sstream> #include <utility> +#ifdef _WIN32 +# include <fcntl.h> // for _O_BINARY +# include <io.h> // for _setmode +# include <stdio.h> // for std{out,err} and fileno +#endif + #include <cm/string_view> #include "cmsys/Directory.hxx" @@ -181,6 +184,9 @@ static bool cmTarFilesFrom(std::string const& file, static void cmCatFile(const std::string& fileToAppend) { +#ifdef _WIN32 + _setmode(fileno(stdout), _O_BINARY); +#endif cmsys::ifstream source(fileToAppend.c_str(), (std::ios::binary | std::ios::in)); std::cout << source.rdbuf(); @@ -500,7 +506,8 @@ int cmcmd::HandleCoCompileCommands(std::vector<std::string> const& args) return ret; } -int cmcmd::ExecuteCMakeCommand(std::vector<std::string> const& args) +int cmcmd::ExecuteCMakeCommand(std::vector<std::string> const& args, + std::unique_ptr<cmConsoleBuf> consoleBuf) { // IF YOU ADD A NEW COMMAND, DOCUMENT IT ABOVE and in cmakemain.cxx if (args.size() > 1) { @@ -954,6 +961,8 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string> const& args) cmSystemTools::Error(arg + ": no such file or directory (ignoring)"); return_value = 1; } else { + // Destroy console buffers to drop cout/cerr encoding transform. + consoleBuf.reset(); cmCatFile(arg); } } @@ -1863,14 +1872,11 @@ private: // still works. int cmcmd::VisualStudioLink(std::vector<std::string> const& args, int type) { -#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) // Replace streambuf so we output in the system codepage. CMake is set up // to output in Unicode (see SetUTF8Pipes) but the Visual Studio linker // outputs using the system codepage so we need to change behavior when // we run the link command. - cmsys::ConsoleBuf::Manager consoleOut(std::cout); - cmsys::ConsoleBuf::Manager consoleErr(std::cerr, true); -#endif + cmConsoleBuf consoleBuf; if (args.size() < 2) { return -1; diff --git a/Source/cmcmd.h b/Source/cmcmd.h index 5b6c813..ffadd5a 100644 --- a/Source/cmcmd.h +++ b/Source/cmcmd.h @@ -5,11 +5,14 @@ #include "cmConfigure.h" // IWYU pragma: keep +#include <memory> #include <string> #include <vector> #include "cmCryptoHash.h" +class cmConsoleBuf; + class cmcmd { public: @@ -17,7 +20,8 @@ public: * Execute commands during the build process. Supports options such * as echo, remove file etc. */ - static int ExecuteCMakeCommand(std::vector<std::string> const&); + static int ExecuteCMakeCommand(std::vector<std::string> const&, + std::unique_ptr<cmConsoleBuf> consoleBuf); protected: static int HandleCoCompileCommands(std::vector<std::string> const& args); diff --git a/Source/ctest.cxx b/Source/ctest.cxx index 3b5bf8c..d0bc061 100644 --- a/Source/ctest.cxx +++ b/Source/ctest.cxx @@ -1,21 +1,20 @@ /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ +#include <cstring> +#include <iostream> +#include <string> +#include <vector> + #include "cmsys/Encoding.hxx" #include "cmCTest.h" +#include "cmConsoleBuf.h" #include "cmDocumentation.h" #include "cmSystemTools.h" #include "CTest/cmCTestLaunch.h" #include "CTest/cmCTestScriptHandler.h" -#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) -# include "cmsys/ConsoleBuf.hxx" -#endif -#include <cstring> -#include <iostream> -#include <string> -#include <vector> static const char* cmDocumentationName[][2] = { { nullptr, " ctest - Testing driver provided by CMake." }, @@ -154,13 +153,11 @@ static const char* cmDocumentationOptions[][2] = { int main(int argc, char const* const* argv) { cmSystemTools::EnsureStdPipes(); -#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) + // Replace streambuf so we can output Unicode to console - cmsys::ConsoleBuf::Manager consoleOut(std::cout); - consoleOut.SetUTF8Pipes(); - cmsys::ConsoleBuf::Manager consoleErr(std::cerr, true); - consoleErr.SetUTF8Pipes(); -#endif + cmConsoleBuf consoleBuf; + consoleBuf.SetUTF8Pipes(); + cmsys::Encoding::CommandLineArguments encoding_args = cmsys::Encoding::CommandLineArguments::Main(argc, argv); argc = encoding_args.argc(); diff --git a/Templates/MSBuild/FlagTables/v142_CL.json b/Templates/MSBuild/FlagTables/v142_CL.json index 95b9d14..7c2d291 100644 --- a/Templates/MSBuild/FlagTables/v142_CL.json +++ b/Templates/MSBuild/FlagTables/v142_CL.json @@ -455,6 +455,20 @@ "flags": [] }, { + "name": "LanguageStandard_C", + "switch": "std:c11", + "comment": "ISO C11 Standard", + "value": "stdc11", + "flags": [] + }, + { + "name": "LanguageStandard_C", + "switch": "std:c17", + "comment": "ISO C17 (2018) Standard", + "value": "stdc17", + "flags": [] + }, + { "name": "PrecompiledHeader", "switch": "Yc", "comment": "Create", diff --git a/Tests/FindPython/FindPythonScript.cmake b/Tests/FindPython/FindPythonScript.cmake index bc7e0d1..808496e 100644 --- a/Tests/FindPython/FindPythonScript.cmake +++ b/Tests/FindPython/FindPythonScript.cmake @@ -1,4 +1,4 @@ - +cmake_minimum_required(VERSION 3.12) if (PYTHON_MUST_NOT_BE_FOUND) find_package(${PYTHON_PACKAGE_NAME} QUIET) if (${PYTHON_PACKAGE_NAME}_FOUND) diff --git a/Tests/FindPython/SOABI/CMakeLists.txt b/Tests/FindPython/SOABI/CMakeLists.txt index 4a6aea3..36daa9f 100644 --- a/Tests/FindPython/SOABI/CMakeLists.txt +++ b/Tests/FindPython/SOABI/CMakeLists.txt @@ -20,3 +20,19 @@ if (Python3_Development_FOUND AND Python3_SOABI) message(FATAL_ERROR "Module suffix do not include Python3_SOABI") endif() endif() + + +find_package(Python2 COMPONENTS ${CMake_TEST_FindPython_COMPONENT}) +if(NOT DEFINED Python2_SOABI) + message(FATAL_ERROR "Python2_SOABI for ${CMake_TEST_FindPython_COMPONENT} not found") +endif() + +if (Python2_Development_FOUND AND Python2_SOABI) + Python2_add_library (spam2 MODULE WITH_SOABI ../spam.c) + target_compile_definitions (spam2 PRIVATE PYTHON2) + + get_property (suffix TARGET spam2 PROPERTY SUFFIX) + if (NOT suffix MATCHES "^.${Python2_SOABI}") + message(FATAL_ERROR "Module suffix do not include Python2_SOABI") + endif() +endif() diff --git a/Tests/ObjCXX/CMakeLists.txt b/Tests/ObjCXX/CMakeLists.txt index a2a907a..cf03771 100644 --- a/Tests/ObjCXX/CMakeLists.txt +++ b/Tests/ObjCXX/CMakeLists.txt @@ -2,3 +2,4 @@ ADD_TEST_MACRO(ObjCXX.ObjC++ ObjC++) ADD_TEST_MACRO(ObjCXX.simple-build-test simple-build-test) ADD_TEST_MACRO(ObjCXX.cxx-file-extension-test cxx-file-extension-test) ADD_TEST_MACRO(ObjCXX.objcxx-file-extension-test objcxx-file-extension-test) +ADD_TEST_MACRO(ObjCXX.cxx-as-objcxx cxx-as-objcxx) diff --git a/Tests/ObjCXX/cxx-as-objcxx/CMakeLists.txt b/Tests/ObjCXX/cxx-as-objcxx/CMakeLists.txt new file mode 100644 index 0000000..23f6891 --- /dev/null +++ b/Tests/ObjCXX/cxx-as-objcxx/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 3.18) +project(cxx-as-objcxx LANGUAGES OBJCXX) + +add_executable(cxx-as-objcxx main.cpp) +set_source_files_properties(main.cpp PROPERTIES LANGUAGE OBJCXX) diff --git a/Tests/ObjCXX/cxx-as-objcxx/main.cpp b/Tests/ObjCXX/cxx-as-objcxx/main.cpp new file mode 100644 index 0000000..701c567 --- /dev/null +++ b/Tests/ObjCXX/cxx-as-objcxx/main.cpp @@ -0,0 +1,6 @@ +#import <Foundation/Foundation.h> + +int main(int argc, char* argv[]) +{ + return 0; +} diff --git a/Tests/QtAutogen/MocIncludeSymlink/CMakeLists.txt b/Tests/QtAutogen/MocIncludeSymlink/CMakeLists.txt index 1627b39..8b11b46 100644 --- a/Tests/QtAutogen/MocIncludeSymlink/CMakeLists.txt +++ b/Tests/QtAutogen/MocIncludeSymlink/CMakeLists.txt @@ -61,6 +61,7 @@ macro(buildMocInclude sourceDir binaryDir) "${sourceDir}" MocInclude CMAKE_FLAGS "-DQT_TEST_VERSION=${QT_TEST_VERSION}" + "-DCMAKE_AUTOMOC_PATH_PREFIX=ON" "-DCMAKE_AUTOGEN_VERBOSE=${CMAKE_AUTOGEN_VERBOSE}" "-DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}" OUTPUT_VARIABLE output diff --git a/Tests/QtAutogen/RerunMocOnAddFile/CMakeLists.txt b/Tests/QtAutogen/RerunMocOnAddFile/CMakeLists.txt new file mode 100644 index 0000000..2677659 --- /dev/null +++ b/Tests/QtAutogen/RerunMocOnAddFile/CMakeLists.txt @@ -0,0 +1,96 @@ +# This test checks whether adding a source file to the project triggers an AUTOMOC re-run. + +cmake_minimum_required(VERSION 3.10) +project(RerunMocOnAddFile) +include("../AutogenCoreTest.cmake") + +# Create an executable to generate a clean target +set(main_source "${CMAKE_CURRENT_BINARY_DIR}/generated_main.cpp") +file(WRITE "${main_source}" "int main() {}") +add_executable(exe "${main_source}") + +# Utility variables +set(timeformat "%Y.%j.%H.%M%S") +set(testProjectTemplateDir "${CMAKE_CURRENT_SOURCE_DIR}/MocOnAddFile") +set(testProjectSrc "${CMAKE_CURRENT_BINARY_DIR}/MocOnAddFile") +set(testProjectBinDir "${CMAKE_CURRENT_BINARY_DIR}/MocOnAddFile-build") + +# Utility macros +macro(sleep) + message(STATUS "Sleeping for a few seconds.") + execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1) +endmacro() + +macro(acquire_timestamp When) + file(TIMESTAMP "${mocBasicBin}" time${When} "${timeformat}") +endmacro() + +macro(rebuild buildName) + message(STATUS "Starting build ${buildName}.") + execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${testProjectBinDir}" RESULT_VARIABLE result) + if (result) + message(FATAL_ERROR "Build ${buildName} failed.") + else() + message(STATUS "Build ${buildName} finished.") + endif() +endmacro() + +macro(require_change) + if (timeAfter VERSION_GREATER timeBefore) + message(STATUS "As expected the file ${mocBasicBin} changed.") + else() + message(SEND_ERROR "Unexpectedly the file ${mocBasicBin} did not change!\nTimestamp pre: ${timeBefore}\nTimestamp aft: ${timeAfter}\n") + endif() +endmacro() + +macro(require_change_not) + if (timeAfter VERSION_GREATER timeBefore) + message(SEND_ERROR "Unexpectedly the file ${mocBasicBin} changed!\nTimestamp pre: ${timeBefore}\nTimestamp aft: ${timeAfter}\n") + else() + message(STATUS "As expected the file ${mocBasicBin} did not change.") + endif() +endmacro() + +# Create the test project from the template +unset(additional_project_sources) +unset(main_cpp_includes) +configure_file("${testProjectTemplateDir}/CMakeLists.txt.in" "${testProjectSrc}/CMakeLists.txt") +configure_file("${testProjectTemplateDir}/main.cpp.in" "${testProjectSrc}/main.cpp") + +# Initial build +try_compile(MOC_RERUN + "${testProjectBinDir}" + "${testProjectSrc}" + MocOnAddFile + CMAKE_FLAGS "-DQT_TEST_VERSION=${QT_TEST_VERSION}" + "-DCMAKE_AUTOGEN_VERBOSE=${CMAKE_AUTOGEN_VERBOSE}" + "-DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}" + OUTPUT_VARIABLE output +) +if (NOT MOC_RERUN) + message(FATAL_ERROR "Initial build of mocOnAddFile failed. Output: ${output}") +endif() + +# Sleep to ensure new timestamps +sleep() + +# Add a QObject class (defined in header) to the project and build +set(additional_project_sources myobject.cpp) +set(main_cpp_includes "#include \"myobject.h\"") +configure_file("${testProjectTemplateDir}/CMakeLists.txt.in" "${testProjectSrc}/CMakeLists.txt" + @ONLY) +configure_file("${testProjectTemplateDir}/main.cpp.in" "${testProjectSrc}/main.cpp" @ONLY) +configure_file("${testProjectTemplateDir}/myobject.h" "${testProjectSrc}/myobject.h" COPYONLY) +configure_file("${testProjectTemplateDir}/myobject.cpp" "${testProjectSrc}/myobject.cpp" COPYONLY) +rebuild(2) + +# Sleep to ensure new timestamps +sleep() + +# Add a QObject class (defined in source) to the project and build +set(additional_project_sources myobject.cpp anotherobject.cpp) +configure_file("${testProjectTemplateDir}/CMakeLists.txt.in" "${testProjectSrc}/CMakeLists.txt" + @ONLY) +configure_file("${testProjectTemplateDir}/anotherobject.cpp" "${testProjectSrc}/anotherobject.cpp" + COPYONLY) +rebuild(3) diff --git a/Tests/QtAutogen/RerunMocOnAddFile/MocOnAddFile/CMakeLists.txt.in b/Tests/QtAutogen/RerunMocOnAddFile/MocOnAddFile/CMakeLists.txt.in new file mode 100644 index 0000000..9e5e21c --- /dev/null +++ b/Tests/QtAutogen/RerunMocOnAddFile/MocOnAddFile/CMakeLists.txt.in @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 3.10) +project(MocOnAddFile) +include("@CMAKE_CURRENT_LIST_DIR@/../AutogenCoreTest.cmake") + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +add_executable(mocOnAddFile main.cpp @additional_project_sources@) +target_link_libraries(mocOnAddFile ${QT_QTCORE_TARGET}) diff --git a/Tests/QtAutogen/RerunMocOnAddFile/MocOnAddFile/anotherobject.cpp b/Tests/QtAutogen/RerunMocOnAddFile/MocOnAddFile/anotherobject.cpp new file mode 100644 index 0000000..45c5af6 --- /dev/null +++ b/Tests/QtAutogen/RerunMocOnAddFile/MocOnAddFile/anotherobject.cpp @@ -0,0 +1,15 @@ +#include <qobject.h> + +class AnotherObject : public QObject +{ + Q_OBJECT +public: + AnotherObject() {} +}; + +AnotherObject* createAnotherObject() +{ + return new AnotherObject(); +} + +#include "anotherobject.moc" diff --git a/Tests/QtAutogen/RerunMocOnAddFile/MocOnAddFile/main.cpp.in b/Tests/QtAutogen/RerunMocOnAddFile/MocOnAddFile/main.cpp.in new file mode 100644 index 0000000..f62027a --- /dev/null +++ b/Tests/QtAutogen/RerunMocOnAddFile/MocOnAddFile/main.cpp.in @@ -0,0 +1,6 @@ +@main_cpp_includes@ + +int main(int argc, char *argv[]) +{ + return 0; +} diff --git a/Tests/QtAutogen/RerunMocOnAddFile/MocOnAddFile/myobject.cpp b/Tests/QtAutogen/RerunMocOnAddFile/MocOnAddFile/myobject.cpp new file mode 100644 index 0000000..7a15300 --- /dev/null +++ b/Tests/QtAutogen/RerunMocOnAddFile/MocOnAddFile/myobject.cpp @@ -0,0 +1,6 @@ +#include "myobject.h" + +MyObject::MyObject(QObject* parent) + : QObject(parent) +{ +} diff --git a/Tests/QtAutogen/RerunMocOnAddFile/MocOnAddFile/myobject.h b/Tests/QtAutogen/RerunMocOnAddFile/MocOnAddFile/myobject.h new file mode 100644 index 0000000..e373ee8 --- /dev/null +++ b/Tests/QtAutogen/RerunMocOnAddFile/MocOnAddFile/myobject.h @@ -0,0 +1,13 @@ +#ifndef MYOBJECT_H +#define MYOBJECT_H + +#include <qobject.h> + +class MyObject : public QObject +{ + Q_OBJECT +public: + MyObject(QObject* parent = 0); +}; + +#endif diff --git a/Tests/QtAutogen/RerunMocOnMissingDependency/CMakeLists.txt b/Tests/QtAutogen/RerunMocOnMissingDependency/CMakeLists.txt new file mode 100644 index 0000000..c5811eb --- /dev/null +++ b/Tests/QtAutogen/RerunMocOnMissingDependency/CMakeLists.txt @@ -0,0 +1,80 @@ +# This test checks whether a missing dependency of the moc output triggers an AUTOMOC re-run. + +cmake_minimum_required(VERSION 3.10) +project(RerunMocOnMissingDependency) +include("../AutogenCoreTest.cmake") + +# Create an executable to generate a clean target +set(main_source "${CMAKE_CURRENT_BINARY_DIR}/generated_main.cpp") +file(WRITE "${main_source}" "int main() {}") +add_executable(exe "${main_source}") + +# Utility variables +set(testProjectTemplateDir "${CMAKE_CURRENT_SOURCE_DIR}/MocOnMissingDependency") +set(testProjectSrc "${CMAKE_CURRENT_BINARY_DIR}/MocOnMissingDependency") +set(testProjectBinDir "${CMAKE_CURRENT_BINARY_DIR}/MocOnMissingDependency-build") +if(DEFINED Qt5Core_VERSION AND Qt5Core_VERSION VERSION_GREATER_EQUAL "5.15.0") + set(moc_depfiles_supported TRUE) +else() + set(moc_depfiles_supported FALSE) +endif() + +# Utility macros +macro(sleep) + message(STATUS "Sleeping for a few seconds.") + execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1) +endmacro() + +macro(rebuild buildName) + message(STATUS "Starting build ${buildName}.") + execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${testProjectBinDir}" + RESULT_VARIABLE result OUTPUT_VARIABLE output) + if (result) + message(FATAL_ERROR "Build ${buildName} failed.") + else() + message(STATUS "Build ${buildName} finished.") + endif() +endmacro() + +# Create the test project from the template +file(COPY "${testProjectTemplateDir}" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") +configure_file("${testProjectTemplateDir}/CMakeLists.txt.in" "${testProjectSrc}/CMakeLists.txt" @ONLY) + +# Initial build +file(REMOVE_RECURSE "${testProjectBinDir}") +try_compile(MOC_RERUN + "${testProjectBinDir}" + "${testProjectSrc}" + MocOnMissingDependency + CMAKE_FLAGS "-DQT_TEST_VERSION=${QT_TEST_VERSION}" + "-DCMAKE_AUTOGEN_VERBOSE=ON" + "-DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}" + OUTPUT_VARIABLE output +) +if (NOT MOC_RERUN) + message(FATAL_ERROR "Initial build of mocOnMissingDependency failed. Output: ${output}") +endif() + +# Sleep to ensure new timestamps +sleep() + +if(moc_depfiles_supported) + # Remove the dependency inc1/foo.h and build again. + # We expect that the moc_XXX.cpp file gets re-generated. But only if we have depfile support. + file(REMOVE_RECURSE "${testProjectSrc}/inc1") + rebuild(2) + if(NOT output MATCHES "AutoMoc: Generating \"[^\"]*moc_myobject.cpp\"") + message(FATAL_ERROR "moc_myobject.cpp was not re-generated " + "after removing one of its dependencies") + endif() +endif() + +# Sleep to ensure new timestamps +sleep() + +# The next build should *not* re-renerate any moc outputs +rebuild(3) +if(output MATCHES "AutoMoc: Generating") + message(FATAL_ERROR "moc_myobject.cpp was not re-generated " + "after removing one of its dependencies") +endif() diff --git a/Tests/QtAutogen/RerunMocOnMissingDependency/MocOnMissingDependency/CMakeLists.txt.in b/Tests/QtAutogen/RerunMocOnMissingDependency/MocOnMissingDependency/CMakeLists.txt.in new file mode 100644 index 0000000..2155f45 --- /dev/null +++ b/Tests/QtAutogen/RerunMocOnMissingDependency/MocOnMissingDependency/CMakeLists.txt.in @@ -0,0 +1,7 @@ +cmake_minimum_required(VERSION 3.18) +project(MocOnMissingDependency) +include("@CMAKE_CURRENT_LIST_DIR@/../AutogenCoreTest.cmake") +set(CMAKE_AUTOMOC ON) +add_executable(MocOnMissingDependency main.cpp myobject.cpp) +target_include_directories(MocOnMissingDependency PRIVATE inc1 inc2) +target_link_libraries(MocOnMissingDependency PRIVATE ${QT_QTCORE_TARGET}) diff --git a/Tests/QtAutogen/RerunMocOnMissingDependency/MocOnMissingDependency/inc1/foo.h b/Tests/QtAutogen/RerunMocOnMissingDependency/MocOnMissingDependency/inc1/foo.h new file mode 100644 index 0000000..cd8b2f9 --- /dev/null +++ b/Tests/QtAutogen/RerunMocOnMissingDependency/MocOnMissingDependency/inc1/foo.h @@ -0,0 +1,2 @@ + +#include <qobject.h> diff --git a/Tests/QtAutogen/RerunMocOnMissingDependency/MocOnMissingDependency/inc2/foo.h b/Tests/QtAutogen/RerunMocOnMissingDependency/MocOnMissingDependency/inc2/foo.h new file mode 100644 index 0000000..cd8b2f9 --- /dev/null +++ b/Tests/QtAutogen/RerunMocOnMissingDependency/MocOnMissingDependency/inc2/foo.h @@ -0,0 +1,2 @@ + +#include <qobject.h> diff --git a/Tests/QtAutogen/RerunMocOnMissingDependency/MocOnMissingDependency/main.cpp b/Tests/QtAutogen/RerunMocOnMissingDependency/MocOnMissingDependency/main.cpp new file mode 100644 index 0000000..36d51fa --- /dev/null +++ b/Tests/QtAutogen/RerunMocOnMissingDependency/MocOnMissingDependency/main.cpp @@ -0,0 +1,9 @@ +#include <iostream> + +#include "myobject.h" + +int main(int argc, char* argv[]) +{ + MyObject obj; + return 0; +} diff --git a/Tests/QtAutogen/RerunMocOnMissingDependency/MocOnMissingDependency/myobject.cpp b/Tests/QtAutogen/RerunMocOnMissingDependency/MocOnMissingDependency/myobject.cpp new file mode 100644 index 0000000..7a15300 --- /dev/null +++ b/Tests/QtAutogen/RerunMocOnMissingDependency/MocOnMissingDependency/myobject.cpp @@ -0,0 +1,6 @@ +#include "myobject.h" + +MyObject::MyObject(QObject* parent) + : QObject(parent) +{ +} diff --git a/Tests/QtAutogen/RerunMocOnMissingDependency/MocOnMissingDependency/myobject.h b/Tests/QtAutogen/RerunMocOnMissingDependency/MocOnMissingDependency/myobject.h new file mode 100644 index 0000000..25176cc --- /dev/null +++ b/Tests/QtAutogen/RerunMocOnMissingDependency/MocOnMissingDependency/myobject.h @@ -0,0 +1,10 @@ +#pragma once + +#include <foo.h> + +class MyObject : public QObject +{ + Q_OBJECT +public: + MyObject(QObject* parent = 0); +}; diff --git a/Tests/QtAutogen/Tests.cmake b/Tests/QtAutogen/Tests.cmake index a19a9ae..b1337d6 100644 --- a/Tests/QtAutogen/Tests.cmake +++ b/Tests/QtAutogen/Tests.cmake @@ -20,6 +20,8 @@ ADD_AUTOGEN_TEST(RccOffMocLibrary) ADD_AUTOGEN_TEST(RccOnly rccOnly) ADD_AUTOGEN_TEST(RccSkipSource) ADD_AUTOGEN_TEST(RerunMocBasic) +ADD_AUTOGEN_TEST(RerunMocOnAddFile) +ADD_AUTOGEN_TEST(RerunMocOnMissingDependency) ADD_AUTOGEN_TEST(RerunRccConfigChange) ADD_AUTOGEN_TEST(RerunRccDepends) ADD_AUTOGEN_TEST(SameName sameName) @@ -29,6 +31,7 @@ ADD_AUTOGEN_TEST(UicInterface QtAutoUicInterface) ADD_AUTOGEN_TEST(UicNoGui uicNoGui) ADD_AUTOGEN_TEST(UicOnly uicOnly) ADD_AUTOGEN_TEST(UicSkipSource) +ADD_AUTOGEN_TEST(UnityMocSource) if(QT_TEST_ALLOW_QT_MACROS) ADD_AUTOGEN_TEST(MocCMP0071) diff --git a/Tests/QtAutogen/UnityMocSource/CMakeLists.txt b/Tests/QtAutogen/UnityMocSource/CMakeLists.txt new file mode 100644 index 0000000..d472319 --- /dev/null +++ b/Tests/QtAutogen/UnityMocSource/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.16) +project(UnityMocSource) +include("../AutogenGuiTest.cmake") + +set(CMAKE_AUTOMOC ON) +set(CMAKE_UNITY_BUILD ON) + +add_library(library library.cpp) +target_link_libraries(library ${QT_LIBRARIES}) + +add_executable(unityMocSource main.cpp) +target_link_libraries(unityMocSource PRIVATE library) diff --git a/Tests/QtAutogen/UnityMocSource/library.cpp b/Tests/QtAutogen/UnityMocSource/library.cpp new file mode 100644 index 0000000..1e30d4b --- /dev/null +++ b/Tests/QtAutogen/UnityMocSource/library.cpp @@ -0,0 +1,6 @@ +#include <QObject> +class Test : public QObject +{ + Q_OBJECT +}; +#include "library.moc" diff --git a/Tests/QtAutogen/UnityMocSource/main.cpp b/Tests/QtAutogen/UnityMocSource/main.cpp new file mode 100644 index 0000000..f8b643a --- /dev/null +++ b/Tests/QtAutogen/UnityMocSource/main.cpp @@ -0,0 +1,4 @@ +int main() +{ + return 0; +} diff --git a/Tests/RunCMake/AndroidTestUtilities/check.cmake b/Tests/RunCMake/AndroidTestUtilities/check.cmake index c24a3cd..ccd4d74 100644 --- a/Tests/RunCMake/AndroidTestUtilities/check.cmake +++ b/Tests/RunCMake/AndroidTestUtilities/check.cmake @@ -13,7 +13,7 @@ function(compare_build_to_expected) endfunction() function(check_for_setup_test) - file(STRINGS "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" output_var REGEX "add_test\\(\"setup_test\".*") + file(STRINGS "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" output_var REGEX "add_test\\(setup_test.*") if(NOT output_var) set(RunCMake_TEST_FAILED "Could not find the test: setup_test" PARENT_SCOPE) endif() diff --git a/Tests/RunCMake/CMP0104/CMP0104-Common.cmake b/Tests/RunCMake/CMP0104/CMP0104-Common.cmake index b3568f1..ca4c1aa2 100644 --- a/Tests/RunCMake/CMP0104/CMP0104-Common.cmake +++ b/Tests/RunCMake/CMP0104/CMP0104-Common.cmake @@ -1,2 +1,6 @@ +# Make sure CMP0104 isn't issued for CXX targets created prior to enabling CUDA. See #21341. +enable_language(CXX) +add_library(cxx main.cxx) + enable_language(CUDA) add_library(cuda main.cu) diff --git a/Tests/RunCMake/CMP0104/main.cxx b/Tests/RunCMake/CMP0104/main.cxx new file mode 100644 index 0000000..5047a34 --- /dev/null +++ b/Tests/RunCMake/CMP0104/main.cxx @@ -0,0 +1,3 @@ +int main() +{ +} diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index 2a39e73..20be71e 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -142,12 +142,15 @@ if(CMAKE_GENERATOR MATCHES "Ninja") if(CMAKE_Fortran_COMPILER) list(APPEND Ninja_ARGS -DTEST_Fortran=1) endif() + if(CMake_TEST_Qt5 AND Qt5Core_FOUND) + list(APPEND Ninja_ARGS -DCMake_TEST_Qt5=1 -DQt5Core_DIR=${Qt5Core_DIR} -DCMAKE_TEST_Qt5Core_Version=${Qt5Core_VERSION}) + endif() add_RunCMake_test(Ninja) set(NinjaMultiConfig_ARGS -DCYGWIN=${CYGWIN} ) if(CMake_TEST_Qt5 AND Qt5Core_FOUND) - list(APPEND NinjaMultiConfig_ARGS -DCMake_TEST_Qt5=1) + list(APPEND NinjaMultiConfig_ARGS -DCMake_TEST_Qt5=1 -DQt5Core_DIR=${Qt5Core_DIR} -DCMAKE_TEST_Qt5Core_Version=${Qt5Core_VERSION}) endif() if(DEFINED CMake_TEST_CUDA) list(APPEND NinjaMultiConfig_ARGS -DCMake_TEST_CUDA=${CMake_TEST_CUDA}) @@ -288,7 +291,6 @@ add_RunCMake_test(add_dependencies) add_RunCMake_test(add_executable) add_RunCMake_test(add_library) add_RunCMake_test(add_subdirectory) -add_RunCMake_test(add_test) add_RunCMake_test(build_command) add_executable(exit_code exit_code.c) set(execute_process_ARGS -DEXIT_CODE_EXE=$<TARGET_FILE:exit_code>) @@ -362,6 +364,15 @@ function(add_RunCMake_test_try_compile) unset(CMAKE_CXX_STANDARD_DEFAULT) endif() endif() + if(CMAKE_VERSION VERSION_LESS 3.18.20200813 AND "x${CMAKE_C_COMPILER_ID}" STREQUAL "xMSVC") + # Older CMake versions do not know about MSVC language standards. + # Approximate our logic from MSVC-C.cmake. + if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 19.27) + set(CMAKE_C_STANDARD_DEFAULT 99) + else() + set(CMAKE_C_STANDARD_DEFAULT "") + endif() + endif() foreach(var CMAKE_SYSTEM_NAME CMAKE_C_COMPILER_ID diff --git a/Tests/RunCMake/CommandLine/.gitattributes b/Tests/RunCMake/CommandLine/.gitattributes new file mode 100644 index 0000000..b0b0588 --- /dev/null +++ b/Tests/RunCMake/CommandLine/.gitattributes @@ -0,0 +1,2 @@ +E_cat_binary_files/binary.obj -text +E_cat_good_binary_cat-stdout.txt -text -whitespace diff --git a/Tests/RunCMake/CommandLine/E_cat_binary_files/binary.obj b/Tests/RunCMake/CommandLine/E_cat_binary_files/binary.obj Binary files differnew file mode 100644 index 0000000..73f1749 --- /dev/null +++ b/Tests/RunCMake/CommandLine/E_cat_binary_files/binary.obj diff --git a/Tests/RunCMake/CommandLine/E_cat_good_binary_cat-stdout.txt b/Tests/RunCMake/CommandLine/E_cat_good_binary_cat-stdout.txt Binary files differnew file mode 100644 index 0000000..0951d85 --- /dev/null +++ b/Tests/RunCMake/CommandLine/E_cat_good_binary_cat-stdout.txt diff --git a/Tests/RunCMake/CommandLine/RunCMakeTest.cmake b/Tests/RunCMake/CommandLine/RunCMakeTest.cmake index 973391d..abb9050 100644 --- a/Tests/RunCMake/CommandLine/RunCMakeTest.cmake +++ b/Tests/RunCMake/CommandLine/RunCMakeTest.cmake @@ -498,6 +498,9 @@ run_cmake_command(E_cat_good_cat ${CMAKE_COMMAND} -E cat "${out}/first_file.txt" "${out}/second_file.txt" "${out}/unicode_file.txt") unset(out) +run_cmake_command(E_cat_good_binary_cat + ${CMAKE_COMMAND} -E cat "${RunCMake_SOURCE_DIR}/E_cat_binary_files/binary.obj" "${RunCMake_SOURCE_DIR}/E_cat_binary_files/binary.obj") + run_cmake_command(E_env-no-command0 ${CMAKE_COMMAND} -E env) run_cmake_command(E_env-no-command1 ${CMAKE_COMMAND} -E env TEST_ENV=1) run_cmake_command(E_env-bad-arg1 ${CMAKE_COMMAND} -E env -bad-arg1) diff --git a/Tests/RunCMake/CrosscompilingEmulator/AddTest-check.cmake b/Tests/RunCMake/CrosscompilingEmulator/AddTest-check.cmake index 3cbbc07..588b77b 100644 --- a/Tests/RunCMake/CrosscompilingEmulator/AddTest-check.cmake +++ b/Tests/RunCMake/CrosscompilingEmulator/AddTest-check.cmake @@ -7,22 +7,22 @@ endif() set(error_details "There is a problem with generated test file: ${testfile}") -if(testfile_contents MATCHES "add_test[(][\"]DoesNotUseEmulator[\"] [^\n]+pseudo_emulator[^\n]+\n") +if(testfile_contents MATCHES "add_test[(]DoesNotUseEmulator [^\n]+pseudo_emulator[^\n]+\n") message(SEND_ERROR "Used emulator when it should not be used. ${error_details}") endif() -if(NOT testfile_contents MATCHES "add_test[(][\"]UsesEmulator[\"] [^\n]+pseudo_emulator[^\n]+\n") +if(NOT testfile_contents MATCHES "add_test[(]UsesEmulator [^\n]+pseudo_emulator[^\n]+\n") message(SEND_ERROR "Did not use emulator when it should be used. ${error_details}") endif() -if(testfile_contents MATCHES "add_test[(][\"]DoesNotUseEmulatorWithGenex[\"] [^\n]+pseudo_emulator[^\n]+\n") +if(testfile_contents MATCHES "add_test[(]DoesNotUseEmulatorWithGenex [^\n]+pseudo_emulator[^\n]+\n") message(SEND_ERROR "Used emulator when it should not be used. ${error_details}") endif() -if(NOT testfile_contents MATCHES "add_test[(][\"]UsesEmulatorWithExecTargetFromSubdirAddedWithoutGenex[\"] [^\n]+pseudo_emulator[^\n]+\n") +if(NOT testfile_contents MATCHES "add_test[(]UsesEmulatorWithExecTargetFromSubdirAddedWithoutGenex [^\n]+pseudo_emulator[^\n]+\n") message(SEND_ERROR "Did not use emulator when it should be used. ${error_details}") endif() -if(testfile_contents MATCHES "add_test[(][\"]DoesNotUseEmulatorWithExecTargetFromSubdirAddedWithGenex[\"] [^\n]+pseudo_emulator[^\n]+\n") +if(testfile_contents MATCHES "add_test[(]DoesNotUseEmulatorWithExecTargetFromSubdirAddedWithGenex [^\n]+pseudo_emulator[^\n]+\n") message(SEND_ERROR "Used emulator when it should not be used. ${error_details}") endif() diff --git a/Tests/RunCMake/FindPkgConfig/RunCMakeTest.cmake b/Tests/RunCMake/FindPkgConfig/RunCMakeTest.cmake index dc77915..4e6eef6 100644 --- a/Tests/RunCMake/FindPkgConfig/RunCMakeTest.cmake +++ b/Tests/RunCMake/FindPkgConfig/RunCMakeTest.cmake @@ -1,5 +1,10 @@ include(RunCMake) +# Isolate test cases from caller's environment. +set(ENV{CMAKE_PREFIX_PATH} "") +set(ENV{CMAKE_APPBUNDLE_PATH} "") +set(ENV{CMAKE_FRAMEWORK_PATH} "") + run_cmake(PkgConfigDoesNotExist) run_cmake(FindPkgConfig_NO_PKGCONFIG_PATH) diff --git a/Tests/RunCMake/Graphviz/default_options-check.cmake b/Tests/RunCMake/Graphviz/default_options-check.cmake index c9a7562..584e276 100644 --- a/Tests/RunCMake/Graphviz/default_options-check.cmake +++ b/Tests/RunCMake/Graphviz/default_options-check.cmake @@ -3,3 +3,11 @@ include(RunCMake) ensure_files_match( ${RunCMake_TEST_SOURCE_DIR}/expected_outputs/dependency_graph_default_options.dot ${RunCMake_TEST_BINARY_DIR}/generated_dependency_graph.dot) + +ensure_files_match( + ${RunCMake_TEST_SOURCE_DIR}/expected_outputs/dependency_graph_target_dependencies.dot.GraphicApplication + ${RunCMake_TEST_BINARY_DIR}/generated_dependency_graph.dot.GraphicApplication) + +ensure_files_match( + ${RunCMake_TEST_SOURCE_DIR}/expected_outputs/dependency_graph_target_dependers.dot.CompilerFlags.dependers + ${RunCMake_TEST_BINARY_DIR}/generated_dependency_graph.dot.CompilerFlags.dependers) diff --git a/Tests/RunCMake/Graphviz/expected_outputs/dependency_graph_target_dependencies.dot.GraphicApplication b/Tests/RunCMake/Graphviz/expected_outputs/dependency_graph_target_dependencies.dot.GraphicApplication new file mode 100644 index 0000000..6893fd1 --- /dev/null +++ b/Tests/RunCMake/Graphviz/expected_outputs/dependency_graph_target_dependencies.dot.GraphicApplication @@ -0,0 +1,22 @@ +digraph "GraphicApplication" { +node [ + fontsize = "12" +]; + "node5" [ label = "GraphicApplication", shape = egg ]; + "node2" [ label = "CoreLibrary", shape = octagon ]; + "node5" -> "node2" [ style = dotted ] // GraphicApplication -> CoreLibrary + "node0" [ label = "CompilerFlags", shape = pentagon ]; + "node2" -> "node0" // CoreLibrary -> CompilerFlags + "node3" [ label = "GoofyLoggingLibrary\n(SeriousLoggingLibrary)\n(TheBestLoggingLibrary)", shape = pentagon ]; + "node2" -> "node3" [ style = dotted ] // CoreLibrary -> GoofyLoggingLibrary + "node6" [ label = "GraphicLibrary", shape = doubleoctagon ]; + "node5" -> "node6" [ style = dotted ] // GraphicApplication -> GraphicLibrary + "node7" [ label = "\"-lm\"", shape = septagon ]; + "node6" -> "node7" [ style = dotted ] // GraphicLibrary -> "-lm" + "node0" [ label = "CompilerFlags", shape = pentagon ]; + "node6" -> "node0" // GraphicLibrary -> CompilerFlags + "node2" [ label = "CoreLibrary", shape = octagon ]; + "node6" -> "node2" [ style = dotted ] // GraphicLibrary -> CoreLibrary + "node8" [ label = "GraphicLibraryObjects", shape = hexagon ]; + "node6" -> "node8" [ style = dotted ] // GraphicLibrary -> GraphicLibraryObjects +} diff --git a/Tests/RunCMake/Graphviz/expected_outputs/dependency_graph_target_dependers.dot.CompilerFlags.dependers b/Tests/RunCMake/Graphviz/expected_outputs/dependency_graph_target_dependers.dot.CompilerFlags.dependers new file mode 100644 index 0000000..3352b1a --- /dev/null +++ b/Tests/RunCMake/Graphviz/expected_outputs/dependency_graph_target_dependers.dot.CompilerFlags.dependers @@ -0,0 +1,26 @@ +digraph "CompilerFlags" { +node [ + fontsize = "12" +]; + "node0" [ label = "CompilerFlags", shape = pentagon ]; + "node2" [ label = "CoreLibrary", shape = octagon ]; + "node2" -> "node0" // CoreLibrary -> CompilerFlags + "node1" [ label = "ConsoleApplication", shape = egg ]; + "node1" -> "node2" [ style = dotted ] // ConsoleApplication -> CoreLibrary + "node5" [ label = "GraphicApplication", shape = egg ]; + "node5" -> "node2" [ style = dotted ] // GraphicApplication -> CoreLibrary + "node6" [ label = "GraphicLibrary", shape = doubleoctagon ]; + "node6" -> "node2" [ style = dotted ] // GraphicLibrary -> CoreLibrary + "node5" [ label = "GraphicApplication", shape = egg ]; + "node5" -> "node6" [ style = dotted ] // GraphicApplication -> GraphicLibrary + "node9" [ label = "GraphicDriverOpenGL", shape = tripleoctagon ]; + "node9" -> "node2" [ style = dotted ] // GraphicDriverOpenGL -> CoreLibrary + "node10" [ label = "GraphicDriverVulkan", shape = tripleoctagon ]; + "node10" -> "node2" [ style = dotted ] // GraphicDriverVulkan -> CoreLibrary + "node6" [ label = "GraphicLibrary", shape = doubleoctagon ]; + "node6" -> "node0" // GraphicLibrary -> CompilerFlags + "node9" [ label = "GraphicDriverOpenGL", shape = tripleoctagon ]; + "node9" -> "node0" [ style = dotted ] // GraphicDriverOpenGL -> CompilerFlags + "node10" [ label = "GraphicDriverVulkan", shape = tripleoctagon ]; + "node10" -> "node0" [ style = dotted ] // GraphicDriverVulkan -> CompilerFlags +} diff --git a/Tests/RunCMake/Ninja/Qt5AutoMocDeps.cmake b/Tests/RunCMake/Ninja/Qt5AutoMocDeps.cmake new file mode 100644 index 0000000..d69a119 --- /dev/null +++ b/Tests/RunCMake/Ninja/Qt5AutoMocDeps.cmake @@ -0,0 +1,9 @@ +enable_language(CXX) + +find_package(Qt5Core REQUIRED) + +set(CMAKE_AUTOMOC ON) + +add_library(simple_lib SHARED simple_lib.cpp) +add_executable(app_with_qt app.cpp app_qt.cpp) +target_link_libraries(app_with_qt PRIVATE simple_lib Qt5::Core) diff --git a/Tests/RunCMake/Ninja/RunCMakeTest.cmake b/Tests/RunCMake/Ninja/RunCMakeTest.cmake index 8f9c263..e6f86a1 100644 --- a/Tests/RunCMake/Ninja/RunCMakeTest.cmake +++ b/Tests/RunCMake/Ninja/RunCMakeTest.cmake @@ -138,6 +138,7 @@ ${ninja_stderr} message(FATAL_ERROR "top ninja build failed exited with status ${ninja_result}") endif() + set(ninja_stdout "${ninja_stdout}" PARENT_SCOPE) endfunction(run_ninja) function (run_LooseObjectDepends) @@ -322,3 +323,24 @@ function (run_ChangeBuildType) run_ninja("${RunCMake_TEST_BINARY_DIR}" -w dupbuild=err) endfunction() run_ChangeBuildType() + +function(run_Qt5AutoMocDeps) + if(CMake_TEST_Qt5 AND CMAKE_TEST_Qt5Core_Version VERSION_GREATER_EQUAL 5.15.0) + set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Qt5AutoMocDeps-build) + set(RunCMake_TEST_OPTIONS "-DQt5Core_DIR=${Qt5Core_DIR}") + run_cmake(Qt5AutoMocDeps) + unset(RunCMake_TEST_OPTIONS) + # Build the project. + run_ninja("${RunCMake_TEST_BINARY_DIR}") + # Touch just the library source file, which shouldn't cause a rerun of AUTOMOC + # for app_with_qt target. + touch("${RunCMake_SOURCE_DIR}/simple_lib.cpp") + # Build and assert that AUTOMOC was not run for app_with_qt. + run_ninja("${RunCMake_TEST_BINARY_DIR}") + if(ninja_stdout MATCHES "Automatic MOC for target app_with_qt") + message(FATAL_ERROR + "AUTOMOC should not have executed for 'app_with_qt' target:\nstdout:\n${ninja_stdout}") + endif() + endif() +endfunction() +run_Qt5AutoMocDeps() diff --git a/Tests/RunCMake/Ninja/app.cpp b/Tests/RunCMake/Ninja/app.cpp new file mode 100644 index 0000000..57380e4 --- /dev/null +++ b/Tests/RunCMake/Ninja/app.cpp @@ -0,0 +1,6 @@ +int main(int argc, char* argv[]) +{ + (void)argc; + (void)argv; + return 0; +} diff --git a/Tests/RunCMake/Ninja/app_qt.cpp b/Tests/RunCMake/Ninja/app_qt.cpp new file mode 100644 index 0000000..302c672 --- /dev/null +++ b/Tests/RunCMake/Ninja/app_qt.cpp @@ -0,0 +1,11 @@ +#include <QObject> + +class Mango : public QObject +{ + Q_OBJECT +public: +Q_SIGNALS: + void eatFruit(); +}; + +#include "app_qt.moc" diff --git a/Tests/RunCMake/Ninja/simple_lib.cpp b/Tests/RunCMake/Ninja/simple_lib.cpp new file mode 100644 index 0000000..cf8d689 --- /dev/null +++ b/Tests/RunCMake/Ninja/simple_lib.cpp @@ -0,0 +1,6 @@ +#ifdef _WIN32 +__declspec(dllexport) +#endif + void dummy_symbol() +{ +} diff --git a/Tests/RunCMake/NinjaMultiConfig/CustomCommandsAndTargets-release-clean-build-check.cmake b/Tests/RunCMake/NinjaMultiConfig/CustomCommandsAndTargets-release-clean-build-check.cmake new file mode 100644 index 0000000..a6eb088 --- /dev/null +++ b/Tests/RunCMake/NinjaMultiConfig/CustomCommandsAndTargets-release-clean-build-check.cmake @@ -0,0 +1,3 @@ +check_files("${RunCMake_TEST_BINARY_DIR}" + INCLUDE + ) diff --git a/Tests/RunCMake/NinjaMultiConfig/CustomCommandsAndTargets-release-leaf-byproduct-ninja-check.cmake b/Tests/RunCMake/NinjaMultiConfig/CustomCommandsAndTargets-release-leaf-byproduct-ninja-check.cmake new file mode 100644 index 0000000..b2d67b4 --- /dev/null +++ b/Tests/RunCMake/NinjaMultiConfig/CustomCommandsAndTargets-release-leaf-byproduct-ninja-check.cmake @@ -0,0 +1,5 @@ +check_files("${RunCMake_TEST_BINARY_DIR}" + INCLUDE + ${TARGET_BYPRODUCTS_LeafExe} + ${TARGET_BYPRODUCTS_RootCustom} + ) diff --git a/Tests/RunCMake/NinjaMultiConfig/CustomCommandsAndTargets-release-leaf-custom-ninja-check.cmake b/Tests/RunCMake/NinjaMultiConfig/CustomCommandsAndTargets-release-leaf-custom-ninja-check.cmake new file mode 100644 index 0000000..b142ed2 --- /dev/null +++ b/Tests/RunCMake/NinjaMultiConfig/CustomCommandsAndTargets-release-leaf-custom-ninja-check.cmake @@ -0,0 +1,6 @@ +check_files("${RunCMake_TEST_BINARY_DIR}" + INCLUDE + ${TARGET_BYPRODUCTS_LeafCustom} + ${TARGET_BYPRODUCTS_RootCustom} + ${TARGET_FILE_RootExe_Release} + ) diff --git a/Tests/RunCMake/NinjaMultiConfig/CustomCommandsAndTargets-release-leaf-exe-ninja-check.cmake b/Tests/RunCMake/NinjaMultiConfig/CustomCommandsAndTargets-release-leaf-exe-ninja-check.cmake new file mode 100644 index 0000000..e29dab6 --- /dev/null +++ b/Tests/RunCMake/NinjaMultiConfig/CustomCommandsAndTargets-release-leaf-exe-ninja-check.cmake @@ -0,0 +1,7 @@ +check_files("${RunCMake_TEST_BINARY_DIR}" + INCLUDE + ${TARGET_FILE_LeafExe_Release} + ${TARGET_BYPRODUCTS_LeafExe} + ${TARGET_BYPRODUCTS_RootCustom} + ${TARGET_FILE_RootExe_Release} + ) diff --git a/Tests/RunCMake/NinjaMultiConfig/CustomCommandsAndTargets.cmake b/Tests/RunCMake/NinjaMultiConfig/CustomCommandsAndTargets.cmake index b2b24e8..7bed090 100644 --- a/Tests/RunCMake/NinjaMultiConfig/CustomCommandsAndTargets.cmake +++ b/Tests/RunCMake/NinjaMultiConfig/CustomCommandsAndTargets.cmake @@ -34,6 +34,18 @@ add_subdirectory(CustomCommandsAndTargetsSubdir) create_targets(Top) +add_executable(RootExe main.c) +add_custom_target(RootCustom COMMAND ${CMAKE_COMMAND} -E touch RootCustom.txt BYPRODUCTS RootCustom.txt) +add_custom_command(OUTPUT main.c COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/main.c ${CMAKE_CURRENT_BINARY_DIR}/main.c DEPENDS RootCustom) +add_executable(LeafExe ${CMAKE_CURRENT_BINARY_DIR}/main.c) +add_custom_target(LeafCustom COMMAND ${CMAKE_COMMAND} -E touch LeafCustom.txt BYPRODUCTS LeafCustom.txt DEPENDS RootCustom RootExe) +add_dependencies(LeafExe RootExe) +file(APPEND "${CMAKE_BINARY_DIR}/target_files_custom.cmake" +"set(TARGET_BYPRODUCTS_LeafCustom [==[${CMAKE_CURRENT_BINARY_DIR}/LeafCustom.txt]==]) +set(TARGET_BYPRODUCTS_LeafExe [==[${CMAKE_CURRENT_BINARY_DIR}/main.c]==]) +set(TARGET_BYPRODUCTS_RootCustom [==[${CMAKE_CURRENT_BINARY_DIR}/RootCustom.txt]==]) +") + include(${CMAKE_CURRENT_LIST_DIR}/Common.cmake) -generate_output_files(TopPostBuild SubdirPostBuild) +generate_output_files(TopPostBuild SubdirPostBuild RootExe LeafExe) file(APPEND "${CMAKE_BINARY_DIR}/target_files.cmake" "include(\${CMAKE_CURRENT_LIST_DIR}/target_files_custom.cmake)\n") diff --git a/Tests/RunCMake/NinjaMultiConfig/PerConfigSources.cmake b/Tests/RunCMake/NinjaMultiConfig/PerConfigSources.cmake new file mode 100644 index 0000000..7483130 --- /dev/null +++ b/Tests/RunCMake/NinjaMultiConfig/PerConfigSources.cmake @@ -0,0 +1,8 @@ +enable_language(C) +file(GENERATE OUTPUT "${CMAKE_BINARY_DIR}/main_$<CONFIG>.c" CONTENT +[[int main(void) +{ + return 0; +} +]]) +add_executable(exe "${CMAKE_BINARY_DIR}/main_$<CONFIG>.c") diff --git a/Tests/RunCMake/NinjaMultiConfig/Qt5-automoc-check-ninja-stdout.txt b/Tests/RunCMake/NinjaMultiConfig/Qt5-automoc-check-ninja-stdout.txt new file mode 100644 index 0000000..85d5fdc --- /dev/null +++ b/Tests/RunCMake/NinjaMultiConfig/Qt5-automoc-check-ninja-stdout.txt @@ -0,0 +1,7 @@ + input: CUSTOM_COMMAND( + [^ +]*)* + \|\| exe_autogen_timestamp_deps:Debug( + [^ +]*)* + outputs: diff --git a/Tests/RunCMake/NinjaMultiConfig/RunCMakeTest.cmake b/Tests/RunCMake/NinjaMultiConfig/RunCMakeTest.cmake index 76b488e..8496d63 100644 --- a/Tests/RunCMake/NinjaMultiConfig/RunCMakeTest.cmake +++ b/Tests/RunCMake/NinjaMultiConfig/RunCMakeTest.cmake @@ -235,11 +235,21 @@ run_cmake_build(CustomCommandsAndTargets debug-in-release-graph-postbuild Releas run_ninja(CustomCommandsAndTargets release-postbuild build-Release.ninja SubdirPostBuild) run_cmake_build(CustomCommandsAndTargets debug-targetpostbuild Debug TopTargetPostBuild) run_ninja(CustomCommandsAndTargets release-targetpostbuild build-Release.ninja SubdirTargetPostBuild) +run_cmake_build(CustomCommandsAndTargets release-clean Release clean:all) +run_ninja(CustomCommandsAndTargets release-leaf-custom build-Release.ninja LeafCustom.txt) +run_cmake_build(CustomCommandsAndTargets release-clean Release clean:all) +run_ninja(CustomCommandsAndTargets release-leaf-exe build-Release.ninja LeafExe) +run_cmake_build(CustomCommandsAndTargets release-clean Release clean:all) +run_ninja(CustomCommandsAndTargets release-leaf-byproduct build-Release.ninja main.c) unset(RunCMake_TEST_BINARY_DIR) run_cmake(CustomCommandDepfile) +set(RunCMake_TEST_OPTIONS "-DCMAKE_CROSS_CONFIGS=all") +run_cmake(PerConfigSources) +unset(RunCMake_TEST_OPTIONS) + set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/PostfixAndLocation-build) set(RunCMake_TEST_OPTIONS "-DCMAKE_CONFIGURATION_TYPES=Debug\\;Release;-DCMAKE_CROSS_CONFIGS=all") run_cmake_configure(PostfixAndLocation) @@ -300,9 +310,12 @@ endif() if(CMake_TEST_Qt5) set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Qt5-build) - set(RunCMake_TEST_OPTIONS "-DCMAKE_CROSS_CONFIGS=all") + set(RunCMake_TEST_OPTIONS "-DCMAKE_CROSS_CONFIGS=all" "-DQt5Core_DIR=${Qt5Core_DIR}") run_cmake_configure(Qt5) unset(RunCMake_TEST_OPTIONS) include(${RunCMake_TEST_BINARY_DIR}/target_files.cmake) run_cmake_build(Qt5 debug-in-release-graph Release exe:Debug) + if(CMAKE_TEST_Qt5Core_Version VERSION_GREATER_EQUAL 5.15.0) + run_ninja(Qt5 automoc-check build-Debug.ninja -t query exe_autogen/timestamp) + endif() endif() diff --git a/Tests/RunCMake/VS10Project/VsCsharpSourceGroup-check.cmake b/Tests/RunCMake/VS10Project/VsCsharpSourceGroup-check.cmake index 3b5c70f..80d76e4 100644 --- a/Tests/RunCMake/VS10Project/VsCsharpSourceGroup-check.cmake +++ b/Tests/RunCMake/VS10Project/VsCsharpSourceGroup-check.cmake @@ -9,12 +9,13 @@ file(STRINGS "${csProjFile}" lines) include(${RunCMake_TEST_SOURCE_DIR}/VsCsharpSourceGroupHelpers.cmake) set(SOURCE_GROUPS_TO_FIND - "CSharpSourceGroup" - "CSharpSourceGroup/nested" - "Images" + "CSharpSourceGroup\\\\foo\\.cs" + "CSharpSourceGroup\\\\nested\\\\baz\\.cs" + "CSharpSourceGroup\\\\images\\\\empty\\.bmp" + "VsCsharpSourceGroup\\.png" ) -foreach(GROUP_NAME IN LISTS ${SOURCE_GROUPS_TO_FIND}) +foreach(GROUP_NAME IN LISTS SOURCE_GROUPS_TO_FIND) find_source_group("${lines}" ${GROUP_NAME}) if(NOT ${SOURCE_GROUP_FOUND}) return() diff --git a/Tests/RunCMake/VS10Project/VsCsharpSourceGroup.cmake b/Tests/RunCMake/VS10Project/VsCsharpSourceGroup.cmake index 024993c..510d712 100644 --- a/Tests/RunCMake/VS10Project/VsCsharpSourceGroup.cmake +++ b/Tests/RunCMake/VS10Project/VsCsharpSourceGroup.cmake @@ -9,8 +9,14 @@ set(SRC_FILES set(IMAGE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/CSharpSourceGroup/Images/empty.bmp ) +# We explicitly don't set a source group for a source in the root level +# because of https://gitlab.kitware.com/cmake/cmake/-/issues/21221 +set(RESOURCE_FILES + ${CMAKE_CURRENT_SOURCE_DIR}/VsCsharpSourceGroup.png +) + -add_library(VsCsharpSourceGroup SHARED ${SRC_FILES} ${IMAGE_FILES}) +add_library(VsCsharpSourceGroup SHARED ${SRC_FILES} ${IMAGE_FILES} ${RESOURCE_FILES}) source_group("CSharpSourceGroup" FILES ${CMAKE_CURRENT_SOURCE_DIR}/CSharpSourceGroup/foo.cs) source_group("CSharpSourceGroup/nested" FILES ${CMAKE_CURRENT_SOURCE_DIR}/CSharpSourceGroup/nested/baz.cs) source_group("Images" FILES ${IMAGE_FILES}) diff --git a/Tests/RunCMake/VS10Project/VsCsharpSourceGroup.png b/Tests/RunCMake/VS10Project/VsCsharpSourceGroup.png new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/Tests/RunCMake/VS10Project/VsCsharpSourceGroup.png diff --git a/Tests/RunCMake/add_test/CMakeLists.txt.in b/Tests/RunCMake/add_test/CMakeLists.txt.in deleted file mode 100644 index 495240d..0000000 --- a/Tests/RunCMake/add_test/CMakeLists.txt.in +++ /dev/null @@ -1,27 +0,0 @@ -if (NOT DEFINED RUN_AS_SCRIPT) - - cmake_minimum_required(VERSION 3.7) - project(@CASE_NAME@ NONE) - include(CTest) - - # Two fallback tests for set_tests_properties. - add_test(NAME PrefixTest COMMAND "${CMAKE_COMMAND}" --version) - add_test(NAME SuffixTest COMMAND "${CMAKE_COMMAND}" --version) - - add_test( - NAME @CASE_CMAKELISTS_NAME_1@ - COMMAND "${CMAKE_COMMAND}" -D RUN_AS_SCRIPT=1 -P "${CMAKE_CURRENT_LIST_FILE}" - ) - set_tests_properties( - @CASE_CMAKELISTS_NAME_2@ - PROPERTIES - ENVIRONMENT CMAKE_add_test_ENVVAR=1 - ) - -else() - - if(NOT DEFINED ENV{CMAKE_add_test_ENVVAR}) - message(FATAL_ERROR "Setting property on test did not succeed!") - endif() - -endif() diff --git a/Tests/RunCMake/add_test/NameContainsBracketArgument1-stdout.txt b/Tests/RunCMake/add_test/NameContainsBracketArgument1-stdout.txt deleted file mode 100644 index 00865d0..0000000 --- a/Tests/RunCMake/add_test/NameContainsBracketArgument1-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: \[=\[BracketArgument;SuffixTest\]=\] \.+[ ]+Passed diff --git a/Tests/RunCMake/add_test/NameContainsBracketArgument2-stdout.txt b/Tests/RunCMake/add_test/NameContainsBracketArgument2-stdout.txt deleted file mode 100644 index a744beb..0000000 --- a/Tests/RunCMake/add_test/NameContainsBracketArgument2-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: BracketArgument;SuffixTest \.+[ ]+Passed diff --git a/Tests/RunCMake/add_test/NameContainsBracketArgument3-result.txt b/Tests/RunCMake/add_test/NameContainsBracketArgument3-result.txt deleted file mode 100644 index b57e2de..0000000 --- a/Tests/RunCMake/add_test/NameContainsBracketArgument3-result.txt +++ /dev/null @@ -1 +0,0 @@ -(-1|255) diff --git a/Tests/RunCMake/add_test/NameContainsBracketArgument3-stderr.txt b/Tests/RunCMake/add_test/NameContainsBracketArgument3-stderr.txt deleted file mode 100644 index 32c2112..0000000 --- a/Tests/RunCMake/add_test/NameContainsBracketArgument3-stderr.txt +++ /dev/null @@ -1,2 +0,0 @@ -Error\(s\) when configuring the project -No tests were found!!! diff --git a/Tests/RunCMake/add_test/NameContainsBracketArgument4-result.txt b/Tests/RunCMake/add_test/NameContainsBracketArgument4-result.txt deleted file mode 100644 index b57e2de..0000000 --- a/Tests/RunCMake/add_test/NameContainsBracketArgument4-result.txt +++ /dev/null @@ -1 +0,0 @@ -(-1|255) diff --git a/Tests/RunCMake/add_test/NameContainsBracketArgument4-stderr.txt b/Tests/RunCMake/add_test/NameContainsBracketArgument4-stderr.txt deleted file mode 100644 index 32c2112..0000000 --- a/Tests/RunCMake/add_test/NameContainsBracketArgument4-stderr.txt +++ /dev/null @@ -1,2 +0,0 @@ -Error\(s\) when configuring the project -No tests were found!!! diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote1-result.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote1-result.txt deleted file mode 100644 index b57e2de..0000000 --- a/Tests/RunCMake/add_test/NameContainsEscapedQuote1-result.txt +++ /dev/null @@ -1 +0,0 @@ -(-1|255) diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote1-stderr.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote1-stderr.txt deleted file mode 100644 index 0661945..0000000 --- a/Tests/RunCMake/add_test/NameContainsEscapedQuote1-stderr.txt +++ /dev/null @@ -1 +0,0 @@ -Unable to find executable: SuffixTest diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote1-stdout.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote1-stdout.txt deleted file mode 100644 index 4875409..0000000 --- a/Tests/RunCMake/add_test/NameContainsEscapedQuote1-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: EscapedQuote \.+\*\*\*Not Run diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote2-result.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote2-result.txt deleted file mode 100644 index b57e2de..0000000 --- a/Tests/RunCMake/add_test/NameContainsEscapedQuote2-result.txt +++ /dev/null @@ -1 +0,0 @@ -(-1|255) diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote2-stderr.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote2-stderr.txt deleted file mode 100644 index 0661945..0000000 --- a/Tests/RunCMake/add_test/NameContainsEscapedQuote2-stderr.txt +++ /dev/null @@ -1 +0,0 @@ -Unable to find executable: SuffixTest diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote2-stdout.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote2-stdout.txt deleted file mode 100644 index 4875409..0000000 --- a/Tests/RunCMake/add_test/NameContainsEscapedQuote2-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: EscapedQuote \.+\*\*\*Not Run diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote3-result.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote3-result.txt deleted file mode 100644 index b57e2de..0000000 --- a/Tests/RunCMake/add_test/NameContainsEscapedQuote3-result.txt +++ /dev/null @@ -1 +0,0 @@ -(-1|255) diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote3-stderr.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote3-stderr.txt deleted file mode 100644 index 0661945..0000000 --- a/Tests/RunCMake/add_test/NameContainsEscapedQuote3-stderr.txt +++ /dev/null @@ -1 +0,0 @@ -Unable to find executable: SuffixTest diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote3-stdout.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote3-stdout.txt deleted file mode 100644 index 4875409..0000000 --- a/Tests/RunCMake/add_test/NameContainsEscapedQuote3-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: EscapedQuote \.+\*\*\*Not Run diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote4-result.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote4-result.txt deleted file mode 100644 index b57e2de..0000000 --- a/Tests/RunCMake/add_test/NameContainsEscapedQuote4-result.txt +++ /dev/null @@ -1 +0,0 @@ -(-1|255) diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote4-stderr.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote4-stderr.txt deleted file mode 100644 index 0661945..0000000 --- a/Tests/RunCMake/add_test/NameContainsEscapedQuote4-stderr.txt +++ /dev/null @@ -1 +0,0 @@ -Unable to find executable: SuffixTest diff --git a/Tests/RunCMake/add_test/NameContainsEscapedQuote4-stdout.txt b/Tests/RunCMake/add_test/NameContainsEscapedQuote4-stdout.txt deleted file mode 100644 index 4875409..0000000 --- a/Tests/RunCMake/add_test/NameContainsEscapedQuote4-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: EscapedQuote \.+\*\*\*Not Run diff --git a/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars1-stdout.txt b/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars1-stdout.txt deleted file mode 100644 index 80435b6..0000000 --- a/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars1-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: \(\) # \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars2-stdout.txt b/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars2-stdout.txt deleted file mode 100644 index 80435b6..0000000 --- a/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars2-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: \(\) # \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars3-stdout.txt b/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars3-stdout.txt deleted file mode 100644 index 80435b6..0000000 --- a/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars3-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: \(\) # \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars4-stdout.txt b/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars4-stdout.txt deleted file mode 100644 index 80435b6..0000000 --- a/Tests/RunCMake/add_test/NameContainsEscapedSpecialChars4-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: \(\) # \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax1-stdout.txt b/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax1-stdout.txt deleted file mode 100644 index 172ff99..0000000 --- a/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax1-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: \$<BOOL:0> \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax2-stdout.txt b/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax2-stdout.txt deleted file mode 100644 index 172ff99..0000000 --- a/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax2-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: \$<BOOL:0> \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax3-stdout.txt b/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax3-stdout.txt deleted file mode 100644 index 172ff99..0000000 --- a/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax3-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: \$<BOOL:0> \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax4-stdout.txt b/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax4-stdout.txt deleted file mode 100644 index 172ff99..0000000 --- a/Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax4-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: \$<BOOL:0> \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/NameContainsOtherSpecialChars1-stdout.txt b/Tests/RunCMake/add_test/NameContainsOtherSpecialChars1-stdout.txt deleted file mode 100644 index 83e3f86..0000000 --- a/Tests/RunCMake/add_test/NameContainsOtherSpecialChars1-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: !§\$%&/ü:\*😤~ \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/NameContainsOtherSpecialChars2-stdout.txt b/Tests/RunCMake/add_test/NameContainsOtherSpecialChars2-stdout.txt deleted file mode 100644 index 83e3f86..0000000 --- a/Tests/RunCMake/add_test/NameContainsOtherSpecialChars2-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: !§\$%&/ü:\*😤~ \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/NameContainsOtherSpecialChars3-stdout.txt b/Tests/RunCMake/add_test/NameContainsOtherSpecialChars3-stdout.txt deleted file mode 100644 index 83e3f86..0000000 --- a/Tests/RunCMake/add_test/NameContainsOtherSpecialChars3-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: !§\$%&/ü:\*😤~ \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/NameContainsOtherSpecialChars4-stdout.txt b/Tests/RunCMake/add_test/NameContainsOtherSpecialChars4-stdout.txt deleted file mode 100644 index 83e3f86..0000000 --- a/Tests/RunCMake/add_test/NameContainsOtherSpecialChars4-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: !§\$%&/ü:\*😤~ \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/NameContainsSemicolon1-stdout.txt b/Tests/RunCMake/add_test/NameContainsSemicolon1-stdout.txt deleted file mode 100644 index 0fbf486..0000000 --- a/Tests/RunCMake/add_test/NameContainsSemicolon1-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: PrefixTest;SuffixTest \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/NameContainsSemicolon2-result.txt b/Tests/RunCMake/add_test/NameContainsSemicolon2-result.txt deleted file mode 100644 index b57e2de..0000000 --- a/Tests/RunCMake/add_test/NameContainsSemicolon2-result.txt +++ /dev/null @@ -1 +0,0 @@ -(-1|255) diff --git a/Tests/RunCMake/add_test/NameContainsSemicolon2-stderr.txt b/Tests/RunCMake/add_test/NameContainsSemicolon2-stderr.txt deleted file mode 100644 index 32c2112..0000000 --- a/Tests/RunCMake/add_test/NameContainsSemicolon2-stderr.txt +++ /dev/null @@ -1,2 +0,0 @@ -Error\(s\) when configuring the project -No tests were found!!! diff --git a/Tests/RunCMake/add_test/NameContainsSemicolon3-stdout.txt b/Tests/RunCMake/add_test/NameContainsSemicolon3-stdout.txt deleted file mode 100644 index c5ab1d8..0000000 --- a/Tests/RunCMake/add_test/NameContainsSemicolon3-stdout.txt +++ /dev/null @@ -1,3 +0,0 @@ -3/3 Test #3: PrefixTest;SuffixTest \.+\*\*\*Failed.* -CMake Error at .+/CMakeLists.txt:[0-9]+ \(message\): -[ ]*Setting property on test did not succeed! diff --git a/Tests/RunCMake/add_test/NameContainsSemicolon4-result.txt b/Tests/RunCMake/add_test/NameContainsSemicolon4-result.txt deleted file mode 100644 index b57e2de..0000000 --- a/Tests/RunCMake/add_test/NameContainsSemicolon4-result.txt +++ /dev/null @@ -1 +0,0 @@ -(-1|255) diff --git a/Tests/RunCMake/add_test/NameContainsSemicolon4-stderr.txt b/Tests/RunCMake/add_test/NameContainsSemicolon4-stderr.txt deleted file mode 100644 index 32c2112..0000000 --- a/Tests/RunCMake/add_test/NameContainsSemicolon4-stderr.txt +++ /dev/null @@ -1,2 +0,0 @@ -Error\(s\) when configuring the project -No tests were found!!! diff --git a/Tests/RunCMake/add_test/NameContainsSpaces1-stdout.txt b/Tests/RunCMake/add_test/NameContainsSpaces1-stdout.txt deleted file mode 100644 index a255fb1..0000000 --- a/Tests/RunCMake/add_test/NameContainsSpaces1-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: PrefixTest SuffixTest \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/NameContainsSpaces2-result.txt b/Tests/RunCMake/add_test/NameContainsSpaces2-result.txt deleted file mode 100644 index b57e2de..0000000 --- a/Tests/RunCMake/add_test/NameContainsSpaces2-result.txt +++ /dev/null @@ -1 +0,0 @@ -(-1|255) diff --git a/Tests/RunCMake/add_test/NameContainsSpaces2-stderr.txt b/Tests/RunCMake/add_test/NameContainsSpaces2-stderr.txt deleted file mode 100644 index 32c2112..0000000 --- a/Tests/RunCMake/add_test/NameContainsSpaces2-stderr.txt +++ /dev/null @@ -1,2 +0,0 @@ -Error\(s\) when configuring the project -No tests were found!!! diff --git a/Tests/RunCMake/add_test/NameContainsSpaces3-stdout.txt b/Tests/RunCMake/add_test/NameContainsSpaces3-stdout.txt deleted file mode 100644 index 3d42b0b..0000000 --- a/Tests/RunCMake/add_test/NameContainsSpaces3-stdout.txt +++ /dev/null @@ -1,3 +0,0 @@ -3/3 Test #3: PrefixTest SuffixTest \.+\*\*\*Failed.* -CMake Error at .+/CMakeLists.txt:[0-9]+ \(message\): -[ ]*Setting property on test did not succeed! diff --git a/Tests/RunCMake/add_test/NameContainsSpaces4-result.txt b/Tests/RunCMake/add_test/NameContainsSpaces4-result.txt deleted file mode 100644 index b57e2de..0000000 --- a/Tests/RunCMake/add_test/NameContainsSpaces4-result.txt +++ /dev/null @@ -1 +0,0 @@ -(-1|255) diff --git a/Tests/RunCMake/add_test/NameContainsSpaces4-stderr.txt b/Tests/RunCMake/add_test/NameContainsSpaces4-stderr.txt deleted file mode 100644 index 32c2112..0000000 --- a/Tests/RunCMake/add_test/NameContainsSpaces4-stderr.txt +++ /dev/null @@ -1,2 +0,0 @@ -Error\(s\) when configuring the project -No tests were found!!! diff --git a/Tests/RunCMake/add_test/NameContainsValidSpecialChars1-stdout.txt b/Tests/RunCMake/add_test/NameContainsValidSpecialChars1-stdout.txt deleted file mode 100644 index ae1a0b1..0000000 --- a/Tests/RunCMake/add_test/NameContainsValidSpecialChars1-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: abc_\.\+-012 \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/NameContainsValidSpecialChars2-stdout.txt b/Tests/RunCMake/add_test/NameContainsValidSpecialChars2-stdout.txt deleted file mode 100644 index ae1a0b1..0000000 --- a/Tests/RunCMake/add_test/NameContainsValidSpecialChars2-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: abc_\.\+-012 \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/NameContainsValidSpecialChars3-stdout.txt b/Tests/RunCMake/add_test/NameContainsValidSpecialChars3-stdout.txt deleted file mode 100644 index ae1a0b1..0000000 --- a/Tests/RunCMake/add_test/NameContainsValidSpecialChars3-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: abc_\.\+-012 \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/NameContainsValidSpecialChars4-stdout.txt b/Tests/RunCMake/add_test/NameContainsValidSpecialChars4-stdout.txt deleted file mode 100644 index ae1a0b1..0000000 --- a/Tests/RunCMake/add_test/NameContainsValidSpecialChars4-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: abc_\.\+-012 \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/NameIsAlphaNumeric1-stdout.txt b/Tests/RunCMake/add_test/NameIsAlphaNumeric1-stdout.txt deleted file mode 100644 index ed939bf..0000000 --- a/Tests/RunCMake/add_test/NameIsAlphaNumeric1-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: abcdefghijklmnopqrstuvwxyz0123456789 \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/NameIsAlphaNumeric2-stdout.txt b/Tests/RunCMake/add_test/NameIsAlphaNumeric2-stdout.txt deleted file mode 100644 index ed939bf..0000000 --- a/Tests/RunCMake/add_test/NameIsAlphaNumeric2-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: abcdefghijklmnopqrstuvwxyz0123456789 \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/NameIsAlphaNumeric3-stdout.txt b/Tests/RunCMake/add_test/NameIsAlphaNumeric3-stdout.txt deleted file mode 100644 index ed939bf..0000000 --- a/Tests/RunCMake/add_test/NameIsAlphaNumeric3-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: abcdefghijklmnopqrstuvwxyz0123456789 \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/NameIsAlphaNumeric4-stdout.txt b/Tests/RunCMake/add_test/NameIsAlphaNumeric4-stdout.txt deleted file mode 100644 index ed939bf..0000000 --- a/Tests/RunCMake/add_test/NameIsAlphaNumeric4-stdout.txt +++ /dev/null @@ -1 +0,0 @@ -Test #[0-9]+: abcdefghijklmnopqrstuvwxyz0123456789 \.+[ ]*Passed diff --git a/Tests/RunCMake/add_test/RunCMakeTest.cmake b/Tests/RunCMake/add_test/RunCMakeTest.cmake deleted file mode 100644 index 6e9edda..0000000 --- a/Tests/RunCMake/add_test/RunCMakeTest.cmake +++ /dev/null @@ -1,263 +0,0 @@ -include(RunCTest) - -set(ENV{CTEST_OUTPUT_ON_FAILURE} 1) - -function(run_NameIsAlphaNumeric1_test) - set(CASE_CMAKELISTS_NAME_1 [==[ abcdefghijklmnopqrstuvwxyz0123456789 ]==]) - set(CASE_CMAKELISTS_NAME_2 [==[ abcdefghijklmnopqrstuvwxyz0123456789 ]==]) - run_ctest(NameIsAlphaNumeric1) -endfunction() -run_NameIsAlphaNumeric1_test() - -function(run_NameIsAlphaNumeric2_test) - set(CASE_CMAKELISTS_NAME_1 [==["abcdefghijklmnopqrstuvwxyz0123456789"]==]) - set(CASE_CMAKELISTS_NAME_2 [==["abcdefghijklmnopqrstuvwxyz0123456789"]==]) - run_ctest(NameIsAlphaNumeric2) -endfunction() -run_NameIsAlphaNumeric2_test() - -function(run_NameIsAlphaNumeric3_test) - set(CASE_CMAKELISTS_NAME_1 [==["abcdefghijklmnopqrstuvwxyz0123456789"]==]) - set(CASE_CMAKELISTS_NAME_2 [==[ abcdefghijklmnopqrstuvwxyz0123456789 ]==]) - run_ctest(NameIsAlphaNumeric3) -endfunction() -run_NameIsAlphaNumeric3_test() - -function(run_NameIsAlphaNumeric4_test) - set(CASE_CMAKELISTS_NAME_1 [==[ abcdefghijklmnopqrstuvwxyz0123456789 ]==]) - set(CASE_CMAKELISTS_NAME_2 [==["abcdefghijklmnopqrstuvwxyz0123456789"]==]) - run_ctest(NameIsAlphaNumeric4) -endfunction() -run_NameIsAlphaNumeric4_test() - - -function(run_NameContainsValidSpecialChars1_test) - set(CASE_CMAKELISTS_NAME_1 [==[ abc_.+-012 ]==]) - set(CASE_CMAKELISTS_NAME_2 [==[ abc_.+-012 ]==]) - run_ctest(NameContainsValidSpecialChars1) -endfunction() -run_NameContainsValidSpecialChars1_test() - -function(run_NameContainsValidSpecialChars2_test) - set(CASE_CMAKELISTS_NAME_1 [==["abc_.+-012"]==]) - set(CASE_CMAKELISTS_NAME_2 [==["abc_.+-012"]==]) - run_ctest(NameContainsValidSpecialChars2) -endfunction() -run_NameContainsValidSpecialChars2_test() - -function(run_NameContainsValidSpecialChars3_test) - set(CASE_CMAKELISTS_NAME_1 [==["abc_.+-012"]==]) - set(CASE_CMAKELISTS_NAME_2 [==[ abc_.+-012 ]==]) - run_ctest(NameContainsValidSpecialChars3) -endfunction() -run_NameContainsValidSpecialChars3_test() - -function(run_NameContainsValidSpecialChars4_test) - set(CASE_CMAKELISTS_NAME_1 [==[ abc_.+-012 ]==]) - set(CASE_CMAKELISTS_NAME_2 [==["abc_.+-012"]==]) - run_ctest(NameContainsValidSpecialChars4) -endfunction() -run_NameContainsValidSpecialChars4_test() - - -function(run_NameContainsOtherSpecialChars1_test) - set(CASE_CMAKELISTS_NAME_1 [==[ !§$%&/ü:*😤~ ]==]) - set(CASE_CMAKELISTS_NAME_2 [==[ !§$%&/ü:*😤~ ]==]) - run_ctest(NameContainsOtherSpecialChars1) -endfunction() -run_NameContainsOtherSpecialChars1_test() - -function(run_NameContainsOtherSpecialChars2_test) - set(CASE_CMAKELISTS_NAME_1 [==["!§$%&/ü:*😤~"]==]) - set(CASE_CMAKELISTS_NAME_2 [==["!§$%&/ü:*😤~"]==]) - run_ctest(NameContainsOtherSpecialChars2) -endfunction() -run_NameContainsOtherSpecialChars2_test() - -function(run_NameContainsOtherSpecialChars3_test) - set(CASE_CMAKELISTS_NAME_1 [==["!§$%&/ü:*😤~"]==]) - set(CASE_CMAKELISTS_NAME_2 [==[ !§$%&/ü:*😤~ ]==]) - run_ctest(NameContainsOtherSpecialChars3) -endfunction() -run_NameContainsOtherSpecialChars3_test() - -function(run_NameContainsOtherSpecialChars4_test) - set(CASE_CMAKELISTS_NAME_1 [==[ !§$%&/ü:*😤~ ]==]) - set(CASE_CMAKELISTS_NAME_2 [==["!§$%&/ü:*😤~"]==]) - run_ctest(NameContainsOtherSpecialChars4) -endfunction() -run_NameContainsOtherSpecialChars4_test() - - -function(run_NameContainsEscapedSpecialChars1_test) - set(CASE_CMAKELISTS_NAME_1 [==[ \(\)\ \# ]==]) - set(CASE_CMAKELISTS_NAME_2 [==[ \(\)\ \# ]==]) - run_ctest(NameContainsEscapedSpecialChars1) -endfunction() -run_NameContainsEscapedSpecialChars1_test() - -function(run_NameContainsEscapedSpecialChars2_test) - set(CASE_CMAKELISTS_NAME_1 [==["\(\)\ \#"]==]) - set(CASE_CMAKELISTS_NAME_2 [==["\(\)\ \#"]==]) - run_ctest(NameContainsEscapedSpecialChars2) -endfunction() -run_NameContainsEscapedSpecialChars2_test() - -function(run_NameContainsEscapedSpecialChars3_test) - set(CASE_CMAKELISTS_NAME_1 [==["\(\)\ \#"]==]) - set(CASE_CMAKELISTS_NAME_2 [==[ \(\)\ \# ]==]) - run_ctest(NameContainsEscapedSpecialChars3) -endfunction() -run_NameContainsEscapedSpecialChars3_test() - -function(run_NameContainsEscapedSpecialChars4_test) - set(CASE_CMAKELISTS_NAME_1 [==[ \(\)\ \# ]==]) - set(CASE_CMAKELISTS_NAME_2 [==["\(\)\ \#"]==]) - run_ctest(NameContainsEscapedSpecialChars4) -endfunction() -run_NameContainsEscapedSpecialChars4_test() - - -function(run_NameContainsGeneratorExpressionSyntax1_test) - set(CASE_CMAKELISTS_NAME_1 [==[ $<BOOL:0> ]==]) - set(CASE_CMAKELISTS_NAME_2 [==[ $<BOOL:0> ]==]) - run_ctest(NameContainsGeneratorExpressionSyntax1) -endfunction() -run_NameContainsGeneratorExpressionSyntax1_test() - -function(run_NameContainsGeneratorExpressionSyntax2_test) - set(CASE_CMAKELISTS_NAME_1 [==["$<BOOL:0>"]==]) - set(CASE_CMAKELISTS_NAME_2 [==["$<BOOL:0>"]==]) - run_ctest(NameContainsGeneratorExpressionSyntax2) -endfunction() -run_NameContainsGeneratorExpressionSyntax2_test() - -function(run_NameContainsGeneratorExpressionSyntax3_test) - set(CASE_CMAKELISTS_NAME_1 [==["$<BOOL:0>"]==]) - set(CASE_CMAKELISTS_NAME_2 [==[ $<BOOL:0> ]==]) - run_ctest(NameContainsGeneratorExpressionSyntax3) -endfunction() -run_NameContainsGeneratorExpressionSyntax3_test() - -function(run_NameContainsGeneratorExpressionSyntax4_test) - set(CASE_CMAKELISTS_NAME_1 [==[ $<BOOL:0> ]==]) - set(CASE_CMAKELISTS_NAME_2 [==["$<BOOL:0>"]==]) - run_ctest(NameContainsGeneratorExpressionSyntax4) -endfunction() -run_NameContainsGeneratorExpressionSyntax4_test() - - -function(run_NameContainsSpaces1_test) - set(CASE_CMAKELISTS_NAME_1 [==["PrefixTest SuffixTest"]==]) - set(CASE_CMAKELISTS_NAME_2 [==["PrefixTest SuffixTest"]==]) - run_ctest(NameContainsSpaces1) -endfunction() -run_NameContainsSpaces1_test() - -function(run_NameContainsSpaces2_test) - set(CASE_CMAKELISTS_NAME_1 [==[ PrefixTest SuffixTest ]==]) - set(CASE_CMAKELISTS_NAME_2 [==[ PrefixTest SuffixTest ]==]) - run_ctest(NameContainsSpaces2) -endfunction() -run_NameContainsSpaces2_test() - -function(run_NameContainsSpaces3_test) - set(CASE_CMAKELISTS_NAME_1 [==["PrefixTest SuffixTest"]==]) - set(CASE_CMAKELISTS_NAME_2 [==[ PrefixTest SuffixTest ]==]) - run_ctest(NameContainsSpaces3) -endfunction() -run_NameContainsSpaces3_test() - -function(run_NameContainsSpaces4_test) - set(CASE_CMAKELISTS_NAME_1 [==[ PrefixTest SuffixTest ]==]) - set(CASE_CMAKELISTS_NAME_2 [==["PrefixTest SuffixTest"]==]) - run_ctest(NameContainsSpaces4) -endfunction() -run_NameContainsSpaces4_test() - - -function(run_NameContainsSemicolon1_test) - set(CASE_CMAKELISTS_NAME_1 [==["PrefixTest;SuffixTest"]==]) - set(CASE_CMAKELISTS_NAME_2 [==["PrefixTest;SuffixTest"]==]) - run_ctest(NameContainsSemicolon1) -endfunction() -run_NameContainsSemicolon1_test() - -function(run_NameContainsSemicolon2_test) - set(CASE_CMAKELISTS_NAME_1 [==[ PrefixTest;SuffixTest ]==]) - set(CASE_CMAKELISTS_NAME_2 [==[ PrefixTest;SuffixTest ]==]) - run_ctest(NameContainsSemicolon2) -endfunction() -run_NameContainsSemicolon2_test() - -function(run_NameContainsSemicolon3_test) - set(CASE_CMAKELISTS_NAME_1 [==["PrefixTest;SuffixTest"]==]) - set(CASE_CMAKELISTS_NAME_2 [==[ PrefixTest;SuffixTest ]==]) - run_ctest(NameContainsSemicolon3) -endfunction() -run_NameContainsSemicolon3_test() - -function(run_NameContainsSemicolon4_test) - set(CASE_CMAKELISTS_NAME_1 [==[ PrefixTest;SuffixTest ]==]) - set(CASE_CMAKELISTS_NAME_2 [==["PrefixTest;SuffixTest"]==]) - run_ctest(NameContainsSemicolon4) -endfunction() -run_NameContainsSemicolon4_test() - - -function(run_NameContainsEscapedQuote1_test) - set(CASE_CMAKELISTS_NAME_1 [==["EscapedQuote\"\"SuffixTest"]==]) - set(CASE_CMAKELISTS_NAME_2 [==["EscapedQuote\"\"SuffixTest"]==]) - run_ctest(NameContainsEscapedQuote1) -endfunction() -run_NameContainsEscapedQuote1_test() - -function(run_NameContainsEscapedQuote2_test) - set(CASE_CMAKELISTS_NAME_1 [==[ EscapedQuote\"\"SuffixTest ]==]) - set(CASE_CMAKELISTS_NAME_2 [==[ EscapedQuote\"\"SuffixTest ]==]) - run_ctest(NameContainsEscapedQuote2) -endfunction() -run_NameContainsEscapedQuote2_test() - -function(run_NameContainsEscapedQuote3_test) - set(CASE_CMAKELISTS_NAME_1 [==["EscapedQuote\"\"SuffixTest"]==]) - set(CASE_CMAKELISTS_NAME_2 [==[ EscapedQuote\"\"SuffixTest ]==]) - run_ctest(NameContainsEscapedQuote3) -endfunction() -run_NameContainsEscapedQuote3_test() - -function(run_NameContainsEscapedQuote4_test) - set(CASE_CMAKELISTS_NAME_1 [==[ EscapedQuote\"\"SuffixTest ]==]) - set(CASE_CMAKELISTS_NAME_2 [==["EscapedQuote\"\"SuffixTest"]==]) - run_ctest(NameContainsEscapedQuote4) -endfunction() -run_NameContainsEscapedQuote4_test() - - -function(run_NameContainsBracketArgument1_test) - set(CASE_CMAKELISTS_NAME_1 [==["[=[BracketArgument;SuffixTest]=]"]==]) - set(CASE_CMAKELISTS_NAME_2 [==["[=[BracketArgument;SuffixTest]=]"]==]) - run_ctest(NameContainsBracketArgument1) -endfunction() -run_NameContainsBracketArgument1_test() - -function(run_NameContainsBracketArgument2_test) - set(CASE_CMAKELISTS_NAME_1 [==[ [=[BracketArgument;SuffixTest]=] ]==]) - set(CASE_CMAKELISTS_NAME_2 [==[ [=[BracketArgument;SuffixTest]=] ]==]) - run_ctest(NameContainsBracketArgument2) -endfunction() -run_NameContainsBracketArgument2_test() - -function(run_NameContainsBracketArgument3_test) - set(CASE_CMAKELISTS_NAME_1 [==["[=[BracketArgument;SuffixTest]=]"]==]) - set(CASE_CMAKELISTS_NAME_2 [==[ [=[BracketArgument;SuffixTest]=] ]==]) - run_ctest(NameContainsBracketArgument3) -endfunction() -run_NameContainsBracketArgument3_test() - -function(run_NameContainsBracketArgument4_test) - set(CASE_CMAKELISTS_NAME_1 [==[ [=[BracketArgument;SuffixTest]=] ]==]) - set(CASE_CMAKELISTS_NAME_2 [==["[=[BracketArgument;SuffixTest]=]"]==]) - run_ctest(NameContainsBracketArgument4) -endfunction() -run_NameContainsBracketArgument4_test() diff --git a/Tests/RunCMake/add_test/test.cmake.in b/Tests/RunCMake/add_test/test.cmake.in deleted file mode 100644 index 9821c1c..0000000 --- a/Tests/RunCMake/add_test/test.cmake.in +++ /dev/null @@ -1,16 +0,0 @@ -cmake_minimum_required(VERSION 3.17) - -set(CTEST_SITE "test-site") -set(CTEST_BUILD_NAME "test-build-name") -set(CTEST_SOURCE_DIRECTORY "@RunCMake_BINARY_DIR@/@CASE_NAME@") -set(CTEST_BINARY_DIRECTORY "@RunCMake_BINARY_DIR@/@CASE_NAME@-build") -set(CTEST_CMAKE_GENERATOR "@RunCMake_GENERATOR@") -set(CTEST_CMAKE_GENERATOR_PLATFORM "@RunCMake_GENERATOR_PLATFORM@") -set(CTEST_CMAKE_GENERATOR_TOOLSET "@RunCMake_GENERATOR_TOOLSET@") -set(CTEST_BUILD_CONFIGURATION "$ENV{CMAKE_CONFIG_TYPE}") - -set(ctest_test_args "@CASE_CTEST_TEST_ARGS@") -ctest_start(Experimental) -ctest_configure() -#ctest_build() -ctest_test(${ctest_test_args}) diff --git a/Tests/RunCMake/foreach/RunCMakeTest.cmake b/Tests/RunCMake/foreach/RunCMakeTest.cmake index 22a0a75..d3f7c23 100644 --- a/Tests/RunCMake/foreach/RunCMakeTest.cmake +++ b/Tests/RunCMake/foreach/RunCMakeTest.cmake @@ -19,3 +19,4 @@ run_cmake(foreach-RANGE-non-int-test-3-1) run_cmake(foreach-RANGE-non-int-test-3-2) run_cmake(foreach-RANGE-non-int-test-3-3) run_cmake(foreach-RANGE-invalid-test) +run_cmake(foreach-RANGE-out-of-range-test) diff --git a/Tests/RunCMake/foreach/foreach-RANGE-out-of-range-test-result.txt b/Tests/RunCMake/foreach/foreach-RANGE-out-of-range-test-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/foreach/foreach-RANGE-out-of-range-test-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/foreach/foreach-RANGE-out-of-range-test-stderr.txt b/Tests/RunCMake/foreach/foreach-RANGE-out-of-range-test-stderr.txt new file mode 100644 index 0000000..f05f864 --- /dev/null +++ b/Tests/RunCMake/foreach/foreach-RANGE-out-of-range-test-stderr.txt @@ -0,0 +1,4 @@ +^CMake Error at foreach-RANGE-out-of-range-test\.cmake:[0-9]+ \(foreach\): + foreach Integer out of range: '10000000000000000000' +Call Stack \(most recent call first\): + CMakeLists\.txt:3 \(include\)$ diff --git a/Tests/RunCMake/foreach/foreach-RANGE-out-of-range-test.cmake b/Tests/RunCMake/foreach/foreach-RANGE-out-of-range-test.cmake new file mode 100644 index 0000000..3099ca9 --- /dev/null +++ b/Tests/RunCMake/foreach/foreach-RANGE-out-of-range-test.cmake @@ -0,0 +1,3 @@ +foreach(a RANGE 10000000000000000000) + break() +endforeach() diff --git a/Tests/SetLang/CMakeLists.txt b/Tests/SetLang/CMakeLists.txt index f24e5cb..9de4fc6 100644 --- a/Tests/SetLang/CMakeLists.txt +++ b/Tests/SetLang/CMakeLists.txt @@ -8,3 +8,10 @@ add_executable(SetLang bar.c) set_source_files_properties(foo.c bar.c PROPERTIES LANGUAGE CXX) target_link_libraries(SetLang foo) set_target_properties(SetLang PROPERTIES LINKER_LANGUAGE CXX) + +# VS generators historically tolerated target-wide -TP flags added +# by project code, so cover that case to preserve the behavior. +if(CMAKE_GENERATOR MATCHES "^Visual Studio" AND "x${CMAKE_C_COMPILER_ID}" STREQUAL "xMSVC") + add_library(stay stay_c.c stay_cxx.cxx) + set_property(TARGET stay PROPERTY COMPILE_OPTIONS "-TP") +endif() diff --git a/Tests/SetLang/stay_c.c b/Tests/SetLang/stay_c.c new file mode 100644 index 0000000..70755f3 --- /dev/null +++ b/Tests/SetLang/stay_c.c @@ -0,0 +1,8 @@ +#ifdef __cplusplus +# error C source incorrectly compiled as C++ +#endif + +int stay_c(void) +{ + return 0; +} diff --git a/Tests/SetLang/stay_cxx.cxx b/Tests/SetLang/stay_cxx.cxx new file mode 100644 index 0000000..e035260 --- /dev/null +++ b/Tests/SetLang/stay_cxx.cxx @@ -0,0 +1,8 @@ +#ifndef __cplusplus +# error C++ source incorrectly compiled as C +#endif + +int stay_cxx() +{ + return 0; +} diff --git a/Tests/SwiftOnly/CMakeLists.txt b/Tests/SwiftOnly/CMakeLists.txt index e24279b..41d14ea 100644 --- a/Tests/SwiftOnly/CMakeLists.txt +++ b/Tests/SwiftOnly/CMakeLists.txt @@ -35,3 +35,4 @@ target_link_libraries(N PUBLIC # Dummy to make sure generation works with such targets. add_library(SwiftIface INTERFACE) +target_link_libraries(SwiftOnly PRIVATE SwiftIface) diff --git a/Tests/UseSWIG/CMakeLists.txt b/Tests/UseSWIG/CMakeLists.txt index d102846..cd04a4a 100644 --- a/Tests/UseSWIG/CMakeLists.txt +++ b/Tests/UseSWIG/CMakeLists.txt @@ -91,6 +91,15 @@ add_test(NAME UseSWIG.MultiplePython COMMAND --build-options ${build_options} --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION> ) +add_test(NAME UseSWIG.MultipleFiles COMMAND + ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION> + --build-and-test + "${CMake_SOURCE_DIR}/Tests/UseSWIG/MultipleFiles" + "${CMake_BINARY_DIR}/Tests/UseSWIG/MultipleFiles" + ${build_generator_args} + --build-project TestMultipleFiles + --build-options ${build_options} + ) add_test(NAME UseSWIG.ModuleVersion2 COMMAND diff --git a/Tests/UseSWIG/MultipleFiles/CMakeLists.txt b/Tests/UseSWIG/MultipleFiles/CMakeLists.txt new file mode 100644 index 0000000..bf3d946 --- /dev/null +++ b/Tests/UseSWIG/MultipleFiles/CMakeLists.txt @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 3.18) + +project(TestMultipleFiles CXX) + +find_package(SWIG REQUIRED) +include(UseSWIG) + +unset(SWIG_LANG_TYPE) +unset(SWIG_LANG_INCLUDE_DIRECTORIES) +unset(SWIG_LANG_DEFINITIONS) +unset(SWIG_LANG_OPTIONS) +unset(SWIG_LANG_LIBRARIES) + +find_package(Python3 REQUIRED COMPONENTS Development) + +set_property(SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/add.i" PROPERTY CPLUSPLUS ON) +set_property(SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/sub.i" PROPERTY CPLUSPLUS ON) +set_property(SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/add.i" PROPERTY SWIG_MODULE_NAME _add) +set_property(SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/sub.i" PROPERTY SWIG_MODULE_NAME _sub) + + +swig_add_library(example + LANGUAGE python + TYPE MODULE + SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/add.i" + "${CMAKE_CURRENT_SOURCE_DIR}/sub.i" + "${CMAKE_CURRENT_SOURCE_DIR}/add.cxx" + "${CMAKE_CURRENT_SOURCE_DIR}/sub.cxx") +target_include_directories(example PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}") +target_link_libraries(example PRIVATE Python3::Module) diff --git a/Tests/UseSWIG/MultipleFiles/add.cxx b/Tests/UseSWIG/MultipleFiles/add.cxx new file mode 100644 index 0000000..a4dcca3 --- /dev/null +++ b/Tests/UseSWIG/MultipleFiles/add.cxx @@ -0,0 +1,6 @@ +#include "add.h" + +int add(int a, int b) +{ + return a + b; +} diff --git a/Tests/UseSWIG/MultipleFiles/add.h b/Tests/UseSWIG/MultipleFiles/add.h new file mode 100644 index 0000000..6295ab9 --- /dev/null +++ b/Tests/UseSWIG/MultipleFiles/add.h @@ -0,0 +1 @@ +int add(int a, int b); diff --git a/Tests/UseSWIG/MultipleFiles/add.i b/Tests/UseSWIG/MultipleFiles/add.i new file mode 100644 index 0000000..2046397 --- /dev/null +++ b/Tests/UseSWIG/MultipleFiles/add.i @@ -0,0 +1,4 @@ +%{ +#include "add.h" +%} +%include "add.h" diff --git a/Tests/UseSWIG/MultipleFiles/sub.cxx b/Tests/UseSWIG/MultipleFiles/sub.cxx new file mode 100644 index 0000000..d6874ef --- /dev/null +++ b/Tests/UseSWIG/MultipleFiles/sub.cxx @@ -0,0 +1,6 @@ +#include "sub.h" + +int sub(int a, int b) +{ + return a - b; +} diff --git a/Tests/UseSWIG/MultipleFiles/sub.h b/Tests/UseSWIG/MultipleFiles/sub.h new file mode 100644 index 0000000..de77111 --- /dev/null +++ b/Tests/UseSWIG/MultipleFiles/sub.h @@ -0,0 +1 @@ +int sub(int a, int b); diff --git a/Tests/UseSWIG/MultipleFiles/sub.i b/Tests/UseSWIG/MultipleFiles/sub.i new file mode 100644 index 0000000..fc70f10 --- /dev/null +++ b/Tests/UseSWIG/MultipleFiles/sub.i @@ -0,0 +1,5 @@ +%{ +#include "sub.h" +%} + +%include "sub.h" @@ -299,6 +299,7 @@ CMAKE_CXX_SOURCES="\ cmComputeLinkDepends \ cmComputeLinkInformation \ cmComputeTargetDepends \ + cmConsoleBuf \ cmConditionEvaluator \ cmConfigureFileCommand \ cmContinueCommand \ @@ -622,6 +623,8 @@ Configuration: --no-system-bzip2 use cmake-provided bzip2 library (default) --system-liblzma use system-installed liblzma library --no-system-liblzma use cmake-provided liblzma library (default) + --system-nghttp2 use system-installed nghttp2 library + --no-system-nghttp2 use cmake-provided nghttp2 library (default) --system-zstd use system-installed zstd library --no-system-zstd use cmake-provided zstd library (default) --system-libarchive use system-installed libarchive library @@ -866,10 +869,10 @@ while test $# != 0; do --init=*) cmake_init_file=`cmake_arg "$1"` ;; --system-libs) cmake_bootstrap_system_libs="${cmake_bootstrap_system_libs} -DCMAKE_USE_SYSTEM_LIBRARIES=1" ;; --no-system-libs) cmake_bootstrap_system_libs="${cmake_bootstrap_system_libs} -DCMAKE_USE_SYSTEM_LIBRARIES=0" ;; - --system-bzip2|--system-curl|--system-expat|--system-jsoncpp|--system-libarchive|--system-librhash|--system-zlib|--system-liblzma|--system-zstd|--system-libuv) + --system-bzip2|--system-curl|--system-expat|--system-jsoncpp|--system-libarchive|--system-librhash|--system-zlib|--system-liblzma|--system-nghttp2|--system-zstd|--system-libuv) lib=`cmake_arg "$1" "--system-"` cmake_bootstrap_system_libs="${cmake_bootstrap_system_libs} -DCMAKE_USE_SYSTEM_LIBRARY_`cmake_toupper $lib`=1" ;; - --no-system-bzip2|--no-system-curl|--no-system-expat|--no-system-jsoncpp|--no-system-libarchive|--no-system-librhash|--no-system-zlib|--no-system-liblzma|--no-system-zstd|--no-system-libuv) + --no-system-bzip2|--no-system-curl|--no-system-expat|--no-system-jsoncpp|--no-system-libarchive|--no-system-librhash|--no-system-zlib|--no-system-liblzma|--no-system-nghttp2|--no-system-zstd|--no-system-libuv) lib=`cmake_arg "$1" "--no-system-"` cmake_bootstrap_system_libs="${cmake_bootstrap_system_libs} -DCMAKE_USE_SYSTEM_LIBRARY_`cmake_toupper $lib`=0" ;; --qt-gui) cmake_bootstrap_qt_gui="1" ;; @@ -1179,7 +1182,7 @@ int check_cxx14() } #endif -#if (__cplusplus >= 201703L || defined(__INTEL_COMPILER) && defined(__cpp_if_constexpr)) +#if (__cplusplus >= 201703L || defined(__INTEL_COMPILER) && defined(__cpp_deduction_guides)) #include <optional> template <typename T, typename std::invoke_result<decltype(&T::get), T>::type = nullptr> |