#!/bin/echo "This file is sourced, not run" # Lots of reusable functions. This file is sourced, not run. # Output path to cross compiler. proc cc_path { var i = '' if test ! -z $MY_CROSS_PATH { global CC_PREFIX := $MY_CC_PREFIX test -z $CC_PREFIX && echo "MY_CROSS_PATH without MY_CC_PREFIX" > !2 && dienow echo -n "$MY_CROSS_PATH:" return } # Output cross it if exists, else simple. If neither exists, output simple. for i in ["$BUILD"/{,simple-}cross-compiler-"$1/bin]" { test -e "$i/$1-cc" && break } echo -n "$i:" } proc base_architecture { global ARCH := $1 source "$CONFIG_DIR/$1" } proc load_target { # Get target platform from first command line argument. global ARCH_NAME := $1 global CONFIG_DIR := ""$SOURCES/targets"" # Read the relevant config file. if test -f "$CONFIG_DIR/$1" { base_architecture $ARCH_NAME global CONFIG_DIR := '' } elif test -f "$CONFIG_DIR/$1/settings" { source "$CONFIG_DIR/$1/settings" test -z $ARCH && dienow "No base_architecture" } else { echo "Supported architectures: " ls $CONFIG_DIR exit 1 } # Which platform are we building for? export WORK = ""$(BUILD)/temp-$ARCH_NAME"" # Say "unknown" in two different ways so it doesn't assume we're NOT # cross compiling when the host and target are the same processor. (If host # and target match, the binutils/gcc/make builds won't use the cross compiler # during root-filesystem.sh, and the host compiler links binaries against the # wrong libc.) export_if_blank CROSS_HOST=$[uname -m]-walrus-linux export_if_blank CROSS_TARGET=$(ARCH)-unknown-linux # Setup directories and add the cross compiler to the start of the path. global STAGE_DIR := ""$BUILD/$(STAGE_NAME)-$(ARCH_NAME)"" if test -z $KEEP_STAGEDIR { blank_tempdir $STAGE_DIR } else { mkdir -p $STAGE_DIR || dienow } env NO_CLEANUP=$(NO_CLEANUP/temp//) blank_tempdir $WORK export PATH = ""$[cc_path $ARCH]$PATH"" test ! -z $HOST_ARCH && test $HOST_ARCH != $ARCH && global PATH := ""$[cc_path $HOST_ARCH]$PATH"" export_if_blank CC_PREFIX="$(ARCH)-" global DO_CROSS := ""CROSS_COMPILE=$CC_PREFIX"" return 0 } # Note that this sources the file, rather than calling it as a separate # process. That way it can set environment variables if it wants to. proc build_section { # Don't build anything statically in host-tools, glibc is broken. # See http://people.redhat.com/drepper/no_static_linking.html for # insane rant from the glibc maintainer about why he doesn't care. is_in_list $1 $BUILD_STATIC && test ! -z $ARCH && global STATIC_FLAGS := '"--static'" global OLDCPUS := $CPUS global OLDNOCLEAN := $NO_CLEANUP is_in_list $1 $DEBUG_PACKAGE && global CPUS := '1' && global NO_CLEANUP := '1' if test -e "$SOURCES/sections/$1".build { setupfor $1 source "$SOURCES/sections/$1".build cleanup } else { announce $1 source "$SOURCES"/sections/"$1".sh } global CPUS := $OLDCPUS global NO_CLEANUP := $OLDNOCLEAN } # Find appropriate miniconfig file proc getconfig { for i in [{$ARCH_NAME,$ARCH}/miniconfig-$1] { test -f "$CONFIG_DIR/$i" && cat "$CONFIG_DIR/$i" && return } # Output baseconfig, then append $1_CONFIG (converting $1 to uppercase) cat "$SOURCES/baseconfig-$1" eval "echo \"\${$[echo $1 | tr a-z A-Z]_CONFIG}\"" } # Find all files in $STAGE_DIR newer than $CURSRC. proc recent_binary_files { global PREVIOUS := '' shell {cd $STAGE_DIR || dienow find . -depth -newer "$CURSRC/BUILD-TIMESTAMP" \ | sed -e 's/^.//' -e 's/^.//' -e '/^$/d' } | while read i { global TEMP := $(PREVIOUS##"$i"/) if test $(${#PREVIOUS}-${#TEMP) -ne $(${#i}+) { # Because the expanded $i might have \ chars in it, that's why. echo -n $i echo -ne '\0' } global PREVIOUS := $i } } # Delete a working copy of source code once the build's done. proc cleanup { # If package build exited with an error, do not continue. test $Status -ne 0 && dienow if test ! -z $BINARY_PACKAGE_TARBALLS { global TARNAME := ""$PACKAGE-$STAGE_NAME-$(ARCH_NAME)".tar.gz" test ! -z $[recent_binary_files] && echo -n Creating $TARNAME && do { recent_binary_files | xargs -0 tar -czvf \ "$BUILD/$(TARNAME)" -C $STAGE_DIR || dienow } | dotprogress } if test ! -z $NO_CLEANUP { echo "skip cleanup $PACKAGE $ifsjoin(Argv)" return } # Loop deleting directories cd $WORK || dienow for i in [$WORKDIR_LIST] { echo "cleanup $i" rm -rf $i || dienow } global WORKDIR_LIST := '' } # Create a working directory under TMPDIR, deleting existing contents (if any), # and tracking created directories so cleanup can delete them automatically. proc blank_workdir { global WORKDIR_LIST := ""$1 $WORKDIR_LIST"" env NO_CLEANUP= blank_tempdir "$WORK/$1" cd "$WORK/$1" || dienow } # Extract package $1 proc setupfor { export WRAPPY_LOGPATH = ""$BUILD/logs/cmdlines.$(ARCH_NAME).$(STAGE_NAME).setupfor"" # Make sure the source is already extracted and up-to-date. extract_package $1 || exit 1 global SNAPFROM := $[package_cache $1] # Delete old working copy (even in the NO_CLEANUP case) then make a new # tree of links to the package cache. echo "Snapshot '$PACKAGE'..." # Try hardlink, then symlink, then normal (noclobber) copy for LINKTYPE in [l s n] { if test -z $REUSE_CURSRC { blank_workdir $PACKAGE global CURSRC := $[pwd] } cp -$(LINKTYPE)fR "$SNAPFROM/"* $CURSRC && break } cd $CURSRC || dienow export WRAPPY_LOGPATH = ""$BUILD/logs/cmdlines.$(ARCH_NAME).$(STAGE_NAME).$1"" # Ugly bug workaround: timestamp granularity in a lot of filesystems is only # 1 second, so find -newer misses things installed in the same second, so we # make sure it's a new second before we start actually doing anything. if test ! -z $BINARY_PACKAGE_TARBALLS { touch "$CURSRC/BUILD-TIMESTAMP" || dienow global TIME := $[date +%s] while true { test $TIME != $[date +%s] && break sleep .1 } } } # Given a filename.tar.ext, return the version number. proc getversion { echo $1 | sed -e 's/.*-\(\([0-9\.]\)*\([_-]rc\)*\(-pre\)*\([0-9][a-zA-Z]\)*\)*\(\.tar\..z2*\)$/'"$2"'\1/' } # Figure out what version of a package we last built proc get_download_version { getversion $[sed -n 's@URL=.*/\(.[^ ]*\).*@\1@p' "$TOP/download.sh" | grep $(1)-] } # Identify subversion or mercurial revision, or release number proc identify_release { global DIR := ""$SRCDIR/$1"" if test -d $DIR { shell { cd $DIR || dienow global ID := $[git log -1 --format=%H !2 >/dev/null] test ! -z $ID && echo git $ID && return global ID := $[hg identify -n !2 >/dev/null] test ! -z $ID && echo hg $ID && return global ID := $[svn info !2 >/dev/null | sed -n "s/^Revision: //p] test ! -z $ID && echo svn $ID && return } } echo release version $[get_download_version $1] } # Create a README identifying package versions in current build. proc do_manifest { # Grab build script version number test -z $SCRIPT_VERS && global SCRIPT_VERS := ""mercurial rev $[cd $TOP; hg identify -n !2 >/dev/null]"" cat