portability: beware of max () with MSVC
[bison.git] / .travis.yml
blob853d54889bfe31394acfc00d87be302659ccc936
1 version: ~> 1.0
3 # If the language is set to C or C++, Travis defines and exports CC
4 # and CXX *after* we have defined our environment variables via 'env'.
5 language: minimal
7 # Run in two steps:
8 # 1. Build the tarball
9 #    On a modern distro, with all the needed dependencies, including the whole git history.
10 # 2. Check it on various environments.
11 #    Less dependencies, and little git content (we would like to have none, but it's not
12 #    an option on Travis).
13 stages:
14   - dist
15   - check
17 # The 'check' jobs do not need the repo at all, only the 'dist'
18 # does.  Let's save time, bandwith, energy, and polar bears.
19 git:
20   clone: false
22 # matrix.include and jobs.include are aliases
23 # (https://docs.travis-ci.com/user/conditional-builds-stages-jobs/).
24 jobs:
25   include:
26     - stage: dist
27       name: "Make dist"
28       git:
29         clone: true
30       dist: bionic
31       script:
32         - sudo apt-get install -qq autoconf automake autopoint flex gettext gperf graphviz help2man m4 texinfo
33         - autoconf --version
34         - automake --version
35         - autopoint --version
36         - dot -V
37         - gettext --version
38         - gperf --version
39         - help2man --version
40         - makeinfo --version
41         - m4 --version
43         # Travis makes a shallow clone, but we need it in full to build the ChangeLog and apply the fixes in git-log-fix.
44         - git fetch --unshallow || true
45         - git submodule update --init --recursive
47         - ./bootstrap
48         - ./configure --enable-gcc-warnings || { cat config.log && false; }
49         - make -j2
50         - make -j2 dist-xz
51         # Can help understanding why we get "dirty" tarballs.
52         - git status
53         - dist=$(echo bison*.xz)
55         # Unfortunately we cannot deterministically know the name of the tarball without the full
56         # git history (because git describe --abbrev=4 may use more than 4 characters if there are
57         # conflicts).
58         #
59         # So for the sake of the 'check' jobs (that don't even have the repo at all), also expose this
60         # tarball on a name that only depends on the Travis build number.
61         #
62         # Without -b -, exit status is always 0.
63         #
64         # If we rerun a job that was already uploaded, 'ln -s' will fail: remove beforehand.
65         - sftp -b - bison@sftp.lrde.epita.fr <<< "put $dist"$'\n'"-rm bison-$TRAVIS_BUILD_NUMBER.tar.xz"$'\n'"ln -s $dist bison-$TRAVIS_BUILD_NUMBER.tar.xz"
67     ## ------- ##
68     ## First.  ##
69     ## ------- ##
71     # Start with three completely different environments, to get errors asap.
73     - name: "GCC 10 -O3"
74       stage: check
75       os: linux
76       dist: bionic
77       addons: &gcc10
78         apt:
79           sources:
80             # See https://github.com/travis-ci/apt-source-safelist/issues/410.
81             - sourceline: 'ppa:ubuntu-toolchain-r/test'
82           packages: g++-10
83       env:
84         - CC=gcc-10
85         - CXX=g++-10
86         - CONFIGUREFLAGS='CPPFLAGS=-DNDEBUG CFLAGS=-O3 CXXFLAGS=-O3'
88     # ASAN is time consuming, and we timeout the 50min granted by
89     # Travis if we run all the tests in one go.  Run in two parts.
90     - name: "Clang 10 libc++ and ASAN part 1"
91       stage: check
92       os: linux
93       dist: bionic
94       addons: &clang10
95         apt:
96           sources:
97             # See https://github.com/travis-ci/apt-source-safelist/issues/410.
98             - sourceline: 'ppa:ubuntu-toolchain-r/test'
99             - sourceline: 'deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-10 main'
100               key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key'
101           packages:
102             - clang-10
103             - libc++-10-dev
104             - libc++abi-10-dev
105       env:
106         # Do not use ASAN with ubuntu's libc++: https://bugs.llvm.org/show_bug.cgi?id=17379
107         - CC='clang-10 -fsanitize=address'
108         - CXX='clang++-10 -fsanitize=address -stdlib=libc++'
109         - PART=1
111     - name: "Clang 10 libc++ and ASAN part 2"
112       stage: check
113       os: linux
114       dist: bionic
115       addons: *clang10
116       env:
117         # Do not use ASAN with ubuntu's libc++: https://bugs.llvm.org/show_bug.cgi?id=17379
118         - CC='clang-10 -fsanitize=address'
119         - CXX='clang++-10 -fsanitize=address -stdlib=libc++'
120         - PART=2
122     # See https://github.com/simd-everywhere/simde/blob/master/.travis.yml
123     # and https://software.intel.com/content/www/us/en/develop/documentation/get-started-with-intel-oneapi-render-linux/top/configure-your-system.html.
124     - name: "ICC"
125       stage: check
126       os: linux
127       compiler: icc
128       env:
129         - CC=icc
130         - CXX=icpc
131       install:
132         - source /opt/intel/inteloneapi/compiler/latest/env/vars.sh
133       addons:
134         apt:
135           sources:
136           - sourceline: 'deb https://apt.repos.intel.com/oneapi all main'
137             key_url: 'https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2023.PUB'
138           packages:
139           - intel-oneapi-icc
141     - name: "ARM64: GCC 10 -O2 part 1"
142       stage: check
143       os: linux
144       arch: arm64
145       dist: bionic
146       addons: *gcc10
147       env:
148         - CC=gcc-10
149         - CXX=g++-10
150         - CONFIGUREFLAGS='CPPFLAGS=-DNDEBUG CFLAGS=-O2 CXXFLAGS=-O2'
151         - PART=1
153     - name: "PPC64le: GCC 10 -O2 part 1"
154       stage: check
155       os: linux
156       arch: ppc64le
157       dist: bionic
158       addons:
159         apt:
160           sources:
161             # See https://github.com/travis-ci/apt-source-safelist/issues/410.
162             - sourceline: 'ppa:ubuntu-toolchain-r/test'
163           packages: g++-10
164       env:
165         - CC=gcc-10
166         - CXX=g++-10
167         - CONFIGUREFLAGS='CFLAGS=-O2 CXXFLAGS=-O2'
168         - PART=1
170     - name: "s390x: GCC 10 -O2 part 1"
171       stage: check
172       os: linux
173       arch: s390x
174       dist: bionic
175       addons: *gcc10
176       env:
177         - CC=gcc-10
178         - CXX=g++-10
179         - CONFIGUREFLAGS='CFLAGS=-O2 CXXFLAGS=-O2'
180         - PART=1
182     ## ----- ##
183     ## GCC.  ##
184     ## ----- ##
186     - name: "GCC 9 with sanitizers part 1"
187       stage: check
188       os: linux
189       dist: bionic
190       addons:
191         apt:
192           sources:
193             # See https://github.com/travis-ci/apt-source-safelist/issues/410.
194             - sourceline: 'ppa:ubuntu-toolchain-r/test'
195           packages: g++-9
196       env:
197         - CC='gcc-9 -fsanitize=undefined,address -fno-omit-frame-pointer'
198         - CXX='g++-9 -fsanitize=undefined,address -fno-omit-frame-pointer'
199         - CONFIGUREFLAGS='CFLAGS=-O1 CXXFLAGS=-O1'
200         - PART=1
202     - name: "GCC 8"
203       stage: check
204       os: linux
205       dist: bionic
206       addons:
207         apt:
208           packages: g++-8
209       env:
210         - CC=gcc-8
211         - CXX=g++-8
213     - name: "GCC 7"
214       stage: check
215       os: linux
216       dist: bionic
217       addons:
218         apt:
219           packages: g++-7
220       env:
221         - CC=gcc-7
222         - CXX=g++-7
224     - name: "GCC 6"
225       stage: check
226       os: linux
227       dist: xenial
228       addons:
229         apt:
230           sources: ubuntu-toolchain-r-test
231           packages: g++-6
232       env:
233         - CC=gcc-6
234         - CXX=g++-6
236     - name: "GCC 5"
237       stage: check
238       os: linux
239       dist: xenial
240       addons:
241         apt:
242           sources: ubuntu-toolchain-r-test
243           packages: g++-5
244       env:
245          - CC=gcc-5
246          - CXX=g++-5
248     - name: "GCC 4.9"
249       stage: check
250       os: linux
251       dist: xenial
252       addons:
253         apt:
254           sources: ubuntu-toolchain-r-test
255           packages: g++-4.9
256       env:
257          - CC=gcc-4.9
258          - CXX=g++-4.9
260     - name: "GCC 4.8"
261       stage: check
262       os: linux
263       dist: xenial
264       addons:
265         apt:
266           sources: ubuntu-toolchain-r-test
267           packages: g++-4.8
268       env:
269          - CC=gcc-4.8
270          - CXX=g++-4.8
272     - name: "GCC 4.7"
273       stage: check
274       os: linux
275       dist: xenial
276       addons:
277         apt:
278           sources: ubuntu-toolchain-r-test
279           packages: g++-4.7
280       env:
281          - CC=gcc-4.7
282          - CXX=g++-4.7
284     - name: "GCC 4.6"
285       stage: check
286       os: linux
287       dist: xenial
288       addons:
289         apt:
290           sources: ubuntu-toolchain-r-test
291           packages: g++-4.6
292       env:
293          - CC=gcc-4.6
294          - CXX=g++-4.6
296     ## ------- ##
297     ## Clang.  ##
298     ## ------- ##
300     - name: "Clang 9 -O3"
301       stage: check
302       os: linux
303       dist: bionic
304       addons:
305         apt:
306           sources:
307             # See https://github.com/travis-ci/apt-source-safelist/issues/410.
308             - sourceline: 'ppa:ubuntu-toolchain-r/test'
309             - sourceline: 'deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-9 main'
310               key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key'
311           packages:
312             - clang-9
313             - libc++-9-dev
314             - libc++abi-9-dev
315       env:
316         - CC='clang-9'
317         - CXX='clang++-9 -stdlib=libc++'
318         - CONFIGUREFLAGS='CPPFLAGS=-DNDEBUG CFLAGS=-O3 CXXFLAGS=-O3'
320     - name: "Clang 8"
321       stage: check
322       os: linux
323       dist: bionic
324       addons:
325         apt:
326           packages:
327             - clang-8
328             - libc++-8-dev
329             - libc++abi-8-dev
330       env:
331         - CC=clang-8
332         - CXX='clang++-8 -stdlib=libc++'
334     - name: "Clang 7"
335       stage: check
336       os: linux
337       dist: bionic
338       addons:
339         apt:
340           packages:
341             - clang-7
342             - libc++-7-dev
343             - libc++abi-7-dev
344       env:
345         - CC=clang-7
346         - CXX='clang++-7 -stdlib=libc++'
348     - name: "Clang 6 and libc++"
349       stage: check
350       os: linux
351       dist: xenial
352       addons:
353         apt:
354           sources:
355             - llvm-toolchain-xenial-6.0
356             - ubuntu-toolchain-r-test
357           packages:
358             - clang-6.0
359             - libc++-dev
360       env:
361         - CC=clang-6.0
362         - CXX='clang++-6.0 -stdlib=libc++'
364     - name: "Clang 5"
365       stage: check
366       os: linux
367       dist: xenial
368       addons:
369         apt:
370           sources: llvm-toolchain-xenial-5.0
371           packages:
372             - clang-5.0
373             - libc++-dev
374       env:
375         - CC='clang-5.0'
376         - CXX='clang++-5.0'
378     - name: "Clang 4"
379       stage: check
380       os: linux
381       dist: xenial
382       addons:
383         apt:
384           sources: llvm-toolchain-xenial-4.0
385           packages: clang-4.0
386       env:
387         - CC=clang-4.0
388         - CXX=clang++-4.0
390     - name: "Clang 3.9"
391       stage: check
392       os: linux
393       dist: xenial
394       addons:
395         apt:
396           sources: llvm-toolchain-xenial-3.9
397           packages: clang-3.9
398       env:
399         - CC=clang-3.9
400         - CXX=clang++-3.9
402     - name: "Clang 3.8"
403       stage: check
404       os: linux
405       dist: xenial
406       addons:
407         apt:
408           sources:
409             - ubuntu-toolchain-r-test
410             - llvm-toolchain-precise-3.8
411           packages: clang-3.8
412       env:
413         - CC=clang-3.8
414         - CXX=clang++-3.8
416     - name: "CLang 3.7"
417       stage: check
418       os: linux
419       dist: xenial
420       addons:
421         apt:
422           sources:
423             - ubuntu-toolchain-r-test
424             - llvm-toolchain-precise-3.7
425           packages: clang-3.7
426       env:
427         - CC=clang-3.7
428         - CXX=clang++-3.7
430     - name: "Clang 3.6"
431       stage: check
432       os: linux
433       dist: xenial
434       addons:
435         apt:
436           sources:
437             - ubuntu-toolchain-r-test
438             - llvm-toolchain-precise-3.6
439           packages: clang-3.6
440       env:
441         - CC=clang-3.6
442         - CXX=clang++-3.6
444     - name: "Clang 3.5"
445       stage: check
446       os: linux
447       dist: xenial
448       addons:
449         apt:
450           sources:
451             - ubuntu-toolchain-r-test
452             - llvm-toolchain-precise-3.5
453           packages: clang-3.5
454       env:
455         - CC=clang-3.5
456         - CXX=clang++-3.5
458     - name: "Clang 3.4"
459       stage: check
460       os: linux
461       # Not available on Xenial.
462       dist: trusty
463       addons:
464         apt:
465           packages: clang-3.4
466       env:
467         # No versioned name installed, but beware that Travis installs
468         # a more modern clang earlier in the default PATH.
469         - CC=/usr/bin/clang
470         - CXX=/usr/bin/clang++
472     - name: "Clang 3.3"
473       stage: check
474       os: linux
475       # Not available on Xenial.
476       dist: trusty
477       addons:
478         apt:
479           packages: clang-3.3
480       env:
481         # See comment for 3.4.
482         - CC=/usr/bin/clang
483         - CXX=/usr/bin/clang++
485 ## From https://docs.gitlab.com/ce/ci/ssh_keys/#ssh-keys-when-using-the-docker-executor.
486 ## Applies to Travis too.  Applied to all the 'script's (of all the jobs).
487 before_script:
488   - 'which ssh-agent || ( sudo apt-get install openssh-client -y )'
489   - eval "$(ssh-agent -s)"
490   # $SSH_PRIVATE_KEY is multiline.  Use $'...' to register its value: $'-----BEGIN OPENSSH PRIVATE KEY-----\nXXXXX...\n...==\n-----END OPENSSH PRIVATE KEY-----'.
491   - echo "$SSH_PRIVATE_KEY" >/tmp/key.id_rsa
492   - chmod 600 /tmp/key.id_rsa
493   - ssh-add /tmp/key.id_rsa </dev/null
494   - mkdir -p ~/.ssh
495   - chmod 700 ~/.ssh
496   - echo '|1|bpc51UGxoDZjCPiwRlCStW32trI=|rfh6mLoLZv/vAvOVrpZXI1hTLxg= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBIR+ckMoJTNXHvAQLHWSfrRnrNJGW2ZR6kr5pBVDGCkz1v1RcQ5rleq0NAt9kS3v4hgnuLiEVnK7KDRzcEH3ikc=' >>~/.ssh/known_hosts
497   - chmod 600 ~/.ssh/known_hosts
499 # Applies only to the jobs that don't have a 'script', i.e., applies to all the 'check' jobs, but not the 'dist' one.
500 script:
501   # Beware not too leak $SSH_PRIVATE_KEY.
502   # - env
503   - sudo apt-get install -qq doxygen flex m4
504   # Install and activate dmd.
505   - mkdir -p ~/dlang && wget https://dlang.org/install.sh -O ~/dlang/install.sh
506   - source $(source ~/dlang/install.sh dmd -a) || true
508   - $CC --version
509   - $CXX --version
510   - dmd --version || true
511   - doxygen --version
512   - flex --version
513   - ld --version
514   - m4 --version
516   - if [[ -f ~/.bashrc ]]; then source ~/.bashrc; fi
517   # Unset this variable, otherwise, Java programs' stderr is cluttered
518   # with `Picked up _JAVA_OPTIONS: -Xmx2048m -Xms512m`, which makes
519   # the test suite fail.
520   - unset _JAVA_OPTIONS
522   # Fail fast from now on.
523   - set -e
524   - sftp bison@sftp.lrde.epita.fr:bison-$TRAVIS_BUILD_NUMBER.tar.xz
525   - tar xf bison-$TRAVIS_BUILD_NUMBER.tar.xz
526   - dir=$(tar tf bison-$TRAVIS_BUILD_NUMBER.tar.xz | sed 1q)
527   - cd $dir
528   - mkdir _build
529   - cd _build
530   - ../configure --enable-gcc-warnings CC="$CC" CXX="$CXX" $CONFIGUREFLAGS || { cat config.log && false; }
531   - make -j2 $MAKE_ARGS
532   - if test ${PART-1} = 1; then make check                  VERBOSE=1 TESTSUITEFLAGS=-j2 || { cat test-suite.log && cat tests/testsuite.log && false; }; fi
533   - if test ${PART-2} = 2; then make maintainer-check-posix VERBOSE=1 TESTSUITEFLAGS=-j2 || { cat tests/testsuite.log && false; }; fi
534   - if test ${PART-2} = 2; then make maintainer-check-g++   VERBOSE=1 TESTSUITEFLAGS=-j2 || { cat tests/testsuite.log && false; }; fi