Merge branch 'GHA'

Add CI GitHub Actions workflow.

See #2062.
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..c6e6519
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,105 @@
+name: CI
+
+on:
+  push:
+    branches: master
+  pull_request:
+    branches: master
+
+jobs:
+  build:
+
+    runs-on: ${{ matrix.os }}
+    strategy:
+      matrix:
+        #SWIGJOBS: ["-j2"]
+        # other variables to optionally set
+        # CC, GCC (used as suffix)
+        # CPP11, CPP14, CPP17
+        # CONFIGOPTS
+        # SWIGLANG
+        # PY3,VER
+        # SWIG_FEATURES
+        include:
+        - os: ubuntu-latest
+          CPP11: 1
+          SWIGLANG: ""
+        - os: ubuntu-latest
+          CPP11: 1
+          SWIGLANG: python
+        - os: ubuntu-latest
+          CPP11: 1
+          SWIGLANG: python
+          PY3: 3
+        - os: ubuntu-latest
+          CPP11: 1
+          SWIGLANG: tcl
+        # let's run all of them, as opposed to aborting when one fails
+      fail-fast: false
+
+    steps:
+    - uses: actions/checkout@v2
+      with:
+        submodules: recursive
+    - name: ccache
+      uses: hendrikmuhs/ccache-action@v1
+      with:
+        key: ${{ matrix.os }}-${{ matrix.SWIGLANG }}
+    - name: configure
+      shell: bash
+      env:
+          SWIGLANG: ${{ matrix.SWIGLANG }}
+          CONFIGOPTS: ${{ matrix.CONFIGOPTS }}
+          CC: ${{ matrix.CC }}
+      run: |
+          set -ex
+          export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
+          source Tools/GHA-linux-install.sh
+          if test -n "$CPP11"; then CONFIGOPTS+=(--enable-cpp11-testing "CXXFLAGS=-std=c++11 $CXXFLAGS" "CFLAGS=-std=c11 $CFLAGS") && export CSTD=c11 && export CPPSTD=c++11; fi
+          if test -n "$CPP14"; then CONFIGOPTS+=(--enable-cpp11-testing "CXXFLAGS=-std=c++14 $CXXFLAGS" "CFLAGS=-std=c11 $CFLAGS") && export CSTD=c11 && export CPPSTD=c++14; fi
+          if test -n "$CPP17"; then CONFIGOPTS+=(--enable-cpp11-testing "CXXFLAGS=-std=c++17 $CXXFLAGS" "CFLAGS=-std=c17 $CFLAGS") && export CSTD=c17 && export CPPSTD=c++17; fi
+          if test -n "$SWIGLANG"; then CONFIGOPTS+=(--without-alllang --with-$WITHLANG); fi
+          echo "${CONFIGOPTS[@]}"
+          ./autogen.sh && mkdir -p build/build && cd build/build && ../../configure "${CONFIGOPTS[@]}"
+
+    - name: build
+      shell: bash
+      env:
+          SWIGLANG: ${{ matrix.SWIGLANG }}
+          SWIGJOBS: ${{ matrix.SWIGJOBS }}
+      run: |
+          set -ex
+          cd ${GITHUB_WORKSPACE}/build/build;
+          make -s $SWIGJOBS
+          ./swig -version && ./swig -pcreversion
+          if test -z "$SWIGLANG"; then make -s $SWIGJOBS check-ccache; fi
+          if test -z "$SWIGLANG"; then make -s $SWIGJOBS check-errors-test-suite; fi
+          echo 'Installing...'
+          if test -z "$SWIGLANG"; then sudo make -s install && swig -version && ccache-swig -V; fi
+    - name: tests
+      shell: bash
+      env:
+          SWIGLANG: ${{ matrix.SWIGLANG }}
+          SWIGJOBS: ${{ matrix.SWIGJOBS }}
+          SWIG_FEATURES: ${{ matrix.SWIG_FEATURES }}
+          CC: ${{ matrix.CC }}
+          CSTD: ${{ matrix.CSTD }}
+          CPP11: ${{ matrix.CPP11 }}
+          CPP14: ${{ matrix.CPP14 }}
+          CPP17: ${{ matrix.CPP17 }}
+      run: |
+          set -ex
+          cd ${GITHUB_WORKSPACE}/build/build;
+          if test -n "$CPP11"; then export CPPSTD=c++11; fi
+          if test -n "$CPP14"; then export CPPSTD=c++14; fi
+          if test -n "$CPP17"; then export CPPSTD=c++17; fi
+          # Stricter compile flags for examples. Various headers and SWIG generated code prevents full use of -pedantic.
+          if test -n "$SWIGLANG"; then cflags=$($GITHUB_WORKSPACE/Tools/testflags.py --language $SWIGLANG --cflags --std=$CSTD --compiler=$CC) && echo $cflags; fi
+          if test -n "$SWIGLANG"; then cxxflags=$($GITHUB_WORKSPACE/Tools/testflags.py --language $SWIGLANG --cxxflags --std=$CPPSTD --compiler=$CC) && echo $cxxflags; fi
+          if test -n "$SWIGLANG"; then make -s check-$SWIGLANG-version; fi
+          if test -n "$SWIGLANG"; then make check-$SWIGLANG-enabled; fi
+          if test -n "$SWIGLANG"; then make $SWIGJOBS check-$SWIGLANG-examples CFLAGS="$cflags" CXXFLAGS="$cxxflags"; fi
+          if test -n "$SWIGLANG"; then make $SWIGJOBS check-$SWIGLANG-test-suite CFLAGS="$cflags" CXXFLAGS="$cxxflags"; fi
+          #echo 'Cleaning...'
+          # Skip on osx as often fails with: rm: Resource temporarily unavailable
+          #if test "$TRAVIS_OS_NAME" != "osx"; then make check-maintainer-clean && ../../configure $CONFIGOPTS; fi
diff --git a/Tools/CI-linux-install.sh b/Tools/CI-linux-install.sh
new file mode 100644
index 0000000..0ce8f12
--- /dev/null
+++ b/Tools/CI-linux-install.sh
@@ -0,0 +1,121 @@
+#!/bin/bash
+# expected to be called from elsewhere with certain variables set
+# e.g. RETRY=travis-retry SWIGLANG=python GCC=7
+set -e # exit on failure (same as -o errexit)
+
+if [[ -n "$GCC" ]]; then
+	$RETRY sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
+	$RETRY sudo apt-get -qq update
+	$RETRY sudo apt-get install -qq g++-$GCC
+fi
+
+$RETRY sudo apt-get -qq install libboost-dev libpcre3-dev
+# testflags.py needs python
+$RETRY sudo apt-get install -qq python
+
+WITHLANG=$SWIGLANG
+
+case "$SWIGLANG" in
+	"")     ;;
+	"csharp")
+		$RETRY sudo apt-get -qq install mono-devel
+		;;
+	"d")
+		$RETRY wget http://downloads.dlang.org/releases/2.x/${VER}/dmd_${VER}-0_amd64.deb
+		$RETRY sudo dpkg -i dmd_${VER}-0_amd64.deb
+		;;
+	"go")
+		if [[ "$VER" ]]; then
+		  eval "$(gimme ${VER}.x)"
+		fi
+		;;
+	"javascript")
+		case "$ENGINE" in
+			"node")
+				$RETRY wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.10/install.sh | bash
+				export NVM_DIR="$HOME/.nvm"
+				[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
+				$RETRY nvm install ${VER}
+				nvm use ${VER}
+				if [ "$VER" == "0.10" ] || [ "$VER" == "0.12" ] || [ "$VER" == "4" ] || [ "$VER" == "6" ] ; then
+#					$RETRY sudo apt-get install -qq nodejs node-gyp
+					$RETRY npm install -g node-gyp@$VER
+				elif [ "$VER" == "8" ] ; then
+					$RETRY npm install -g node-gyp@6
+				elif [ "$VER" == "10" ] || [ "$VER" == "12" ] || [ "$VER" == "14" ]  || [ "$VER" == "16" ]; then
+					$RETRY npm install -g node-gyp@7
+				else
+					$RETRY npm install -g node-gyp
+				fi
+				;;
+			"jsc")
+				$RETRY sudo apt-get install -qq libwebkitgtk-dev
+				;;
+			"v8")
+				$RETRY sudo apt-get install -qq libv8-dev
+				;;
+		esac
+		;;
+	"guile")
+		$RETRY sudo apt-get -qq install guile-2.0-dev
+		;;
+	"lua")
+		if [[ -z "$VER" ]]; then
+			$RETRY sudo apt-get -qq install lua5.2 liblua5.2-dev
+		else
+			$RETRY sudo apt-get -qq install lua${VER} liblua${VER}-dev
+		fi
+		;;
+	"mzscheme")
+		$RETRY sudo apt-get -qq install racket
+		;;
+	"ocaml")
+		$RETRY sudo apt-get -qq install ocaml camlp4
+		;;
+	"octave")
+		$RETRY sudo apt-get -qq install liboctave-dev
+		;;
+	"php")
+		$RETRY sudo add-apt-repository -y ppa:ondrej/php
+		$RETRY sudo apt-get -qq update
+		$RETRY sudo apt-get -qq install php$VER-cli php$VER-dev
+		;;
+	"python")
+		pip install --user pycodestyle
+		if [[ "$VER" ]]; then
+			$RETRY sudo add-apt-repository -y ppa:deadsnakes/ppa
+			$RETRY sudo apt-get -qq update
+			$RETRY sudo apt-get -qq install python${VER}-dev
+			WITHLANG=$SWIGLANG$PY3=$SWIGLANG$VER
+                else
+		        $RETRY sudo apt-get install -qq python${PY3}-dev
+		        WITHLANG=$SWIGLANG$PY3
+		fi
+		;;
+	"r")
+		$RETRY sudo apt-get -qq install r-base
+		;;
+	"ruby")
+		if [[ "$VER" == "2.7" || "$VER" == "3.0" ]]; then
+			# Ruby 2.7+ support is currently only rvm master (30 Dec 2019)
+			$RETRY rvm get master
+			rvm reload
+			rvm list known
+		fi
+		if [[ "$VER" ]]; then
+			$RETRY rvm install $VER
+		fi
+		;;
+	"scilab")
+		# Travis has the wrong version of Java pre-installed resulting in error using scilab:
+		# /usr/bin/scilab-bin: error while loading shared libraries: libjava.so: cannot open shared object file: No such file or directory
+		echo "JAVA_HOME was set to $JAVA_HOME"
+		unset JAVA_HOME
+		$RETRY sudo apt-get -qq install scilab
+		;;
+	"tcl")
+		$RETRY sudo apt-get -qq install tcl-dev
+		;;
+esac
+
+set +e # turn off exit on failure (same as +o errexit)
diff --git a/Tools/GHA-linux-install.sh b/Tools/GHA-linux-install.sh
new file mode 100644
index 0000000..ea2108f
--- /dev/null
+++ b/Tools/GHA-linux-install.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+#lsb_release -a
+# find location of current script (only works in bash)
+script_dir="$( dirname "${BASH_SOURCE[0]}")"
+
+# run generic script
+RETRY=
+source "$script_dir"/CI-linux-install.sh
diff --git a/Tools/travis-linux-install.sh b/Tools/travis-linux-install.sh
index cb7d9d2..cda8341 100755
--- a/Tools/travis-linux-install.sh
+++ b/Tools/travis-linux-install.sh
@@ -2,123 +2,10 @@
 
 # Install Linux packages where the version has been overidden in .travis.yml
 
