WINDOWS_EXPORT_ALL_SYMBOLS reads object files with two backends: on
Windows hosts CMake walks the COFF symbol table itself, elsewhere (and
for LLVM bitcode) it parses `nm` output. Only the walker applied the
rules the MSVC ABI needs, so a DLL cross-compiled from Linux or macOS
exported a different set of symbols than the same sources built on
Windows.
Move every rule that depends only on the symbol name into one place
used by both backends, and teach the nm backend the rest: skip
deleting destructors (`??_G`, `??_E`), export vftables (`??_7`) as code
except on ARM64EC where they are DATA, ignore common symbols, and strip
i386 decorations. The machine type these need is read from the COFF
file header, once per object file.
The expected output of the nm symbol-type test changes accordingly.
Add a test running `cmake -E __create_def` over checked-in objects for
x86_64, i386 and ARM64EC against expected .def files, so one
expectation pins both backends.
Fixes: #28103
Provide a `.devcontainer` definition, following the Dev Container
Specification, to give contributors a ready-made Linux environment with
the tools needed to build CMake, run its test suite, build its
documentation, and satisfy its style rules.
Base the container on Ubuntu, which offers the broadest ecosystem of
packages and tooling for development, including a recent `cmake` and the
`clang-format` version our style rules require, exactly. Mirror the
package lists of the Debian image our CI infrastructure uses, section by
section, so that the dependencies available closely match the ones
against which merge requests are tested. Build the image the way the
images under `.gitlab/ci/docker/` are built: bind mount the package
lists and the installation script rather than copying them in, and cache
the package lists and downloaded archives so that a rebuild fetches only
what has changed.
Run optional `.devcontainer/hooks/root.sh` and
`.devcontainer/hooks/user.sh` scripts, both ignored by Git, so that
developers may customize the container without modifying tracked files.
Document usage in a new `Help/dev/devcontainer.rst`.
Fixes: #28043
Exclude infrastructure added by commit 61743471d9 (ast-grep: add a rule
to find adjacent string literals in cmStrCat calls, 2025-05-15,
v4.1.0-rc1~122^2~3).
The `CreateProcessW` documentation states "to run a batch file, you must
start the command interpreter". Use `cmd /c the.bat` to run batch files.
Also, use a "short path" to the `.bat` file if needed to avoid spaces.
Previously this worked in some cases only due to undocumented behavior
of `CreateProcessW` when given a `.bat` file.
Fixes: #26655
This presents value semantics for a stack of constant values.
Internally it shares ownership to avoid copies. Previously
this was implemented by `cmListFileBacktrace` explicitly,
but the approach can be re-used for other kinds of stacks.
A .editorconfig file allows many editors (e.g. Visual Studio Code)
to autoconfigure themselves based on its contents. This avoids
some formatting issues in PRs because editors will do the right
thing by default with a .editorconfig file available in the repo.
The `Modules/CPack.background.png.in` file was originally added by
commit f2c0dbd164 (ENH: More work on the packaging. Add Applicaitons,
add icons, etc, 2007-02-13, v2.6.0~2217). Then it was removed
accidentally by commit 5308afa3f7 (ENH: remove unused file, 2009-03-03,
v2.8.0~963) and restored by commit f9dd6a38c5 (ENH: add file back bug
use cmake image, 2009-03-04, v2.8.0~958) but with corruption.
Restore the original image file and add a Git attribute to prevent
newline conversion as we do for other `.png` files.
Update `.clang-format` with configuration to make the 6.0 format as
close as possible to what 3.8 produced before. Then revise the style:
* Indent preprocessor directives (a feature new since 3.8)
* Add a newline and indentation before inheritance `:` and `,`
Rename the Git attribute identifying the format to include the
clang-format version number: `format.clang-format-6.0`. This will aid
external infrastructure in knowing what version of the tool to run.
The `crlf` attribute is deprecated in Git. This also changes the given
files to be in the index using LF newlines, but they will be checked
out with CRLF newlines due to the attribute.
* Add AppContainerApplication to non-UTILITY targets
* Generate app manifest and related files if project does not provide them.
Place them in a per-target directory to avoid clashes.
* Mark WinRT components with WinMDAssembly
* Import Windows Phone 8.0 targets in .vcxproj files when necessary,
and reference platform.winmd.
Inspired-by: Paul Annetts <paul@lightunobscured.com>
Teach the Windows-GNU.cmake platform file to look for Visual Studio
tools matching the target ABI. Add an extra step to the link command
for shared libraries and executables that export symbols and on which a
new GNUtoMS property is set (initialized by the CMAKE_GNUtoMS option).
Tell the GNU linker to output a module definition (.def) file listing
exported symbols in addition to the GNU-format import library (.dll.a).
Pass the .def file to the MS "lib" tool to construct a MS-format DLL
import library (.lib).
Teach the install(TARGETS) command to install the MS import library next
to the GNU one. Teach the install(EXPORT) and export() command to set
the IMPORTED_IMPLIB property pointing at the import library to use the
import library matching the tools in the importing project.