version: 2
jobs:
  #
  # This is for the latest RELEASED Fedora.
  # Update the version of Fedora when new version is released.
  # We don't use rawhide, the development version of Fedora
  # till the list of TODO items of u-ctags becomes nil.
  #
  # We assume GNU Make is available.
  #
   fedora39_gmake:
     working_directory: ~/universal-ctags
     docker:
       - image: docker.io/fedora:39
     steps:
       - run:
           name: Install Git, Gdb and Procps-NG
           command: |
             yum -y install git gdb procps-ng
       - checkout
       - run:
           name: Install tools for building ctags and validating test input files
           command: |
             dnf -y install gcc automake autoconf pkgconfig make libseccomp-devel libxml2-devel jansson-devel libyaml-devel pcre2-devel findutils diffutils sudo
             dnf -y install jq puppet python3-sphinx
             # These are for input-validation.
             dnf -y install g++ jq puppet nodejs
       - run:
           name: Build
           command: |
             bash ./autogen.sh
             ./configure --enable-debugging
             make -j 2
       - run:
           name: Test
           command: |
             make check validate-input
       - run:
           name: Make HTML documents
           command: |
             cd docs
             make html

   fedora39_gmake_roundtrip:
     working_directory: ~/universal-ctags
     docker:
       - image: docker.io/fedora:39
     steps:
       - run:
           name: Install Git and Gdb
           command: |
             yum -y install git gdb
       - checkout
       - run:
           name: Install build tools
           command: |
             dnf -y install gcc automake autoconf pkgconfig make libseccomp-devel libxml2-devel jansson-devel libyaml-devel pcre2-devel findutils diffutils sudo
             dnf -y install jq puppet
       - run:
           name: Build
           command: |
             bash ./autogen.sh
             ./configure --enable-debugging
             make -j 2
       - run:
           name: Test
           command: |
             make roundtrip

  #
  # We assume GNU make as the `make` command as we use GNU make extension
  # aggressively in man/Makefile and win32/Makefile.
  #
  # man/Makefile is used to generate man files only when rst2man is installed.
  # win32/Makefile is used only when either source.mk or win32/*.in is updated.
  # In other cases we can still build ctags without GNU make.
  #
  # The following tests use bmake (NetBSD make) to check if GNU make extensions
  # are not used unintentionally.
  #
  # On Fedora 31 bmake package cannot be installed because a package required by
  # bmake is not available. More inspection is needed. Fedora 30 is the last
  # version where bmake can be installed.
  #
   fedora30_bmake:
     working_directory: ~/universal-ctags
     docker:
       - image: docker.io/fedora:30
     steps:
       - run:
           name: Install Git and Gdb
           command: |
             dnf -y install git gdb
       - checkout
       - run:
           name: Install packages for building ctags with bmake and checking code
           command: |
             dnf -y install gcc automake autoconf pkgconfig bmake libseccomp-devel libxml2-devel jansson-devel libyaml-devel pcre2-devel findutils sudo
       - run:
           name: Build
           command: |
             bash ./autogen.sh
             MAKE=bmake ./configure --enable-debugging
             bmake -j 2
       - run:
           name: Test
           command: |
             MAKE=bmake bmake check codecheck

   fedora30_bmake_roundtrip:
     working_directory: ~/universal-ctags
     docker:
       - image: docker.io/fedora:30
     steps:
       - run:
           name: Install Git and Gdb
           command: |
             dnf -y install git gdb
       - checkout
       - run:
           name: Install build tools
           command: |
             dnf -y install gcc automake autoconf pkgconfig bmake libseccomp-devel libxml2-devel jansson-devel libyaml-devel pcre2-devel findutils sudo
             dnf -y install jq puppet
       - run:
           name: Build
           command: |
             bash ./autogen.sh
             MAKE=bmake ./configure --enable-debugging
             bmake -j 2
       - run:
           name: Test
           command: |
             MAKE=bmake bmake roundtrip

   fedora39_distcheck:
     working_directory: ~/universal-ctags
     docker:
       - image: docker.io/fedora:39
     steps:
       - run:
           name: Install Git, Gdb and Procps-NG
           command: |
             dnf -y install git gdb procps-ng
       - checkout
       - run:
           name: Install build tools
           command: |
             dnf -y install gcc automake autoconf pkgconfig make libseccomp-devel libxml2-devel jansson-devel libyaml-devel findutils diffutils sudo pcre2-devel
             dnf -y install jq puppet python3-docutils
       - run:
           name: Run autogen.sh
           command: |
             bash ./autogen.sh
       - run:
           name: Run configure
           command: |
             ./configure
       - run:
           name: verify generated files (optlib, txt2cstr, etc.) are updated
           command: |
             make check-genfile
       - run:
           name: Test
           command: |
             ulimit -c 0
             # Let's trick git.
             #
             # "git" running in "make distcheck" may refer $(pwd)/.git of THIS context.
             # On the other hand, we want to run the test cases in an environment separated
             # from our git repo.
             #
             mkdir __NO_GIT__
             make distcheck GIT_DIR=__NO_GIT__
             rmdir __NO_GIT__

   stream9:
     working_directory: ~/universal-ctags
     docker:
       - image: quay.io/centos/centos:stream9
     steps:
       - run:
           name: Install Git
           command: |
             yum -y --enablerepo=baseos --enablerepo=appstream --enablerepo=crb install git
       - checkout
       - run:
           name: Install build tools
           command: |
              yum -y --enablerepo=baseos --enablerepo=appstream --enablerepo=crb install python3 gcc automake autoconf pkgconfig make libxml2-devel libyaml-devel pcre2-devel findutils diffutils sudo
       - run:
           name: Build
           command: |
             bash ./autogen.sh
             ./configure --enable-debugging
             make -j 2
       - run:
           name: Test
           command: |
             make check roundtrip

   ubi8:
     working_directory: ~/universal-ctags
     docker:
       - image: registry.access.redhat.com/ubi8:latest
     steps:
       - run:
           name: Install Git
           command: |
             yum -y install git
       - checkout
       - run:
           name: Install build tools
           command: |
              yum -y --enablerepo=ubi-8-appstream-rpms --enablerepo=ubi-8-baseos-rpms --enablerepo=ubi-8-codeready-builder-rpms install python3 gcc automake autoconf pkgconfig make libxml2-devel libyaml-devel pcre2-devel findutils diffutils sudo
       - run:
           name: Build
           command: |
             bash ./autogen.sh
             ./configure --enable-debugging
             make -j 2
       - run:
           name: Test
           command: |
             make check roundtrip

   centos7_make:
     working_directory: ~/universal-ctags
     docker:
       - image: docker.io/centos:7
     steps:
       - run:
           name: Install Git
           command: |
             yum -y install git
       - checkout
       - run:
           name: Install build tools
           command: |
              yum -y install python3 gcc automake autoconf pkgconfig make libxml2-devel jansson-devel libyaml-devel pcre2-devel findutils diffutils sudo
       - run:
           name: Build
           command: |
             bash ./autogen.sh
             ./configure --enable-debugging
             make -j 2
       - run:
           name: Test
           command: |
             make check SKIP_CHECKGEN_WIN32=yes

   centos7_make_roundtrip:
     working_directory: ~/universal-ctags
     docker:
       - image: docker.io/centos:7
     steps:
       - run:
           name: Install Git
           command: |
             yum -y install git
       - checkout
       - run:
           name: Install build tools
           command: |
              yum -y install gcc automake autoconf pkgconfig make libxml2-devel jansson-devel libyaml-devel pcre2-devel findutils diffutils sudo
       - run:
           name: Build
           command: |
             bash ./autogen.sh
             ./configure --enable-debugging
             make -j 2
       - run:
           name: Test
           command: |
             make roundtrip

   ubuntu20_mingw:
     working_directory: ~/universal-ctags
     docker:
       - image: docker.io/ubuntu:20.04
     steps:
       - run:
           name: Install git
           command: |
             export DEBIAN_FRONTEND=noninteractive
             apt-get -y update
             apt-get -y install git
       - checkout
       - run:
           name: Install build tools
           command: |
             export DEBIAN_FRONTEND=noninteractive
             apt-get -o APT::Immediate-Configure=false -y install \
             binutils-mingw-w64-i686 gcc-mingw-w64-i686 make gcc
       - run:
           name: Build
           command: |
             make -j2 CC=i686-w64-mingw32-gcc WINDRES=i686-w64-mingw32-windres CC_FOR_PACKCC=gcc -f mk_mingw.mak
   ubuntu20_32bit:
     working_directory: ~/universal-ctags
     docker:
       - image: docker.io/ubuntu:20.04
     steps:
       - run:
           name: Install git
           command: |
             export DEBIAN_FRONTEND=noninteractive
             dpkg --add-architecture i386
             apt-get -y update
             apt-get -y install git
       - checkout
       - run:
           name: Install build tools
           # APT::Immediate-Configure=false is taken from
           # https://superuser.com/questions/199582/apt-error-could-not-perform-immediate-configuration-on
           # I don't understand why I need this.
           # -- Masatake
           command: |
             export DEBIAN_FRONTEND=noninteractive
             apt-get -o APT::Immediate-Configure=false -y install \
             pkg-config autoconf automake make gcc \
             libjansson-dev:i386 libyaml-dev:i386 libseccomp-dev:i386 libxml2-dev:i386 \
             gdb valgrind \
             python3-docutils \
             libc6-dev-i386 libc6-dbg:i386
       - run:
           name: Build
           command: |
             bash ./autogen.sh
             CC='gcc -m32' ./configure --enable-debugging
             make -j 2
       - run:
           name: Test
           command: |
             # make check roundtrip
             make units CATEGORIES=parser-varlink

   fedora33_cross_aarch64:
     working_directory: ~/universal-ctags
     docker:
       - image: docker.io/library/fedora:33
     steps:
       - run:
           name: Install tools
           command: |
             dnf -y install git gcc autoconf automake make file
       - run:
           name: Prepare repo file for install cross compiler
           command: |
             curl -o /etc/yum.repos.d/lantw44-aarch64-linux-gnu-toolchain-fedora-33.repo https://copr.fedorainfracloud.org/coprs/lantw44/aarch64-linux-gnu-toolchain/repo/fedora-33/lantw44-aarch64-linux-gnu-toolchain-fedora-33.repo
       - run:
           name: Install the cross compiler for aarch64
           command: |
             dnf -y install aarch64-linux-gnu-binutils aarch64-linux-gnu-gcc aarch64-linux-gnu-glibc
       - checkout
       - run:
           name: Build ctags for aarch64
           command: |
             bash ./autogen.sh
             mkdir out
             ./configure --host=aarch64-linux-gnu \
             --prefix=`pwd`/out \
             --enable-static \
             --disable-seccomp \
             CC=/usr/bin/aarch64-linux-gnu-gcc \
             CPP=/usr/bin/aarch64-linux-gnu-cpp \
             AR=/usr/bin/aarch64-linux-gnu-gcc-ar \
             RANLIB=/usr/bin/aarch64-linux-gnu-gcc-ranlib \
             CC_FOR_BUILD=/usr/bin/gcc
             make -j 2
       - run:
           name: Install locally
           command: |
             make install
       - run:
           name: Test
           command: |
             test -f out/bin/ctags && ( file out/bin/ctags | grep -q 'ARM aarch64' )

workflows:
  version: 2
  build_and_test:
    jobs:
      - ubuntu20_32bit
      - fedora30_bmake
      - fedora39_distcheck
      - stream9
      - ubi8
      - fedora39_gmake
      - fedora33_cross_aarch64
      - centos7_make
      - ubuntu20_mingw
      - fedora30_bmake_roundtrip
      - fedora39_gmake_roundtrip
      - centos7_make_roundtrip