-set -e # exit on failure (same as -o errexit)
-
 lsb_release -a
-travis_retry sudo apt-get -qq update
+# find location of current script (only works in bash)
+script_dir="$( dirname "${BASH_SOURCE[0]}")"
 
-if [[ -n "$GCC" ]]; then
-	travis_retry sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
-	travis_retry sudo apt-get -qq update
-	travis_retry sudo apt-get install -qq g++-$GCC
-fi
-
-travis_retry sudo apt-get -qq install libboost-dev libpcre3-dev
-
-WITHLANG=$SWIGLANG
-
-case "$SWIGLANG" in
-	"")     ;;
-	"csharp")
-		travis_retry sudo apt-get -qq install mono-devel
-		;;
-	"d")
-		travis_retry wget http://downloads.dlang.org/releases/2.x/${VER}/dmd_${VER}-0_amd64.deb
-		travis_retry sudo dpkg -i dmd_${VER}-0_amd64.deb
-		;;
-	"go")
-		if [[ "$VER" ]]; then
-		  eval "$(gimme ${VER}.x)"
-		fi
-		;;
-	"javascript")
-		case "$ENGINE" in
-			"node")
-				travis_retry wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.10/install.sh | bash
-				export NVM_DIR="$HOME/.nvm"
-				[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
-				travis_retry nvm install ${VER}
-				nvm use ${VER}
-				if [ "$VER" == "0.10" ] || [ "$VER" == "0.12" ] || [ "$VER" == "4" ] || [ "$VER" == "6" ] ; then
-#					travis_retry sudo apt-get install -qq nodejs node-gyp
-					travis_retry npm install -g node-gyp@$VER
-				elif [ "$VER" == "8" ] ; then
-					travis_retry npm install -g node-gyp@6
-				elif [ "$VER" == "10" ] || [ "$VER" == "12" ] || [ "$VER" == "14" ]  || [ "$VER" == "16" ]; then
-					travis_retry npm install -g node-gyp@7
-				else
-					travis_retry npm install -g node-gyp
-				fi
-				;;
-			"jsc")
-				travis_retry sudo apt-get install -qq libwebkitgtk-dev
-				;;
-			"v8")
-				travis_retry sudo apt-get install -qq libv8-dev
-				;;
-		esac
-		;;
-	"guile")
-		travis_retry sudo apt-get -qq install guile-2.0-dev
-		;;
-	"lua")
-		if [[ -z "$VER" ]]; then
-			travis_retry sudo apt-get -qq install lua5.2 liblua5.2-dev
-		else
-			travis_retry sudo apt-get -qq install lua${VER} liblua${VER}-dev
-		fi
-		;;
-	"mzscheme")
-		travis_retry sudo apt-get -qq install racket
-		;;
-	"ocaml")
-		travis_retry sudo apt-get -qq install ocaml camlp4
-		;;
-	"octave")
-		travis_retry sudo apt-get -qq install liboctave-dev
-		;;
-	"php")
-		travis_retry sudo add-apt-repository -y ppa:ondrej/php
-		travis_retry sudo apt-get -qq update
-		travis_retry sudo apt-get -qq install php$VER-cli php$VER-dev
-		;;
-	"python")
-		pip install --user pycodestyle
-		if [[ "$PY3" ]]; then
-			travis_retry sudo apt-get install -qq python3-dev
-		fi
-		WITHLANG=$SWIGLANG$PY3
-		if [[ "$VER" ]]; then
-			travis_retry sudo add-apt-repository -y ppa:deadsnakes/ppa
-			travis_retry sudo apt-get -qq update
-			travis_retry sudo apt-get -qq install python${VER}-dev
-			WITHLANG=$SWIGLANG$PY3=$SWIGLANG$VER
-		fi
-		;;
-	"r")
-		travis_retry sudo apt-get -qq install r-base
-		;;
-	"ruby")
-		if [[ "$VER" == "2.7" || "$VER" == "3.0" ]]; then
-			# Ruby 2.7+ support is currently only rvm master (30 Dec 2019)
-			travis_retry rvm get master
-			rvm reload
-			rvm list known
-		fi
-		if [[ "$VER" ]]; then
-			travis_retry rvm install $VER
-		fi
-		;;
-	"scilab")
-		# Travis has the wrong version of Java pre-installed resulting in error using scilab:
-		# /usr/bin/scilab-bin: error while loading shared libraries: libjava.so: cannot open shared object file: No such file or directory
-		echo "JAVA_HOME was set to $JAVA_HOME"
-		unset JAVA_HOME
-		travis_retry sudo apt-get -qq install scilab
-		;;
-	"tcl")
-		travis_retry sudo apt-get -qq install tcl-dev
-		;;
-esac
-
-set +e # turn off exit on failure (same as +o errexit)
+# run generic script
+RETRY=travis-retry
+source "$script_dir"/CI-linux-install.sh