1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-10 01:48:00 +00:00
putty-source/cmake
Simon Tatham d96a4983be gitcommit.cmake: work around Windows pathname aliasing.
The cmake script that determines the current git head commit, in order
to bake it into the binaries for development builds from a git
checkout, wasn't working reliably on Windows: sometimes it reported
that the source directory didn't seem to be a git repository, when in
fact it was.

This occurred because gitcommit.cmake starts by trying to work out
_whether_ the source directory is the top level of a git worktree at
all, by the technique of running `git rev-parse --show-toplevel` (to
print the top-level path of the git worktree _containing_ $PWD, if
any) and comparing it with ${CMAKE_SOURCE_DIR}. But the comparison was
done as a plain string, which leads to problems if more than one
string can represent the same actual directory.

On Windows, this can occur for two reasons that I know of. One reason
is related to Windows itself: if you map a network file server path to
a local drive letter, then the same directory is accessible as a UNC
path (e.g. \\hostname\share\subdir) and via the drive letter (e.g.
N:\subdir). And it can happen that CMAKE_SOURCE_DIR and git's output
disagree on which representation to use, causing the string comparison
to return a false negative.

(This can also affect filesystems in a WSL instance, accessed from
native Windows via \\wsl$\instance\path, because Windows implements
that as a network file share even though the network in question is
purely in the imagination of that one machine.)

The other reason is related more specifically to git, because some
versions of Windows git are built on top of MSYS or MINGW or that kind
of shim layer, and model Windows drive letters as subdirectories of a
Unixlike VFS root. So you might also find that the two strings
disagree on whether you're in C:\Users\alice\src\putty or
/c/Users/alice/src/putty.

I think this commit should work around both of these problems. Reading
the man page for `git rev-parse` more carefully, it has an option
`--show-cdup`, which returns a _relative_ path from $PWD to the
top-level directory of the worktree: that is, it will be a sequence of
`../../..` as long as necessary, including length zero. So you can use
that to directly query whether you're at the top of a git worktree: if
`git rev-parse --show-cdup` returns the empty string and a success
status, then you are. (If you're deeper in a worktree it will return a
non-empty string, and if you're not in a worktree at all it will
return a failure status and print an error message to stderr.)
2024-12-27 10:07:32 +00:00
..
platforms Windows: inhibit all default application manifests. 2024-12-16 18:44:47 +00:00
cmake.h.in Arm: turn on PSTATE.DIT if available and needed. 2024-12-19 08:52:47 +00:00
gitcommit.cmake gitcommit.cmake: work around Windows pathname aliasing. 2024-12-27 10:07:32 +00:00
gtk.cmake Fix build failure on Debian bullseye from last commit. 2024-09-08 19:05:45 +01:00
licence.cmake Replace mkfiles.pl with a CMake build system. 2021-04-17 13:53:02 +01:00
setup.cmake Side-channel tester: align memory allocations. 2024-04-01 13:10:49 +01:00
toolchain-mingw.cmake Reinstate __USE_MINGW_ANSI_STDIO for MinGW builds. 2022-08-29 17:22:28 +01:00
toolchain-winegcc.cmake Replace mkfiles.pl with a CMake build system. 2021-04-17 13:53:02 +01:00
winegcc Fix breakage in winegcc build script. 2023-08-19 08:58:36 +01:00