Rev 4057 | Blame | Last modification | View Log | RSS feed
#! /bin/bash## Force failed command to exit this shell - all commands must report successset -eechoecho#------------------------------------------------------------------------------# Takes $1 and removes all relative paths (. and ..) from it. The cleaned up# directory is written to stdout.#------------------------------------------------------------------------------cleanup_dir (){DIR_PARTS=`echo $1 | sed "s|/| |g"`CLEANUP_DIR=""for PART in ${DIR_PARTS}; doif [ "${PART}" != "." ]; thenif [ "${PART}" == ".." ]; thenCLEANUP_DIR=`echo "${CLEANUP_DIR}" | sed "s|/[^/]*$||"`elseCLEANUP_DIR="${CLEANUP_DIR}/${PART}"fifidoneecho ${CLEANUP_DIR}}#------------------------------------------------------------------------------# Extract arguments - order not important except that the first argument is# the launch script#------------------------------------------------------------------------------unset CLEANunset COPY_MODS_DIRSunset DOWNLOAD_PKGunset DOWNLOAD_PKG_AUTOunset DEBIAN_PACKAGEunset APPLY_PATCHESunset APPLY_MODSunset CONFIG_VARIENTunset WORK_DIR_NAMEunset XGCC_IN_PATH;for arg in "$@" ; doval=${arg##*=}tag=${arg%%=*}case $tag in-XGccInPath) XGCC_IN_PATH=1;;-CopyModsDirs) COPY_MODS_DIRS=1;;-clean) CLEAN=1;;-ShellBuild) SHELL_BUILD="$val";;-BuildName) BUILD_NAME=$val;;-BuildVersion) BUILD_VERSION=$val;;-Platform) PLATFORM=$val;;-Type) TYPE=$val;;-Arch) ARCH=$val;;-MachType) MACHTYPE=$val;;-BuildRoot) BUILD_ROOT=$val;;-InterfaceDir) INTERFACE_DIR=$val;;-LocalDir) LOCAL_DIR=$val;;-LocalIncDir) LOCAL_INC_DIR=$val;;-LocalBinDir) LOCAL_BIN_DIR=$val;;-LocalLibDir) LOCAL_LIB_DIR=$val;;-BinDir) BIN_DIR=$val;;-LibDir) LIB_DIR=$val;;-ObjDir) OBJ_DIR=$val;;-PackageBinDir) PKG_BIN_DIR=$val;;-PackageIncDir) PKG_INC_DIR=$val;;-PackageLibDir) PKG_LIB_DIR=$val;;-PackagePkgDir) PKG_PKG_DIR=$val;;-PackageToolDir) PKG_TOOL_DIR=$val;;-PackageToolBin) PKG_TOOL_BIN_DIR=$val;;-PackageToolScript) PKG_TOOL_SCRIPT_DIR=$val;;-PackageDir) PKG_DIR=$val;;-CompilerPath) COMPILER_DIR="$val";;-DownloadPkg) DOWNLOAD_PKG="$val";;-DebianPackage) DEBIAN_PACKAGE=$val;;-ApplyPatches) APPLY_PATCHES=1;;-ApplyMods) APPLY_MODS=1;;-ConfigVarient) CONFIG_VARIENT=$val;;-WorkDir) WORK_DIR_NAME=$val;;-WorkDirSuffix) WORK_DIR_SUFFIX=$val;;*) echo "Unknown tag: $tag=$val"esacdoneif [ "${DOWNLOAD_PKG}" == "-DownloadPkg" ]; thenDOWNLOAD_PKG_NAME=${BUILD_NAME}DOWNLOAD_PKG_VER=`echo ${BUILD_VERSION} | sed "s|\.[0-9]\+\.cots||"`DOWNLOAD_PKG=${DOWNLOAD_PKG_NAME}-${DOWNLOAD_PKG_VER}elseDOWNLOAD_PKG_VER=`echo ${DOWNLOAD_PKG} | sed "s|.*-||"`DOWNLOAD_PKG_NAME=`echo ${DOWNLOAD_PKG} | sed "s|-${DOWNLOAD_PKG_VER}||"`fi#------------------------------------------------------------------------------# Dump JATS information for debugging purposes#------------------------------------------------------------------------------echo "================================================================================"echo " JATS SUPPLIED FIELDS"echo "================================================================================"echo " ShellBuild = ${SHELL_BUILD}"echo " BuildName = ${BUILD_NAME} ${BUILD_VERSION}"echo " Platform = ${PLATFORM}"echo " Type = ${TYPE}"echo " Arch = ${ARCH}"echo " MachType = ${MACHTYPE}"echo " BuildRoot = ${BUILD_ROOT}"echo " InterfaceDir = ${INTERFACE_DIR}"echo " LocalDir = ${LOCAL_DIR}"if [ ${DOWNLOAD_PKG} ]; thenecho " DownloadPkg = ${DOWNLOAD_PKG}"fiecho " BinDir = ${BIN_DIR}"echo " LibDir = ${LIB_DIR}"echo " ObjDir = ${OBJ_DIR}"echo " PkgDir = ${PKG_DIR}"echo " PackageBinDir = ${PKG_BIN_DIR}"echo " PackageIncDir = ${PKG_INC_DIR}"echo " PackageLibDir = ${PKG_LIB_DIR}"echo " PackagePkgDir = ${PKG_PKG_DIR}"echo " CompilerDir = ${COMPILER_DIR}"echo "================================================================================"echoecho#------------------------------------------------------------------------------# Determine host and build environments#------------------------------------------------------------------------------case ${MACHTYPE} inlinux_i386)COMPILE_BUILD="i386-cross-linux-gnu";;*)echo "Unknown MACHTYPE=${MACHTYPE}"exit 1;;esaccase ${ARCH} in*603E*|*powerpc*)COMPILE_HOST="powerpc-603e-linux-gnu"LINUX_HOST_ARCH=powerpc;;ARMV9*)COMPILE_HOST="arm-9tdmi-linux-gnu"LINUX_HOST_ARCH=arm;;ARM926EJ*)COMPILE_HOST="arm-926ejs-linux-gnueabi"LINUX_HOST_ARCH=armif [ "${XGCC_IN_PATH}" != "" ]; thenecho "-XGccInPath is *NOT* supported by this platform by this version of ShellBuild"echo "Correct your shellbuild script so that it is not required."exit 1fi;;*I386*)if [ "${PLATFORM}" == "LINUX_I386" ]; thenCOMPILE_HOST="i386-cross-linux-gnu"elseCOMPILE_HOST="i586-unknown-linux-gnu"fiLINUX_HOST_ARCH=x86;;*)echo "Unknown ARCH=${ARCH}"exit 1;;esac# Setup the location of the cross compilerif [ "${COMPILE_HOST}" == "i386-redhat-linux" ] || [ "${COMPILER_DIR}" == "gcc" ]; thenXGCC_BASE_DIR=elseXGCC_BASE_DIR=`echo ${COMPILER_DIR} | sed 's|/[^/]*/[^/]*$||'`XGCC_BASE_DIR=`cleanup_dir ${XGCC_BASE_DIR}`fi# Determine the location of the generated filesCWD=`pwd`BIN_DIR=`cleanup_dir ${CWD}/${BIN_DIR}`LIB_DIR=`cleanup_dir ${CWD}/${LIB_DIR}`OBJ_DIR=`cleanup_dir ${CWD}/${OBJ_DIR}`PKG_DIR=`cleanup_dir ${CWD}/${PKG_DIR}`PKG_BIN_DIR=`cleanup_dir ${CWD}/${PKG_BIN_DIR}`PKG_INC_DIR=`cleanup_dir ${CWD}/${PKG_INC_DIR}`PKG_LIB_DIR=`cleanup_dir ${CWD}/${PKG_LIB_DIR}`PKG_PKG_DIR=`cleanup_dir ${CWD}/${PKG_PKG_DIR}`PKG_TOOL_DIR=`cleanup_dir ${CWD}/${PKG_TOOL_DIR}`PKG_TOOL_BIN_DIR=`cleanup_dir ${CWD}/${PKG_TOOL_BIN_DIR}`PKG_TOOL_SCRIPT_DIR=`cleanup_dir ${CWD}/${PKG_TOOL_SCRIPT_DIR}`BASE_DIR=`cleanup_dir ${CWD}/${BUILD_ROOT}`INTERFACE_DIR=`cleanup_dir ${CWD}/${INTERFACE_DIR}`LOCAL_DIR=`cleanup_dir ${CWD}/${LOCAL_DIR}`LOCAL_INC_DIR=`cleanup_dir ${CWD}/${LOCAL_INC_DIR}`LOCAL_BIN_DIR=`cleanup_dir ${CWD}/${LOCAL_BIN_DIR}`LOCAL_LIB_DIR=`cleanup_dir ${CWD}/${LOCAL_LIB_DIR}`LCL_SRC_DIR=${BASE_DIR}/srcSHARE_SRC_DIR=${LCL_SRC_DIR}SHARE_BASE_DIR=${BASE_DIR}DEB_PKG_DIR=${LIB_DIR}AFC_DIR=${DEB_PKG_DIR}/afcAFC_BIN_DIR=${AFC_DIR}/binAFC_LIB_DIR=${AFC_DIR}/libAFC_SHARE_DIR=${AFC_DIR}/shareDEB_DIR=`cleanup_dir ${CWD}/${DEBIAN_PACKAGE}`# Find the launch scriptLAUNCH_SCRIPT=`cleanup_dir ${LCL_SRC_DIR}/${SHELL_BUILD}`if [ ! -f ${LAUNCH_SCRIPT} ]; thenecho "Specified shell build script ${LAUNCH_SCRIPT} does not exist."exit 1fiREL_BASE_DIR=../..if [ ${DOWNLOAD_PKG} ]; then# This is the set of available download directories, consisting of downloads/# and a download directory that is offset from the location of the build# script src directory.unset TAR_DECOMP_ARGTMP=`echo ${SHELL_BUILD} | sed "s|/src/.*||"`TMP=`cleanup_dir ${CWD}/${TMP}`DDIR_ELSEWHERE=${TMP}DOWNLOAD_DIRS="${TMP} ${BASE_DIR}"for DDIR in ${DOWNLOAD_DIRS}; doTMP=${DDIR}/downloads/${DOWNLOAD_PKG}.tar.bz2if [ -e ${TMP} ]; thenTARBALL_FILE=${TMP}SHARE_SRC_DIR=${DDIR}/srcSHARE_BASE_DIR=${DDIR}TAR_DECOMP_ARG=jelseTMP=${DDIR}/downloads/${DOWNLOAD_PKG}.tar.gzif [ -e ${TMP} ]; thenTARBALL_FILE=${TMP}SHARE_SRC_DIR=${DDIR}/srcSHARE_BASE_DIR=${DDIR}TAR_DECOMP_ARG=zelseTMP=${DDIR}/downloads/${DOWNLOAD_PKG}.tgzif [ -e ${TMP} ]; thenTARBALL_FILE=${TMP}SHARE_SRC_DIR=${DDIR}/srcSHARE_BASE_DIR=${DDIR}TAR_DECOMP_ARG=zelseTMP=${DDIR}/downloads/${DOWNLOAD_PKG}.zipif [ -e ${TMP} ]; thenTARBALL_FILE=${TMP}SHARE_SRC_DIR=${DDIR}/srcSHARE_BASE_DIR=${DDIR}TAR_DECOMP_ARG=unzipfifififidoneif [ "${SHARE_BASE_DIR}" == "${DDIR_ELSEWHERE}" ]; thenREL_BASE_DIR=../$(echo ${SHELL_BUILD} | sed "s|/src/.*||")fiif [ "${TAR_DECOMP_ARG}" == "" ]; thenecho "Could not find download file ${DOWNLOAD_PKG}.<tar.gz|tar.bz2|tgz|zip> in any of { ${DOWNLOAD_DIRS} }"exit 1fiUNTAR_DIR=${LCL_SRC_DIR}/${DOWNLOAD_PKG}WORK_DIR=${UNTAR_DIR}.${PLATFORM}${TYPE}elseWORK_DIR=${LCL_SRC_DIR}fi## Setup WORK_DIR# This can be deduced from the tar-file, but in some cases the name# must be specified#if [ ${WORK_DIR_NAME} ]; thenWORK_DIR=${LCL_SRC_DIR}/${WORK_DIR_NAME}fiif [ ${WORK_DIR_SUFFIX} ]; thenWORK_DIR=${WORK_DIR}${WORK_DIR_SUFFIX}fi## Extend compiler and linker search paths to access data within# packages imported via BuildPkgArchive## Include the packageing directory - its used for builds that# build multiple packages.## Only include paths that exist#INCLUDE=LIBPATH=DJOIN=""DLIST="${PKG_INC_DIR}${LOCAL_DIR}/inc${INTERFACE_DIR}/include/${PLATFORM}${INTERFACE_DIR}/include/LINUX${INTERFACE_DIR}/include"for dtest in ${DLIST} ; doif [ -d $dtest ] ; thenINCLUDE="${INCLUDE}${DJOIN}-I$dtest"DJOIN=" "fidoneDJOIN=""DLIST="${PKG_LIB_DIR}${LOCAL_DIR}/lib/${PLATFORM}${INTERFACE_DIR}/lib/${PLATFORM}"for dtest in ${DLIST} ; doif [ -d $dtest ] ; thenLIBPATH="${LIBPATH}${DJOIN}-L$dtest"DJOIN=" "fidone# Dump configurationecho "================================================================================"echo " BUILD CONFIGURATION"echo "================================================================================"echo " Compile Host = ${COMPILE_HOST}"echo " Compile Build = ${COMPILE_BUILD}"echo " XGCC Base Dir = ${XGCC_BASE_DIR}"echo " Base Dir = ${BASE_DIR}"if [ ${WORK_DIR_NAME} ]; thenecho " Work Dir Name = ${WORK_DIR_NAME}"fiif [ ${DOWNLOAD_PKG} ]; thenecho " Tarball File = ${TARBALL_FILE}"echo " Working Dir = ${WORK_DIR}"fiTITLE="Includes ="for INC in ${INCLUDE}; doecho " ${TITLE} ${INC}"TITLE=" "doneTITLE="Library Path ="for LIB in ${LIBPATH}; doecho " ${TITLE} ${LIB}"TITLE=" "doneif [ ${DEBIAN_PACKAGE} ]; thenecho " Debian Package = ${DEB_PKG_DIR}"fiecho " Launch Script = ${LAUNCH_SCRIPT}"echo "================================================================================"echoecho# Prepare the environmentecho " --> Preparing environment"LIBTOOL=${XGCC_BASE_DIR}/bin/${COMPILE_HOST}-libtoolif [ -e ${LIBTOOL} ]; thenecho " --> Using toolchain libtool"elseecho " --> Using environment libtool"LIBTOOL=/usr/bin/libtoolfiexport LIBTOOLunset CCunset CXXunset CPPunset CPPFLAGSunset LD_LIBRARY_PATHexport CC CXX CPP CPPFLAGS LD_LIBRARY_PATHunset MAKEunset MAKEFLAGSunset MAKEOVERRIDESunset MAKELEVELexport CFLAGS="${CFLAGS} ${INCLUDE}"export CXXFLAGS="${CXXFLAGS} ${INCLUDE}"export CCFLAGS="${CCFLAGS} ${INCLUDE}"export LDFLAGS="${LDFLAGS} ${LIBPATH}"if [ "${XGCC_IN_PATH}" != "" ]; thenXGCC_COMPILER_PATH="${XGCC_BASE_DIR}/${COMPILE_HOST}/bin"XGCC_IN_PATH_PREFIX_DIR=${XGCC_BASE_DIR}/${COMPILE_HOST}elseXGCC_COMPILER_PATH="${XGCC_BASE_DIR}/bin"XGCC_IN_PATH_PREFIX_DIR=/afcfi## Do not prepend the compiler path if it is already present in PATH# In particular do not prepend /usr/bin as this will prevent tools# provided in packages (eg bison) from overriding local versions#if [[ ":${PATH}:" != *:${XGCC_COMPILER_PATH}:* ]] ; thenexport PATH="${XGCC_COMPILER_PATH}:${PATH}"fi## Environment - CHOST is used by some packages (e.g., zlib) to set the# host environment compiler.#export CHOST=${COMPILE_HOST}## These are special files used to track completion of tasks allowing for partial# rebuilds during development.#COMPLETE_PREFIX=${LCL_SRC_DIR}/.complete${DOWNLOAD_PKG}.${PLATFORM}${TYPE}.COMPLETE_DECOMPRESS=${COMPLETE_PREFIX}decompress${WORK_DIR_SUFFIX}COMPLETE_CONFIGURE=${COMPLETE_PREFIX}configure${WORK_DIR_SUFFIX}## Clean up request# No building - just a clean of previous builds#if [ ${CLEAN} ]; thenecho " --> Removing all completion tags"rm -fr ${LCL_SRC_DIR}/.complete*if [ ${DOWNLOAD_PKG} ]; thenecho " --> Cleaning generated files"cd ${BASE_DIR}rm -fr ${WORK_DIR}fiecho " --> Deleting binary, object, and library directories"rm -fr ${BIN_DIR}rm -fr ${LIB_DIR}rm -fr ${OBJ_DIR}if [ ${DEBIAN_PACKAGE} ]; thenecho " --> Deleting Debian Build Files "rm -fr ${DEB_DIR}fiexit 0fiecho " --> Creating package directories"mkdir -p ${PKG_BIN_DIR}mkdir -p ${PKG_INC_DIR}mkdir -p ${PKG_LIB_DIR}mkdir -p ${PKG_PKG_DIR}mkdir -p ${AFC_DIR}mkdir -p ${AFC_BIN_DIR}mkdir -p ${AFC_LIB_DIR}mkdir -p ${AFC_SHARE_DIR}mkdir -p ${PKG_TOOL_DIR}mkdir -p ${PKG_TOOL_BIN_DIR}mkdir -p ${PKG_TOOL_SCRIPT_DIR}if [ ${DOWNLOAD_PKG} ]; thenif [ -e ${COMPLETE_DECOMPRESS} ]; thenecho " --> Already extracted ${DOWNLOAD_PKG}"elseecho " --> Deleting existing build objects directory"rm -fr ${UNTAR_DIR}rm -fr ${WORK_DIR}echo " --> Extracting ${DOWNLOAD_PKG}"cd ${LCL_SRC_DIR}# For Zip file use unzip instead of tarif [ "${TAR_DECOMP_ARG}" == "unzip" ]; thenunzip ${TARBALL_FILE}elsetar -x${TAR_DECOMP_ARG}pf ${TARBALL_FILE}ficd ${UNTAR_DIR}PATCHES_DIR=${SHARE_BASE_DIR}/patchesif [ -d ${PATCHES_DIR} ]; thenPATCHES=`cd ${PATCHES_DIR} && find . -name "*.patch" | sort`if [ "${PATCHES}" != "" ]; thenecho " --> Apply external patches"for PATCH in ${PATCHES}; doif patch -p1 < ${PATCHES_DIR}/${PATCH}; thenecho "Applied patch ${PATCH}"echo ""elseecho "Patch ${PATCH} failed"exit 1fidonefifi## When a 'mods' directory is present we need to sym-link all the# files from there into the source tree.#cd ${UNTAR_DIR}MODS_DIR=${SHARE_BASE_DIR}/${DOWNLOAD_PKG_NAME}_${DOWNLOAD_PKG_VER}_modsif [ -d ${MODS_DIR} ]; thenecho " --> Applying modifications from ${MODS_DIR}"echo " Base relative directory is ${REL_BASE_DIR}"if [ "${COPY_MODS_DIRS}" != "" ]; thenecho " Directories are copied"elseecho " Directories are symlinked"fifunction create_mods(){local SRClocal RELlocal DSTlocal NAMElocal MOD_DIR=$1local REL_DEPTH=$2for SRC in `ls ${MOD_DIR}`; doSRC=${MOD_DIR}${SRC}REL=`echo "${SRC}" | sed "s|${MODS_DIR}|${REL_DEPTH}/${DOWNLOAD_PKG_NAME}_${DOWNLOAD_PKG_VER}_mods|g"`DST=`echo "${SRC}" | sed "s|${MODS_DIR}/||g"`if [ -d "${SRC}" ]; thenif [ -e "${DST}" ]; thencreate_mods ${SRC}/ ../${REL_DEPTH}elseif [ "${COPY_MODS_DIRS}" != "" ]; thenecho " * Creating directory ${DST}"mkdir -p ${DST}create_mods ${SRC}/ ../${REL_DEPTH}elseecho " * Creating directory ${DST} symlink"ln -s ${REL} ${DST}if [ $? != 0 ]; thenecho "ERROR: Could not create symlink from ${REL} to ${DST}"exit 1fififielseif [ -e "${DST}" ]; thenecho " * Replacing file ${DST} with symlink"rm -f ${DST}elseecho " * Creating file ${DST} symlink"filn -s ${REL} ${DST}if [ $? != 0 ]; thenecho "ERROR: Could not create symlink from ${REL} to ${DST}"exit 1fifidone}create_mods ${MODS_DIR}/ ${REL_BASE_DIR}VXP_CONFIG=${MODS_DIR}/VXP.configif [ ! -f ${VXP_CONFIG} ]; thenVXP_CONFIG=${MODS_DIR}/ERG.configfiif [ -f ${VXP_CONFIG} ]; thenREL=`echo "${VXP_CONFIG}" | sed "s|${MODS_DIR}|${REL_BASE_DIR}/${DOWNLOAD_PKG_NAME}_${DOWNLOAD_PKG_VER}_mods|g"`if [ -e .config ]; thenecho " * Replacing .config with symlink"rm -f .configelseecho " * Creating .config symlink"filn -s ${REL} .configfifimv ${UNTAR_DIR} ${WORK_DIR}touch ${COMPLETE_DECOMPRESS}fifi## Source the users script# This is processed in the context of this script#mkdir -p ${WORK_DIR}cd ${WORK_DIR}source ${LAUNCH_SCRIPT}if [ ${DEBIAN_PACKAGE} ]; thenecho " --> Creating Debian packaging scripts"unset TOOL_DIRfor DIR in `echo ${PATH} | sed "s|\:| |g"`; doif [ -f ${DIR}/debbuild.pl ]; thenTOOL_DIR=`cleanup_dir ${DIR}`fidoneif [ ${TOOL_DIR} ]; thenDEBBUILD_PL=${TOOL_DIR}/debbuild.plecho " - Found ${DEBBUILD_PL}"rm -fr ${DEB_DIR}mkdir -p ${DEB_DIR}# Replace TAGS in the debbuild.pl fileDEB_DESC="${BUILD_NAME} ${BUILD_VERSION} for ${PLATFORM}"cat ${DEBBUILD_PL} | sed "-es|TAG_DESCRIPTION|${DEB_DESC}|" "-es|TAG_POSTINSTALL|${DEB_DIR}/postinstall|" > ${DEB_DIR}/debbuild.plcp ${TOOL_DIR}/postinstall ${DEB_DIR}/postinstallelseecho "ERROR: Cannot find debbuild.pl in the PATH"exit 1fifiecho " --> Removing unnecesary files resulting from the make install"if [ -d ${PKG_LIB_DIR} ] ; thenDEL_FILES=`find ${PKG_LIB_DIR} -type f -name '*.la'`for FILE in ${DEL_FILES}; doecho " - Deleting ${FILE}"rm -f ${FILE}donefiecho " --> Cleaning up empty directories"# Deletes directory $1 if it does not contain any other files or directoriesfunction rmdir_empty(){if [ -d "$1" ] ; then# -A = do not list . and ..# -Q = enclose entry names in double quotes# -l = list one file per line# -F = appends each directory with a '/'DIRS=`ls -A -Q -l -F "$1" | grep "\".*\"\/" | sed "s|.* \"||" | sed "s|\"\/||"`for DIR in ${DIRS}; dormdir_empty $1/${DIR}doneLS=`ls -A -Q -l -F "$1" | grep "\"" | sed "s|^.* \"||" | sed "s|\".*||"`if [ "${LS}" == "" ]; thenrmdir $1fifi}rmdir_empty ${DEB_PKG_DIR}rmdir_empty ${BASE_DIR}/pkgecho " --> End of ShellBuild"