diff options
-rw-r--r-- | Dockerfile | 69 | ||||
-rwxr-xr-x | build.sh | 9 | ||||
-rwxr-xr-x | etc/pkgs/000-dummy.sh | 2 | ||||
-rwxr-xr-x | etc/pkgs/001-gcc.sh | 97 | ||||
-rwxr-xr-x | etc/pkgs/002-binutils.sh | 27 | ||||
-rwxr-xr-x | etc/tasks/001-packages.sh | 41 | ||||
-rwxr-xr-x | etc/tasks/999-clean.sh | 26 | ||||
-rwxr-xr-x | scripts/build.sh | 33 |
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 |