a4173ef165 Tests: Enable coverage of special chars in include dirs for Makefiles
d74e651b78 Makefiles: Re-implement makefile target path escaping and quoting
031bfaa865 Makefiles: Factor out makefile target path escaping and quoting
ca343dad07 Makefiles: Convert paths with '#' on command-lines to short path on Windows
af7de05853 Makefiles: Do not use '\#' escape sequence with Windows-style make tools
1639ee70ef cmDepends: Update types to always use a Makefile generator
413d26030f cmGlobalNinjaGenerator: Remove outdated comment
Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !4605
Simplifies CUDA target architecture handling.
Required for Clang support as Clang doesn't automatically select a supported architecture.
We detect a supported architecture during compiler identification and set CMAKE_CUDA_ARCHITECTURES to it.
Introduces CMP0104 for backwards compatibility with manually setting code generation flags with NVCC.
Implements #17963.
Previously we used `cmSystemTools::ConvertToOutputPath` which internally
used KWSys methods
* SystemTools::ConvertToUnixOutputPath
* SystemTools::ConvertToWindowsOutputPath
These were written in very early days of CMake and have some
limitations:
* They do not encode all characters. E.g. '#' is left out.
* They attempt to do some path cleanup and handle existing quotes.
These days CMake has clean unquoted paths already.
* They attempted to encode paths both for makefile targets and
for shell command lines. The latter use has mostly been replaced.
* Choosing between the two methods depends on a global variable!
Several code paths in CMake have to copy the global generator's
member ForceUnixPaths variable over to the cmSystemTools global.
Re-implement the `ConvertToMakefilePath` method to drop use of those
methods. Compute suitable makefile target path escaping and quoting
via local logic. Add support for more characters like '#'.
Fixes: #20555
Code paths that write makefile target paths use a combination of
`cmSystemTools::ConvertToOutputPath` and `cmMakeSafe`. Some were
missing the latter. Wrap these two steps up into a dedicated
`ConvertToMakefilePath` method provided on both the local and global
generators.
In `ConvertToOutputForExisting` we convert paths with spaces to short
paths on Windows for use on command lines, e.g. for include directories.
Do the same for paths with `#` since tools like NMake do not have a way
to reliably put `#` in variable assignments.
Since commit fbf7a92975 (Makefile: Handle '#' in COMPILE_OPTIONS,
2014-08-12, v3.1.0-rc1~174^2) we escape `#` as `\#` in `flags.make`
variable assignments so that they are not treated as a comment.
Windows-style make tools like NMake do not interpret backslashes
in that way. Other means will be needed to handle `#` in contexts
where it is even possible. The test suite is not covering this
for NMake anyway, and actually has a workaround in `Tests/TryCompile`
for the old behavior, which we can now update.