Skip to content

Commit ff2540b

Browse files
committed
Merge branch 'visual-studio'
This topic branch teaches the project generator to generate a Visual Studio solution, ready to be opened in Visual Studio 2010 or later. The idea, of course, is to let some automatic build job generate and commit the project files with make MSVC=1 vcxproj and then (force-)push to a special-purpose branch. The major part of this branch thicket concerns itself not only with generating the Visual Studio project files, but making sure that the user can then run the test suite from a regular Git Bash (i.e. *not* requiring a Git for Windows SDK), e.g. by running cd t prove --timer --jobs 15 ./t[0-9]*.sh Signed-off-by: Johannes Schindelin <[email protected]>
2 parents 48236bc + f5cd503 commit ff2540b

25 files changed

+730
-59
lines changed

.gitignore

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,43 @@
179179
/gitweb/gitweb.cgi
180180
/gitweb/static/gitweb.js
181181
/gitweb/static/gitweb.min.*
182+
/libgit
183+
/test-chmtime
184+
/test-ctype
185+
/test-config
186+
/test-date
187+
/test-delta
188+
/test-dump-cache-tree
189+
/test-dump-split-index
190+
/test-dump-untracked-cache
191+
/test-fake-ssh
192+
/test-scrap-cache-tree
193+
/test-genrandom
194+
/test-hashmap
195+
/test-index-version
196+
/test-line-buffer
197+
/test-match-trees
198+
/test-mergesort
199+
/test-mktemp
200+
/test-parse-options
201+
/test-path-utils
202+
/test-prio-queue
203+
/test-read-cache
204+
/test-regex
205+
/test-revision-walking
206+
/test-run-command
207+
/test-sha1
208+
/test-sha1-array
209+
/test-sigchain
210+
/test-string-list
211+
/test-submodule-config
212+
/test-subprocess
213+
/test-svn-fe
214+
/test-urlmatch-normalization
215+
/test-wildmatch
182216
/common-cmds.h
217+
/vcs-svn_lib
218+
/xdiff_lib
183219
*.tar.gz
184220
*.dsc
185221
*.deb
@@ -217,6 +253,13 @@
217253
*.idb
218254
*.pdb
219255
*.ilk
256+
*.iobj
257+
*.ipdb
258+
*.dll
220259
.vs/
221-
/Debug/
222-
/Release/
260+
*.manifest
261+
Debug/
262+
Release/
263+
/UpgradeLog*.htm
264+
/git.VC.VC.opendb
265+
/git.VC.db

.nuget/NuGet.config

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<configuration>
3+
<config>
4+
<add key="repositoryPath" value="..\compat\vcbuild\GEN.PKGS" />
5+
</config>
6+
</configuration>

Makefile

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2108,7 +2108,7 @@ exec_cmd.sp exec_cmd.s exec_cmd.o: GIT-PREFIX
21082108
exec_cmd.sp exec_cmd.s exec_cmd.o: EXTRA_CPPFLAGS = \
21092109
'-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
21102110
'-DBINDIR="$(bindir_relative_SQ)"' \
2111-
'-DPREFIX="$(prefix_SQ)"'
2111+
'-DFALLBACK_RUNTIME_PREFIX="$(prefix_SQ)"'
21122112

21132113
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: GIT-PREFIX
21142114
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: EXTRA_CPPFLAGS = \
@@ -2343,6 +2343,7 @@ GIT-BUILD-OPTIONS: FORCE
23432343
@echo NO_UNIX_SOCKETS=\''$(subst ','\'',$(subst ','\'',$(NO_UNIX_SOCKETS)))'\' >>$@+
23442344
@echo PAGER_ENV=\''$(subst ','\'',$(subst ','\'',$(PAGER_ENV)))'\' >>$@+
23452345
@echo DC_SHA1=\''$(subst ','\'',$(subst ','\'',$(DC_SHA1)))'\' >>$@+
2346+
@echo X=\'$(X)\' >>$@+
23462347
ifdef TEST_OUTPUT_DIRECTORY
23472348
@echo TEST_OUTPUT_DIRECTORY=\''$(subst ','\'',$(subst ','\'',$(TEST_OUTPUT_DIRECTORY)))'\' >>$@+
23482349
endif
@@ -2377,6 +2378,9 @@ ifdef GIT_INTEROP_MAKE_OPTS
23772378
endif
23782379
ifdef TEST_GIT_INDEX_VERSION
23792380
@echo TEST_GIT_INDEX_VERSION=\''$(subst ','\'',$(subst ','\'',$(TEST_GIT_INDEX_VERSION)))'\' >>$@+
2381+
endif
2382+
ifdef MSVC_DEPS
2383+
@echo MSVC_DEPS=\''$(subst ','\'',$(subst ','\'',$(MSVC_DEPS)))'\' >>$@+
23802384
endif
23812385
@if cmp $@+ $@ >/dev/null 2>&1; then $(RM) $@+; else mv $@+ $@; fi
23822386

