OpenSSL::config: determine the MSVC target architecture by asking cl

Since cl knows what architecture it builds fore, all depending on what
the user set up, it makes sense to ask it, and use that result primarly,
and only use the POSIX::uname() MACHINE value as a fallback.

Also, this does indeed determine if cl is present or not.

We drop the explicit names in .github/workflows/windows.yml as proof
of concept.

Fixes #19281

Reviewed-by: Hugo Landau <hlandau@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/19285)
This commit is contained in:
Richard Levitte 2022-09-27 18:31:15 +02:00 committed by Hugo Landau
parent 2de00f4f1e
commit 0747f94b5f
2 changed files with 47 additions and 6 deletions

View File

@ -22,9 +22,9 @@ jobs:
- windows-2022
platform:
- arch: win64
config: VC-WIN64A enable-fips
config: enable-fips
- arch: win32
config: VC-WIN32 --strict-warnings no-fips
config: --strict-warnings no-fips
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v2
@ -95,7 +95,7 @@ jobs:
- name: config
working-directory: _build
run: |
perl ..\Configure --banner=Configured no-makedepend no-bulk no-deprecated no-fips no-asm -DOPENSSL_SMALL_FOOTPRINT VC-WIN64A
perl ..\Configure --banner=Configured no-makedepend no-bulk no-deprecated no-fips no-asm -DOPENSSL_SMALL_FOOTPRINT
perl configdata.pm --dump
- name: build
working-directory: _build

View File

@ -32,6 +32,7 @@ my $SYSTEM;
my $VERSION;
my $CCVENDOR;
my $CCVER;
my $CL_ARCH;
my $GCC_BITS;
my $GCC_ARCH;
@ -378,6 +379,22 @@ sub determine_compiler_settings {
$CCVER = $v;
}
}
# 'Windows NT' is the system name according to POSIX::uname()!
if ( $SYSTEM eq "Windows NT" ) {
# favor vendor cl over gcc
if (IPC::Cmd::can_run('cl')) {
$CC = 'cl';
$CCVENDOR = ''; # Determine later
$CCVER = 0;
my $v = `cl 2>&1`;
if ( $v =~ /Microsoft .* Version ([0-9\.]+) for (x86|x64|ARM|ia64)/ ) {
$CCVER = $1;
$CL_ARCH = $2;
}
}
}
}
# If no C compiler has been determined at this point, we die. Hard.
@ -884,9 +901,33 @@ EOF
],
# Windows values found by looking at Perl 5's win32/win32.c
[ 'amd64-.*?-Windows NT', { target => 'VC-WIN64A' } ],
[ 'ia64-.*?-Windows NT', { target => 'VC-WIN64I' } ],
[ 'x86-.*?-Windows NT', { target => 'VC-WIN32' } ],
[ '(amd64|ia64|x86|ARM)-.*?-Windows NT',
sub {
# If we determined the arch by asking cl, take that value,
# otherwise the SYSTEM we got from from POSIX::uname().
my $arch = $CL_ARCH // $1;
my $config;
if ($arch) {
$config = { 'amd64' => { target => 'VC-WIN64A' },
'ia64' => { target => 'VC-WIN64I' },
'x86' => { target => 'VC-WIN32' },
'x64' => { target => 'VC-WIN64A' },
'ARM' => { target => 'VC-WIN64-ARM' },
} -> {$arch};
die <<_____ unless defined $config;
ERROR
I do not know how to handle ${arch}.
_____
}
die <<_____ unless defined $config;
ERROR
Could not figure out the architecture.
_____
return $config;
}
],
# VMS values found by observation on existing machinery.
# Unfortunately, the machine part is a bit... overdone. It seems,