#!/bin/sh # # Initial port bootstrap scripts # bootstrap-stage2-install.sh # Installs built stage 2 packages into a bootstrap system directory. # # 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 ARCH= PLAT= main() { ARCH="$(cat /etc/proteanos_arch)" PLAT="$(cat /etc/proteanos_plat)" cat <<-EOF Installing packages in stage 2... ================================= EOF clean_root install_packages install_archplat_sysconf configure_packages setup_root } 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' } clean_root() { [ -d root2 ] || return 0 cd root2 case "${ARCH}" in *-linux-*) sudo umount dev/pts || true sudo umount proc || true sudo umount sys || true sudo umount dev || true ;; esac cd .. rm -Rf root2 } install_packages() { local opk pkg mkdir root2 cd root2 for opk in ../root1/usr/src/*_${ARCH}_${PLAT}.opk \ ../root1/usr/src/*_${ARCH}_all.opk \ ../root1/usr/src/*_all_${PLAT}.opk \ ../root1/usr/src/*_all_all.opk; do [ -f "${opk}" ] || continue pkg="${opk#../root1/usr/src/}" case "${pkg}" in "build-essential-${ARCH}_"*) ;; 'build-essential-common_'*) ;; 'build-essential-'*) continue ;; "gcc-${ARCH}_"*) ;; "gcc-"*"-${ARCH}_"*) ;; 'gcc-'*'-common_'*) ;; 'gcc-'*'-locales_'*) ;; 'gcc-'*) continue ;; "g++-${ARCH}_"*) ;; "g++-"*"-${ARCH}_"*) ;; 'g++-'*'-common_'*) ;; 'g++-'*'-locales_'*) ;; 'g++-'*) continue ;; esac log 'Installing package %s...' "${pkg%%_*}" tar -xzOf "${opk}" data.tar.gz | tar -xz done cd .. } install_archplat_sysconf() { # TODO: The config-opkg package should provide these, but it isn't built # and installed here yet. cd root2 mkdir -p etc printf '%s\n' "${ARCH}" >etc/proteanos_arch printf '%s\n' "${PLAT}" >etc/proteanos_plat mkdir -p etc/opkg printf 'arch all 1\narch %s 1\narch src 1\n' "${ARCH}" \ >etc/opkg/opkg.conf cd .. } configure_packages() { local opk pkg entry file cd root2 info='var/lib/opkg/info' mkdir -p "${info}" for opk in ../root1/usr/src/*_${ARCH}_${PLAT}.opk \ ../root1/usr/src/*_${ARCH}_all.opk \ ../root1/usr/src/*_all_${PLAT}.opk \ ../root1/usr/src/*_all_all.opk; do [ -f "${opk}" ] || continue pkg="${opk#../root1/usr/src/}" case "${pkg}" in "build-essential-${ARCH}_"*) ;; 'build-essential-common_'*) ;; 'build-essential-'*) continue ;; "gcc-${ARCH}_"*) ;; "gcc-"*"-${ARCH}_"*) ;; 'gcc-'*'-common_'*) ;; 'gcc-'*'-locales_'*) ;; 'gcc-'*) continue ;; "g++-${ARCH}_"*) ;; "g++-"*"-${ARCH}_"*) ;; 'g++-'*'-common_'*) ;; 'g++-'*'-locales_'*) ;; 'g++-'*) continue ;; esac pkg="${pkg%%_*}" for entry in $(tar -xzOf "${opk}" control.tar.gz | tar -tz); do file="${entry##*/}" case "${file}" in preinst | postinst) tar -xzOf "${opk}" control.tar.gz | \ tar -xzO "${entry}" \ >"${info}/${pkg}.${file}" chmod a+x "${info}/${pkg}.${file}" log 'Running %s...' "${pkg}.${file}" sudo chroot . \ "/${info}/${pkg}.${file}" \ configure ;; esac done done sudo chroot . chmod -R a+w /var/lib/opkg/alternatives cd .. } setup_root() { cd root2 case "${ARCH}" in *-linux-*) mkdir -p proc sys dev sudo mount -t proc proc proc sudo mount -t sysfs sys sys sudo mount -o bind /dev dev sudo mount -t devpts -o noexec,nosuid,gid=5,mode=0620 \ devpts dev/pts ;; esac # TODO: base-files will eventually handle this. mkdir -p tmp chmod 1775 tmp cd .. } main "${@}"