# Build opkg packages # # Copyright (C) 2012 Patrick McDermott # # This file is part of opkbuild. # # opkbuild 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. # # opkbuild 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 opkbuild. If not, see . set -e . "${LIBDATADIR}/libopkbuild.${SHSOEXT}.${LIBOPKBUILD_SHSOVERSION}" export OPK_SOURCE= export OPK_SOURCE_VERSION= export OPK_SOURCE_VERSION_UPSTREAM= export OPK_BINARY_VERSION= export OPK_PACKAGES= export OPK_PACKAGES_REDUCED= export OPK_BUILD_ARCH= export OPK_BUILD_ARCH_CPU= export OPK_BUILD_ARCH_KERNEL= export OPK_BUILD_ARCH_LIBS= export OPK_BUILD_PLAT= export OPK_HOST_ARCH= export OPK_HOST_ARCH_CPU= export OPK_HOST_ARCH_KERNEL= export OPK_HOST_ARCH_LIBS= export OPK_HOST_PLAT= opt_build= opt_arch_dep= opt_plat_dep= opt_target= opt_host_arch= opt_host_plat= opt_check_build_deps= opt_clean= opt_uid0_cmd= usage() { printf "$(ob_get_msg 'usage')\n" 'opkbuild' } help() { usage printf '%s\n' "$(ob_get_msg 'help')" } version() { printf "$(ob_get_msg 'version')\n" \ 'opkbuild' "${PACKAGE_NAME}" "${PACKAGE_VERSION}" } get_options() { # Parse and handle command-line options. # Remember to update the optstring file when changing this. while getopts 'bBPSFT:a:p:DdCcr:hV' opt; do case "${opt}" in b) case "${opt_build}" in ''|'binary');; *) ob_error "$(ob_get_msg 'bsf_mutex')" return 1 esac opt_build='binary' ;; B) case "${opt_build}" in ''|'binary');; *) ob_error "$(ob_get_msg 'bsf_mutex')" return 1 esac opt_build='binary' opt_arch_dep=true ;; P) case "${opt_build}" in ''|'binary');; *) ob_error "$(ob_get_msg 'bsf_mutex')" return 1 esac opt_build='binary' opt_plat_dep=true ;; S) case "${opt_build}" in ''|'source');; *) ob_error "$(ob_get_msg 'bsf_mutex')" return 1 esac opt_build='source' ;; F) case "${opt_build}" in ''|'full');; *) ob_error "$(ob_get_msg 'bsf_mutex')" return 1 esac opt_build='full' ;; T) opt_target="${OPTARG}" ;; a) opt_host_arch="${OPTARG}" ;; p) opt_host_plat="${OPTARG}" ;; D) opt_check_build_deps='true' ;; d) opt_check_build_deps='false' ;; C) opt_clean='true' ;; c) opt_clean='false' ;; r) opt_uid0_cmd="${OPTARG}" ;; h) help exit 0 ;; V) version exit 0 ;; ?) ob_error "$(ob_get_msg 'bad_opt')" "${opt}" return 1 ;; esac done # Set default option values. [ -z "${opt_build}" ] && opt_build='full' [ -z "${opt_check_build_deps}" ] && opt_check_build_deps='true' [ -z "${opt_uid0_cmd}" ] && opt_uid0_cmd='fakeroot' [ "x${opt_arch_dep}" = 'x' ] && opt_arch_dep=false [ "x${opt_plat_dep}" = 'x' ] && opt_plat_dep=false # Set cleaning behavior. if [ -n "${opt_target}" ]; then [ -z "${opt_clean}" ] && opt_clean='false' else [ -z "${opt_clean}" ] && opt_clean='true' fi return 0 } test_uid0_cmd() { # Verify that the UID 0 command works. if ! test_uid=$("${opt_uid0_cmd}" -- id -u); then ob_error "$(ob_get_msg 'uid0_cmd_not_found')" "${opt_uid0_cmd}" return 1 fi if [ ${test_uid} -ne 0 ]; then ob_error "$(ob_get_msg 'uid0_cmd_bad_uid')" "${opt_uid0_cmd}" return 1 fi return 0 } setup_arch_plat() { ob_info "$(ob_get_msg 'setup_arch_plat')" OPK_BUILD_ARCH="$(ob_get_system_arch)" OPK_BUILD_PLAT="$(ob_get_system_plat)" if [ -n "${opt_host_arch}" ]; then OPK_HOST_ARCH="${opt_host_arch}" else OPK_HOST_ARCH="${OPK_BUILD_ARCH}" fi if [ -n "${opt_host_plat}" ]; then OPK_HOST_PLAT="${opt_host_plat}" else OPK_HOST_PLAT="${OPK_BUILD_PLAT}" fi IFS='-' read OPK_BUILD_ARCH_CPU OPK_BUILD_ARCH_KERNEL OPK_BUILD_ARCH_LIBS \ <<-EOF ${OPK_BUILD_ARCH} EOF IFS='-' read OPK_HOST_ARCH_CPU OPK_HOST_ARCH_KERNEL OPK_HOST_ARCH_LIBS \ <<-EOF ${OPK_HOST_ARCH} EOF } make_work_area() { ob_info "$(ob_get_msg 'make_work_area')" mkdir -p 'tmp' cd 'tmp' } setup_package() { ob_info "$(ob_get_msg 'parse_package_metadata')" ob_init_package '..' || exit 1 ob_parse_package_metadata -c '.opkbuild.cache' || exit 1 OPK_SOURCE="$(ob_get_source_parameter 'Source')" OPK_SOURCE_VERSION="$(ob_get_source_parameter 'Version')" ob_parse_version -u 'OPK_SOURCE_VERSION_UPSTREAM' "${OPK_SOURCE_VERSION}" OPK_BINARY_VERSION="$(ob_get_source_parameter 'Version')" } build_source() { ob_info "$(ob_get_msg 'build_source')" src="$(ob_get_source_parameter 'Source')" ver="$(ob_get_source_parameter 'Version')" src_pkg_data_base="src-${src}.data$(ob_get_system_path 'package-source' \ "${src}" "${ver}")" if ! "${opt_uid0_cmd}" -- mkdir -p "${src_pkg_data_base}"; then ob_error "$(ob_get_msg 'cant_make_src_pkg_dir')" return 1 fi for file in ../*; do case "${file}" in ../tmp) ;; ../*) if ! "${opt_uid0_cmd}" -- cp -Rp "${file}" \ "${src_pkg_data_base}"; then ob_error "$(ob_get_msg 'cant_install_src_pkg_file')" return 1 fi ;; esac done if ! OB_DO_SOURCE='true' "${BINDIR}/ob-gencontrol"; then exit 1 fi if ! OB_DO_SOURCE='true' "${BINDIR}/ob-buildopk"; then exit 1 fi if ! OB_DO_SOURCE='true' "${BINDIR}/ob-genchanges"; then exit 1 fi if ! rm -Rf "src-${src}.data"; then ob_error "$(ob_get_msg 'cant_rm_src_pkg_data')" return 1 fi return 0 } print_arch_stats() { ob_info "$(ob_get_msg 'build_arch_stat_header')" ob_info "$(ob_get_msg 'arch_stat_arch')" "${OPK_BUILD_ARCH}" ob_info "$(ob_get_msg 'arch_stat_plat')" "${OPK_BUILD_PLAT}" ob_info "$(ob_get_msg 'host_arch_stat_header')" ob_info "$(ob_get_msg 'arch_stat_arch')" "${OPK_HOST_ARCH}" ob_info "$(ob_get_msg 'arch_stat_plat')" "${OPK_HOST_PLAT}" } setup_build() { OPK_PACKAGES="$(\ ob_get_binary_packages -a "${OPK_HOST_ARCH}" \ -P "${OPK_HOST_PLAT}"; \ ob_get_binary_packages -a "${OPK_HOST_ARCH}" -P 'all'; \ ob_get_binary_packages -a 'all' -P "${OPK_HOST_PLAT}"; \ ob_get_binary_packages -a 'all' -P 'all')" # This is an internal non-SPF variable. The definition of OPK_PACKAGES # may change in future SPF versions. # TODO: ??? OPK_PACKAGES_REDUCED="$(\ ob_get_binary_packages -a "${OPK_HOST_ARCH}" \ -P "${OPK_HOST_PLAT}")" if ! ${opt_plat_dep}; then OPK_PACKAGES_REDUCED="${OPK_PACKAGES_REDUCED} $(\ ob_get_binary_packages -a "${OPK_HOST_ARCH}" -P 'all')" fi if ! ${opt_arch_dep}; then OPK_PACKAGES_REDUCED="${OPK_PACKAGES_REDUCED} $(\ ob_get_binary_packages -a 'all' -P "${OPK_HOST_PLAT}")" if ! ${opt_plat_dep}; then OPK_PACKAGES_REDUCED="${OPK_PACKAGES_REDUCED} $(\ ob_get_binary_packages -a 'all' -P 'all')" fi fi eval "$("${BINDIR}/ob-buildenv" | sed 's/^/export /')" if ! "${BINDIR}/ob-unpacksource"; then exit 1 fi if ! "${BINDIR}/ob-applypatches"; then # TODO: Remove the ":" after fixing ob-applypatches. : exit 1 fi if ! "${BINDIR}/ob-installplatconf"; then exit 1 fi } build() { case "${opt_target}" in '') ../build build && ${opt_uid0_cmd} -- ../build install && ${opt_uid0_cmd} -- '${BINDIR}/ob-installdocs' && ${opt_uid0_cmd} -- '${BINDIR}/ob-gencontrol' && ${opt_uid0_cmd} -- '${BINDIR}/ob-buildopk' && ${opt_uid0_cmd} -- '${BINDIR}/ob-genchanges' || exit 1 ;; 'install'|'install-'*) if ! ${opt_uid0_cmd} -- ../build "${opt_target}"; then exit 1 fi ;; *) if ! ../build "${opt_target}"; then exit 1 fi ;; esac } clean() { if "${opt_clean}"; then cd .. rm -Rf 'tmp' fi } main() { ob_set_text_domain 'opkbuild' get_options "${@}" || return 1 shift $(($OPTIND - 1)) if [ ${#} -ne 0 ]; then usage exit 1 fi test_uid0_cmd || return 1 setup_arch_plat make_work_area setup_package if [ "${opt_build}" = 'source' -o "${opt_build}" = 'full' ]; then build_source || return 1 fi if [ "${opt_build}" != 'source' ]; then print_arch_stats if "${opt_check_build_deps}"; then if ! "${BINDIR}/ob-checkbuilddeps"; then exit 1 fi fi setup_build build clean fi return 0 } main "${@}"