summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Dockerfile69
-rwxr-xr-xbuild.sh9
-rwxr-xr-xetc/pkgs/000-dummy.sh2
-rwxr-xr-xetc/pkgs/001-gcc.sh97
-rwxr-xr-xetc/pkgs/002-binutils.sh27
-rwxr-xr-xetc/tasks/001-packages.sh41
-rwxr-xr-xetc/tasks/999-clean.sh26
-rwxr-xr-xscripts/build.sh33
8 files changed, 304 insertions, 0 deletions
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..4740144
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,69 @@
+FROM centos:6.9
+LABEL maintainer="jhunk@stsci.edu" \
+ vendor="Space Telescope Science Institute"
+
+ENV TOOLCHAIN="/opt/toolchain"
+ENV TOOLCHAIN_BIN="${TOOLCHAIN}/bin"
+ENV TOOLCHAIN_LIB="${TOOLCHAIN}/lib"
+ENV TOOLCHAIN_INCLUDE="${TOOLCHAIN}/include"
+ENV TOOLCHAIN_DATA="${TOOLCHAIN}/share"
+ENV TOOLCHAIN_SYSCONF="${TOOLCHAIN}/etc"
+ENV TOOLCHAIN_MAN="${TOOLCHAIN_DATA}/man"
+ENV TOOLCHAIN_PKGCONFIG="${TOOLCHAIN_LIB}/pkgconfig"
+ENV TOOLCHAIN_BUILD="/opt/buildroot"
+ENV PATH="${TOOLCHAIN_BIN}:${PATH}"
+
+ARG PYTHON_VERSION=${PYTHON_VERSION:-3.7.1}
+ARG USER_ACCT=${USER_ACCT:-developer}
+ARG USER_HOME=/home/${USER_ACCT}
+ARG USER_UID=${USER_UID:-1000}
+ARG USER_GID=${USER_GID:-1000}
+
+ENV USER_ACCT=${USER_ACCT} \
+ USER_HOME=${USER_HOME} \
+ USER_UID=${USER_UID} \
+ USER_GID=${USER_GID} \
+ LC_ALL=en_US.UTF-8 \
+ LANG=en_US.UTF-8 \
+ LANGUAGE=en_US.UTF-8
+
+RUN groupadd -g ${USER_GID} ${USER_ACCT} \
+ && useradd -u ${USER_UID} -g ${USER_ACCT} \
+ -m -d ${USER_HOME} -s /bin/bash ${USER_ACCT} \
+ && echo "${USER_ACCT}:${USER_ACCT}" | chpasswd \
+ && echo "${USER_ACCT} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers \
+ && echo export PATH="${TOOLCHAIN_BIN}:\${PATH}" > /etc/profile.d/toolchain.sh \
+ && echo export MANPATH="${TOOLCHAIN_MAN}:\${MANPATH}" >> /etc/profile.d/toolchain.sh \
+ && echo export PKG_CONFIG_PATH="${TOOLCHAIN_PKGCONFIG}:\${PKG_CONFIG_PATH}" >> /etc/profile.d/toolchain.sh \
+ && yum install -y epel-release \
+ && yum install -y \
+ gcc \
+ gcc-c++ \
+ gcc-gfortran \
+ glibc \
+ make \
+ perl \
+ pkgconfig \
+ sudo \
+ wget \
+ which \
+ zlib-devel \
+ && yum clean all
+
+WORKDIR "${TOOLCHAIN_BUILD}"
+COPY scripts/ ${TOOLCHAIN_BUILD}/bin
+COPY etc/ ${TOOLCHAIN_BUILD}/etc
+
+RUN mkdir -p "${TOOLCHAIN}" \
+ && chown -R ${USER_ACCT}: \
+ ${TOOLCHAIN} \
+ ${TOOLCHAIN_BUILD}
+
+USER "${USER_ACCT}"
+
+RUN bin/build.sh \
+ && sudo rm -rf "${TOOLCHAIN_BUILD}"
+
+WORKDIR "${USER_HOME}"
+
+CMD ["/bin/bash", "-l"]
diff --git a/build.sh b/build.sh
new file mode 100755
index 0000000..0254885
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+PROJECT=astroconda/base
+VERSION="${1}"
+if [[ -z ${VERSION} ]]; then
+ echo "Project version required [e.g. 1.2.3]"
+ exit 1
+fi
+
+docker build -t ${PROJECT}:latest -t ${PROJECT}:${VERSION} .
diff --git a/etc/pkgs/000-dummy.sh b/etc/pkgs/000-dummy.sh
new file mode 100755
index 0000000..06bd986
--- /dev/null
+++ b/etc/pkgs/000-dummy.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+exit 0
diff --git a/etc/pkgs/001-gcc.sh b/etc/pkgs/001-gcc.sh
new file mode 100755
index 0000000..62ddae0
--- /dev/null
+++ b/etc/pkgs/001-gcc.sh
@@ -0,0 +1,97 @@
+#!/bin/bash -e
+set -x
+name=gcc
+version=8.2.0
+url=http://mirrors-usa.go-parts.com/gcc/releases/${name}-${version}/${name}-${version}.tar.gz
+src=${name}-${version}
+bld=${src}_build
+
+version_isl=0.20
+url_isl=http://isl.gforge.inria.fr/isl-${version_isl}.tar.bz2
+
+version_cloog=0.18.4
+url_cloog="http://www.bastoul.net/cloog/pages/download/count.php3?url=./cloog-${version_cloog}.tar.gz"
+
+# Ensure 64-bit libraries go into /lib
+sudo ln -sf ${TOOLCHAIN_LIB} ${TOOLCHAIN}/lib64
+
+curl -LO ${url}
+tar xf ${src}.tar.gz
+
+mkdir -p ${bld}
+pushd ${src}
+ unset CFLAGS
+ unset LDFLAGS
+
+ # Disable fixincludes
+ sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in
+
+ # Use /lib, not /lib64
+ #sed -i '/m64=/s/lib64/lib/' gcc/config/i386/t-linux64
+ #sed -i 's/lib64/lib/g' gcc/config.gcc
+ #sed -i "/ac_cpp=/s/\$CPPFLAGS/\$CPPFLAGS -O2/" {libiberty,gcc}/configure
+
+ # Download MPFR and friends
+ ./contrib/download_prerequisites
+
+ curl -LO ${url_isl}
+ tar xf $(basename ${url_isl})
+ ln -s isl-${version_isl} isl
+
+ curl -LO ${url_cloog}
+ tar xf $(basename ${url_cloog})
+ ln -s cloog-${version_cloog} cloog
+popd
+
+pushd ${bld}
+ # Beware: x86_64-only toolchain (multilib disabled)
+ ../${src}/configure \
+ --prefix=${TOOLCHAIN} \
+ --libdir=${TOOLCHAIN_LIB} \
+ --libexecdir=${TOOLCHAIN_LIB} \
+ --disable-bootstrap \
+ --disable-multilib \
+ --disable-werror \
+ --disable-libunwind-exceptions \
+ --disable-libstdcxx-pch \
+ --disable-libssp \
+ --with-system-zlib \
+ --with-isl \
+ --with-linker-hash-style=gnu \
+ --with-tune=generic \
+ --enable-languages=c,c++,fortran,lto,go \
+ --enable-shared \
+ --enable-threads=posix \
+ --enable-libmpx \
+ --enable-__cxa_atexit \
+ --enable-clocale=gnu \
+ --enable-gnu-unique-object \
+ --enable-linker-build-id \
+ --enable-lto \
+ --enable-plugin \
+ --enable-install-libiberty \
+ --enable-gnu-indirect-function \
+ --enable-default-pie \
+ --enable-default-ssp \
+ --enable-cet=auto \
+ --enable-checking=release
+
+ make -j${_maxjobs}
+ make install-strip
+
+ # Create compiler links
+ ln -sf gcc ${TOOLCHAIN_BIN}/cc
+
+ # Prevent ldconfig from picking up gdb python scripts
+ autoload="${TOOLCHAIN_DATA}/gdb/auto-load${TOOLCHAIN_LIB}"
+ mkdir -p "${autoload}"
+ mv -v "${TOOLCHAIN_LIB}"/*gdb.py "${autoload}"
+
+ # Binutils build cannot use this static archive
+ rm -f "${TOOLCHAIN_LIB}/libiberty.a"
+
+ # Enforce global linkage to toolchain
+ /bin/echo "${TOOLCHAIN_LIB}" > gcc.conf
+ sudo cp -a gcc.conf /etc/ld.so.conf.d
+ sudo ldconfig
+popd
diff --git a/etc/pkgs/002-binutils.sh b/etc/pkgs/002-binutils.sh
new file mode 100755
index 0000000..4c2e13d
--- /dev/null
+++ b/etc/pkgs/002-binutils.sh
@@ -0,0 +1,27 @@
+#!/bin/bash -x
+name=binutils
+version=2.31.1
+url=https://ftp.gnu.org/gnu/binutils/${name}-${version}.tar.gz
+
+curl -LO ${url}
+tar xf ${name}-${version}.tar.gz
+
+mkdir -p binutils
+pushd binutils
+ ../${name}-${version}/configure \
+ --prefix=${TOOLCHAIN} \
+ --with-lib-path=${TOOLCHAIN_LIB}:/lib64:/usr/lib64:/usr/local/lib64 \
+ --target=x86_64-pc-linux-gnu \
+ --enable-shared \
+ --enable-lto \
+ --enable-gold \
+ --enable-ld=default \
+ --enable-plugins \
+ --enable-threads \
+ --disable-static \
+ --disable-multilib \
+ --with-sysroot=/ \
+ --with-tune=generic
+ make -j${_maxjobs}
+ make install-strip
+popd
diff --git a/etc/tasks/001-packages.sh b/etc/tasks/001-packages.sh
new file mode 100755
index 0000000..e9e0c60
--- /dev/null
+++ b/etc/tasks/001-packages.sh
@@ -0,0 +1,41 @@
+#!/bin/bash
+set -x
+
+sysconfdir="${TOOLCHAIN_BUILD}/etc"
+reqdir=${sysconfdir}/pkgs
+blddir=builds
+
+function pre()
+{
+ if [[ ! -d ${reqdir} ]]; then
+ # Nothing there, but maybe that's on purpose.
+ exit 0
+ fi
+ mkdir -p "${blddir}"
+ pushd ${blddir} &>/dev/null
+}
+
+function build()
+{
+ pre
+ # Iterate over binary package build scripts
+ for req in ${reqdir}/*
+ do
+ chmod +x "${req}"
+ "${req}"
+ retval=$?
+ if [[ ${retval} != 0 ]]; then
+ echo "BUILD FAILED: ${req}"
+ exit ${retval}
+ fi
+ done
+ post
+}
+
+function post()
+{
+ popd &>/dev/null
+ [[ -d ${blddir} ]] && rm -rf "${blddir}" || true
+}
+
+build
diff --git a/etc/tasks/999-clean.sh b/etc/tasks/999-clean.sh
new file mode 100755
index 0000000..2900413
--- /dev/null
+++ b/etc/tasks/999-clean.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+if [[ ! -f /.dockerenv ]]; then
+ echo "This script cannot be executed outside of a docker container."
+ exit 1
+fi
+
+packages=(
+ gcc
+ gcc-c++
+ gcc-gfortran
+)
+sudo yum remove -y "${packages[@]}"
+sudo yum clean all
+
+sudo rm -rf "${HOME}/.astropy"
+sudo rm -rf "${HOME}"/*
+sudo rm -rf /tmp/*
+sudo rm -rf /var/cache/yum
+
+# Ensure new shared libraries ingested
+sudo ldconfig
+
+for logfile in /var/log/*
+do
+ [[ -f ${logfile} ]] && sudo truncate --size=0 "${logfile}"
+done
diff --git a/scripts/build.sh b/scripts/build.sh
new file mode 100755
index 0000000..9575888
--- /dev/null
+++ b/scripts/build.sh
@@ -0,0 +1,33 @@
+#!/bin/bash -x
+
+prefix="${TOOLCHAIN}"
+taskdir=${TOOLCHAIN_BUILD}/etc/tasks
+
+export _maxjobs=$(getconf _NPROCESSORS_ONLN)
+export PATH="${prefix}/bin:${PATH}"
+export CFLAGS="-I${prefix}/include"
+export LDFLAGS="-L${prefix}/lib -Wl,-rpath=${prefix}/lib"
+export PKG_CONFIG_PATH="${prefix}/lib/pkgconfig"
+export PREFIX="${prefix}"
+
+if [[ ! -d ${taskdir} ]]; then
+ echo "No tasks. ${taskdir} does not exist."
+ exit 1
+fi
+
+for task in ${taskdir}/*
+do
+ # Check for execution permission
+ if [[ ! -x ${task} ]]; then
+ echo "Skipping: ${task}"
+ continue
+ fi
+ echo "Executing: ${task}"
+ hash -r
+ ${task}
+ retval=$?
+ if [[ ${retval} != 0 ]]; then
+ echo "TASK FAILED: ${task}"
+ exit ${retval}
+ fi
+done