#!@@SH@@ # # opkbuild # src/opkbuild.sh # Build opkg packages. # # Copyright (C) 2012 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 2 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 . . '@@PKGLIBDIR@@/load.sm' ob_use locale ob_use output ob_use package ob_use metadata 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= main() { ob_set_text_domain 'opkbuild' get_options "${@}" shift $(($OPTIND - 1)) if [ ${#} -ne 0 ]; then usage exit 1 fi test_uid0_cmd setup_arch_plat make_work_area setup_package if [ "${opt_build}" = 'source' -o "${opt_build}" = 'full' ]; then build_source 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 } 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')";; esac opt_build='binary' ;; B) case "${opt_build}" in ''|'binary');; *) ob_error "$(ob_get_msg 'bsf_mutex')";; esac opt_build='binary' opt_arch_dep=true ;; P) case "${opt_build}" in ''|'binary');; *) ob_error "$(ob_get_msg 'bsf_mutex')";; esac opt_build='binary' opt_plat_dep=true ;; S) case "${opt_build}" in ''|'source');; *) ob_error "$(ob_get_msg 'bsf_mutex')";; esac opt_build='source' ;; F) case "${opt_build}" in ''|'full');; *) ob_error "$(ob_get_msg 'bsf_mutex')";; 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}" exit 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 } test_uid0_cmd() { # Verify that the UID 0 command works. test_uid=$("${opt_uid0_cmd}" -- id -u) if [ ${?} -ne 0 ]; then ob_error "$(ob_get_msg 'uid0_cmd_not_found')" "${opt_uid0_cmd}" fi if [ ${test_uid} -ne 0 ]; then ob_error "$(ob_get_msg 'uid0_cmd_bad_uid')" "${opt_uid0_cmd}" fi } 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}")" "${opt_uid0_cmd}" -- mkdir -p \ "${src_pkg_data_base}" || \ ob_error "$(ob_get_msg 'cant_make_src_pkg_dir')" for file in ../*; do case "${file}" in ../tmp) ;; ../*) "${opt_uid0_cmd}" -- cp -Rp "${file}" "${src_pkg_data_base}" || \ ob_error "$(ob_get_msg 'cant_install_src_pkg_file')" ;; 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 rm -Rf "src-${src}.data" || ob_error "$(ob_get_msg 'cant_rm_src_pkg_data')" } 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. 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} -- sh -s <<-EOF ../build install && \ '@@BINDIR@@/ob-installdocs' && \ '@@BINDIR@@/ob-gencontrol' && \ '@@BINDIR@@/ob-buildopk' && \ '@@BINDIR@@/ob-genchanges' EOF if [ ${?} -ne 0 ]; then exit 1 fi ;; '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 "${@}"