-
Notifications
You must be signed in to change notification settings - Fork 156
Fix incorrectly reported CPU in 32-bit Windows #121
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
We cannot rely on `uname -m` in Git for Windows' SDK to tell us what architecture we are compiling for, as we can compile both 32-bit and 64-bit `git.exe` from a 64-bit SDK, but the `uname -m` in that SDK will always report `x86_64`. So let's go back to our original design. And make it explicitly Windows-specific. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
/submit |
Submitted as pull.121.git.gitgitgadget@gmail.com |
On the Git mailing list, Junio C Hamano wrote (reply to this):
|
This branch is now known as |
This patch series was integrated into pu via git@3b5a46c. |
On the Git mailing list, Johannes Schindelin wrote (reply to this):
|
This patch series was integrated into pu via git@9cef9f0. |
This patch series was integrated into next via git@cbd8634. |
#include <wchar.h> | ||
typedef _sigset_t sigset_t; | ||
#endif | ||
#include <winsock2.h> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On the Git mailing list, Eric Sunshine wrote (reply to this):
On Thu, Feb 7, 2019 at 5:46 AM Johannes Schindelin via GitGitGadget
<gitgitgadget@gmail.com> wrote:
> We cannot rely on `uname -m` in Git for Windows' SDK to tell us what
> architecture we are compiling for, as we can compile both 32-bit and
> 64-bit `git.exe` from a 64-bit SDK, but the `uname -m` in that SDK will
> always report `x86_64`.
>
> So let's go back to our original design. And make it explicitly
> Windows-specific.
b22894049f (version --build-options: also report host CPU, 2017-12-15)
took this sort of case into consideration by introducing Makefile
variable HOST_CPU (which takes precedence over `uname -m`), with the
intention that, when cross-compiling, your build environment should
(somehow) set HOST_CPU to the canonical name of the CPU on which the
built Git will run (for instance, "x86_64" or "i686"). It would be
nice to employ this mechanism to solve this issue rather than
(re-)introducing a manually-maintained list of CPU names.
Can you say a few words (here in the email thread) about how the Git
for Windows SDK is instructed to build for one architecture or the
other? With such information, perhaps we can figure out how to get the
build environment itself to set HOST_CPU automatically so we don't
have to resort to and worry about maintenance costs of a hard-coded
CPU name list.
> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
> ---
> diff --git a/compat/mingw.h b/compat/mingw.h
> @@ -6,6 +6,25 @@ typedef _sigset_t sigset_t;
> +#ifdef __MINGW64_VERSION_MAJOR
> +/*
> + * In Git for Windows, we cannot rely on `uname -m` to report the correct
> + * architecture: /usr/bin/uname.exe will report the architecture with which the
> + * current MSYS2 runtime was built, not the architecture for which we are
> + * currently compiling (both 32-bit and 64-bit `git.exe` is built in the 64-bit
> + * Git for Windows SDK).
> + */
> +#undef GIT_HOST_CPU
> +/* This was figured out by looking at `cpp -dM </dev/null`'s output */
> +#if defined(__x86_64__)
> +#define GIT_HOST_CPU "x86_64"
> +#elif defined(__i686__)
> +#define GIT_HOST_CPU "i686"
> +#else
> +#error "Unknown architecture"
> +#endif
> +#endif
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On the Git mailing list, Johannes Schindelin wrote (reply to this):
Hi Eric,
On Fri, 8 Feb 2019, Eric Sunshine wrote:
> On Thu, Feb 7, 2019 at 5:46 AM Johannes Schindelin via GitGitGadget
> <gitgitgadget@gmail.com> wrote:
> > We cannot rely on `uname -m` in Git for Windows' SDK to tell us what
> > architecture we are compiling for, as we can compile both 32-bit and
> > 64-bit `git.exe` from a 64-bit SDK, but the `uname -m` in that SDK will
> > always report `x86_64`.
> >
> > So let's go back to our original design. And make it explicitly
> > Windows-specific.
>
> b22894049f (version --build-options: also report host CPU, 2017-12-15)
> took this sort of case into consideration by introducing Makefile
> variable HOST_CPU (which takes precedence over `uname -m`), with the
> intention that, when cross-compiling, your build environment should
> (somehow) set HOST_CPU to the canonical name of the CPU on which the
> built Git will run (for instance, "x86_64" or "i686"). It would be
> nice to employ this mechanism to solve this issue rather than
> (re-)introducing a manually-maintained list of CPU names.
Heh, this is also manually-maintained, but I agree that it is cleaner.
> Can you say a few words (here in the email thread) about how the Git
> for Windows SDK is instructed to build for one architecture or the
> other?
To cross-compile a 32-bit Git in a 64-bit Git for Windows SDK, use this
incantation:
MSYSTEM=MINGW32 PATH=/mingw32/bin:$PATH make
> With such information, perhaps we can figure out how to get the build
> environment itself to set HOST_CPU automatically so we don't have to
> resort to and worry about maintenance costs of a hard-coded CPU name
> list.
Indeed, we can set HOST_CPU in the same conditionals as prefix (which is
/mingw32 for 32-bit and /mingw64 for 64-bit) in config.mak.uname.
Patch incoming,
Dscho
> > Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
> > ---
> > diff --git a/compat/mingw.h b/compat/mingw.h
> > @@ -6,6 +6,25 @@ typedef _sigset_t sigset_t;
> > +#ifdef __MINGW64_VERSION_MAJOR
> > +/*
> > + * In Git for Windows, we cannot rely on `uname -m` to report the correct
> > + * architecture: /usr/bin/uname.exe will report the architecture with which the
> > + * current MSYS2 runtime was built, not the architecture for which we are
> > + * currently compiling (both 32-bit and 64-bit `git.exe` is built in the 64-bit
> > + * Git for Windows SDK).
> > + */
> > +#undef GIT_HOST_CPU
> > +/* This was figured out by looking at `cpp -dM </dev/null`'s output */
> > +#if defined(__x86_64__)
> > +#define GIT_HOST_CPU "x86_64"
> > +#elif defined(__i686__)
> > +#define GIT_HOST_CPU "i686"
> > +#else
> > +#error "Unknown architecture"
> > +#endif
> > +#endif
>
This patch series was integrated into pu via git@71e4413. |
This patch series was integrated into pu via git@6951c5f. |
This patch series was integrated into next via git@6951c5f. |
This patch series was integrated into master via git@6951c5f. |
Closed via 6951c5f. |
While in review, Git for Windows' original design was changed, to use the output of
uname -m
instead of (necessarily incomplete) pre-processor magic to determine which CPU to report.Both 32-bit and 64-bit versions of Git for Windows are built in the 64-bit Git for Windows SDK, however, whose
uname -m
always reportsx86_64
. Even for 32-bit Git for Windows.Let's fix that by going back to the pre-processor magic, making it specific to Git for Windows' SDK (where it actually is complete).
This is yet another patch I forgot to upstream, and I hope that it will make it into v2.21.0-rc1.