diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..c6e6519b7 --- /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 000000000..0ce8f1203 --- /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 000000000..ea2108fce --- /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 cb7d9d298..cda834112 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