ansible: Deploy legacy cross compilers on Debian nodes
authorKienan Stewart <kstewart@efficios.com>
Fri, 18 Aug 2023 20:37:56 +0000 (16:37 -0400)
committerKienan Stewart <kstewart@efficios.com>
Fri, 18 Aug 2023 21:35:25 +0000 (17:35 -0400)
Change-Id: Idc7f5910d8b3c0f5fedd20f11e534cce93017d23

automation/ansible/roles/cross-compilers/files/Containerfile [new file with mode: 0644]
automation/ansible/roles/cross-compilers/files/script.sh [new file with mode: 0755]
automation/ansible/roles/cross-compilers/tasks/setup-Debian.yml

diff --git a/automation/ansible/roles/cross-compilers/files/Containerfile b/automation/ansible/roles/cross-compilers/files/Containerfile
new file mode 100644 (file)
index 0000000..cedbf38
--- /dev/null
@@ -0,0 +1,38 @@
+FROM docker.io/debian:bookworm
+
+#
+# Create the container: podman build -t . gcc-4.8
+# Build the cross compilers:
+#   mkdir -p ~/gcc-4.8
+#   for i in aarch64-linux-gnu arm-linux-gnueabihf i686-linux-gnu powerpc64le-linux-gnu powerpc-linux-gnu riscv64-linux-gnu s390x-linux-gnu ; do podman run --rm -e "TARGET=$i" -v ~/gcc-4.8:/output localhost/gcc-4.8 ; done
+#   tar -czf ~/gcc-4.8.tgz -C ~/gcc-4.8 ./
+
+RUN echo 'deb-src http://deb.debian.org/debian bookworm main contrib' >> /etc/apt/sources.list
+RUN apt-get update
+
+RUN apt-get -y --force-yes build-dep gcc-12
+RUN apt-get -y --force-yes install wget
+#RUN apt-get -y --force-yes install -t jessie cross-gcc-dev
+RUN mkdir -p /src/build /src/patches /output
+WORKDIR /src
+RUN wget -q -O - https://github.com/gcc-mirror/gcc/archive/refs/tags/releases/gcc-4.8.5.tar.gz | tar -xzf -
+WORKDIR /src/patches
+
+# This patch fixes builds with more recent versions of texinfo
+RUN wget -q https://aur.archlinux.org/cgit/aur.git/plain/gcc.texi.49.patch?h=gcc48 -O 01-texi.patch.0
+
+# This patch updates the program search directions and installation directories
+# to match those used by the Debian packages, so we can piggy-back on the modern
+# toolchain binaries (eg. binutils--arch64-linux-gnu)
+RUN wget -q https://salsa.debian.org/toolchain-team/gcc/-/raw/gcc-4.8-debian/debian/patches/cross-install-location.diff -O 02-cross_install_dir.patch.2
+
+WORKDIR /src/build
+COPY script.sh /usr/bin/build-gcc.sh
+CMD /usr/bin/build-gcc.sh
+
+# @TODO: missing crtbegin.o eg., libgcc-4.8-dev-arm64-cross
+# This can be "worked around" by copying the system libc-cross
+# eg.
+#   cp -r /usr/lib/gcc-cross/aarch64-linux-gnu/12/ /usr/lib/gcc-cross/aarch64-linux-gnu/4.8.5
+#   make
+#
diff --git a/automation/ansible/roles/cross-compilers/files/script.sh b/automation/ansible/roles/cross-compilers/files/script.sh
new file mode 100755 (executable)
index 0000000..47b04a0
--- /dev/null
@@ -0,0 +1,94 @@
+#!/bin/bash -x
+
+SRC_DIR="${SRC_DIR:-/src/gcc-releases-gcc-4.8.5}"
+PATCH_DIR="${PATCH_DIR:-/src/patches}"
+TARGET="${TARGET:-aarch64-linux-gnu}"
+HOST="${HOST:-x86_64-linux-gnu}"
+CONFIGURE_ARGS="${CONFIGURE_ARGS:-}"
+MAKE_ARGS="${MAKE_ARGS:-}"
+MAKE_INSTALL_ARGS="${MAKE_INSTALL_ARGS:-}"
+
+OWD="$(pwd)"
+cd "${SRC_DIR}" || exit 1
+while read -r line ; do
+    EXT=$(echo "$line" | rev | cut -d. -f1 | rev)
+    PATCH_LEVEL=1
+    if [[ "${EXT}" =~ [0-9]+ ]] ; then
+        PATCH_LEVEL="${EXT}"
+    fi
+    patch -p"${PATCH_LEVEL}" < "${line}"
+done < <(find "${PATCH_DIR}" -type f)
+cd "${OWD}"
+
+TARGET_ARGS=()
+case "${TARGET}" in
+    aarch64-linux-gnu)
+        TARGET_ARGS+=(
+            --enable-fix-cortex-a64-84319
+        )
+        ;;
+    arm-linux-gnueabihf)
+        TARGET_ARGS+=(
+            --with-arch=armv7-a
+            --with-float=hard
+            --with-fpu=vfpv3-d16
+            --with-mode=thumb
+        )
+        ;;
+    i686-linux-gnu)
+        TARGET_ARGS+=(
+            --with-arch-i686
+            --with-tune=generic
+        )
+        ;;
+    powerpc64le-linux-gnu)
+        TARGET_ARGS+=(
+            --enable-secureplt
+            --enable-targets=powerpcle-linux
+            --with-cpu=power8
+            --with-long-double-128
+        )
+        ;;
+    powerpc-linux-gnu)
+        TARGET_ARGS+=(
+            --disable-softfloat
+            --enable-secureplt
+            --enable-targets=powerpc-linux,powerpc64-linux
+            --with-cpu=default32
+            --with-long-double-128
+        )
+        ;;
+    riscv64-linux-gnu)
+        echo "Not supported in gcc-4.8"
+        exit 0
+        ;;
+    s390x-linux-gnu)
+        TARGET_ARGS+=(
+            --with-arch=zEC12
+            --with-long-double-128
+        )
+        ;;
+    *)
+        echo "Unrecognized target: ${TARGET}"
+        exit 0
+        ;;
+esac
+
+"${SRC_DIR}/configure" --build="${HOST}" --host="${HOST}" --enable-languages=c,c++ \
+            --program-prefix="${TARGET}-" --target="${TARGET}" --program-suffix=-4.8 \
+            --prefix=/usr/ --with-system-zlib \
+            --libexecdir=/usr/lib/ --libdir=/usr/lib/ \
+            --disable-nls --disable-shared --enable-host-shared \
+            --disable-bootstrap --enable-threads=posix --enable-default-pie \
+            --with-sysroot=/ --includedir=/usr/"${TARGET}"/include \
+            --without-target-system-zlib --enable-multiarch
+            ${TARGET_ARGS[@]} ${CONFIGURE_ARGS} \
+            CFLAGS='-std=gnu99' CXXFLAGS='-std=gnu++98'
+
+make -j"${NPROC:-$(nproc)}" ${MAKE_ARGS} \
+      CFLAGS='-std=gnu99' CXXFLAGS='-std=gnu++98'
+
+make install ${MAKE_INSTALL_ARGS}
+mkdir -p /output/usr/lib/ /output/usr/bin/
+cp -r /usr/lib/gcc-cross /output/usr/lib/
+cp /usr/bin/*-4.8 /output/usr/bin/
index c6c613d529b8541fe0ee54914344e9de538996e0..dfc2a719090108277dfa9e325dfb236ec68b83a8 100644 (file)
 
 - name: Ensure cross-compilers packages are installed.
   apt: "name={{ cross_compilers_packages }} state=present"
+
+- name: Install legacy cross compilers
+  when: ansible_distribution == 'Debian' and ansible_architecture == 'x86_64'
+  block:
+    # This step needs to happen after the cross compiler packages are installed
+    # so the libgcc cross libraries can be copied
+    - name: Copy gcc-cross libs
+      ansible.builtin.command:
+        argv: ['cp', '-r', "/usr/lib/gcc-cross/{{item}}/12/", "/usr/lib/gcc-cross/{{item}}/4.8.5"]
+        creates: "/usr/lib/gcc-cross/{{item}}/4.8.5"
+      with_items:
+        - aarch64-linux-gnu
+        - arm-linux-gnueabihf
+        - i686-linux-gnu
+        - powerpc64le-linux-gnu
+        - powerpc-linux-gnu
+        - riscv64-linux-gnu
+        - s390x-linux-gnu
+    - name: Download legacy compiler binaries
+      # These binaries built from files/Containerfile
+      ansible.builtin.get_url:
+        url: https://obj.internal.efficios.com/jenkins/gcc-4.8-x86_64-linux-gnu-cross.tgz
+        dest: /root/gcc-4.8-x86_64-linux-gnu-cross.tgz
+      register: cross_download
+    - name: Extract legacy compiler binaries
+      when: cross_download.changed
+      ansible.builtin.command:
+        argv: ['tar', '-C', '/', '-xzf', '/root/gcc-4.8-x86_64-linux-gnu-cross.tgz']
This page took 0.026392 seconds and 4 git commands to generate.