#!/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= PLAT= main() { SCRIPT_DIR="$(cd "${0%/*}" && pwd)" ARCH="$(cat /etc/proteanos_arch)" PLAT="$(cat /etc/proteanos_plat)" cat <<-EOF Preparing packages for bootstrap... =================================== EOF prepare_file_system_fake prepare_packages_from_git prepare_packages_from_ftp 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_file_system_fake() { # ob-platconf needs to find this file. Otherwise, opkbuild fails to # build busybox. config-dev provides this, but that isn't fetched until # after busybox is built. sudo mkdir -p "/usr/local/share/platconf/${PLAT}/busybox" sudo touch "/usr/local/share/platconf/${PLAT}/busybox/busybox.config" } prepare_packages_from_git() { local repo patch [ -d pkg ] || mkdir pkg cd pkg for repo in $(cat "${SCRIPT_DIR}/bootstrap-pkgs-git.txt"); do if [ -f "${repo##*/}_"*'_src_all.changes' ]; then continue fi 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 [ -d "${SCRIPT_DIR}/patches/${repo##*/}" ]; then printf 'Patching package %s...\n' "${repo##*/%/}" for patch in "${SCRIPT_DIR}/patches/${repo##*/}/"*; do patch -N -p 1 -u -i "${patch}" || \ true done fi 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 rm -Rf tmp fi opkbuild -SC rm -Rf tmp cd .. done cd .. } prepare_packages_from_ftp() { local pkg src_opk path cd pkg for pkg in ; 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 .. } 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' ;; 'i386-linux-gnu') interp='ld-linux.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 sudo cp -p "pkg/config-${PLAT}/src/busybox/config" \ "/usr/local/share/platconf/${PLAT}/busybox/busybox.config" } main "${@}"