ed712ef8d5
To build with MSVC, we "translate" GCC options to MSVC options, and part of those options refer to the libraries to link into the final executable. Currently, this part looks somewhat like this on Windows: -lcurl -lnghttp2 -lidn2 -lssl -lcrypto -lssl -lcrypto -lgdi32 -lcrypt32 -lwldap32 -lz -lws2_32 -lexpat Some of those are direct dependencies (such as curl and ssl) and others are indirect (nghttp2 and idn2, for example, are dependencies of curl, but need to be linked in for reasons). We already handle the direct dependencies, e.g. `-liconv` is already handled as adding `libiconv.lib` to the list of libraries to link against. Let's just ignore the remaining `-l*` options so that MSVC does not have to warn us that it ignored e.g. the `/lnghttp2` option. We do that by extending the clause that already "eats" the `-R*` options to also eat the `-l*` options. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
86 lines
2.3 KiB
Perl
Executable File
86 lines
2.3 KiB
Perl
Executable File
#!/usr/bin/perl -w
|
|
######################################################################
|
|
# Compiles or links files
|
|
#
|
|
# This is a wrapper to facilitate the compilation of Git with MSVC
|
|
# using GNU Make as the build system. So, instead of manipulating the
|
|
# Makefile into something nasty, just to support non-space arguments
|
|
# etc, we use this wrapper to fix the command line options
|
|
#
|
|
# Copyright (C) 2009 Marius Storm-Olsen <mstormo@gmail.com>
|
|
######################################################################
|
|
use strict;
|
|
my @args = ();
|
|
my @cflags = ();
|
|
my @lflags = ();
|
|
my $is_linking = 0;
|
|
my $is_debug = 0;
|
|
while (@ARGV) {
|
|
my $arg = shift @ARGV;
|
|
if ("$arg" eq "-DDEBUG") {
|
|
# Some vcpkg-based libraries have different names for release
|
|
# and debug versions. This hack assumes that -DDEBUG comes
|
|
# before any "-l*" flags.
|
|
$is_debug = 1;
|
|
}
|
|
if ("$arg" =~ /^-[DIMGOZ]/) {
|
|
push(@cflags, $arg);
|
|
} elsif ("$arg" eq "-o") {
|
|
my $file_out = shift @ARGV;
|
|
if ("$file_out" =~ /exe$/) {
|
|
$is_linking = 1;
|
|
# Create foo.exe and foo.pdb
|
|
push(@args, "-OUT:$file_out");
|
|
} else {
|
|
# Create foo.o and foo.o.pdb
|
|
push(@args, "-Fo$file_out");
|
|
push(@args, "-Fd$file_out.pdb");
|
|
}
|
|
} elsif ("$arg" eq "-lz") {
|
|
if ($is_debug) {
|
|
push(@args, "zlibd.lib");
|
|
} else{
|
|
push(@args, "zlib.lib");
|
|
}
|
|
} elsif ("$arg" eq "-liconv") {
|
|
push(@args, "libiconv.lib");
|
|
} elsif ("$arg" eq "-lcrypto") {
|
|
push(@args, "libeay32.lib");
|
|
} elsif ("$arg" eq "-lssl") {
|
|
push(@args, "ssleay32.lib");
|
|
} elsif ("$arg" eq "-lcurl") {
|
|
my $lib = "";
|
|
# Newer vcpkg definitions call this libcurl_imp.lib; Do we
|
|
# need to use that instead?
|
|
foreach my $flag (@lflags) {
|
|
if ($flag =~ /^-LIBPATH:(.*)/) {
|
|
foreach my $l ("libcurl_imp.lib", "libcurl.lib") {
|
|
if (-f "$1/$l") {
|
|
$lib = $l;
|
|
last;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
push(@args, $lib);
|
|
} elsif ("$arg" eq "-lexpat") {
|
|
push(@args, "expat.lib");
|
|
} elsif ("$arg" =~ /^-L/ && "$arg" ne "-LTCG") {
|
|
$arg =~ s/^-L/-LIBPATH:/;
|
|
push(@lflags, $arg);
|
|
} elsif ("$arg" =~ /^-[Rl]/) {
|
|
# eat
|
|
} else {
|
|
push(@args, $arg);
|
|
}
|
|
}
|
|
if ($is_linking) {
|
|
push(@args, @lflags);
|
|
unshift(@args, "link.exe");
|
|
} else {
|
|
unshift(@args, "cl.exe");
|
|
push(@args, @cflags);
|
|
}
|
|
printf(STDERR "**** @args\n\n\n") if (!defined($ENV{'QUIET_GEN'}));
|
|
exit (system(@args) != 0);
|