glibc-all-in-one/build

119 lines
2.6 KiB
Bash
Executable File

#!/bin/bash
cd "$(dirname "$0")"
SOURCE="http://mirrors.ustc.edu.cn/gnu/libc"
GLIBC_DIR="/glibc"
if [ ! -d "srcs" ]; then
mkdir srcs
fi
if [ ! -d $GLIBC_DIR ]; then
mkdir $GLIBC_DIR
fi
die() {
echo >&2 $1
exit 1
}
usage() {
echo -e >&2 "Usage: $0 version arch\nSupported version:2.19, 2.23-2.29\nSupported arch: i686, amd64"
exit 2
}
download(){
local filename=$1
if [ ! -f srcs/$filename ]; then
wget "$SOURCE/$filename" -O "srcs/$filename"
else
echo "[?] srcs/$filename already exists. remove it to re-download. continue ? (y/[n])"
read opt
if [ "$opt" = "y" ] || [ "$opt" = "Y" ]; then
:
else
die "[*] check src/$filename manually"
fi
fi
}
extract(){
local filepath=$1
local output_dir=$2
if [ ! -f $filepath ]; then
die "[-] Invalid filepath: $filepath"
fi
if [ ! -d $output_dir ]; then
echo "[*] Making directory $output_dir"
mkdir -p $output_dir
cp $filepath $output_dir/src.tar.gz
pushd $output_dir 1>/dev/null
tar xf src.tar.gz
mv */* ./
rm src.tar.gz
popd 1>/dev/null
else
echo "[?] Seems that source code exists in $output_dir. continue ? (y/[n])"
read opt
if [ "$opt" = "y" ] || [ "$opt" = "Y" ]; then
:
else
die "[*] check $output_dir manually"
fi
fi
}
build(){
local arch=$1
local src_dir=$2
local output_dir=$3
if [ ! -d $src_dir ]; then
die "[-] Invalid src_dir: $src_dir"
fi
if [ ! -d $output_dir ]; then
echo "[*] Making directory $output_dir"
mkdir -p $output_dir
fi
pushd $src_dir 1>/dev/null
mkdir build
cd build
if [ $arch = 'amd64' ]; then
../configure --prefix=$output_dir --disable-werror --enable-debug=yes
elif [ $arch = 'i686' ]; then
../configure --prefix=$output_dir --disable-werror --enable-debug=yes --host=i686-linux-gnu --build=i686-linux-gnu CC="gcc -m32" CXX="g++ -m32"
else
die "[-] Invalid arch: $arch"
fi
make
make install
cd ../
rm -rf build
popd 1>/dev/null
}
if [[ $# != 2 ]]; then
usage
fi
echo "[*] checking requirements"
apt-get install gawk bison gcc-multilib g++-multilib -y
GLIBC_VERSION=$1
ARCH=$2
SRC="glibc-$GLIBC_VERSION.tar.gz"
echo "[*] downloading $SRC"
download $SRC
SRC_DIR=$GLIBC_DIR/$GLIBC_VERSION/source
echo "[*] extracting to $SRC_DIR"
extract "srcs/$SRC" $SRC_DIR
echo "[*] building..."
build $ARCH $SRC_DIR $GLIBC_DIR/$GLIBC_VERSION/$ARCH/
echo "[+] build finished. check $GLIBC_DIR/$GLIBC_VERSION/$ARCH/"