Skip to content

Commit 1536827

Browse files
committed
vcxproj: automatically initialize the vcpkg system
We just introduced a way to build Git for Windows with MSVC on the command line using vcpkg-generated, up-to-date dependencies. Let's bring that convenience to the Visual Studio project, too. (The previous method, fetching NuGet packages, is fraught with problems: as C++ libraries have to be built for every architecture and for every toolset, the NuGet packages which we would like to consume fell behind and are not up-to-date with the current versions of the libraries, e.g. cURL and OpenSSL. By using vcpkg we avoid that problem, always building the newest dependency versions.) The trick is to initialize the VCPKG system once, and then build Git's dependencies using it. We do that by attaching a pre-build event to the libgit project (which is now the base project on which all others depend, therefore no other project is built in paralleli, side-stepping issues with vcpkg being unprepared for being run in parallel). Signed-off-by: Johannes Schindelin <[email protected]>
1 parent 04f2fb6 commit 1536827

File tree

3 files changed

+37
-56
lines changed

3 files changed

+37
-56
lines changed

config.mak.uname

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ vcxproj:
450450
# Make .vcxproj files and add them
451451
unset QUIET_GEN QUIET_BUILT_IN; \
452452
perl contrib/buildsystems/generate -g Vcxproj
453-
git add -f git.sln {*,*/lib,t/helper/*}/{packages.config,*.vcxproj}
453+
git add -f git.sln {*,*/lib,t/helper/*}/*.vcxproj
454454

455455
# Add common-cmds.h
456456
$(MAKE) MSVC=1 prefix=/mingw64 common-cmds.h

contrib/buildsystems/Generators/Vcxproj.pm

Lines changed: 34 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,12 @@ sub createProject {
126126
$cflags =~ s/</&lt;/g;
127127
$cflags =~ s/>/&gt;/g;
128128

129-
my $libs = '';
129+
my $libs_release = '';
130+
my $libs_debug = '';
130131
if (!$static_library) {
131-
$libs = join(";", sort(grep /^(?!libgit\.lib|xdiff\/lib\.lib|vcs-svn\/lib\.lib|libcurl\.lib|libeay32\.lib|libiconv\.lib|ssleay32\.lib|zlib\.lib)/, @{$$build_structure{"$prefix${name}_LIBS"}}));
132+
$libs_release = join(";", sort(grep /^(?!libgit\.lib|xdiff\/lib\.lib|vcs-svn\/lib\.lib)/, @{$$build_structure{"$prefix${name}_LIBS"}}));
133+
$libs_debug = $libs_release;
134+
$libs_debug =~ s/zlib\.lib/zlibd\.lib/;
132135
}
133136

134137
$defines =~ s/-D//g;
@@ -138,45 +141,6 @@ sub createProject {
138141

139142
die "Could not create the directory $target for $label project!\n" unless (-d "$target" || mkdir "$target");
140143

141-
use File::Copy;
142-
copy("$git_dir/compat/vcbuild/packages.config", "$target/packages.config");
143-
144-
my $needsCurl = grep(/libcurl.lib/, @{$$build_structure{"$prefix${name}_LIBS"}});
145-
my $targetsImport = '';
146-
my $targetsErrors = '';
147-
my $afterTargets = '';
148-
open F, "<$git_dir/compat/vcbuild/packages.config";
149-
while (<F>) {
150-
if (/<package id="([^"]+)" version="([^"]+)"/) {
151-
if ($1 eq 'libiconv') {
152-
# we have to link with the Release builds already because libiconv
153-
# is only available targeting v100 and v110, see
154-
# https://github.com/coapp-packages/libiconv/issues/2
155-
$libs .= ";$rel_dir\\compat\\vcbuild\\GEN.PKGS\\$1.$2\\build\\native\\lib\\v110\\\$(Platform)\\Release\\dynamic\\cdecl\\libiconv.lib";
156-
$afterTargets .= "\n <Copy SourceFiles=\"$rel_dir\\compat\\vcbuild\\GEN.PKGS\\$1.redist.$2\\build\\native\\bin\\v110\\\$(Platform)\\Release\\dynamic\\cdecl\\libiconv.dll\" DestinationFolder=\"\$(TargetDir)\" SkipUnchangedFiles=\"true\" />";
157-
} elsif ($needsCurl && $1 eq 'curl') {
158-
# libcurl is only available targeting v100 and v110
159-
$libs .= ";$rel_dir\\compat\\vcbuild\\GEN.PKGS\\$1.$2\\build\\native\\lib\\v110\\\$(Platform)\\Release\\dynamic\\libcurl.lib";
160-
$afterTargets .= "\n <Copy SourceFiles=\"$rel_dir\\compat\\vcbuild\\GEN.PKGS\\$1.redist.$2\\build\\native\\bin\\v110\\\$(Platform)\\Release\\dynamic\\libcurl.dll\" DestinationFolder=\"\$(TargetDir)\" SkipUnchangedFiles=\"true\" />";
161-
} elsif ($needsCurl && $1 eq 'expat') {
162-
# libexpat is only available targeting v100 and v110
163-
$libs .= ";$rel_dir\\compat\\vcbuild\\GEN.PKGS\\$1.$2\\build\\native\\lib\\v110\\\$(Platform)\\Release\\dynamic\\utf8\\libexpat.lib";
164-
} elsif ($1 eq 'zlib') {
165-
# zlib
166-
$libs .= ";$rel_dir\\compat\\vcbuild\\GEN.PKGS\\$1.v140.windesktop.msvcstl.dyn.rt-dyn.$2\\lib\\native\\v140\\windesktop\\msvcstl\\dyn\\rt-dyn\\x64\\RelWithDebInfo\\zlib.lib";
167-
} elsif ($1 eq 'openssl') {
168-
# openssl
169-
$libs .= ";$rel_dir\\compat\\vcbuild\\GEN.PKGS\\$1.v140.windesktop.msvcstl.dyn.rt-dyn.x64.$2\\lib\\native\\v140\\windesktop\\msvcstl\\dyn\\rt-dyn\\x64\\release\\libeay32.lib";
170-
$libs .= ";$rel_dir\\compat\\vcbuild\\GEN.PKGS\\$1.v140.windesktop.msvcstl.dyn.rt-dyn.x64.$2\\lib\\native\\v140\\windesktop\\msvcstl\\dyn\\rt-dyn\\x64\\release\\ssleay32.lib";
171-
}
172-
next if ($1 =~ /^(zlib$|openssl(?!.*(x64|x86)$))/);
173-
my $targetsFile = "$rel_dir\\compat\\vcbuild\\GEN.PKGS\\$1.$2\\build\\native\\$1.targets";
174-
$targetsImport .= "\n <Import Project=\"$targetsFile\" Condition=\"Exists('$targetsFile')\" />";
175-
$targetsErrors .= "\n <Error Condition=\"!Exists('$targetsFile')\" Text=\"\$([System.String]::Format('\$(ErrorText)', '$targetsFile'))\" />";
176-
}
177-
}
178-
close F;
179-
180144
open F, ">$vcxproj" or die "Could not open $vcxproj for writing!\n";
181145
binmode F, ":crlf :utf8";
182146
print F chr(0xFEFF);
@@ -204,6 +168,16 @@ sub createProject {
204168
<PropertyGroup Label="Globals">
205169
<ProjectGuid>$uuid</ProjectGuid>
206170
<Keyword>Win32Proj</Keyword>
171+
<VCPKGArch Condition="'\$(Platform)'=='Win32'">x86-windows</VCPKGArch>
172+
<VCPKGArch Condition="'\$(Platform)'!='Win32'">x64-windows</VCPKGArch>
173+
<VCPKGArchDirectory>$cdup\\compat\\vcbuild\\vcpkg\\installed\\\$(VCPKGArch)</VCPKGArchDirectory>
174+
<VCPKGBinDirectory Condition="'\(Configuration)'=='Debug'">\$(VCPKGArchDirectory)\\debug\\bin</VCPKGBinDirectory>
175+
<VCPKGLibDirectory Condition="'\(Configuration)'=='Debug'">\$(VCPKGArchDirectory)\\debug\\lib</VCPKGLibDirectory>
176+
<VCPKGBinDirectory Condition="'\(Configuration)'!='Debug'">\$(VCPKGArchDirectory)\\bin</VCPKGBinDirectory>
177+
<VCPKGLibDirectory Condition="'\(Configuration)'!='Debug'">\$(VCPKGArchDirectory)\\lib</VCPKGLibDirectory>
178+
<VCPKGIncludeDirectory>\$(VCPKGArchDirectory)\\include</VCPKGIncludeDirectory>
179+
<VCPKGLibs Condition="'\(Configuration)'=='Debug'">$libs_debug</VCPKGLibs>
180+
<VCPKGLibs Condition="'\(Configuration)'!='Debug'">$libs_release</VCPKGLibs>
207181
</PropertyGroup>
208182
<Import Project="\$(VCTargetsPath)\\Microsoft.Cpp.Default.props" />
209183
<PropertyGroup Condition="'\$(Configuration)'=='Debug'" Label="Configuration">
@@ -237,7 +211,7 @@ sub createProject {
237211
<ItemDefinitionGroup>
238212
<ClCompile>
239213
<AdditionalOptions>$cflags %(AdditionalOptions)</AdditionalOptions>
240-
<AdditionalIncludeDirectories>$includes;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
214+
<AdditionalIncludeDirectories>$cdup;$cdup\\compat;$cdup\\compat\\regex;$cdup\\compat\\win32;$cdup\\compat\\poll;$cdup\\compat\\vcbuild\\include;\$(VCPKGIncludeDirectory);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
241215
<EnableParallelCodeGeneration />
242216
<MinimalRebuild>true</MinimalRebuild>
243217
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
@@ -248,11 +222,22 @@ sub createProject {
248222
<SuppressStartupBanner>true</SuppressStartupBanner>
249223
</Lib>
250224
<Link>
251-
<AdditionalDependencies>$libs;\$(AdditionalDependencies)</AdditionalDependencies>
225+
<AdditionalLibraryDirectories>\$(VCPKGLibDirectory);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
226+
<AdditionalDependencies>\$(VCPKGLibs);\$(AdditionalDependencies)</AdditionalDependencies>
252227
<AdditionalOptions>invalidcontinue.obj %(AdditionalOptions)</AdditionalOptions>
253228
<ManifestFile>$cdup\\compat\\win32\\git.manifest</ManifestFile>
254229
<SubSystem>Console</SubSystem>
255230
</Link>
231+
EOM
232+
if ($target eq 'libgit') {
233+
print F << "EOM";
234+
<PreBuildEvent Condition="!Exists('$cdup\\compat\\vcbuild\\vcpkg')">
235+
<Message>Initialize VCPKG</Message>
236+
<Command>call "$cdup\\compat\\vcbuild\\vcpkg_install.bat" </Command>
237+
</PreBuildEvent>
238+
EOM
239+
}
240+
print F << "EOM";
256241
</ItemDefinitionGroup>
257242
<ItemDefinitionGroup Condition="'\$(Platform)'=='Win32'">
258243
<Link>
@@ -323,21 +308,15 @@ EOM
323308
EOM
324309
}
325310
print F << "EOM";
326-
<ItemGroup>
327-
<None Include="packages.config" />
328-
</ItemGroup>
329311
<Import Project="\$(VCTargetsPath)\\Microsoft.Cpp.targets" />
330-
<ImportGroup Label="ExtensionTargets">$targetsImport
331-
</ImportGroup>
332-
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
333-
<PropertyGroup>
334-
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
335-
</PropertyGroup>$targetsErrors
336-
</Target>
337312
EOM
338-
if (!$static_library && $afterTargets ne '') {
313+
if (!$static_library) {
339314
print F << "EOM";
340-
<Target Name="${target}_AfterBuild" AfterTargets="AfterBuild">$afterTargets
315+
<Target Name="${target}_AfterBuild" AfterTargets="AfterBuild">
316+
<ItemGroup>
317+
<DLLsAndPDBs Include="\$(VCPKGBinDirectory)\\*.dll;\$(VCPKGBinDirectory)\\*.pdb" />
318+
</ItemGroup>
319+
<Copy SourceFiles="@(DLLsAndPDBs)" DestinationFolder="\$(OutDir)" />
341320
</Target>
342321
EOM
343322
}

contrib/buildsystems/engine.pl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,8 @@ sub handleLinkLine
347347
push(@libs, "ssleay32.lib");
348348
} elsif ("$part" eq "-lcurl") {
349349
push(@libs, "libcurl.lib");
350+
} elsif ("$part" eq "-lexpat") {
351+
push(@libs, "expat.lib");
350352
} elsif ("$part" eq "-liconv") {
351353
push(@libs, "libiconv.lib");
352354
} elsif ($part =~ /^[-\/]/) {

0 commit comments

Comments
 (0)