# ProteanOS Development Kit # lib/cmd/install.sh # "install" command # # 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 3 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 . use getopt use feed use profile use fd use pkg cmd_install_optstring='a:P:m:' cmd_install_deps= cmd_install_fnames= cmd_install_feed_url= cmd_install_main() { local suite= local chroot= local arch= local plat= local profile= local mirror= get_options "${@}" shift $(($OPTIND - 1)) if [ ${#} -lt 2 ]; then print_cmd_usage 'install' >&2 exit 1 fi suite="${1}" chroot="${2}" if [ "x${suite%%:*}" != "x${suite}" ]; then profile="${suite%%:*}" suite="${suite#*:}" else profile='proteanos' fi profile_set "${profile}" suite="$(profile_normalize_suite "${suite}")" if [ "x${cmd_install_opt_a+set}" = 'xset' ]; then arch="${cmd_install_opt_a}" else arch="$(profile_detect_arch)" fi if [ "x${cmd_install_opt_P+set}" = 'xset' ]; then plat="${cmd_install_opt_P}" else plat="$(profile_default_plat)" fi if ! profile_validate_archplat "${arch}" "${plat}"; then error 2 "$(get_msg 'cmd_install_bad_archplat')" \ "${arch}" "${plat}" fi info "$(get_msg 'cmd_install_selected_arch')" "${arch}" info "$(get_msg 'cmd_install_selected_plat')" "${plat}" if [ "x${cmd_install_opt_m+set}" = 'xset' ]; then mirror="${cmd_install_opt_m}" else mirror="$(profile_select_mirror)" fi info "$(get_msg 'cmd_install_selected_mirror')" "${mirror}" info "$(get_msg 'cmd_install_setting_up_chroot')" if [ -d "${chroot}" ]; then error 2 "$(get_msg 'cmd_install_chroot_dir_exists')" "${chroot}" fi if ! mkdir "${chroot}" || ! mkdir "${chroot}/.prokit"; then error 2 "$(get_msg 'cmd_install_mkdir_chroot_fail')" "${chroot}" fi info "$(get_msg 'cmd_install_find_pkgs')" cmd_install_find_pkgs "${mirror}" "${suite}" "${arch}" "${plat}" \ "${chroot}" } cmd_install_find_pkgs() { local mirror="${1}" local suite="${2}" local arch="${3}" local plat="${4}" local chroot="${5}" local opkg_conf_fd= local pkgs_fd= local feed_idx= local feed= local pkgs= mkdir -p "${chroot}/etc/opkg" "${chroot}/var/lib/opkg/lists" fopen "${chroot}/etc/opkg/opkg.conf" 'w' opkg_conf_fd=${FD} cmd_install_deps= cmd_install_fnames= fopen "${chroot}/.prokit/packages" 'w' pkgs_fd=${FD} while read -r feed_idx feed; do printf 'src %s %s\n' "${feed_idx}" "${feed}" >&${opkg_conf_fd} feed_download "${feed}" \ >"${chroot}/var/lib/opkg/lists/${feed_idx}" cmd_install_feed_url="${feed%/*}" feed_find_pkgs "${chroot}/var/lib/opkg/lists/${feed_idx}" \ "$(profile_dep_fields)" profile_include_pkg \ cmd_install_deps_cb cmd_install_fname_cb >&${pkgs_fd} done <<-EOF $(profile_feeds "${mirror}" "${arch}" "${plat}" "${suite}") EOF printf '\ndest root /\n' >&${opkg_conf_fd} printf 'arch %s 1\n' 'all' "${arch}" 'src' >&${opkg_conf_fd} fclose ${opkg_conf_fd} fclose ${pkgs_fd} pkgs="$(resolve_deps "$(cat "${chroot}/.prokit/packages")" \ "${cmd_install_deps}" | xargs printf '%s\n' | sort -u)" printf '%s\n' "${pkgs}" >"${chroot}/.prokit/packages" } cmd_install_deps_cb() { local pkg="${1}" local deps="${2}" cmd_install_deps="${cmd_install_deps}${pkg}: ${deps}${LF}" } cmd_install_fname_cb() { local pkg="${1}" local fname="${2}" cmd_install_fnames="$(printf '%s\n%s %s/%s' "${cmd_install_fnames}" \ "${pkg}" "${cmd_install_feed_url}" "${fname}")" }