#!/bin/sh # # Initial port bootstrap scripts # bootstrap-stage1-install.sh # Installs built stage 1 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 1... ================================= EOF clean_root install_packages install_elf_interp_link 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 root1 ] || return 0 cd root1 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 root1 } install_packages() { local opk pkg mkdir root1 cd root1 for opk in ../pkg/*_${ARCH}_${PLAT}.opk ../pkg/*_${ARCH}_all.opk \ ../pkg/*_all_${PLAT}.opk ../pkg/*_all_all.opk; do [ -f "${opk}" ] || continue pkg="${opk#../pkg/}" 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_elf_interp_link() { local elf_interp cd root1 elf_interp="$(readelf -l bin/busybox | sed -n \ 's|^.*\[Requesting program interpreter: /\(.*\)\].*$|\1|p')" mkdir -p "${elf_interp%/*}" ln -sf "/lib/${ARCH}/${elf_interp##*/}" "${elf_interp}" cd .. } install_archplat_sysconf() { # TODO: The config-opkg package should provide these, but it isn't built # and installed here yet. cd root1 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 root1 info='var/lib/opkg/info' mkdir -p "${info}" for opk in ../pkg/*_${ARCH}_${PLAT}.opk ../pkg/*_${ARCH}_all.opk \ ../pkg/*_all_${PLAT}.opk ../pkg/*_all_all.opk; do [ -f "${opk}" ] || continue pkg="${opk#../pkg/}" 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 root1 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 "${@}"