#!@DIR_MODS@/bt_sh # $Id: sh_head.in,v 1.29 2004/05/08 20:05:19 jmmv Exp $ # Common header for shell scripts, including shared functions. # # buildtool # Copyright (c) 2003, 2004 Julio M. Merino Vidal. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # 3. Neither the name of the author nor the names of contributors may # be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT # OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # ProgName=${0##*/} LogName= ConfigFile= DefsFile= DocsFile= LogicFile= # ------------------------------------------------------------------------- # # btcmn_err message # Show error message on stderr and exit with error status. # btcmn_err() { local spaces="$(echo ${ProgName} | sed -e 's/./ /g')" echo "${ProgName}: $1" 1>&2 shift while [ $# -gt 0 ]; do echo "${spaces} $1" 1>&2 shift done exit 1 } # ------------------------------------------------------------------------- # # btcmn_warn message # Show warning message on stderr. # btcmn_warn() { local spaces="$(echo ${ProgName} | sed -e 's/./ /g')" echo "${ProgName}: $1" 1>&2 shift while [ $# -gt 0 ]; do echo "${spaces} $1" 1>&2 shift done } # ------------------------------------------------------------------------- # # btcmn_log_start name # Open the given log file and add a header to it for the current # session. # btcmn_log_start() { LogName=$1 [ -f ${LogName} ] && echo >> ${LogName} echo "-------------------------------------------------------------------------" >> ${LogName} # NOLINT echo "LOG STARTED FOR MODULE ${ProgName} ON $(date)" >> ${LogName} echo >> ${LogName} } # ------------------------------------------------------------------------- # # btcmn_log_name # Get the current log name. # btcmn_log_name() { echo ${LogName} } # ------------------------------------------------------------------------- # # btcmn_log_msg text # Append the given message to the log file. # btcmn_log_msg() { echo $* >> ${LogName} } # ------------------------------------------------------------------------- # # btcmn_req_project # Check if we are executing Buildtool inside a buildtoolized project. # If so, set BT_TOPDIR to its top directory, set all *File variables # pointing to the right script, check if the current Buildtool version # is enough to work with this project and automatically source the defs # block. The function does not return if the check fails. # btcmn_req_project() { local major minor oldpwd config() { btcmn_err "no config() function defined; cannot continue." } defs() { btcmn_err "no defs() function defined; cannot continue." } docs() { btcmn_err "no docs() function defined; cannot continue." } oldpwd=$(pwd) BT_TOPDIR= while [ -z "${BT_TOPDIR}" -a $(pwd) != / ]; do if [ -f Generic.bt -o -f Defs.bt ]; then BT_TOPDIR=$(pwd) else cd .. fi done [ -z "${BT_TOPDIR}" ] && btcmn_err \ "this module needs to be run from inside a Buildtool project" if [ -f Config.bt ]; then ConfigFile=${BT_TOPDIR}/Config.bt else ConfigFile=${BT_TOPDIR}/Generic.bt fi if [ -f Defs.bt ]; then DefsFile=${BT_TOPDIR}/Defs.bt else DefsFile=${BT_TOPDIR}/Generic.bt fi if [ -f Docs.bt ]; then DocsFile=${BT_TOPDIR}/Docs.bt else DocsFile=${BT_TOPDIR}/Generic.bt fi if [ -f Logic.bt ]; then LogicFile=${BT_TOPDIR}/Logic.bt else LogicFile=${BT_TOPDIR}/Generic.bt fi cd ${oldpwd} [ -f Logic.bt ] && LogicFile=$(pwd)/Logic.bt BT_REQUIRE= . ${DefsFile} defs if [ -z "${BT_REQUIRE}" ]; then btcmn_err "broken package; does not define BT_REQUIRE" fi major=$(echo ${BT_REQUIRE} | cut -d . -f 1) minor=$(echo ${BT_REQUIRE} | cut -d . -f 2) [ ${major} -ne @VERSION_MAJOR@ -a ${major} -ne 0 ] && \ btcmn_err "this package requires the Buildtool ${major}.x branch" [ ${minor} -gt @VERSION_MINOR@ ] && \ btcmn_err "this package requires Buildtool ${BT_REQUIRE}" } # ------------------------------------------------------------------------- # # btcmn_req_config # Check for the presence of the config script and source it if found. # Does not return if the file is not found. # btcmn_req_config() { [ ! -f ${ConfigFile} ] && btcmn_err "cannot open ${ConfigFile}" config_init() { return 0; } config() { return 0; } . ${ConfigFile} } # ------------------------------------------------------------------------- # # btcmn_req_defs # Check for the presence of the defs script and source it if found. # Does not return if the file is not found. # btcmn_req_defs() { [ ! -f ${DefsFile} ] && btcmn_err "cannot open ${DefsFile}" defs() { return 0; } . ${DefsFile} } # ------------------------------------------------------------------------- # # btcmn_req_docs # Check for the presence of the docs script and source it if found. # Does not return if the file is not found. # btcmn_req_docs() { [ ! -f ${DocsFile} ] && btcmn_err "cannot open ${DocsFile}" docs() { return 0; } . ${DocsFile} } # ------------------------------------------------------------------------- # # btcmn_req_logic # Check for the presence of the logic script and source it if found. # Does not return if the file is not found. # btcmn_req_logic() { [ ! -f ${LogicFile} ] && btcmn_err "cannot open ${LogicFile}" logic() { return 0; } . ${LogicFile} } # ------------------------------------------------------------------------- # # btcmn_req_runtime # Check if we were executed by the main buildtool wrapper program. # btcmn_req_runtime() { if [ ${__BUILDTOOL:-no} != yes ]; then btcmn_err "this program must be run through Buildtool" fi } # ------------------------------------------------------------------------- # # btcmn_run_module module [args] # Execute the given module passing all extra arguments to it. # btcmn_run_module() { local module="$1"; shift case ${module} in config) btcmn_req_project __BUILDTOOL=yes @DIR_MODS@/bt_sh ${BT_SH_FLAGS} \ @DIR_MODS@/bt_config ${BT_PKG_CONFIG_FLAGS} "$@" ;; dist) btcmn_req_project __BUILDTOOL=yes @DIR_MODS@/bt_sh ${BT_SH_FLAGS} \ @DIR_MODS@/bt_dist ${BT_PKG_DIST_FLAGS} "$@" ;; doc) btcmn_req_project __BUILDTOOL=yes @DIR_MODS@/bt_sh ${BT_SH_FLAGS} \ @DIR_MODS@/bt_doc ${BT_PKG_DOC_FLAGS} "$@" ;; lint) btcmn_req_project __BUILDTOOL=yes @DIR_MODS@/bt_sh ${BT_SH_FLAGS} \ @DIR_MODS@/bt_lint ${BT_PKG_LINT_FLAGS} "$@" ;; logic) btcmn_req_project __BUILDTOOL=yes @DIR_MODS@/bt_sh ${BT_SH_FLAGS} \ @DIR_MODS@/bt_logic ${BT_PKG_LOGIC_FLAGS} "$@" ;; pkgflags) __BUILDTOOL=yes @DIR_MODS@/bt_sh ${BT_SH_FLAGS} \ @DIR_MODS@/bt_pkgflags "$@" ;; swcgen) __BUILDTOOL=yes @DIR_MODS@/bt_sh ${BT_SH_FLAGS} \ @DIR_MODS@/bt_swcgen "$@" ;; wizard) __BUILDTOOL=yes @DIR_MODS@/bt_sh ${BT_SH_FLAGS} \ @DIR_MODS@/bt_wizard "$@" ;; *) btcmn_err "no such module \`${module}' (internal error)" ;; esac } # ------------------------------------------------------------------------- # Local Variables: *** # mode: shell-script *** # End: *** # vim: syntax=sh