From a78e1c5bbf9d3d27fb5c2a4d4f115290a4954b1b Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Mon, 4 Dec 2017 20:43:23 +0100 Subject: [PATCH 01/12] contrib/buildsystems: error out on unknown option One time too many did this developer call the `generate` script passing a `--make-out=` option that was happily ignored (because there should be a space, not an equal sign, between `--make-out` and the path). And one time too many, this script not only ignored it but did not even complain. Let's fix that. Signed-off-by: Johannes Schindelin --- contrib/buildsystems/engine.pl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contrib/buildsystems/engine.pl b/contrib/buildsystems/engine.pl index 6cfaedb029..35fd05633a 100755 --- a/contrib/buildsystems/engine.pl +++ b/contrib/buildsystems/engine.pl @@ -57,6 +57,8 @@ while (@ARGV) { open(F, "<$infile") || die "Couldn't open file $infile"; @makedry = ; close(F); + } else { + die "Unknown option: " . $arg; } } From 55ffe1cfc46f17b9af98b12b16d071ac0fed894d Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Mon, 4 Dec 2017 20:47:24 +0100 Subject: [PATCH 02/12] contrib/buildsystems: redirect stderr into the correct directory The script assumes that we're in the top-level directory of the checkout. That does not need to be true. Signed-off-by: Johannes Schindelin --- contrib/buildsystems/engine.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/buildsystems/engine.pl b/contrib/buildsystems/engine.pl index 35fd05633a..9f4e7a2ccb 100755 --- a/contrib/buildsystems/engine.pl +++ b/contrib/buildsystems/engine.pl @@ -82,7 +82,7 @@ EOM # Capture the make dry stderr to file for review (will be empty for a release build). my $ErrsFile = "msvc-build-makedryerrors.txt"; -@makedry = `cd $git_dir && make -n MSVC=1 V=1 2>$ErrsFile` if !@makedry; +@makedry = `make -C $git_dir -n MSVC=1 V=1 2>$ErrsFile` if !@makedry; # test for an empty Errors file and remove it unlink $ErrsFile if -f -z $ErrsFile; From 85fda739dfb9fd7f88fd46e7fbf4b1f04fdbbc29 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Tue, 28 Nov 2017 18:02:51 +0100 Subject: [PATCH 03/12] Mark .bat files as requiring CR/LF endings Signed-off-by: Johannes Schindelin --- .gitattributes | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitattributes b/.gitattributes index 1bdc91e282..9fc30e5c76 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5,6 +5,7 @@ *.pl eof=lf diff=perl *.pm eol=lf diff=perl *.py eol=lf diff=python +*.bat eol=crlf /Documentation/git-*.txt eol=lf /command-list.txt eol=lf /GIT-VERSION-GEN eol=lf From 4ee8d34ff686fc395a47e9f2291443575ee5293b Mon Sep 17 00:00:00 2001 From: Jeff Hostetler Date: Tue, 19 Sep 2017 12:56:21 -0400 Subject: [PATCH 04/12] vcpkg: get MSVC dependencies with vcpkg rather than nuget Dependencies such as cURL and OpenSSL are necessary to build and run Git. Previously, we obtained those dependencies by fetching NuGet packages. However, it is notoriously hard to keep NuGet packages of C/C++ libraries up-to-date, as the toolsets for different Visual Studio versions are different, and the NuGet packages would have to ship them all. That is the reason why the NuGet packages we use are quite old, and even insecure in the case of cURL and OpenSSL (the versions contain known security flaws that have been addressed by later versions for which no NuGet packages are available). The better way to handle this situation is to use the vcpkg system: https://github.com/Microsoft/vcpkg The idea is that a single Git repository contains enough supporting files to build up-to-date versions of a large number of Open Source libraries on demand, including cURL and OpenSSL. We integrate this system via four new .bat files to 1) initialize the vcpkg system, 2) build the packages, 4) set up Git's Makefile system to find the build artifacts, and 3) copy the artifacts into the top-level directory We now also completely convert the pathname exported in the %msvc_bin_dir_msys% variable to MSYS format with forward slashes rather than a mixture of forward and back slashes. This solves an obscure problem observed by some developers: [...] http-push.c CC remote-curl.o remote-curl.c * new script parameters GEN git-instaweb sed: -e expression #7, char 155: invalid reference \2 on `s' command's RHS make: *** [Makefile:2023: git-instaweb] Error 1 Signed-off-by: Jeff Hostetler Signed-off-by: Johannes Schindelin --- .gitignore | 1 - Makefile | 13 ++--- compat/vcbuild/.gitignore | 4 +- compat/vcbuild/README | 51 +++++++++++++++++++ compat/vcbuild/find_vs_env.bat | 6 ++- compat/vcbuild/scripts/clink.pl | 15 +++++- compat/vcbuild/vcpkg_copy_dlls.bat | 39 ++++++++++++++ compat/vcbuild/vcpkg_install.bat | 81 ++++++++++++++++++++++++++++++ config.mak.uname | 27 ++++++---- t/test-lib.sh | 3 -- 10 files changed, 215 insertions(+), 25 deletions(-) create mode 100644 compat/vcbuild/vcpkg_copy_dlls.bat create mode 100644 compat/vcbuild/vcpkg_install.bat diff --git a/.gitignore b/.gitignore index 650351389d..33c645e3fe 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ /GIT-BUILD-OPTIONS /GIT-CFLAGS /GIT-LDFLAGS -/GIT-MSVC-GEN /GIT-PREFIX /GIT-PERL-DEFINES /GIT-PERL-HEADER diff --git a/Makefile b/Makefile index eeb33bbacb..d1ff76ac3a 100644 --- a/Makefile +++ b/Makefile @@ -2602,9 +2602,6 @@ ifdef GIT_INTEROP_MAKE_OPTS endif ifdef TEST_GIT_INDEX_VERSION @echo TEST_GIT_INDEX_VERSION=\''$(subst ','\'',$(subst ','\'',$(TEST_GIT_INDEX_VERSION)))'\' >>$@+ -endif -ifdef MSVC_DEPS - @echo MSVC_DEPS=\''$(subst ','\'',$(subst ','\'',$(MSVC_DEPS)))'\' >>$@+ endif @if cmp $@+ $@ >/dev/null 2>&1; then $(RM) $@+; else mv $@+ $@; fi @@ -2754,8 +2751,6 @@ install: all $(INSTALL) -m 644 $(SCRIPT_LIB) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' $(INSTALL) $(install_bindir_programs) '$(DESTDIR_SQ)$(bindir_SQ)' ifdef MSVC - $(INSTALL) compat/vcbuild/GEN.DEPS/bin/*.dll '$(DESTDIR_SQ)$(bindir_SQ)' - $(INSTALL) compat/vcbuild/GEN.DEPS/bin/*.pdb '$(DESTDIR_SQ)$(bindir_SQ)' # We DO NOT install the individual foo.o.pdb files because they # have already been rolled up into the exe's pdb file. # We DO NOT have pdb files for the builtin commands (like git-status.exe) @@ -2978,9 +2973,15 @@ endif ifdef MSVC $(RM) $(patsubst %.o,%.o.pdb,$(OBJECTS)) $(RM) $(patsubst %.exe,%.pdb,$(OTHER_PROGRAMS)) + $(RM) $(patsubst %.exe,%.iobj,$(OTHER_PROGRAMS)) + $(RM) $(patsubst %.exe,%.ipdb,$(OTHER_PROGRAMS)) $(RM) $(patsubst %.exe,%.pdb,$(PROGRAMS)) + $(RM) $(patsubst %.exe,%.iobj,$(PROGRAMS)) + $(RM) $(patsubst %.exe,%.ipdb,$(PROGRAMS)) $(RM) $(patsubst %.exe,%.pdb,$(TEST_PROGRAMS)) - $(RM) GIT-MSVC-GEN + $(RM) $(patsubst %.exe,%.iobj,$(TEST_PROGRAMS)) + $(RM) $(patsubst %.exe,%.ipdb,$(TEST_PROGRAMS)) + $(RM) compat/vcbuild/MSVC-DEFS-GEN endif .PHONY: all install profile-clean cocciclean clean strip diff --git a/compat/vcbuild/.gitignore b/compat/vcbuild/.gitignore index e14691508e..8f8b794ef3 100644 --- a/compat/vcbuild/.gitignore +++ b/compat/vcbuild/.gitignore @@ -1 +1,3 @@ -GEN.* +/vcpkg/ +/MSVC-DEFS-GEN +/VCPKG-DEFS diff --git a/compat/vcbuild/README b/compat/vcbuild/README index 60fd873fe8..2ea3da97f4 100644 --- a/compat/vcbuild/README +++ b/compat/vcbuild/README @@ -1,3 +1,54 @@ +The Steps to Build Git with VS2015 or VS2017 from the command line. + +1. Install the "vcpkg" open source package manager and build essential + third-party libaries. The steps for this have been captured in a + set of convenience scripts. These can be run from a stock Command + Prompt or from an SDK bash window: + + $ cd + $ ./compat/vcbuild/vcpkg_install.bat + + The vcpkg tools and all of the third-party sources will be installed + in this folder: + /compat/vcbuild/vcpkg/ + + A file will be created with a set of Makefile macros pointing to a + unified "include", "lib", and "bin" directory (release and debug) for + all of the required packages. This file will be included by the main + Makefile: + /compat/vcbuild/MSVC-DEFS-GEN + +2. OPTIONALLY copy the third-party *.dll and *.pdb files into the repo + root to make it easier to run and debug git.exe without having to + manipulate your PATH. This is especially true for debug sessions in + Visual Studio. + + Use ONE of the following forms which should match how you want to + compile git.exe. + + $ ./compat/vcbuild/vcpkg_copy_packages.bat debug + $ ./compat/vcbuild/vcpkg_copy_packages.bat release + +3. Build git using MSVC from an SDK bash window using one of the + following commands: + + $ make MSVC=1 + $ make MSVC=1 DEBUG=1 + +================================================================ + +Alternatively, run `make MSVC=1 vcxproj` and then load the generated +git.sln in Visual Studio. The initial build will install the vcpkg +system and build the dependencies automatically. This will take a while. + +Note that this will automatically add and commit the generated +.sln and .vcxproj files to the repo. You may want to drop this +commit before submitting a Pull Request.... + +Or maybe we should put the .sln/.vcxproj files in the .gitignores +and not do this. I'm not sure. + +================================================================ The Steps of Build Git with VS2008 1. You need the build environment, which contains the Git dependencies diff --git a/compat/vcbuild/find_vs_env.bat b/compat/vcbuild/find_vs_env.bat index 3800e9bf18..1232f200f7 100644 --- a/compat/vcbuild/find_vs_env.bat +++ b/compat/vcbuild/find_vs_env.bat @@ -25,7 +25,7 @@ REM REM The output of this script should be written to a make "include REM file" and referenced by the top-level Makefile. REM -REM See "config.mak.uname" (look for GIT-MSVC-GEN). +REM See "config.mak.uname" (look for compat/vcbuild/MSVC-DEFS-GEN). REM ================================================================ REM The provided command prompts are custom to each VS release and REM filled with lots of internal knowledge (such as Registry settings); @@ -154,7 +154,9 @@ REM ================================================================ REM Include DOS-style and BASH-style path for bin dir. echo msvc_bin_dir=%msvc_bin_dir% - echo msvc_bin_dir_msys=%msvc_bin_dir:C:=/C% + SET X1=%msvc_bin_dir:C:=/C% + SET X2=%X1:\=/% + echo msvc_bin_dir_msys=%X2% echo msvc_includes=%msvc_includes% echo msvc_libs=%msvc_libs% diff --git a/compat/vcbuild/scripts/clink.pl b/compat/vcbuild/scripts/clink.pl index b67b831304..3d6fa21c1e 100755 --- a/compat/vcbuild/scripts/clink.pl +++ b/compat/vcbuild/scripts/clink.pl @@ -14,8 +14,15 @@ 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") { @@ -30,9 +37,13 @@ while (@ARGV) { 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, "iconv.lib"); + push(@args, "libiconv.lib"); } elsif ("$arg" eq "-lcrypto") { push(@args, "libeay32.lib"); } elsif ("$arg" eq "-lssl") { @@ -40,7 +51,7 @@ while (@ARGV) { } elsif ("$arg" eq "-lcurl") { push(@args, "libcurl.lib"); } elsif ("$arg" eq "-lexpat") { - push(@args, "libexpat.lib"); + push(@args, "expat.lib"); } elsif ("$arg" =~ /^-L/ && "$arg" ne "-LTCG") { $arg =~ s/^-L/-LIBPATH:/; push(@lflags, $arg); diff --git a/compat/vcbuild/vcpkg_copy_dlls.bat b/compat/vcbuild/vcpkg_copy_dlls.bat new file mode 100644 index 0000000000..13661c14f8 --- /dev/null +++ b/compat/vcbuild/vcpkg_copy_dlls.bat @@ -0,0 +1,39 @@ +@ECHO OFF +REM ================================================================ +REM This script is an optional step. It copies the *.dll and *.pdb +REM files (created by vcpkg_install.bat) into the top-level directory +REM of the repo so that you can type "./git.exe" and find them without +REM having to fixup your PATH. +REM +REM NOTE: Because the names of some DLL files change between DEBUG and +REM NOTE: RELEASE builds when built using "vcpkg.exe", you will need +REM NOTE: to copy up the corresponding version. +REM ================================================================ + + SETLOCAL EnableDelayedExpansion + + @FOR /F "delims=" %%D IN ("%~dp0") DO @SET cwd=%%~fD + cd %cwd% + + SET arch=x64-windows + SET inst=%cwd%vcpkg\installed\%arch% + + IF [%1]==[release] ( + echo Copying RELEASE mode DLLs to repo root... + ) ELSE IF [%1]==[debug] ( + SET inst=%inst%\debug + echo Copying DEBUG mode DLLs to repo root... + ) ELSE ( + echo ERROR: Invalid argument. + echo Usage: %~0 release + echo Usage: %~0 debug + EXIT /B 1 + ) + + xcopy /e/s/v/y %inst%\bin\*.dll ..\..\ + xcopy /e/s/v/y %inst%\bin\*.pdb ..\..\ + + xcopy /e/s/v/y %inst%\bin\*.dll ..\..\t\helper\ + xcopy /e/s/v/y %inst%\bin\*.pdb ..\..\t\helper\ + + EXIT /B 0 diff --git a/compat/vcbuild/vcpkg_install.bat b/compat/vcbuild/vcpkg_install.bat new file mode 100644 index 0000000000..3d086c39c3 --- /dev/null +++ b/compat/vcbuild/vcpkg_install.bat @@ -0,0 +1,81 @@ +@ECHO OFF +REM ================================================================ +REM This script installs the "vcpkg" source package manager and uses +REM it to build the third-party libraries that git requires when it +REM is built using MSVC. +REM +REM [1] Install VCPKG. +REM [a] Create /compat/vcbuild/vcpkg/ +REM [b] Download "vcpkg". +REM [c] Compile using the currently installed version of VS. +REM [d] Create /compat/vcbuild/vcpkg/vcpkg.exe +REM +REM [2] Install third-party libraries. +REM [a] Download each (which may also install CMAKE). +REM [b] Compile in RELEASE mode and install in: +REM vcpkg/installed//{bin,lib} +REM [c] Compile in DEBUG mode and install in: +REM vcpkg/installed//debug/{bin,lib} +REM [d] Install headers in: +REM vcpkg/installed//include +REM +REM [3] Create a set of MAKE definitions for the top-level +REM Makefile to allow "make MSVC=1" to find the above +REM third-party libraries. +REM [a] Write vcpkg/VCPGK-DEFS +REM +REM https://blogs.msdn.microsoft.com/vcblog/2016/09/19/vcpkg-a-tool-to-acquire-and-build-c-open-source-libraries-on-windows/ +REM https://github.com/Microsoft/vcpkg +REM https://vcpkg.readthedocs.io/en/latest/ +REM ================================================================ + + SETLOCAL EnableDelayedExpansion + + @FOR /F "delims=" %%D IN ("%~dp0") DO @SET cwd=%%~fD + cd %cwd% + + dir vcpkg\vcpkg.exe >nul 2>nul && GOTO :install_libraries + + echo Fetching vcpkg in %cwd%vcpkg + git.exe clone https://github.com/Microsoft/vcpkg vcpkg + IF ERRORLEVEL 1 ( EXIT /B 1 ) + + cd vcpkg + echo Building vcpkg + powershell -exec bypass scripts\bootstrap.ps1 + IF ERRORLEVEL 1 ( EXIT /B 1 ) + + echo Successfully installed %cwd%vcpkg\vcpkg.exe + +:install_libraries + SET arch=x64-windows + + echo Installing third-party libraries... + FOR %%i IN (zlib expat libiconv openssl libssh2 curl) DO ( + cd %cwd%vcpkg + SET p="packages\%%i_%arch%" + IF NOT EXIST "%p%" CALL :sub__install_one %%i + IF ERRORLEVEL 1 ( EXIT /B 1 ) + ) + +:install_defines + cd %cwd% + SET inst=%cwd%vcpkg\installed\%arch% + + echo vcpkg_inc=-I"%inst%\include">VCPKG-DEFS + echo vcpkg_rel_lib=-L"%inst%\lib">>VCPKG-DEFS + echo vcpkg_rel_bin="%inst%\bin">>VCPKG-DEFS + echo vcpkg_dbg_lib=-L"%inst%\debug\lib">>VCPKG-DEFS + echo vcpkg_dbg_bin="%inst%\debug\bin">>VCPKG-DEFS + + EXIT /B 0 + + +:sub__install_one + echo Installing package %1... + + .\vcpkg.exe install %1:%arch% + IF ERRORLEVEL 1 ( EXIT /B 1 ) + + echo Finished %1 + goto :EOF diff --git a/config.mak.uname b/config.mak.uname index 493df2dd3b..8a9dd5a849 100644 --- a/config.mak.uname +++ b/config.mak.uname @@ -18,9 +18,16 @@ ifdef MSVC # Generate and include makefile variables that point to the # currently installed set of MSVC command line tools. -GIT-MSVC-GEN: ./compat/vcbuild/find_vs_env.bat - @./compat/vcbuild/find_vs_env.bat | sed 's|\\|/|g' >GIT-MSVC-GEN --include GIT-MSVC-GEN +compat/vcbuild/MSVC-DEFS-GEN: compat/vcbuild/find_vs_env.bat + @"$<" | tr '\\' / >"$@" +include compat/vcbuild/MSVC-DEFS-GEN + + # See if vcpkg and the vcpkg-build versions of the third-party + # libraries that we use are installed. We include the result + # to get $(vcpkg_*) variables defined for the Makefile. +compat/vcbuild/VCPKG-DEFS: compat/vcbuild/vcpkg_install.bat + @"$<" +include compat/vcbuild/VCPKG-DEFS endif # We choose to avoid "if .. else if .. else .. endif endif" @@ -427,13 +434,13 @@ ifeq ($(uname_S),Windows) EXTLIBS = user32.lib advapi32.lib shell32.lib wininet.lib ws2_32.lib invalidcontinue.obj kernel32.lib ntdll.lib PTHREAD_LIBS = lib = - # Path to the unpacked third-party libraries - MSVC_DEPS = compat/vcbuild/GEN.DEPS - BASIC_CFLAGS += \ - -I$(MSVC_DEPS)/include -I$(MSVC_DEPS)/include/expat -I$(MSVC_DEPS)/include/zlib \ - -L$(MSVC_DEPS)/lib \ - $(sdk_includes) $(sdk_libs) \ - $(msvc_includes) $(msvc_libs) + BASIC_CFLAGS += $(vcpkg_inc) $(sdk_includes) $(msvc_includes) +ifndef DEBUG + BASIC_CFLAGS += $(vcpkg_rel_lib) +else + BASIC_CFLAGS += $(vcpkg_dbg_lib) +endif + BASIC_CFLAGS += $(sdk_libs) $(msvc_libs) # Optionally enable memory leak reporting. # BASIC_CLFAGS += -DUSE_MSVC_CRTDBG diff --git a/t/test-lib.sh b/t/test-lib.sh index 1a09d8e903..9b46325c31 100644 --- a/t/test-lib.sh +++ b/t/test-lib.sh @@ -57,9 +57,6 @@ fi . "$GIT_BUILD_DIR"/GIT-BUILD-OPTIONS export PERL_PATH SHELL_PATH -test -z "$MSVC_DEPS" || -PATH="$GIT_BUILD_DIR/$MSVC_DEPS/bin:$PATH" - ################################################################ # It appears that people try to run tests without building... test -n "$GIT_TEST_INSTALLED" || "$GIT_BUILD_DIR/git$X" >/dev/null || From 1d34bf10b2e2c25910f66b4e74845b59199e47ae Mon Sep 17 00:00:00 2001 From: Jeff Hostetler Date: Tue, 19 Sep 2017 12:56:21 -0400 Subject: [PATCH 05/12] msvc: cleanup obsolete nuget files We no longer use NuGet packages... Signed-off-by: Jeff Hostetler Signed-off-by: Johannes Schindelin --- .nuget/NuGet.config | 6 -- compat/vcbuild/Makefile | 147 ------------------------------- compat/vcbuild/README_VS2015.txt | 54 ------------ compat/vcbuild/nuget.config | 27 ------ compat/vcbuild/packages.config | 21 ----- 5 files changed, 255 deletions(-) delete mode 100644 .nuget/NuGet.config delete mode 100644 compat/vcbuild/Makefile delete mode 100644 compat/vcbuild/README_VS2015.txt delete mode 100644 compat/vcbuild/nuget.config delete mode 100644 compat/vcbuild/packages.config diff --git a/.nuget/NuGet.config b/.nuget/NuGet.config deleted file mode 100644 index 93e50042cb..0000000000 --- a/.nuget/NuGet.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/compat/vcbuild/Makefile b/compat/vcbuild/Makefile deleted file mode 100644 index 255dd43084..0000000000 --- a/compat/vcbuild/Makefile +++ /dev/null @@ -1,147 +0,0 @@ -## Makefile to install nuget package dependencies. -################################################################## - -INST=GEN.DEPS -INST_INC=$(INST)/include -INST_LIB=$(INST)/lib -INST_BIN=$(INST)/bin - -PKGDIR=GEN.PKGS -NUGET ?= nuget.exe -ifneq ($(shell $(NUGET) help 2>/dev/null; echo $$?),0) - NUGET := /usr/src/build-extra/nuget/nuget.exe -endif - -################################################################## -all: unpack expat libssh libssh_redist curl curl_redist openssl zlib \ - libiconv libiconv_redist - -unpack: - [ -d $(PKGDIR) ] || mkdir $(PKGDIR) - "$(NUGET)" restore packages.config -ConfigFile nuget.config \ - -NonInteractive -OutputDirectory $(PKGDIR) - -insdir: - [ -d $(INST) ] || mkdir $(INST) - [ -d $(INST_INC) ] || mkdir $(INST_INC) - [ -d $(INST_BIN) ] || mkdir $(INST_BIN) - [ -d $(INST_LIB) ] || mkdir $(INST_LIB) - -################################################################## -## We place the expat headers in their own subdirectory. -## The custom is to reference , so compile with: -## -I$(INST_INC)/expat - -EXPAT_VER=2.1.0.11 -EXPAT_ROOT=$(PKGDIR)/expat.$(EXPAT_VER)/build/native -EXPAT_INC=$(EXPAT_ROOT)/include -EXPAT_LIB=$(EXPAT_ROOT)/lib/v110/x64/Release/dynamic/utf8 - -expat: insdir - [ -d $(INST_INC)/expat ] || mkdir $(INST_INC)/expat - cp -r $(EXPAT_INC)/* $(INST_INC)/expat/ - cp -r $(EXPAT_LIB)/* $(INST_LIB)/ - - -################################################################## - -LIBICONV_VER=1.14.0.11 -LIBICONV_ROOT=$(PKGDIR)/libiconv.$(LIBICONV_VER)/build/native -LIBICONV_INC=$(LIBICONV_ROOT)/include -LIBICONV_LIB=$(LIBICONV_ROOT)/lib/v110/x64/Release/dynamic/cdecl - -libiconv: insdir - cp -r $(LIBICONV_INC)/* $(INST_INC)/ - cp -r $(LIBICONV_LIB)/libiconv.lib $(INST_LIB)/iconv.lib - - -LIBICONV_REDIST_ROOT=$(PKGDIR)/libiconv.redist.$(LIBICONV_VER)/build/native -LIBICONV_REDIST_BIN=$(LIBICONV_REDIST_ROOT)/bin/v110/x64/Release/dynamic/cdecl - -libiconv_redist: insdir - cp -r $(LIBICONV_REDIST_BIN)/* $(INST_BIN)/ - - -################################################################## - -LIBSSH_VER=1.4.3.3 -LIBSSH_ROOT=$(PKGDIR)/libssh2.$(LIBSSH_VER)/build/native -LIBSSH_INC=$(LIBSSH_ROOT)/include -LIBSSH_LIB=$(LIBSSH_ROOT)/lib/v110/x64/Release/dynamic/cdecl - -libssh: insdir - [ -d $(INST_INC)/libssh2 ] || mkdir $(INST_INC)/libssh2 - cp -r $(LIBSSH_INC)/* $(INST_INC)/libssh2 - cp -r $(LIBSSH_LIB)/* $(INST_LIB)/ - - -LIBSSH_REDIST_ROOT=$(PKGDIR)/libssh2.redist.$(LIBSSH_VER)/build/native -LIBSSH_REDIST_BIN=$(LIBSSH_REDIST_ROOT)/bin/v110/x64/Release/dynamic/cdecl - -libssh_redist: insdir - cp -r $(LIBSSH_REDIST_BIN)/* $(INST_BIN)/ - - -################################################################## -## We place the curl headers in their own subdirectory. -## The custom is to reference , so compile with: -## -I$(INST_INC) - -CURL_VER=7.30.0.2 -CURL_ROOT=$(PKGDIR)/curl.$(CURL_VER)/build/native -CURL_INC=$(CURL_ROOT)/include/curl -CURL_LIB=$(CURL_ROOT)/lib/v110/x64/Release/dynamic - -curl: insdir - [ -d $(INST_INC)/curl ] || mkdir $(INST_INC)/curl - cp -r $(CURL_INC)/* $(INST_INC)/curl - cp -r $(CURL_LIB)/* $(INST_LIB)/ - - -CURL_REDIST_ROOT=$(PKGDIR)/curl.redist.$(CURL_VER)/build/native -CURL_REDIST_BIN=$(CURL_REDIST_ROOT)/bin/v110/x64/Release/dynamic - -curl_redist: insdir - cp -r $(CURL_REDIST_BIN)/* $(INST_BIN)/ - - -################################################################## -## We place the openssl headers in their own subdirectory. -## The custom is to reference , so compile with: -## -I$(INST_INC) - -OPENSSL_VER=1.0.2.1 -OPENSSL_ROOT=$(PKGDIR)/openssl.v140.windesktop.msvcstl.dyn.rt-dyn.x64.$(OPENSSL_VER) -OPENSSL_INC=$(OPENSSL_ROOT)/build/native/include/openssl -OPENSSL_LIB=$(OPENSSL_ROOT)/lib/native/v140/windesktop/msvcstl/dyn/rt-dyn/x64/release - -openssl: insdir - [ -d $(INST_INC)/openssl ] || mkdir $(INST_INC)/openssl - cp -r $(OPENSSL_INC)/* $(INST_INC)/openssl - cp -r $(OPENSSL_LIB)/*.lib $(INST_LIB)/ - cp -r $(OPENSSL_LIB)/*.dll $(INST_BIN)/ - cp -r $(OPENSSL_LIB)/*.pdb $(INST_BIN)/ - -################################################################## -## We place the zlib headers in their own subdirectory. -## The custom is to reference , so compile with: -## -I$(INST_INC)/zlib - -ZLIB_VER=1.2.8.8 -ZLIB_ROOT=$(PKGDIR)/zlib.v140.windesktop.msvcstl.dyn.rt-dyn.$(ZLIB_VER) -ZLIB_INC=$(ZLIB_ROOT)/build/native/include -ZLIB_LIB=$(ZLIB_ROOT)/lib/native/v140/windesktop/msvcstl/dyn/rt-dyn/x64/RelWithDebInfo - -zlib: insdir - [ -d $(INST_INC)/zlib ] || mkdir $(INST_INC)/zlib - cp -r $(ZLIB_INC)/* $(INST_INC)/zlib - cp -r $(ZLIB_LIB)/*.lib $(INST_LIB)/ - cp -r $(ZLIB_LIB)/*.dll $(INST_BIN)/ - cp -r $(ZLIB_LIB)/*.pdb $(INST_BIN)/ - -################################################################## -clean: - rm -rf $(INST) - -clobber: clean - rm -rf $(PKGDIR) diff --git a/compat/vcbuild/README_VS2015.txt b/compat/vcbuild/README_VS2015.txt deleted file mode 100644 index a9c6f59dc6..0000000000 --- a/compat/vcbuild/README_VS2015.txt +++ /dev/null @@ -1,54 +0,0 @@ -Instructions for building Git for Windows using VS2015. -================================================================ - -Installing third-party dependencies: -==================================== - -[1] Install nuget.exe somewhere on your system and add it to your PATH. - https://docs.nuget.org/consume/command-line-reference - https://dist.nuget.org/index.html - -[2] Download required nuget packages for third-party libraries. - Using a terminal window, type: - - make -C compat/vcbuild - - This will download the packages, unpack them into GEN.PKGS, - and populate the {include, lib, bin} directories in GEN.DEPS. - - -Building Git for Windows using VS2015: -====================================== - -[3] Build 64-bit version of Git for Windows. - Using a terminal window: - - make MSVC=1 DEBUG=1 - - -[4] Add compat/vcbuild/GEN.DEPS/bin to your PATH. - -[5] You should then be able to run the test suite and any interactive - commands. - -[6] To debug/profile in VS, open the git.exe in VS and run/debug - it. (Be sure to add GEN.DEPS/bin to the PATH in the debug - dialog.) - - -TODO List: -========== - -[A] config.mak.uname currently contains hard-coded paths - to the various MSVC and SDK libraries for the 64-bit - version of the compilers and libaries. - - See: SANE_TOOL_PATH, MSVC_DEPS, MSVC_SDK*, MSVC_VCDIR. - - Long term, we need to figure out how to properly import - values for %VCINSTALLDIR%, %LIB%, %LIBPATH%, and the - other values normally set by "vsvars32.bat" when a - developer command prompt is started. This would also - allow us to switch between 32- and 64-bit tool chains. - -[B] We need to build SLN or VCPROJ files. diff --git a/compat/vcbuild/nuget.config b/compat/vcbuild/nuget.config deleted file mode 100644 index b5e7349504..0000000000 --- a/compat/vcbuild/nuget.config +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/compat/vcbuild/packages.config b/compat/vcbuild/packages.config deleted file mode 100644 index 53b1ede4f5..0000000000 --- a/compat/vcbuild/packages.config +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - From 3dab4511c8bf60085c3e0ab0a3b297f110e730e1 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Wed, 29 Nov 2017 21:43:04 +0100 Subject: [PATCH 06/12] vcxproj: let vcs-svn depend on libgit It really does depend on libgit. It does not hurt to let it depend on xdiff, and it makes the code simpler. It is necessary to get this dependency chain right, because we will introduce a change where the vcpkg system is initialized before building libgit. The vcpkg system will then build the dependencies needed by Git (and thereby make the include headers available): As the vcpkg system cannot be run in parallel (it does not lock, wreaking havoc with files being accessed and written at the same time, letting the vcpkg processes stumble over each others' toes. We prevent that by ensuring that only one project is built at first: libgit. And this project's PreBuildEvent will be used to initialize vcpkg and build all dependencies. Subsequently, the other projects can be built in parallel. Signed-off-by: Johannes Schindelin --- contrib/buildsystems/Generators/Vcxproj.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/buildsystems/Generators/Vcxproj.pm b/contrib/buildsystems/Generators/Vcxproj.pm index ae443449aa..e481e2d600 100644 --- a/contrib/buildsystems/Generators/Vcxproj.pm +++ b/contrib/buildsystems/Generators/Vcxproj.pm @@ -296,7 +296,7 @@ EOM print F << "EOM"; EOM - if (!$static_library) { + if (!$static_library || $target =~ 'vcs-svn') { my $uuid_libgit = $$build_structure{"LIBS_libgit_GUID"}; my $uuid_xdiff_lib = $$build_structure{"LIBS_xdiff/lib_GUID"}; From fac005d587af61a0623a9482347344be18d2b32f Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Wed, 29 Nov 2017 22:06:09 +0100 Subject: [PATCH 07/12] vcxproj: do not use " unnecessarily The .vcxproj's text nodes do not actually need to URL-encode double quotes. So let's not do that. Signed-off-by: Johannes Schindelin --- contrib/buildsystems/Generators/Vcxproj.pm | 2 -- 1 file changed, 2 deletions(-) diff --git a/contrib/buildsystems/Generators/Vcxproj.pm b/contrib/buildsystems/Generators/Vcxproj.pm index e481e2d600..3b1e4c2f93 100644 --- a/contrib/buildsystems/Generators/Vcxproj.pm +++ b/contrib/buildsystems/Generators/Vcxproj.pm @@ -123,7 +123,6 @@ sub createProject { my $defines = join(";", sort(@{$$build_structure{"$prefix${name}_DEFINES"}})); my $includes= join(";", sort(map { s/^-I//; s/\//\\/g; File::Spec->file_name_is_absolute($_) ? $_ : "$rel_dir\\$_" } @{$$build_structure{"$prefix${name}_INCLUDES"}})); my $cflags = join(" ", sort(map { s/^-[GLMOZ].*//; s/.* .*/"$&"/; $_; } @{$$build_structure{"$prefix${name}_CFLAGS"}})); - $cflags =~ s/\"/"/g; $cflags =~ s//>/g; @@ -133,7 +132,6 @@ sub createProject { } $defines =~ s/-D//g; - $defines =~ s/\"/"/g; $defines =~ s//>/g; $defines =~ s/\'//g; From 039df6a929157c08c4229eb2cdf0660115999dd6 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Tue, 28 Nov 2017 18:29:18 +0100 Subject: [PATCH 08/12] 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 --- config.mak.uname | 2 +- contrib/buildsystems/Generators/Vcxproj.pm | 90 +++++++++------------- contrib/buildsystems/engine.pl | 2 + 3 files changed, 38 insertions(+), 56 deletions(-) diff --git a/config.mak.uname b/config.mak.uname index 8a9dd5a849..d697fea67c 100644 --- a/config.mak.uname +++ b/config.mak.uname @@ -474,7 +474,7 @@ vcxproj: # Make .vcxproj files and add them unset QUIET_GEN QUIET_BUILT_IN; \ perl contrib/buildsystems/generate -g Vcxproj - git add -f git.sln {*,*/lib,t/helper/*}/{packages.config,*.vcxproj} + git add -f git.sln {*,*/lib,t/helper/*}/*.vcxproj # Add command-list.h $(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 command-list.h diff --git a/contrib/buildsystems/Generators/Vcxproj.pm b/contrib/buildsystems/Generators/Vcxproj.pm index 3b1e4c2f93..3535215100 100644 --- a/contrib/buildsystems/Generators/Vcxproj.pm +++ b/contrib/buildsystems/Generators/Vcxproj.pm @@ -126,9 +126,12 @@ sub createProject { $cflags =~ s//>/g; - my $libs = ''; + my $libs_release = "\n "; + my $libs_debug = "\n "; if (!$static_library) { - $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"}})); + $libs_release = join(";", sort(grep /^(?!libgit\.lib|xdiff\/lib\.lib|vcs-svn\/lib\.lib)/, @{$$build_structure{"$prefix${name}_LIBS"}})); + $libs_debug = $libs_release; + $libs_debug =~ s/zlib\.lib/zlibd\.lib/; } $defines =~ s/-D//g; @@ -138,45 +141,6 @@ sub createProject { die "Could not create the directory $target for $label project!\n" unless (-d "$target" || mkdir "$target"); - use File::Copy; - copy("$git_dir/compat/vcbuild/packages.config", "$target/packages.config"); - - my $needsCurl = grep(/libcurl.lib/, @{$$build_structure{"$prefix${name}_LIBS"}}); - my $targetsImport = ''; - my $targetsErrors = ''; - my $afterTargets = ''; - open F, "<$git_dir/compat/vcbuild/packages.config"; - while () { - if (/"; - } elsif ($needsCurl && $1 eq 'curl') { - # libcurl is only available targeting v100 and v110 - $libs .= ";$rel_dir\\compat\\vcbuild\\GEN.PKGS\\$1.$2\\build\\native\\lib\\v110\\\$(Platform)\\Release\\dynamic\\libcurl.lib"; - $afterTargets .= "\n "; - } elsif ($needsCurl && $1 eq 'expat') { - # libexpat is only available targeting v100 and v110 - $libs .= ";$rel_dir\\compat\\vcbuild\\GEN.PKGS\\$1.$2\\build\\native\\lib\\v110\\\$(Platform)\\Release\\dynamic\\utf8\\libexpat.lib"; - } elsif ($1 eq 'zlib') { - # zlib - $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"; - } elsif ($1 eq 'openssl') { - # openssl - $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"; - $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"; - } - next if ($1 =~ /^(zlib$|openssl(?!.*(x64|x86)$))/); - my $targetsFile = "$rel_dir\\compat\\vcbuild\\GEN.PKGS\\$1.$2\\build\\native\\$1.targets"; - $targetsImport .= "\n "; - $targetsErrors .= "\n "; - } - } - close F; - open F, ">$vcxproj" or die "Could not open $vcxproj for writing!\n"; binmode F, ":crlf :utf8"; print F chr(0xFEFF); @@ -204,6 +168,16 @@ sub createProject { $uuid Win32Proj + x86-windows + x64-windows + $cdup\\compat\\vcbuild\\vcpkg\\installed\\\$(VCPKGArch) + \$(VCPKGArchDirectory)\\debug\\bin + \$(VCPKGArchDirectory)\\debug\\lib + \$(VCPKGArchDirectory)\\bin + \$(VCPKGArchDirectory)\\lib + \$(VCPKGArchDirectory)\\include + $libs_debug + $libs_release @@ -237,7 +211,7 @@ sub createProject { $cflags %(AdditionalOptions) - $includes;%(AdditionalIncludeDirectories) + $cdup;$cdup\\compat;$cdup\\compat\\regex;$cdup\\compat\\win32;$cdup\\compat\\poll;$cdup\\compat\\vcbuild\\include;\$(VCPKGIncludeDirectory);%(AdditionalIncludeDirectories) true OnlyExplicitInline @@ -248,11 +222,23 @@ sub createProject { true - $libs;\$(AdditionalDependencies) + \$(VCPKGLibDirectory);%(AdditionalLibraryDirectories) + \$(VCPKGLibs);\$(AdditionalDependencies) invalidcontinue.obj %(AdditionalOptions) $cdup\\compat\\win32\\git.manifest Console +EOM + if ($target eq 'libgit') { + print F << "EOM"; + + Initialize VCPKG + del "$cdup\\compat\\vcbuild\\vcpkg" + call "$cdup\\compat\\vcbuild\\vcpkg_install.bat" + +EOM + } + print F << "EOM"; @@ -323,21 +309,15 @@ EOM EOM } print F << "EOM"; - - - - $targetsImport - - - - 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}. - $targetsErrors - EOM - if (!$static_library && $afterTargets ne '') { + if (!$static_library) { print F << "EOM"; - $afterTargets + + + + + EOM } diff --git a/contrib/buildsystems/engine.pl b/contrib/buildsystems/engine.pl index 9f4e7a2ccb..8bb07e8e25 100755 --- a/contrib/buildsystems/engine.pl +++ b/contrib/buildsystems/engine.pl @@ -347,6 +347,8 @@ sub handleLinkLine push(@libs, "ssleay32.lib"); } elsif ("$part" eq "-lcurl") { push(@libs, "libcurl.lib"); + } elsif ("$part" eq "-lexpat") { + push(@libs, "expat.lib"); } elsif ("$part" eq "-liconv") { push(@libs, "libiconv.lib"); } elsif ($part =~ /^[-\/]/) { From 79c23b6af0d0ab49d09f4d23f8702968442a08b4 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Tue, 5 Dec 2017 12:50:57 +0100 Subject: [PATCH 09/12] vcxproj: move `vcxproj` target outside the MSVC block The `vcxproj` target does not, in fact, depend on MSVC being defined, so let's just move it outside of that block. Signed-off-by: Johannes Schindelin --- config.mak.uname | 118 +++++++++++++++++++++++------------------------ 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/config.mak.uname b/config.mak.uname index d697fea67c..8b294f1588 100644 --- a/config.mak.uname +++ b/config.mak.uname @@ -464,65 +464,6 @@ endif X = .exe compat/msvc.o: compat/msvc.c compat/mingw.c GIT-CFLAGS - -vcxproj: - # Require clean work tree - git update-index -q --refresh && \ - git diff-files --quiet && \ - git diff-index --cached --quiet HEAD -- - - # Make .vcxproj files and add them - unset QUIET_GEN QUIET_BUILT_IN; \ - perl contrib/buildsystems/generate -g Vcxproj - git add -f git.sln {*,*/lib,t/helper/*}/*.vcxproj - - # Add command-list.h - $(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 command-list.h - git add -f command-list.h - - # Add scripts - rm -f perl/perl.mak - $(MAKE) MSVC=1 prefix=/mingw64 \ - $(SCRIPT_LIB) $(SCRIPT_SH_GEN) $(SCRIPT_PERL_GEN) - # Strip out the sane tool path, needed only for building - sed -i '/^git_broken_path_fix ".*/d' git-sh-setup - git add -f $(SCRIPT_LIB) $(SCRIPT_SH_GEN) $(SCRIPT_PERL_GEN) - - # Add Perl module - $(MAKE) $(LIB_PERL_GEN) - git add -f perl/build - - # Add bin-wrappers, for testing - rm -rf bin-wrappers/ - $(MAKE) MSVC=1 prefix=/mingw64 $(test_bindir_programs) - # Ensure that the GIT_EXEC_PATH is a Unix-y one, and that the absolute - # path of the repository is not hard-coded (GIT_EXEC_PATH will be set - # by test-lib.sh according to the current setup) - sed -i -e 's/^\(GIT_EXEC_PATH\)=.*/test -n "$${\1##*:*}" ||\ - \1="$$(cygpath -u "$$\1")"/' \ - -e "s|'$$(pwd)|\"\$$GIT_EXEC_PATH\"'|g" bin-wrappers/* - # Ensure that test-* helpers find the .dll files copied to top-level - sed -i 's|^PATH=.*|&:"$$GIT_EXEC_PATH"|' bin-wrappers/test-* - # We do not want to force hard-linking builtins - sed -i 's|\(git\)-\([-a-z]*\)\.exe"|\1.exe" \2|g' \ - bin-wrappers/git-{receive-pack,upload-archive} - git add -f $(test_bindir_programs) - # remote-ext is a builtin, but invoked as if it were external - sed 's|receive-pack|remote-ext|g' \ - bin-wrappers/git-remote-ext - git add -f bin-wrappers/git-remote-ext - - # Add templates - $(MAKE) -C templates - git add -f templates/boilerplates.made templates/blt/ - - # Add build options - $(MAKE) MSVC=1 prefix=/mingw64 GIT-BUILD-OPTIONS - git add -f GIT-BUILD-OPTIONS - - # Commit the whole shebang - git commit -m "Generate Visual Studio solution" \ - -m "Auto-generated by \`$(MAKE)$(MAKEFLAGS) $@\`" endif ifeq ($(uname_S),Interix) NO_INITGROUPS = YesPlease @@ -724,3 +665,62 @@ ifeq ($(uname_S),QNX) NO_STRCASESTR = YesPlease NO_STRLCPY = YesPlease endif + +vcxproj: + # Require clean work tree + git update-index -q --refresh && \ + git diff-files --quiet && \ + git diff-index --cached --quiet HEAD -- + + # Make .vcxproj files and add them + unset QUIET_GEN QUIET_BUILT_IN; \ + perl contrib/buildsystems/generate -g Vcxproj + git add -f git.sln {*,*/lib,t/helper/*}/*.vcxproj + + # Add command-list.h + $(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 command-list.h + git add -f command-list.h + + # Add scripts + rm -f perl/perl.mak + $(MAKE) MSVC=1 prefix=/mingw64 \ + $(SCRIPT_LIB) $(SCRIPT_SH_GEN) $(SCRIPT_PERL_GEN) + # Strip out the sane tool path, needed only for building + sed -i '/^git_broken_path_fix ".*/d' git-sh-setup + git add -f $(SCRIPT_LIB) $(SCRIPT_SH_GEN) $(SCRIPT_PERL_GEN) + + # Add Perl module + $(MAKE) $(LIB_PERL_GEN) + git add -f perl/build + + # Add bin-wrappers, for testing + rm -rf bin-wrappers/ + $(MAKE) MSVC=1 prefix=/mingw64 $(test_bindir_programs) + # Ensure that the GIT_EXEC_PATH is a Unix-y one, and that the absolute + # path of the repository is not hard-coded (GIT_EXEC_PATH will be set + # by test-lib.sh according to the current setup) + sed -i -e 's/^\(GIT_EXEC_PATH\)=.*/test -n "$${\1##*:*}" ||\ + \1="$$(cygpath -u "$$\1")"/' \ + -e "s|'$$(pwd)|\"\$$GIT_EXEC_PATH\"'|g" bin-wrappers/* + # Ensure that test-* helpers find the .dll files copied to top-level + sed -i 's|^PATH=.*|&:"$$GIT_EXEC_PATH"|' bin-wrappers/test-* + # We do not want to force hard-linking builtins + sed -i 's|\(git\)-\([-a-z]*\)\.exe"|\1.exe" \2|g' \ + bin-wrappers/git-{receive-pack,upload-archive} + git add -f $(test_bindir_programs) + # remote-ext is a builtin, but invoked as if it were external + sed 's|receive-pack|remote-ext|g' \ + bin-wrappers/git-remote-ext + git add -f bin-wrappers/git-remote-ext + + # Add templates + $(MAKE) -C templates + git add -f templates/boilerplates.made templates/blt/ + + # Add build options + $(MAKE) MSVC=1 prefix=/mingw64 GIT-BUILD-OPTIONS + git add -f GIT-BUILD-OPTIONS + + # Commit the whole shebang + git commit -m "Generate Visual Studio solution" \ + -m "Auto-generated by \`$(MAKE)$(MAKEFLAGS) $@\`" From e4379513ee3a8c557406415e7d5c6e251b181368 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Fri, 1 Dec 2017 21:00:00 +0100 Subject: [PATCH 10/12] Allow `make vcxproj` without initializing vcpkg The idea of the `vcxproj` target is to generate .sln/.vcxproj files and then commit them, to be used elsewhere. Typically, this is done in a VSTS job whenever `master` changes. So there is little use in initializing vcpkg and building all the dependencies: they are not necessary here. Signed-off-by: Johannes Schindelin --- config.mak.uname | 8 +++++--- contrib/buildsystems/engine.pl | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/config.mak.uname b/config.mak.uname index 8b294f1588..42e3082c64 100644 --- a/config.mak.uname +++ b/config.mak.uname @@ -25,10 +25,12 @@ include compat/vcbuild/MSVC-DEFS-GEN # See if vcpkg and the vcpkg-build versions of the third-party # libraries that we use are installed. We include the result # to get $(vcpkg_*) variables defined for the Makefile. +ifeq (,$(SKIP_VCPKG)) compat/vcbuild/VCPKG-DEFS: compat/vcbuild/vcpkg_install.bat @"$<" include compat/vcbuild/VCPKG-DEFS endif +endif # We choose to avoid "if .. else if .. else .. endif endif" # because maintaining the nesting to match is a pain. If @@ -683,7 +685,7 @@ vcxproj: # Add scripts rm -f perl/perl.mak - $(MAKE) MSVC=1 prefix=/mingw64 \ + $(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 \ $(SCRIPT_LIB) $(SCRIPT_SH_GEN) $(SCRIPT_PERL_GEN) # Strip out the sane tool path, needed only for building sed -i '/^git_broken_path_fix ".*/d' git-sh-setup @@ -695,7 +697,7 @@ vcxproj: # Add bin-wrappers, for testing rm -rf bin-wrappers/ - $(MAKE) MSVC=1 prefix=/mingw64 $(test_bindir_programs) + $(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 $(test_bindir_programs) # Ensure that the GIT_EXEC_PATH is a Unix-y one, and that the absolute # path of the repository is not hard-coded (GIT_EXEC_PATH will be set # by test-lib.sh according to the current setup) @@ -718,7 +720,7 @@ vcxproj: git add -f templates/boilerplates.made templates/blt/ # Add build options - $(MAKE) MSVC=1 prefix=/mingw64 GIT-BUILD-OPTIONS + $(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 GIT-BUILD-OPTIONS git add -f GIT-BUILD-OPTIONS # Commit the whole shebang diff --git a/contrib/buildsystems/engine.pl b/contrib/buildsystems/engine.pl index 8bb07e8e25..fba8a3f056 100755 --- a/contrib/buildsystems/engine.pl +++ b/contrib/buildsystems/engine.pl @@ -82,7 +82,8 @@ EOM # Capture the make dry stderr to file for review (will be empty for a release build). my $ErrsFile = "msvc-build-makedryerrors.txt"; -@makedry = `make -C $git_dir -n MSVC=1 V=1 2>$ErrsFile` if !@makedry; +@makedry = `make -C $git_dir -n MSVC=1 SKIP_VCPKG=1 V=1 2>$ErrsFile` +if !@makedry; # test for an empty Errors file and remove it unlink $ErrsFile if -f -z $ErrsFile; From a9c8392da55e6a875e360a63e87a98753c653cc9 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Tue, 19 Dec 2017 13:54:14 +0100 Subject: [PATCH 11/12] vcxproj: also link-or-copy builtins The problem with not having, say, git-receive-pack.exe after a full build is that the test suite will then happily use the *installed* git-receive-pack.exe because it finds nothing else. Absolutely not what we want. We want to have confidence that our test covers the MSVC-built Git executables, and not some random stuff. Signed-off-by: Johannes Schindelin --- config.mak.uname | 15 +++++++++++++++ contrib/buildsystems/Generators/Vcxproj.pm | 3 +++ 2 files changed, 18 insertions(+) diff --git a/config.mak.uname b/config.mak.uname index 42e3082c64..1aa100997b 100644 --- a/config.mak.uname +++ b/config.mak.uname @@ -679,6 +679,21 @@ vcxproj: perl contrib/buildsystems/generate -g Vcxproj git add -f git.sln {*,*/lib,t/helper/*}/*.vcxproj + # Generate the LinkOrCopyBuiltins.targets file + (echo '' && \ + echo ' ' && \ + for name in $(BUILT_INS);\ + do \ + echo ' '; \ + done && \ + for name in $(REMOTE_CURL_ALIASES); \ + do \ + echo ' '; \ + done && \ + echo ' ' && \ + echo '') >git/LinkOrCopyBuiltins.targets + git add -f git/LinkOrCopyBuiltins.targets + # Add command-list.h $(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 command-list.h git add -f command-list.h diff --git a/contrib/buildsystems/Generators/Vcxproj.pm b/contrib/buildsystems/Generators/Vcxproj.pm index 3535215100..e7f3ec2a96 100644 --- a/contrib/buildsystems/Generators/Vcxproj.pm +++ b/contrib/buildsystems/Generators/Vcxproj.pm @@ -321,6 +321,9 @@ EOM EOM } + if ($target eq 'git') { + print F " \n"; + } print F << "EOM"; EOM From d2971a934c1dc2aa9f07a58479f81b1747b24562 Mon Sep 17 00:00:00 2001 From: Jeff Hostetler Date: Fri, 8 Dec 2017 12:10:58 -0500 Subject: [PATCH 12/12] Makefile: add third-party DLLs to install target Signed-off-by: Jeff Hostetler --- Makefile | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Makefile b/Makefile index d1ff76ac3a..53dd7f08b2 100644 --- a/Makefile +++ b/Makefile @@ -2769,6 +2769,13 @@ ifdef MSVC $(INSTALL) git-remote-testsvn.pdb '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' $(INSTALL) git-sh-i18n--envsubst.pdb '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' $(INSTALL) git-show-index.pdb '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' +ifndef DEBUG + $(INSTALL) $(vcpkg_rel_bin)/*.dll '$(DESTDIR_SQ)$(bindir_SQ)' + $(INSTALL) $(vcpkg_rel_bin)/*.pdb '$(DESTDIR_SQ)$(bindir_SQ)' +else + $(INSTALL) $(vcpkg_dbg_bin)/*.dll '$(DESTDIR_SQ)$(bindir_SQ)' + $(INSTALL) $(vcpkg_dbg_bin)/*.pdb '$(DESTDIR_SQ)$(bindir_SQ)' +endif endif $(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'