summaryrefslogtreecommitdiffstats
path: root/src/cmd/build.sh
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/build.sh')
-rw-r--r--src/cmd/build.sh152
1 files changed, 152 insertions, 0 deletions
diff --git a/src/cmd/build.sh b/src/cmd/build.sh
new file mode 100644
index 0000000..8d12691
--- /dev/null
+++ b/src/cmd/build.sh
@@ -0,0 +1,152 @@
+# "build" command
+#
+# Copyright (C) 2014 Patrick "P. J." McDermott
+#
+# This file is part of the ProteanOS Development Kit.
+#
+# The ProteanOS Development Kit 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 3 of the
+# License, or (at your option) any later version.
+#
+# The ProteanOS Development Kit 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 the ProteanOS Development Kit. If not, see
+# <http://www.gnu.org/licenses/>.
+
+cmd_build_root=
+cmd_build_pkg_dir=
+cmd_build_build_deps=
+
+cmd_build_main()
+{
+ local root=
+ local dev=
+ local opkbuild_optstring=
+ local arch=
+ local plat=
+ local first_arg=
+ local arg=
+
+ if [ ${#} -lt 2 ]; then
+ print_cmd_usage 'build' >&2
+ exit 1
+ fi
+
+ root="${1}"
+ shift 1
+
+ dev=''
+ if is_block "${root}"; then
+ dev="${root}"
+ root="$(block_mount "${dev}")"
+ fi
+
+ cmd_build_root="${root}"
+
+ opkbuild_optstring="$(cat "${root}/usr/share/opkbuild/optstring")"
+ arch="$(cat "${root}/etc/proteanos_arch")"
+ plat="$(cat "${root}/etc/proteanos_plat")"
+ while getopts "${opkbuild_optstring}" opt 2>/dev/null; do
+ case "${opt}" in
+ a) arch="${OPTARG}";;
+ p) plat="${OPTARG}";;
+ esac
+ done
+
+ first_arg=true
+ cmd_build_pkg_dir=''
+ for arg in "${@}"; do
+ if ${first_arg}; then
+ set --
+ first_arg=false
+ else
+ set -- "${@}" "${cmd_build_pkg_dir}"
+ fi
+ cmd_build_pkg_dir="${arg}"
+ done
+
+ . "${root}/etc/os-release"
+ profile_set "${ID}"
+
+ if ! [ -d "${cmd_build_pkg_dir}" ]; then
+ error 2 "$(get_msg 'cmd_build_not_a_dir')" \
+ "${cmd_build_pkg_dir}"
+ fi
+ package_init "${cmd_build_pkg_dir}"
+ package_set_substvars "${arch}" "${plat}"
+
+ session_begin "${root}" "${cmd_build_pkg_dir}" cmd_build_fini false
+
+ cmd_build_build_deps="$(package_get_build_deps "${arch}" "${plat}")"
+ if [ "x${cmd_build_build_deps}" != 'x' ]; then
+ cmd_build_make_deps_pkg
+ session_exec opkg install ../builddeps.opk
+ fi
+
+ session_exec opkbuild "${@}"
+
+ cmd_build_fini
+
+ session_end
+
+ if [ "x${dev}" != 'x' ]; then
+ block_umount "${root}"
+ fi
+}
+
+cmd_build_make_deps_pkg()
+{
+ local pkg_dir=
+
+ pkg_dir="${cmd_build_root}$(session_dir)/builddeps"
+ mkdir -p "${pkg_dir}/control" "${pkg_dir}/data"
+ printf '2.0\n' >"${pkg_dir}/debian-binary"
+ cat >"${pkg_dir}/control/control" <<-EOF
+ Package: prokit-builddeps-$(session_id)
+ Source: prokit
+ Version: 1.0
+ Architecture: all
+ Platform: all
+ Depends: ${cmd_build_build_deps}
+ Description: Build dependencies metapackage generated by prokit
+ EOF
+ (cd "${pkg_dir}/data"; tar -czf ../data.tar.gz .)
+ (cd "${pkg_dir}/control"; tar -czf ../control.tar.gz .)
+ (cd "${pkg_dir}"; tar -czf ../builddeps.opk \
+ 'debian-binary' 'data.tar.gz' 'control.tar.gz')
+ rm -Rf "${pkg_dir}"
+}
+
+cmd_build_fini()
+{
+ local session_dir=
+ local f=
+
+ session_dir="$(session_dir)"
+
+ if [ "x${cmd_build_build_deps}" != 'x' ]; then
+ session_exec opkg --autoremove remove \
+ prokit-builddeps-$(session_id)
+ rm "${cmd_build_root}${session_dir}/builddeps.opk"
+ # Hack to avoid this code branch if the function is called again
+ # in response to a signal.
+ cmd_build_build_deps=''
+ fi
+
+ for f in "${cmd_build_root}${session_dir}/"*; do
+ [ -e "${f}" ] || continue
+ [ "x${f##*/}" = 'xwd' ] && continue
+ mv "${f}" "${cmd_build_pkg_dir}/.."
+ done
+}
+
+cmd_build_register()
+{
+ register_cmd 'build'
+}
+__init cmd_build_register