#!/bin/sh # # Initial port bootstrap scripts # bootstrap-prepare.sh # Downloads, configures, and patches packages to be built. # # Copyright (C) 2013 Patrick "P. J." McDermott # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . set -e SCRIPT_DIR= ARCH= main() { SCRIPT_DIR="$(cd "${0%/*}" && pwd)" ARCH="$(cat /etc/proteanos_arch)" cat <<-EOF Preparing packages for bootstrap... =================================== EOF prepare_packages_from_git prepare_packages_from_ftp patch_packages prepare_file_system } log() { local msg i msg="$(printf "${@}")" printf '\n%s\n' "${msg}" i=0 while [ ${i} -lt ${#msg} ]; do printf '-' i=$(($i + 1)) done printf '\n\n' } prepare_packages_from_git() { local repo [ -d pkg ] || mkdir pkg cd pkg for repo in zlib toolchains/binutils linux-libre eglibc \ gmp toolchains/gcc-4.7 toolchains/gcc-defaults \ busybox gmake opkg opkbuild opkhelper-3.0 \ fakeroot file m4 config-dev \ expat gettext libunistring; do log 'Preparing package %s...' "${repo##*/}" if [ ! -d "${repo##*/}" ]; then git clone --depth 1 \ "git://git.proteanos.com/pkg/${repo}.git" fi cd "${repo##*/}" git pull origin master if [ -x config ]; then ./config clean PKG_TARGETS="${ARCH}" ./config fi rm -f local.mk if [ -f source.mk -a ! -f "${repo##*/}"*.orig.tar* ]; then opkbuild -bCT source fi opkbuild -SC cd .. done cd .. } prepare_packages_from_ftp() { local pkg src_opk path cd pkg for pkg in mpc mpfr; do log 'Preparing package %s...' "${pkg}" if [ ! -d "${pkg}" ]; then src_opk="src-${pkg}_*_src_all.opk" path="pub/pkg/${pkg}/${src_opk}" wget "ftp://files.proteanos.com/${path}" tar -xzOf ${src_opk} data.tar.gz | tar -xz mv "usr/src/${pkg}_"* "${pkg}" fi done [ -d usr/src ] && rmdir usr/src [ -d usr ] && rmdir usr cd .. } patch_packages() { local dir patch cd pkg for dir in */; do if [ -d "${SCRIPT_DIR}/patches/${dir}" ]; then log 'Patching package %s...' "${dir%/}" for patch in "${SCRIPT_DIR}/patches/${dir}"*; do patch -N -p 1 -u -d "${dir}" -i "${patch}" || \ true done fi done cd .. } prepare_file_system() { local ma dir if ma=$(dpkg-architecture -qDEB_HOST_MULTIARCH 2>/dev/null); then log 'Making multiarch directory links...' for dir in /lib /usr/lib /usr/include; do if [ ! -e "${dir}/${ARCH}" ]; then printf '%s/%s -> %s\n' \ "${dir}" "${ARCH}" "${ma}" sudo ln -s "${ma}" "${dir}/${ARCH}" fi done printf '\n' log 'Overriding elf_interp macro in gcc-4.7 source package...' case "${ma}" in 'x86_64-linux-gnu') interp='ld-linux-x86-64.so.2' ;; esac printf 'Using %s...\n\n' /lib/${ARCH}/${interp:-ld-*.so.*} printf 'elf_interp = %s\n' /lib/${ARCH}/${interp:-ld-*.so.*} \ >pkg/gcc-4.7/local.mk fi } main "${@}"