# "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 # . use profile use session use rand use package use control cmd_build_root= cmd_build_pkg_dir= cmd_build_build_deps= cmd_build_main() { local root= 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}" cmd_build_root="${root}" shift 1 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 } 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 }