# Copyright (c) 2021 Red Hat, Inc.
#
# Author:
#  Cleber Rosa <crosa@redhat.com>
#
# This work is licensed under the terms of the GNU GPL, version 2 or
# later.  See the COPYING file in the top-level directory.
#
# This is an ansible playbook file.  Run it to set up systems with the
# environment needed to build QEMU.
---
- name: Installation of basic packages to build QEMU
  hosts: all
  tasks:
    - name: Check for suitable ansible version
      delegate_to: localhost
      assert:
        that:
          - '((ansible_version.major == 2) and (ansible_version.minor >= 8)) or (ansible_version.major >= 3)'
        msg: "Unsuitable ansible version, please use version 2.8.0 or later"

    - name: Add armhf foreign architecture to aarch64 hosts
      command: dpkg --add-architecture armhf
      when:
        - ansible_facts['distribution'] == 'Ubuntu'
        - ansible_facts['architecture'] == 'aarch64'

    - name: Update apt cache / upgrade packages via apt
      apt:
        update_cache: yes
        upgrade: yes
      when:
        - ansible_facts['distribution'] == 'Ubuntu'

    # lcitool variables -f json ubuntu-2204 qemu | jq -r '.pkgs[]' | xargs -n 1 echo "-"
    - name: Install basic packages to build QEMU on Ubuntu 22.04
      package:
        name:
          - bash
          - bc
          - bison
          - bsdextrautils
          - bzip2
          - ca-certificates
          - ccache
          - clang
          - dbus
          - debianutils
          - diffutils
          - exuberant-ctags
          - findutils
          - flex
          - g++
          - gcc
          - gcovr
          - genisoimage
          - gettext
          - git
          - hostname
          - libaio-dev
          - libasan5
          - libasound2-dev
          - libattr1-dev
          - libbpf-dev
          - libbrlapi-dev
          - libbz2-dev
          - libc6-dev
          - libcacard-dev
          - libcap-ng-dev
          - libcapstone-dev
          - libcmocka-dev
          - libcurl4-gnutls-dev
          - libdaxctl-dev
          - libdrm-dev
          - libepoxy-dev
          - libfdt-dev
          - libffi-dev
          - libgbm-dev
          - libgcrypt20-dev
          - libglib2.0-dev
          - libglusterfs-dev
          - libgnutls28-dev
          - libgtk-3-dev
          - libibumad-dev
          - libibverbs-dev
          - libiscsi-dev
          - libjemalloc-dev
          - libjpeg-turbo8-dev
          - libjson-c-dev
          - liblttng-ust-dev
          - liblzo2-dev
          - libncursesw5-dev
          - libnfs-dev
          - libnuma-dev
          - libpam0g-dev
          - libpcre2-dev
          - libpixman-1-dev
          - libpmem-dev
          - libpng-dev
          - libpulse-dev
          - librbd-dev
          - librdmacm-dev
          - libsasl2-dev
          - libsdl2-dev
          - libsdl2-image-dev
          - libseccomp-dev
          - libslirp-dev
          - libsnappy-dev
          - libspice-protocol-dev
          - libspice-server-dev
          - libssh-dev
          - libsystemd-dev
          - libtasn1-6-dev
          - libubsan1
          - libudev-dev
          - liburing-dev
          - libusb-1.0-0-dev
          - libusbredirhost-dev
          - libvdeplug-dev
          - libvirglrenderer-dev
          - libvte-2.91-dev
          - libxen-dev
          - libxml2-dev
          - libzstd-dev
          - llvm
          - locales
          - make
          - meson
          - multipath-tools
          - ncat
          - nettle-dev
          - ninja-build
          - openssh-client
          - pkgconf
          - python3
          - python3-numpy
          - python3-opencv
          - python3-pillow
          - python3-pip
          - python3-sphinx
          - python3-sphinx-rtd-theme
          - python3-venv
          - python3-yaml
          - rpm2cpio
          - sed
          - sparse
          - systemtap-sdt-dev
          - tar
          - tesseract-ocr
          - tesseract-ocr-eng
          - texinfo
          - xfslibs-dev
          - zlib1g-dev
        state: present
      when:
        - ansible_facts['distribution'] == 'Ubuntu'
        - ansible_facts['distribution_version'] == '22.04'

    - name: Install armhf cross-compile packages to build QEMU on AArch64 Ubuntu 22.04
      package:
        name:
          - binutils-arm-linux-gnueabihf
          - gcc-arm-linux-gnueabihf
          - libblkid-dev:armhf
          - libc6-dev:armhf
          - libffi-dev:armhf
          - libglib2.0-dev:armhf
          - libmount-dev:armhf
          - libpcre2-dev:armhf
          - libpixman-1-dev:armhf
          - zlib1g-dev:armhf
      when:
        - ansible_facts['distribution'] == 'Ubuntu'
        - ansible_facts['distribution_version'] == '22.04'
        - ansible_facts['architecture'] == 'aarch64'

    - name: Enable EPEL repo on EL8
      dnf:
        name:
          - epel-release
        state: present
      when:
        - ansible_facts['distribution_file_variety'] in ['RedHat', 'CentOS']
        - ansible_facts['distribution_major_version'] == '8'

    - name: Enable PowerTools repo on CentOS 8
      ini_file:
        path: /etc/yum.repos.d/CentOS-Stream-PowerTools.repo
        section: powertools
        option: enabled
        value: "1"
      when:
        - ansible_facts['distribution_file_variety'] == 'CentOS'
        - ansible_facts['distribution_major_version'] == '8'

    - name: Install basic packages to build QEMU on EL8
      dnf:
        # This list of packages start with tests/docker/dockerfiles/centos8.docker
        # but only include files that are common to all distro variants and present
        # in the standard repos (no add-ons)
        name:
          - bzip2
          - bzip2-devel
          - capstone-devel
          - dbus-daemon
          - device-mapper-multipath-devel
          - diffutils
          - gcc
          - gcc-c++
          - genisoimage
          - gettext
          - git
          - glib2-devel
          - glusterfs-api-devel
          - gnutls-devel
          - libaio-devel
          - libcap-ng-devel
          - libcurl-devel
          - libepoxy-devel
          - libfdt-devel
          - libgcrypt-devel
          - libiscsi-devel
          - libpmem-devel
          - librados-devel
          - librbd-devel
          - libseccomp-devel
          - libssh-devel
          - libxkbcommon-devel
          - lzo-devel
          - make
          - mesa-libEGL-devel
          - nettle-devel
          - ninja-build
          - nmap-ncat
          - numactl-devel
          - pixman-devel
          - python38
          - python3-sphinx
          - rdma-core-devel
          - redhat-rpm-config
          - snappy-devel
          - spice-glib-devel
          - systemd-devel
          - systemtap-sdt-devel
          - tar
          - zlib-devel
        state: present
      when:
        - ansible_facts['distribution_file_variety'] in ['RedHat', 'CentOS']
        - ansible_facts['distribution_version'] == '8'

    - name: Install packages only available on x86 and aarch64
      dnf:
        # Spice server not available in ppc64le
        name:
          - spice-server
          - spice-server-devel
        state: present
      when:
        - ansible_facts['distribution_file_variety'] in ['RedHat', 'CentOS']
        - ansible_facts['distribution_version'] == '8'
        - ansible_facts['architecture'] == 'aarch64' or ansible_facts['architecture'] == 'x86_64'

    - name: Check whether the Python runtime version is managed by alternatives
      stat:
        path: /etc/alternatives/python3
      register: python3

    - name: Set default Python runtime to 3.8 on EL8
      command: alternatives --set python3 /usr/bin/python3.8
      when:
        - ansible_facts['distribution_file_variety'] in ['RedHat', 'CentOS']
        - ansible_facts['distribution_version'] == '8'
        - python3.stat.islnk and python3.stat.lnk_target != '/usr/bin/python3.8'