From ff0eec9e540e1d8d25db2469a6e89d26a00626b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SZEDER=20G=C3=A1bor?= Date: Thu, 17 Jan 2019 02:29:10 +0100 Subject: [PATCH 1/4] .gitignore: ignore external debug symbols from GCC on macOS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When Git is build with a "real" GCC on macOS [1], or at least with GCC installed via Homebrew, and CFLAGS includes the '-g' option (and our default CFLAGS does), then by default GCC writes the debug symbols into external files under '.dSYM/' directories (e.g. 'git-daemon.dSYM/', 'git.dSYM/', etc.). Update '.gitignore' to ignore these directories, so they don't clutter the output of 'git status'. Furthermore, these build artifacts then won't trigger build failures on Travis CI via b92cb86ea1 (travis-ci: check that all build artifacts are .gitignore-d, 2017-12-31) once one of the following patches updates our CI build scripts to use a real GCC in the 'osx-gcc' build job. [1] On macOS the default '/usr/bin/gcc' executable is not a real GCC, but merely a compatibility wrapper around Clang: $ gcc --version Configured with: --prefix=<...> Apple LLVM version 9.0.0 (clang-900.0.39.2) <...> So even though 'make CC=gcc' does indeed execute a command called 'gcc', in the end Git will be built with Clang all the same. Signed-off-by: SZEDER Gábor Signed-off-by: Junio C Hamano --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 0d77ea5894..a9db568712 100644 --- a/.gitignore +++ b/.gitignore @@ -229,3 +229,4 @@ *.pdb /Debug/ /Release/ +*.dSYM From bbf24adb87a0825bf6b96ef891e11e22bcf02e88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SZEDER=20G=C3=A1bor?= Date: Thu, 17 Jan 2019 02:29:11 +0100 Subject: [PATCH 2/4] travis-ci: don't be '--quiet' when running the tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All Travis CI build jobs run the test suite with 'make --quiet test'. On one hand, being quiet doesn't save us from much clutter in the output: $ make test |wc -l 861 $ make --quiet test |wc -l 848 It only spares 13 lines, mostly the output of entering the 't/' directory and the pre- and post-cleanup commands, which is negligible compared to the ~700 lines printed while building Git and the ~850 lines of 'prove' output. On the other hand, it's asking for trouble. In our CI build scripts we build Git and run the test suite in two separate 'make' invocations. In a prelimiary version of one of the later patches in this series, to explicitly specify which compiler to use, I changed them to basically run: make CC=$CC make --quiet test naively thinking that it should Just Work... but then that 'make --quiet test' got all clever on me, noticed the changed build flags, and then proceeded to rebuild everything with the default 'cc'. And because of that '--quiet' option, it did so, well, quietly, only saying "* new build flags", and it was by mere luck that I happened to notice that something is amiss. Let's just drop that '--quiet' option when running the test suite in all build scripts. Signed-off-by: SZEDER Gábor Signed-off-by: Junio C Hamano --- ci/run-build-and-tests.sh | 4 ++-- ci/run-linux32-build.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ci/run-build-and-tests.sh b/ci/run-build-and-tests.sh index cda170d5c2..84431c097e 100755 --- a/ci/run-build-and-tests.sh +++ b/ci/run-build-and-tests.sh @@ -8,7 +8,7 @@ ln -s "$cache_dir/.prove" t/.prove make --jobs=2 -make --quiet test +make test if test "$jobname" = "linux-gcc" then export GIT_TEST_SPLIT_INDEX=yes @@ -17,7 +17,7 @@ then export GIT_TEST_OE_DELTA_SIZE=5 export GIT_TEST_COMMIT_GRAPH=1 export GIT_TEST_MULTI_PACK_INDEX=1 - make --quiet test + make test fi check_unignored_build_artifacts diff --git a/ci/run-linux32-build.sh b/ci/run-linux32-build.sh index 2c60d2e70a..26c168a016 100755 --- a/ci/run-linux32-build.sh +++ b/ci/run-linux32-build.sh @@ -56,5 +56,5 @@ linux32 --32bit i386 su -m -l $CI_USER -c ' cd /usr/src/git test -n "$cache_dir" && ln -s "$cache_dir/.prove" t/.prove make --jobs=2 - make --quiet test + make test ' From 2000ac9fbf074e32cfd11109f6148a0c34d1133a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SZEDER=20G=C3=A1bor?= Date: Thu, 17 Jan 2019 02:29:12 +0100 Subject: [PATCH 3/4] travis-ci: switch to Xcode 10.1 macOS image MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When building something with GCC installed from Homebrew in the default macOS (with Xcode 9.4) image on Travis CI, it errors out with something like this: /usr/local/Cellar/gcc/8.1.0/lib/gcc/8/gcc/x86_64-apple-darwin17.5.0/8.1.0/include-fixed/stdio.h:78:10: fatal error: _stdio.h: No such file or directory #include <_stdio.h> ^~~~~~~~~~ This seems to be a common problem affecting several projects, and the common solution is to use a Travis CI macOS image with more recent Xcode version, e.g. 10 or 10.1. While we don't use such a GCC yet, in the very next patch we will, so switch our OSX build jobs to use the Xcode 10.1 image. Compared to the Xcode 10 image, this has the benefit that it comes with GCC (v8.2) preinstalled from Homebrew. Signed-off-by: SZEDER Gábor Signed-off-by: Junio C Hamano --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 03c8e4c613..36cbdea7f4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,8 @@ os: - linux - osx +osx_image: xcode10.1 + compiler: - clang - gcc From 2c8921db2b86fa5153ce642c9dd285d9500117fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SZEDER=20G=C3=A1bor?= Date: Thu, 17 Jan 2019 02:29:13 +0100 Subject: [PATCH 4/4] travis-ci: build with the right compiler MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Our 'Makefile' hardcodes the compiler to build Git as 'CC = cc'. This CC variable can be overridden from the command line, i.e. 'make CC=gcc-X.Y' will build with that particular GCC version, but not from the environment, i.e. 'CC=gcc-X.Y make' will still build with whatever 'cc' happens to be on the platform. Our build jobs on Travis CI are badly affected by this. In the build matrix we have dedicated build jobs to build Git with GCC and Clang both on Linux and macOS from the very beginning (522354d70f (Add Travis CI support, 2015-11-27)). Alas, this never really worked as supposed to, because Travis CI specifies the compiler for those build jobs as 'export CC=gcc' and 'export CC=clang' (which works fine for projects built with './configure && make'). Consequently, our 'linux-clang' build job has always used GCC, because that's where 'cc' points at in Travis CI's Linux images, while the 'osx-gcc' build job has always used Clang. Furthermore, 37fa4b3c78 (travis-ci: run gcc-8 on linux-gcc jobs, 2018-05-19) added an 'export CC=gcc-8' in an attempt to build with a more modern compiler, but to no avail. Set MAKEFLAGS with CC based on the $CC environment variable, so 'make' will run the "right" compiler. The Xcode 10.1 macOS image on Travis CI already contains the gcc@8 package from Homebrew, but we have to 'brew link' it first to be able to use it. So with this patch our build jobs will build Git with the following compiler versions: linux-clang: clang version 5.0.0 (tags/RELEASE_500/final) linux-gcc: gcc-8 (Ubuntu 8.1.0-5ubuntu1~14.04) 8.1.0 osx-clang: Apple LLVM version 10.0.0 (clang-1000.11.45.5) osx-gcc: gcc-8 (Homebrew GCC 8.2.0) 8.2.0 GETTEXT_POISON: gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 Signed-off-by: SZEDER Gábor Signed-off-by: Junio C Hamano --- ci/install-dependencies.sh | 5 +++++ ci/lib-travisci.sh | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/ci/install-dependencies.sh b/ci/install-dependencies.sh index 06c3546e1e..dc719876bb 100755 --- a/ci/install-dependencies.sh +++ b/ci/install-dependencies.sh @@ -40,6 +40,11 @@ osx-clang|osx-gcc) brew install git-lfs gettext brew link --force gettext brew install caskroom/cask/perforce + case "$jobname" in + osx-gcc) + brew link gcc@8 + ;; + esac ;; StaticAnalysis) sudo apt-get -q update diff --git a/ci/lib-travisci.sh b/ci/lib-travisci.sh index 69dff4d1ec..a479613a57 100755 --- a/ci/lib-travisci.sh +++ b/ci/lib-travisci.sh @@ -99,12 +99,14 @@ export DEFAULT_TEST_TARGET=prove export GIT_PROVE_OPTS="--timer --jobs 3 --state=failed,slow,save" export GIT_TEST_OPTS="--verbose-log -x --immediate" export GIT_TEST_CLONE_2GB=YesPlease -if [ "$jobname" = linux-gcc ]; then - export CC=gcc-8 -fi case "$jobname" in linux-clang|linux-gcc) + if [ "$jobname" = linux-gcc ] + then + export CC=gcc-8 + fi + export GIT_TEST_HTTPD=YesPlease # The Linux build installs the defined dependency versions below. @@ -118,6 +120,11 @@ linux-clang|linux-gcc) export PATH="$GIT_LFS_PATH:$P4_PATH:$PATH" ;; osx-clang|osx-gcc) + if [ "$jobname" = osx-gcc ] + then + export CC=gcc-8 + fi + # t9810 occasionally fails on Travis CI OS X # t9816 occasionally fails with "TAP out of sequence errors" on # Travis CI OS X @@ -127,3 +134,5 @@ GIT_TEST_GETTEXT_POISON) export GIT_TEST_GETTEXT_POISON=YesPlease ;; esac + +export MAKEFLAGS="CC=${CC:-cc}"