summaryrefslogtreecommitdiffstats
path: root/bootstrap-stage2-install.sh
diff options
context:
space:
mode:
authorP. J. McDermott <pjm@nac.net>2013-07-04 14:03:55 (EDT)
committer P. J. McDermott <pjm@nac.net>2013-07-04 14:03:55 (EDT)
commit207075e50565b14d3d6c51365794927a126164a7 (patch)
tree86133845205daf7467dcade009e088830e55b63e /bootstrap-stage2-install.sh
parentf05b04239e43c8660193fbfda8697ed6eca3bb54 (diff)
bootstrap-stage2-install.sh: New file.
Diffstat (limited to 'bootstrap-stage2-install.sh')
-rwxr-xr-xbootstrap-stage2-install.sh154
1 files changed, 154 insertions, 0 deletions
diff --git a/bootstrap-stage2-install.sh b/bootstrap-stage2-install.sh
new file mode 100755
index 0000000..2f656d0
--- /dev/null
+++ b/bootstrap-stage2-install.sh
@@ -0,0 +1,154 @@
+#!/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 <http://www.gnu.org/licenses/>.
+
+set -e
+
+ARCH=
+PLAT=
+
+main()
+{
+ ARCH="$(cat /etc/proteanos_arch)"
+ PLAT="$(cat /etc/proteanos_plat)"
+
+ cat <<-EOF
+
+ Installing packages in stage 2...
+ =================================
+ EOF
+
+ 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'
+}
+
+install_packages()
+{
+ local opk pkg
+
+ rm -Rf root2
+ 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/}"
+ 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/}"
+ 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
+ ;;
+ esac
+
+ # TODO: base-files will eventually handle this.
+ mkdir -p tmp
+ chmod 1775 tmp
+
+ cd ..
+}
+
+main "${@}"