summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/cmd/build.sh88
-rw-r--r--lib/cmd/local.mk3
-rw-r--r--locale/en_US.sh5
3 files changed, 95 insertions, 1 deletions
diff --git a/lib/cmd/build.sh b/lib/cmd/build.sh
new file mode 100644
index 0000000..61f6612
--- /dev/null
+++ b/lib/cmd/build.sh
@@ -0,0 +1,88 @@
+# "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/>.
+
+use profile
+use chroot
+use rand
+
+cmd_build_main()
+{
+ local root=
+ local first_arg=
+ local prev_arg=
+ local arg=
+ local dir=
+ local uname_s=
+ local f=
+
+ if [ ${#} -lt 2 ]; then
+ print_cmd_usage 'build' >&2
+ exit 1
+ fi
+
+ root="${1}"
+ shift 1
+
+ first_arg=true
+ prev_arg=
+ for arg in "${@}"; do
+ if ${first_arg}; then
+ set --
+ first_arg=false
+ else
+ set -- "${@}" "${prev_arg}"
+ fi
+ prev_arg="${arg}"
+ done
+
+ . "${root}/etc/os-release"
+ profile_set "${ID}"
+
+ if ! [ -d "${prev_arg}" ]; then
+ error 2 "$(get_msg 'cmd_build_not_a_dir')"
+ fi
+
+ rand
+ dir="/prokit/build.${rand_x}"
+ uname_s="$( (uname -s) 2>/dev/null)" || uname_s='unknown'
+ mkdir -p "${root}${dir}/pkg"
+ case "${uname_s}" in
+ 'Linux')
+ mount -o bind "${prev_arg}" "${root}${dir}/pkg"
+ ;;
+ esac
+
+ chroot_exec "${root}" sh <<-EOF
+ cd '${dir}/pkg'
+ opkbuild ${@}
+ EOF
+
+ case "${uname_s}" in
+ 'Linux')
+ umount "${root}${dir}/pkg"
+ ;;
+ esac
+ rmdir "${root}${dir}/pkg"
+ for f in "${root}${dir}/"*; do
+ [ -e "${f}" ] || continue
+ mv "${f}" ..
+ done
+ rmdir "${root}${dir}"
+}
diff --git a/lib/cmd/local.mk b/lib/cmd/local.mk
index 1c77e63..8c56946 100644
--- a/lib/cmd/local.mk
+++ b/lib/cmd/local.mk
@@ -3,4 +3,5 @@ pkgdatacmd_sources = \
lib/cmd/version.sh \
lib/cmd/install.sh \
lib/cmd/shell.sh \
- lib/cmd/opkg.sh
+ lib/cmd/opkg.sh \
+ lib/cmd/build.sh
diff --git a/locale/en_US.sh b/locale/en_US.sh
index dbf518d..c8e2fc9 100644
--- a/locale/en_US.sh
+++ b/locale/en_US.sh
@@ -91,5 +91,10 @@ msg_prokit_cmd_opkg_summary='manage packages with opkg'
msg_prokit_cmd_opkg_usage='<root-dir> [<option> ...] <sub-command> '\
'[<argument> ...]'
+# lib/cmd/build.sh
+msg_prokit_cmd_build_summary='build a package'
+msg_prokit_cmd_build_usage='<root-dir> [<option> ...] <pkg-dir>'
+msg_prokit_cmd_build_not_a_dir='Not a directory: %s'
+
# lib/profile.sh
msg_prokit_profile_not_found='Profile "%s" not found'