You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
306 lines
8.7 KiB
306 lines
8.7 KiB
#!/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" <<EOF |
|
root:x:0:0:root:/root:/bin/bash |
|
builder:x:1000:1000:Builder:/home/builder:/bin/bash |
|
EOF |
|
|
|
cat > "$WORK_DIR/etc/group" <<EOF |
|
root:x:0: |
|
builder:x:1000: |
|
EOF |
|
|
|
# Create minimal /etc/resolv.conf |
|
cat > "$WORK_DIR/etc/resolv.conf" <<EOF |
|
nameserver 8.8.8.8 |
|
nameserver 8.8.4.4 |
|
EOF |
|
|
|
# Create working directories |
|
mkdir -p "$WORK_DIR"/{root,home/builder,usr/local/PFEXTLIB-1.2} |
|
chmod 755 "$WORK_DIR/tmp" |
|
|
|
echo "==> 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" <<EOF |
|
FROM scratch |
|
ADD . / |
|
ENV PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin |
|
ENV LD_LIBRARY_PATH=/usr/local/lib:/usr/lib:/lib |
|
ENV PREFIX=/usr/local/PFEXTLIB-1.2 |
|
WORKDIR /usr/local/PFEXTLIB-1.2 |
|
CMD ["/bin/bash"] |
|
EOF |
|
|
|
# Build the Docker image |
|
cd "$WORK_DIR" |
|
sudo docker build -t "$IMAGE_NAME" . |
|
cd .. |
|
|
|
echo |
|
echo "======================================" |
|
echo "Docker image created: $IMAGE_NAME" |
|
echo "======================================" |
|
echo |
|
echo "To use the image:" |
|
echo " docker run -it $IMAGE_NAME /bin/bash" |
|
echo |
|
echo "To build all libraries inside container:" |
|
echo " docker run -it $IMAGE_NAME /usr/local/PFEXTLIB-1.2/build-all.sh" |
|
echo |
|
echo "To extract compiled libraries:" |
|
echo " docker run -v \$(pwd)/output:/output $IMAGE_NAME bash -c 'cp -r /usr/local/PFEXTLIB-1.2/{cppunit,fftw,hdf5} /output/'" |
|
echo
|
|
|