123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- #!/bin/sh
- TOOLSDIR='tools'
- PACKAGESDIR='packages'
- WORKSPACEDIR='workspace'
- TOOLSROOTDIR='root'
- KEYRING='keyring.gpg'
- GNUMIRROR='ftp.gnu.org'
- packages=' '
- package_binutils_protocols=' https http ftp '
- package_binutils_server=$GNUMIRROR
- package_binutils_remotedir='/gnu/binutils'
- package_binutils_filename='binutils-2.30'
- package_binutils_extensions=' tar.xz tar.lz tar.bz2 tar.gz '
- package_binutils_recipe='setup_binutils'
- package_gawk_protocols=' https http ftp '
- package_gawk_server=$GNUMIRROR
- package_gawk_remotedir='/gnu/gawk'
- package_gawk_filename='gawk-4.2.1'
- package_gawk_extensions=' tar.xz tar.lz tar.gz '
- package_gawk_recipe='setup_gawk'
- package_gcc_protocols=' https http ftp '
- package_gcc_server=$GNUMIRROR
- package_gcc_remotedir='/gnu/gcc/gcc-7.3.0'
- package_gcc_filename='gcc-7.3.0'
- package_gcc_extensions=' tar.xz tar.gz '
- package_gcc_recipe='setup_gcc'
- package_grub_protocols=' https http ftp '
- package_grub_server=$GNUMIRROR
- package_grub_remotedir='/gnu/grub'
- package_grub_filename='grub-2.02'
- package_grub_extensions=' tar.xz tar.gz '
- package_grub_recipe='setup_grub'
- package_nasm_protocols=' http '
- package_nasm_server='www.nasm.us'
- package_nasm_remotedir='/pub/nasm/releasebuilds/2.13.03'
- package_nasm_filename='nasm-2.13.03'
- package_nasm_extensions=' tar.xz tar.bz2 tar.gz zip '
- package_nasm_recipe='setup_nasm'
- package_xorriso_protocols=' https http ftp '
- package_xorriso_server=$GNUMIRROR
- package_xorriso_remotedir='/gnu/xorriso'
- package_xorriso_filename='xorriso-1.4.8'
- package_xorriso_extensions=' tar.gz '
- package_xorriso_recipe='setup_xorriso'
- setup_binutils() {
- cd 'binutils-2.30' && ./configure "--prefix=$PREFIX" --target=i686-elf --disable-nls && make $MAKEFLAGS && make install
- }
- setup_gawk() {
- cd 'gawk-4.2.1' && ./configure "--prefix=$PREFIX" && make $MAKEFLAGS && make install
- }
- setup_gcc() {
- cd 'gcc-7.3.0' && mkdir -p build && cd build \
- && ../configure "--prefix=$PREFIX" --target=i686-elf --enable-languages=c --without-headers --disable-nls --disable-libssp \
- && make $MAKEFLAGS all-gcc && make $MAKEFLAGS all-target-libgcc \
- && make install-gcc && make install-target-libgcc
- }
- setup_grub() {
- cd 'grub-2.02' && ./configure "--prefix=$PREFIX" && make $MAKEFLAGS && make install
- }
- setup_nasm() {
- cd 'nasm-2.13.03' && ./configure "--prefix=$PREFIX" && make $MAKEFLAGS && make install
- }
- setup_xorriso() {
- cd 'xorriso-1.4.8' && ./configure "--prefix=$PREFIX" && make $MAKEFLAGS && make install
- }
- download() {
- download_url="$1://$2/$3"
- if [ -n "$AXEL" ]
- then
- "$AXEL" -o "$4" "$download_url"
- elif [ -n "$WGET" ]
- then
- "$WGET" -O "$4" "$download_url"
- elif [ -n "$CURL" ]
- then
- "$CURL" -L -o "$4" "$download_url"
- elif [ -n "$PFTP" ] && [ "$1" = "ftp" ]
- then
- separator=`expr index + "$2" + :`
- if [ $separator -ne 0 ]
- then
- host=`expr substr + "$2" 1 \( "$separator" - 1 \)`
- port=`expr substr + "$2" \( $separator + 1 \) \( length + "$2" \)`
- else
- host="$2"
- port=""
- fi
- "$PFTP" -n $host $port <<EOF
- user ftp
- binary
- get "$remotepath" "$localpath"
- quit
- EOF
- else
- printf 'No suitable program available to download "%s". Giving up.\n' "$url" 1>&2
- exit 1
- fi
- }
- extract() {
- if expr + "$1" : '.*\.tar.*' 1>/dev/null
- then
- "$TAR" -C "$2" -x -f "$1"
- elif expr + "$1" : '.*\.zip$' 1>/dev/null
- then
- "$UNZIP" "$1" -d "$2"
- fi
- }
- [ -d "$TOOLSDIR" ] || mkdir "$TOOLSDIR" || exit 1
- cd "$TOOLSDIR" || exit 1
- [ -d "$PACKAGESDIR" ] || mkdir "$PACKAGESDIR" || exit 1
- [ -d "$WORKSPACEDIR" ] || mkdir "$WORKSPACEDIR" || exit 1
- [ -d "$TOOLSROOTDIR" ] || mkdir "$TOOLSROOTDIR" || exit 1
- export PATH="$PWD/$TOOLSROOTDIR/bin:$PATH"
- AXEL=`command -v axel`
- WGET=`command -v wget`
- CURL=`command -v curl`
- FTP=`command -v ftp`
- PFTP=`command -v pftp` || ([ -n "$FTP" ] && PFTP="$FTP -p")
- TAR=`command -v tar`
- UNZIP=`command -v unzip`
- if ! GPG=`command -v gpg`
- then
- echo 'GNU Privacy Guard is required to verify signatures. Please install it.' 1>&2
- exit 1
- fi
- ARCHIVES=' '
- if [ -n "$TAR" ]
- then
- for comp in xz.xz lzip.lz bzip2.bz2 gzip.gz
- do
- program=`expr substr "$comp" 1 \( index + "$comp" . - 1 \)`
- extension=`expr substr "$comp" \( index + "$comp" . + 1 \) \( length $comp \)`
- command -v "$program" 1>/dev/null && ARCHIVES="${ARCHIVES}tar.$extension "
- done
- fi
- [ -n "$UNZIP" ] && ARCHIVES="${ARCHIVES}zip "
- echo 'Detecting installed packages...' 1>&2
- command -v gawk || packages="${packages}gawk "
- command -v i686-elf-ld || packages="${packages}binutils "
- command -v i686-elf-gcc || packages="${packages}gcc "
- command -v grub-mkrescue || packages="${packages}grub "
- command -v nasm || packages="${packages}nasm "
- command -v xorriso || packages="${packages}xorriso "
- MAKEFLAGS="$MAKEFLAGS -j `nproc`"
- for package in $packages
- do
- printf 'Installing package %s\n' "$package" 1>&2
- [ -d "$WORKSPACEDIR/$package" ] || mkdir "$WORKSPACEDIR/$package" || exit 1
- unset packagefile
- eval "protocols=\"\$package_${package}_protocols\"\
- server=\"\$package_${package}_server\"\
- remotedir=\"\$package_${package}_remotedir\"\
- filename=\"\$package_${package}_filename\"\
- extensions=\"\$package_${package}_extensions\"\
- recipe=\"\$package_${package}_recipe\""
- for ext in $extensions
- do
- printf '%s' "$ARCHIVES" | grep -q -F " $ext " || continue
- file="${filename}.$ext"
- url="$remotedir/$file"
- if ! [ -f "$PACKAGESDIR/$file" ]
- then
- success=false
- for protocol in $protocols
- do
- printf 'Downloading %s from %s://%s/%s\n' "$file" "$protocol" "$server" "$url" 1>&2
- if download "$protocol" "$server" "$url" "$PACKAGESDIR/$file"
- then
- success=true
- break
- fi
- done
- if ! $success
- then
- echo 'Download failed.' 1>&2
- continue
- fi
- fi
- packagefile="$PACKAGESDIR/$file"
- break;
- done
- if [ -z "$packagefile" ]
- then
- printf 'No files could be downloaded and/or extracted to install package %s. Giving up.\n' "$package" 1>&2
- exit 1
- fi
- if ! [ -f ${packagefile}.sig ]
- then
- printf 'Retrieving signature %s\n' "${packagefile}.sig" 1>&2
- if ! download "$protocol" "$server" "${url}.sig" "${packagefile}.sig"
- then
- printf 'Could not retrieve the signature for %s. Giving up.\n' "$packagefile" 1>&2
- exit 1
- fi
- fi
- printf 'Verifying signature %s\n' "${packagefile}.sig" 1>&2
- if ! "$GPG" --no-default-keyring --keyring "$PWD/$KEYRING" --verify "${packagefile}.sig" "$packagefile"
- then
- printf 'bad\nCould not verify the signature for %s. Giving up.\n' "$packagefile" 1>&2
- exit 1
- fi
- printf 'Extracting archive %s\n' "$file" 1>&2
- if ! extract "$packagefile" "$WORKSPACEDIR/$package"
- then
- printf 'The package archive %s could not be extracted. Giving up.\n' "$packagefile" 1>&2
- exit 1
- fi
- oldwd="$PWD"
- export PREFIX="$PWD/$TOOLSROOTDIR"
- cd "$WORKSPACEDIR/$package"
- $recipe
- errorcode=$?
- cd "$oldwd"
- if [ "$errorcode" -ne 0 ]
- then
- printf 'Errors occurred while building package %s. Giving up.\n' "$package" 1>&2
- exit 1
- fi
- done
- echo 'Done installing packages' 1>&2
|