@@ -2401,7 +2405,7 @@ bin-wrappers/%: wrap-for-bin.sh
24012405
@mkdir -p bin-wrappers
24022406
$(QUIET_GEN)sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
24032407
-e 's|@@BUILD_DIR@@|$(shell pwd)|' \
2404-
-e 's|@@PROG@@|$(patsubst test-%,t/helper/test-%,$(@F))|' < $< > $@ && \
2408+
-e 's|@@PROG@@|$(patsubst test-%,t/helper/test-%$(X),$(@F))$(patsubst git%,$(X),$(filter $(@F),$(BINDIR_PROGRAMS_NEED_X)))|' < $< > $@ && \
24052409
chmod +x $@
24062410

24072411
# GNU make supports exporting all variables by "export" without parameters.

builtin/rev-list.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,8 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
395395
mark_edges_uninteresting(&revs, show_edge);
396396

397397
if (bisect_list) {
398-
int reaches = reaches, all = all;
398+
FAKE_INIT(int, reaches, 0);
399+
FAKE_INIT(int, all, 0);
399400

400401
revs.commits = find_bisection(revs.commits, &reaches, &all,
401402
bisect_find_all);

compat/msvc.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
#include <malloc.h>
77
#include <io.h>
88

9+
#pragma warning(disable: 4018) /* signed/unsigned comparison */
10+
#pragma warning(disable: 4244) /* type conversion, possible loss of data */
11+
#pragma warning(disable: 4090) /* 'function' : different 'const' qualifiers (ALLOC_GROW etc.)*/
12+
913
/* porting function */
1014
#define inline __inline
1115
#define __inline__ __inline

compat/obstack.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,7 @@ __extension__ \
493493
( (h)->temp.tempint = (char *) (obj) - (char *) (h)->chunk, \
494494
((((h)->temp.tempint > 0 \
495495
&& (h)->temp.tempint < (h)->chunk_limit - (char *) (h)->chunk)) \
496-
? (int) ((h)->next_free = (h)->object_base \
496+
? (ptrdiff_t) ((h)->next_free = (h)->object_base \
497497
= (h)->temp.tempint + (char *) (h)->chunk) \
498498
: (((obstack_free) ((h), (h)->temp.tempint + (char *) (h)->chunk), 0), 0)))
499499

compat/terminal.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
#ifndef NO_INTTYPES_H
12
#include <inttypes.h>
3+
#endif
24
#include "git-compat-util.h"
35
#include "run-command.h"
46
#include "compat/terminal.h"

config.mak.uname

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Platform specific Makefile tweaks based on uname detection
22

3+
# Define NO_SAFESEH if you need MSVC/Visual Studio to ignore the lack of
4+
# Microsoft's Safe Exception Handling in libraries (such as zlib).
5+
# Typically required for VS2013+/32-bit compilation on Vista+ versions.
6+
37
uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
48
uname_M := $(shell sh -c 'uname -m 2>/dev/null || echo not')
59
uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not')
@@ -353,6 +357,7 @@ ifeq ($(uname_S),Windows)
353357
NEEDS_LIBICONV = YesPlease
354358
NO_STRTOUMAX = YesPlease
355359
NO_MKDTEMP = YesPlease
360+
NO_INTTYPES_H = YesPlease
356361
# VS2015 with UCRT claims that snprintf and friends are C99 compliant,
357362
# so we don't need this.
358363
#
@@ -386,6 +391,9 @@ ifeq ($(uname_S),Windows)
386391
compat/win32/dirent.o compat/win32/fscache.o
387392
COMPAT_CFLAGS = -D__USE_MINGW_ACCESS -DDETECT_MSYS_TTY -DNOGDI -DHAVE_STRING_H -Icompat -Icompat/regex -Icompat/win32 -DSTRIP_EXTENSION=\".exe\"
388393
BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO -SUBSYSTEM:CONSOLE
394+
# invalidcontinue.obj allows Git's source code to close the same file
395+
# handle twice, or to access the osfhandle of an already-closed stdout
396+
# See https://msdn.microsoft.com/en-us/library/ms235330.aspx
389397
EXTLIBS = user32.lib advapi32.lib shell32.lib wininet.lib ws2_32.lib invalidcontinue.obj kernel32.lib ntdll.lib
390398
PTHREAD_LIBS =
391399
lib =
@@ -418,6 +426,11 @@ ifeq ($(uname_S),Windows)
418426
# release mode) to force a PDB to be generated (like RelWithDebInfo).
419427
BASIC_CFLAGS += -Zi
420428
BASIC_LDFLAGS += -debug
429+
430+
ifdef NO_SAFESEH
431+
LDFLAGS += -SAFESEH:NO
432+
endif
433+
421434
ifndef DEBUG
422435
BASIC_CFLAGS += -GL -Gy -O2 -Oy- -MD -DNDEBUG
423436
BASIC_LDFLAGS += -release -LTCG /OPT:REF /OPT:ICF /INCREMENTAL:NO /DEBUGTYPE:CV,FIXUP
@@ -428,6 +441,65 @@ endif
428441
X = .exe
429442

430443
compat/msvc.o: compat/msvc.c compat/mingw.c GIT-CFLAGS
444+
445+
vcxproj:
446+
# Require clean work tree
447+
git update-index -q --refresh && \
448+
git diff-files --quiet && \
449+
git diff-index --cached --quiet HEAD --
450+
451+
# Make .vcxproj files and add them
452+
unset QUIET_GEN QUIET_BUILT_IN; \
453+
perl contrib/buildsystems/generate -g Vcxproj
454+
git add -f git.sln {*,*/lib,t/helper/*}/{packages.config,*.vcxproj}
455+
456+
# Add common-cmds.h
457+
$(MAKE) MSVC=1 prefix=/mingw64 common-cmds.h
458+
git add -f common-cmds.h
459+
460+
# Add scripts
461+
rm -f perl/perl.mak
462+
$(MAKE) MSVC=1 prefix=/mingw64 \
463+
$(SCRIPT_LIB) $(SCRIPT_SH_GEN) $(SCRIPT_PERL_GEN)
464+
# Strip out the sane tool path, needed only for building
465+
sed -i '/^git_broken_path_fix ".*/d' git-sh-setup
466+
git add -f $(SCRIPT_LIB) $(SCRIPT_SH_GEN) $(SCRIPT_PERL_GEN)
467+
468+
# Add Perl module
469+
$(MAKE) -C perl
470+
git add -f perl/blib/lib
471+
472+
# Add bin-wrappers, for testing
473+
rm -rf bin-wrappers/
474+
$(MAKE) MSVC=1 prefix=/mingw64 $(test_bindir_programs)
475+
# Ensure that the GIT_EXEC_PATH is a Unix-y one, and that the absolute
476+
# path of the repository is not hard-coded (GIT_EXEC_PATH will be set
477+
# by test-lib.sh according to the current setup)
478+
sed -i -e 's/^\(GIT_EXEC_PATH\)=.*/test -n "$${\1##*:*}" ||\
479+
\1="$$(cygpath -u "$$\1")"/' \
480+
-e "s|'$$(pwd)|\"\$$GIT_EXEC_PATH\"'|g" bin-wrappers/*
481+
# Ensure that test-* helpers find the .dll files copied to top-level
482+
sed -i 's|^PATH=.*|&:"$$GIT_EXEC_PATH"|' bin-wrappers/test-*
483+
# We do not want to force hard-linking builtins
484+
sed -i 's|\(git\)-\([-a-z]*\)\.exe"|\1.exe" \2|g' \
485+
bin-wrappers/git-{receive-pack,upload-archive}
486+
git add -f $(test_bindir_programs)
487+
# remote-ext is a builtin, but invoked as if it were external
488+
sed 's|receive-pack|remote-ext|g' \
489+
<bin-wrappers/git-receive-pack >bin-wrappers/git-remote-ext
490+
git add -f bin-wrappers/git-remote-ext
491+
492+
# Add templates
493+
$(MAKE) -C templates
494+
git add -f templates/boilerplates.made templates/blt/
495+
496+
# Add build options
497+
$(MAKE) MSVC=1 prefix=/mingw64 GIT-BUILD-OPTIONS
498+
git add -f GIT-BUILD-OPTIONS
499+
500+
# Commit the whole shebang
501+
git commit -m "Generate Visual Studio solution" \
502+
-m "Auto-generated by \`$(MAKE)$(MAKEFLAGS) $@\`"
431503
endif
432504
ifeq ($(uname_S),Interix)
433505
NO_INITGROUPS = YesPlease

contrib/buildsystems/Generators.pm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ BEGIN {
1717
$me = dirname($me);
1818
if (opendir(D,"$me/Generators")) {
1919
foreach my $gen (readdir(D)) {
20-
next if ($gen =~ /^\.\.?$/);
20+
next unless ($gen =~ /\.pm$/);
2121
require "${me}/Generators/$gen";
2222
$gen =~ s,\.pm,,;
2323
push(@AVAILABLE, $gen);

0 commit comments

Comments
 (0)