#!/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 IDX_SHA256SUM='1df55a00659f82da3a595c154ce2fbfb4b9ca355b5bc6edceb34076536d7f09d' 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 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" # opkhelper installs an opkbuild helper configuration script named # "opkhelper". ProteanOS packages depend on "opkhelper-3.0". sudo ln -sf opkhelper /usr/local/share/opkbuild/helpers/opkhelper-3.0 } prepare_packages_from_git() { local pkgs_list repo branch patch if [ -e "${SCRIPT_DIR}/bootstrap-pkgs-git_${ARCH}.txt" ]; then pkgs_list="${SCRIPT_DIR}/bootstrap-pkgs-git_${ARCH}.txt" elif [ -e "${SCRIPT_DIR}/bootstrap-pkgs-git.txt" ]; then pkgs_list="${SCRIPT_DIR}/bootstrap-pkgs-git.txt" else return 0 fi [ -d pkg ] || mkdir pkg cd pkg while read repo branch; do if [ -f "${repo##*/}_"*'_src_all.changes' ]; then continue fi log 'Preparing package %s...' "${repo##*/}" if [ ! -d "${repo##*/}/.git" ]; then git clone --depth 1 --branch "${branch}" \ "git://git.proteanos.com/pkg/${repo}.git" fi cd "${repo##*/}" git pull origin "${branch}" 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 ./config fi rm -f local.mk if [ -f source.mk -a ! -f "${repo##*/}"*.orig.tar* ]; then if [ -f "../.cache/${repo##*/}"*.orig.tar* ]; then mv "../.cache/${repo##*/}"*.orig.tar* . else opkbuild -bCT source rm -Rf tmp fi fi opkbuild -SC rm -Rf tmp cd .. done <"${pkgs_list}" cd .. } : <<'EOF' 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 .. } EOF prepare_packages() { local mirror rand line filename sha256sum log 'Selecting package archive mirror...' if [ -r "${SCRIPT_DIR}/mirror" ]; then mirror="$(cat "${SCRIPT_DIR}/mirror")" else rand=$(date '+%S') rand=$(($rand % 2)) case ${rand} in 0) mirror='http://mirror.gnu.dk/pub/proteanos' ;; 1) mirror='http://mirror.oss.maxcdn.com/proteanos' ;; esac fi log 'Downloading Packages index file...' wget -O Packages "${mirror}/feeds/dev/trunk/src/all/base/Packages" if ! printf '%s Packages\n' "${IDX_SHA256SUM}" | sha256sum -c -; then printf 'ERROR: Checksum of Packages index file failed!\n' >&2 exit 1 fi log 'Downloading source packages...' while IFS='' read -r line; do if [ "x${line%: *}" = 'xFilename' ]; then filename="${line}" filename="${filename#Filename: }" elif [ "x${line%: *}" = 'xSHA256sum' ]; then sha256sum="${line}" sha256sum="${sha256sum#SHA256sum: }" get_pkg "${mirror}" "${filename}" "${sha256sum}" fi done &2 exit 1 fi tar -xzOf "${filename}" data.tar.gz | tar -xz mv "usr/src/${pkg_ver}" "${pkg_ver%_*}" rmdir usr/src usr cd .. } prepare_file_system() { local ma dir bb_ver 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' ;; 'arm-linux-gnueabihf') interp='ld-linux-armhf.so.3' ;; 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 bb_ver="$(sed 's/^busybox (\(.*\)-.*) .*$/\1/; q;' \ pkg/busybox/changelog)" sudo cp -p "pkg/config-${PLAT}/src/build/busybox/${bb_ver}/busybox.config" \ "/usr/local/share/platconf/${PLAT}/busybox/busybox.config" sudo cp -p "pkg/config-${PLAT}/src/build/busybox/${bb_ver}/inittab" \ "/usr/local/share/platconf/${PLAT}/busybox/inittab" } main "${@}"