# "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_main() { local root= local opkbuild_optstring= local arch= local plat= local first_arg= local prev_arg= local arg= local session_dir= local build_deps= local f= if [ ${#} -lt 2 ]; then print_cmd_usage 'build' >&2 exit 1 fi root="${1}" 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 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')" "${prev_arg}" fi package_init "${prev_arg}" package_set_substvars "${arch}" "${plat}" session_begin "${root}" "${prev_arg}" : session_dir="$(session_dir)" build_deps="$(package_get_build_deps "${arch}" "${plat}")" if [ "x${build_deps}" != 'x' ]; then cmd_build_make_deps_pkg "${root}" "${build_deps}" session_exec opkg install ../builddeps.opk fi session_exec opkbuild "${@}" if [ "x${build_deps}" != 'x' ]; then session_exec opkg --autoremove remove \ prokit-builddeps-$(session_id) rm "${root}${session_dir}/builddeps.opk" fi for f in "${root}${session_dir}/"*; do [ -e "${f}" ] || continue [ "x${f##*/}" = 'xwd' ] && continue mv "${f}" "${prev_arg}/.." done session_end } cmd_build_make_deps_pkg() { local root="${1}" local build_deps="${2}" local pkg_dir= pkg_dir="${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: ${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}" }