#!/bin/bash # Script to build a minimal CentOS 3.9 Docker image for PFEXTLIB compilation # This creates a container with libstdc++.5 and necessary build tools set -e CENTOS_VAULT="https://archive.kernel.org/centos-vault/3.9/os/i386" WORK_DIR="$(pwd)/centos39-rootfs" IMAGE_NAME="centos39-pfextlib:latest" echo "==> Creating minimal CentOS 3.9 rootfs for Docker..." # Clean previous build rm -rf "$WORK_DIR" mkdir -p "$WORK_DIR" # Create basic directory structure mkdir -p "$WORK_DIR"/{dev,proc,sys,tmp,var/lib/rpm,etc,bin,sbin,usr/{bin,sbin,lib,local},lib} echo "==> Downloading essential RPMs from CentOS 3.9 vault..." # Essential RPMs needed for a minimal system with build tools # All filenames verified against https://archive.kernel.org/centos-vault/3.9/os/i386/RedHat/RPMS/ RPMS=( # Core system "basesystem-8.0-2.centos.0.noarch.rpm" "filesystem-2.2.1-3.centos.1.i386.rpm" "setup-2.5.27-1.noarch.rpm" "glibc-2.3.2-95.50.i386.rpm" "glibc-common-2.3.2-95.50.i386.rpm" "glibc-devel-2.3.2-95.50.i386.rpm" "glibc-headers-2.3.2-95.50.i386.rpm" "glibc-kernheaders-2.4-8.34.5.i386.rpm" "bash-2.05b-41.7.centos.0.i386.rpm" "coreutils-4.5.3-28.7.i386.rpm" "grep-2.5.1-24.6.i386.rpm" "sed-4.0.7-9.el3.i386.rpm" "gawk-3.1.1-9.i386.rpm" "findutils-4.1.7-9.1.i386.rpm" "util-linux-2.11y-31.23.i386.rpm" # libstdc++.5 - THE KEY LIBRARY FOR LEGACY SUPPORT "compat-libstdc++-7.3-2.96.128.i386.rpm" "libstdc++-3.2.3-59.i386.rpm" "libstdc++-devel-3.2.3-59.i386.rpm" # Build tools (GCC toolchain) "gcc-3.2.3-59.i386.rpm" "gcc-c++-3.2.3-59.i386.rpm" "cpp-3.2.3-59.i386.rpm" "libgcc-3.2.3-59.i386.rpm" "make-3.79.1-17.1.i386.rpm" "binutils-2.14.90.0.4-42.i386.rpm" "libtool-1.4.3-6.i386.rpm" "libtool-libs-1.4.3-6.i386.rpm" "autoconf-2.57-3.noarch.rpm" "automake-1.6.3-5.noarch.rpm" "m4-1.4.1-13.i386.rpm" # Additional libraries and tools "zlib-1.1.4-10.EL3.i386.rpm" "zlib-devel-1.1.4-10.EL3.i386.rpm" "libacl-2.2.3-1.i386.rpm" "libattr-2.2.0-1.i386.rpm" "pcre-3.9-10.2.i386.rpm" "file-3.39-9.EL3.4.i386.rpm" "perl-5.8.0-94.EL3.i386.rpm" "ncurses-5.3-9.4.i386.rpm" "ncurses-devel-5.3-9.4.i386.rpm" "libtermcap-2.0.8-35.i386.rpm" "readline-4.3-5.2.i386.rpm" "readline-devel-4.3-5.2.i386.rpm" "tar-1.13.25-15.RHEL3.i386.rpm" "gzip-1.3.3-14.rhel3.i386.rpm" "bzip2-1.0.2-11.EL3.4.i386.rpm" "bzip2-libs-1.0.2-11.EL3.4.i386.rpm" "patch-2.5.4-16.i386.rpm" "diffutils-2.8.1-8.i386.rpm" "which-2.14-7.i386.rpm" "sed-4.0.7-9.el3.i386.rpm" "info-4.5-3.el3.1.i386.rpm" "texinfo-4.5-3.el3.1.i386.rpm" ) # Download RPMs mkdir -p rpms cd rpms for rpm in "${RPMS[@]}"; do if [ ! -f "$rpm" ]; then echo "Downloading $rpm..." wget -q "${CENTOS_VAULT}/RedHat/RPMS/${rpm}" || { echo "Warning: Failed to download $rpm, continuing..." } fi done cd .. echo "==> Extracting RPMs to rootfs..." # Extract all RPMs for rpm in rpms/*.rpm; do if [ -f "$rpm" ]; then echo "Extracting $(basename $rpm)..." cd "$WORK_DIR" rpm2cpio "../$rpm" | cpio -idm 2>/dev/null || true cd .. fi done echo "==> Configuring minimal system..." # Create essential device nodes sudo mknod -m 666 "$WORK_DIR/dev/null" c 1 3 || true sudo mknod -m 666 "$WORK_DIR/dev/zero" c 1 5 || true sudo mknod -m 666 "$WORK_DIR/dev/random" c 1 8 || true sudo mknod -m 666 "$WORK_DIR/dev/urandom" c 1 9 || true # Create minimal /etc/passwd and /etc/group cat > "$WORK_DIR/etc/passwd" < "$WORK_DIR/etc/group" < "$WORK_DIR/etc/resolv.conf" < Copying PFEXTLIB source code..." cp -r usr/local/PFEXTLIB-1.2/* "$WORK_DIR/usr/local/PFEXTLIB-1.2/" echo "==> Cleaning pre-existing build artifacts..." cd "$WORK_DIR/usr/local/PFEXTLIB-1.2" for dir in cppunit-1.10.2 fftw-3.0.1 hdf5-1.6.2; do if [ -d "$dir" ]; then cd "$dir" make distclean 2>/dev/null || true find . -name "*.o" -delete 2>/dev/null || true find . -name "*.so*" -delete 2>/dev/null || true find . -name "*.a" -delete 2>/dev/null || true find . -name ".libs" -type d -exec rm -rf {} + 2>/dev/null || true cd .. fi done cd - echo "==> Creating build scripts in container..." # Create compilation script for cppunit cat > "$WORK_DIR/usr/local/PFEXTLIB-1.2/build-cppunit.sh" <<'EOF' #!/bin/bash set -e cd /usr/local/PFEXTLIB-1.2/cppunit-1.10.2 echo "==> Cleaning cppunit build..." make distclean 2>/dev/null || true echo "==> Configuring cppunit..." ./configure --prefix=/usr/local/PFEXTLIB-1.2/cppunit echo "==> Building cppunit..." make -j$(nproc 2>/dev/null || echo 2) echo "==> Installing cppunit..." make install echo "==> cppunit build complete!" EOF # Create compilation script for fftw cat > "$WORK_DIR/usr/local/PFEXTLIB-1.2/build-fftw.sh" <<'EOF' #!/bin/bash set -e cd /usr/local/PFEXTLIB-1.2/fftw-3.0.1 echo "==> Cleaning fftw build..." make distclean 2>/dev/null || true echo "==> Configuring fftw..." ./configure --prefix=/usr/local/PFEXTLIB-1.2/fftw --enable-shared --enable-threads echo "==> Building fftw..." make -j$(nproc 2>/dev/null || echo 2) echo "==> Installing fftw..." make install echo "==> fftw build complete!" EOF # Create compilation script for hdf5 cat > "$WORK_DIR/usr/local/PFEXTLIB-1.2/build-hdf5.sh" <<'EOF' #!/bin/bash set -e cd /usr/local/PFEXTLIB-1.2/hdf5-1.6.2 echo "==> Cleaning hdf5 build..." make distclean 2>/dev/null || true echo "==> Configuring hdf5..." ./configure --prefix=/usr/local/PFEXTLIB-1.2/hdf5 --enable-cxx echo "==> Building hdf5..." make -j$(nproc 2>/dev/null || echo 2) echo "==> Installing hdf5..." make install echo "==> hdf5 build complete!" EOF # Create compilation script for xerces-c cat > "$WORK_DIR/usr/local/PFEXTLIB-1.2/build-xerces.sh" <<'EOF' #!/bin/bash set -e cd /usr/local/PFEXTLIB-1.2/xerces-c-src2_1_0/src echo "==> Cleaning xerces-c build..." make clean 2>/dev/null || true rm -rf ../lib/*.so* ../lib/*.a 2>/dev/null || true rm -rf ../bin/* 2>/dev/null || true echo "==> Building xerces-c..." export XERCESCROOT=/usr/local/PFEXTLIB-1.2/xerces-c-src2_1_0 ./runConfigure -plinux -cgcc -xg++ -minmem -nsocket -tnative -rpthread make -j$(nproc 2>/dev/null || echo 2) echo "==> xerces-c build complete!" echo "Library location: $XERCESCROOT/lib/" EOF # Create master build script cat > "$WORK_DIR/usr/local/PFEXTLIB-1.2/build-all.sh" <<'EOF' #!/bin/bash set -e echo "======================================" echo "PFEXTLIB Build System" echo "CentOS 3.9 with libstdc++.5" echo "======================================" echo # Display compiler information echo "==> Compiler information:" gcc --version | head -1 g++ --version | head -1 echo # Check for libstdc++ echo "==> Checking for libstdc++.5:" ldconfig -p | grep libstdc++ || true echo # Build each library echo "==> Building all PFEXTLIB libraries..." echo bash /usr/local/PFEXTLIB-1.2/build-cppunit.sh echo bash /usr/local/PFEXTLIB-1.2/build-fftw.sh echo bash /usr/local/PFEXTLIB-1.2/build-hdf5.sh echo bash /usr/local/PFEXTLIB-1.2/build-xerces.sh echo echo "======================================" echo "Build complete!" echo "======================================" echo "Libraries installed in:" echo " - /usr/local/PFEXTLIB-1.2/cppunit" echo " - /usr/local/PFEXTLIB-1.2/fftw" echo " - /usr/local/PFEXTLIB-1.2/hdf5" echo " - /usr/local/PFEXTLIB-1.2/xerces-c-src2_1_0/lib" echo " - /usr/local/PFEXTLIB-1.2/fftw" echo " - /usr/local/PFEXTLIB-1.2/hdf5" EOF chmod +x "$WORK_DIR/usr/local/PFEXTLIB-1.2"/*.sh echo "==> Creating Docker image from rootfs..." # Create Dockerfile for the actual image cat > "$WORK_DIR/Dockerfile" <