diff options
Diffstat (limited to 'scripts/pkg')
-rwxr-xr-x | scripts/pkg | 1010 |
1 files changed, 472 insertions, 538 deletions
diff --git a/scripts/pkg b/scripts/pkg index e9465ef..9c38b6b 100755 --- a/scripts/pkg +++ b/scripts/pkg @@ -1,16 +1,19 @@ #!/bin/bash -# pkg - Formilux package builder - version 0.5.2 - 2005-03-25 +# pkg - Formilux package builder - version 0.7.1 - 2005-12-17 # # Copyright (C) 2001-2005 Benoit Dolez & Willy Tarreau # mailto: benoit@ant-computing.com,willy@ant-computing.com # # This program is licenced under GPLv2 ( http://www.gnu.org/licenses/gpl.txt ) +######## Please update this version ######## +PKG_VERSION=0.7.1 +############################################ + ## WARNING ## # This version is not compatible with pkg scripts written for pre-0.2.0 versions - # Usage: # pkg <action> [ pkg [ pkg2 ] ] # @@ -50,7 +53,17 @@ umask og-w # set some constants KERNDIR=${KERNDIR:-/usr/src/linux} -FLXARCH=${FLXARCH:-$(uname -m)} +FLXHOSTOS=${FLXHOSTOS:-$(uname -s|tr 'A-Z' 'a-z')} +FLXHOSTARCH=${FLXHOSTARCH:-$(uname -m)} +FLXHOST=${FLXHOST:-$FLXHOSTARCH-$FLXHOSTOS} + +# FLXTARGARCH can be influenced by FLXARCH if defined +FLXTARGOS=${FLXTARGOS:-$FLXHOSTOS} +FLXTARGARCH=${FLXTARGARCH:-$FLXARCH} +FLXTARGARCH=${FLXTARGARCH:-$FLXHOSTARCH} +FLXTARG=${FLXTARG:-$FLXTARGARCH-$FLXTARGOS} +FLXARCH=${FLXARCH:-$FLXTARGARCH} + DEVROOT=${DEVROOT:-/var/flx-dev} PKGROOT=${PKGROOT:-/var/flx-pkg} # use -p1 by default to apply a patch @@ -66,6 +79,7 @@ INSTNAME=".flxdisk" LINKNAME=".flxpkg" FIND_CMD=pkgfilefind +CURDIR="$(pwd)" FILE_LIST= @@ -76,6 +90,46 @@ EXCLUDE_LIST=( bin boot dev etc etc/opt home lib lib/modules mnt mnt/disk mnt/cd ###### here are some undertermined type functions ###### +# check that this utility's version is at least as high as the version +# specified in $1. Returns 0 if OK, 1 if inferior. + +function check_pkg_version { + local version="$1" + local major minor patch + local mymajor myminor mypatch + + major=${version%%.*} + minor=${version#$major.}; minor=${minor%%.*} + patch=${version##*.} + + mymajor=${PKG_VERSION%%.*} + myminor=${PKG_VERSION#$mymajor.}; myminor=${myminor%%.*} + mypatch=${PKG_VERSION##*.} + + if [ -n "$major" ]; then + [ "$mymajor" -gt "$major" ] && return 0 + [ "$mymajor" -lt "$major" ] && return 1 + else + return 0 + fi + + if [ -n "$minor" ]; then + [ "$myminor" -gt "$minor" ] && return 0 + [ "$myminor" -lt "$minor" ] && return 1 + else + return 0 + fi + + if [ -n "$patch" ]; then + [ "$mypatch" -gt "$patch" ] && return 0 + [ "$mypatch" -lt "$patch" ] && return 1 + else + return 0 + fi + return 0 +} + + # find packageable files (that can't be automaticaly created) and return only # their relative path to the argument. @@ -92,6 +146,106 @@ function pkgfilefind { } +# resolves a symlink to an absolute location. +# usage: resolve_link <link_dir> <link_pointer> +function resolve_link { + # prints $1 if $2 is empty, and prints $2 if it starts with a '/'. + if [ -z "$2" ]; then + dir="$1" + elif [ -z "${2##/*}" ]; then + dir="$2" + else + dir="$1/$2" + fi + + # resolve '//', '/./', '/.$', '^./' always one at a time, from left to right, + # then enclose with '/' + while [ -n "$dir" ]; do + if [ -z "${dir##./*}" ]; then dir="${dir#./}" + elif [ -z "${dir##/*}" ]; then dir="${dir#/}" + elif [ -z "${dir%%*/.}" ]; then dir="${dir%/.}" + elif [ -z "${dir%%*/}" ]; then dir="${dir%/}" + elif [ -z "${dir##*//*}" ]; then dir="${dir/\/\//\/}" + elif [ -z "${dir##*/./*}" ]; then dir="${dir/\/.\//\/}" + else + dir="/$dir/" + break; + fi + done + + # now resolve '/../' from left to right only. + while [ -z "${dir##*/../*}" ]; do + # if dir goes past root, we must truncate it + if [ -z "${dir##/../*}" ]; then + dir="/${dir##/../}" + else + # turn all '/x/../' into '/' + odir="$dir" + dir="$(echo "$dir" | sed -e 's,/[^/]*/\.\./,/,')" + [ "$dir" = "$odir" ] && break + fi + done + + [ "$dir" = "/" ] || dir="${dir#/}" + [ "$dir" = "/" ] || dir="${dir%/}" + echo "$dir" +} + +# this function analyses an ELF executable and prints its name along with some +# informations such as : +# %N:soname : for libraries, their soname +# %D:libname : library it depends on (their soname) +# %P:provide : feature provided by a library, in the form soname/version +# %R:require : required feature, in the for soname/version +function elf_get_dep { + local elf + for elf in "$@"; do + $OBJDUMP -p "$elf" | ( + soname_str="" + soname="" + needed="" + provide="" + require="" + curreq="" + section="" + while read; do + case "$REPLY" in + Dynamic\ Section*) + section="dynamic" ;; + Version\ defin*) + section="definitions" ;; + Version\ Refer*) + section="references" ;; + *) + set -- $REPLY + if [ "$section" = "dynamic" ]; then + if [ "$1" = "NEEDED" ]; then + needed="${needed:+$needed }%D:$2" + elif [ "$1" = "SONAME" ]; then + soname="$2" + soname_str="${soname_str:+$soname_str }%N:$2" + fi + elif [ "$section" = "definitions" ]; then + if [ "$#" = "4" -a "$2" = "0x00" ]; then + provide="${provide:+$provide }%P:$soname/$4" + fi + elif [ "$section" = "references" ]; then + if [ "$#" = "3" -a "$1" = "required" ]; then + curreq="${3%:}" + elif [ "$#" = "4" ]; then + require="${require:+$require }%R:$curreq/$4" + fi + fi + ;; + esac + done + echo "${elf:+$elf }${soname_str:+$soname_str }${needed:+$needed }${provide:+$provide }${require}" + ) + done + return 0 +} + + ###### ###### here are some functions for manipulating package names ###### @@ -127,6 +281,7 @@ function get_next_build { # This function accepts a list of versionned names, and returns them sorted by # version number. The names must NOT contain any '|' or '~' character, or they # will be discarded. Names that don't have any version are also discarded. +# Note: package names can be full path names. function sortnames { local IFS FIELD NUMERIC_VERSION ALPHA_VERSION VERSION local base version rest filename i t file flist @@ -143,10 +298,11 @@ function sortnames { VERSION="\($NUMERIC_VERSION\|$ALPHA_VERSION\)" # make the list appear in the form 'package|version|rest|full_name' - list=($(echo "$*" | grep -v "|~" | sed -e "s/$VERSION/\1|/" \ - -e "s/^$FIELD|$VERSION/\1|\2|/" \ - -e "s/^$FIELD|$FIELD|$FIELD$/\1|\2|\3~\1\2\3/" \ - -e "s/^[^|]*|[^|]*$//")) + list=($(echo "$*" | grep -v "|~" | sed -e "s,$VERSION,\1|," \ + -e "s,^$FIELD|$VERSION,\1|\2|," \ + -e "s,^$FIELD|$FIELD|$FIELD$,\1|\2|\3~\1\2\3," \ + -e "s,^[^|]*|[^|]*$,," \ + -e 's,^[^|]*/,,')) # there's a risk that it doesn't complete for all the list, and that some # elements keep a "rest". But what can we do about it ? @@ -362,22 +518,31 @@ function do_build { # %D => use the default package # If several packages match a given pattern, the user is asked to select the # desired one. -# The result is returned in REPLY. +# The resulting package name is returned in REPLY, and the package directoryy +# is returned in PKGDIR whenever possible. function get_name { local pattern pkg_name local radix ver build local -a rel_list dev_list sort_list - local i + local i search_dir REPLY= for pattern in $*; do + search_dir= if [ "$pattern" = "%P" ]; then - pattern=$(basename $(pwd)) + search_dir="${CURDIR%/*}" ; search_dir="/${search_dir#/}" + pattern="$(basename $CURDIR)" elif [ "$pattern" = "%L" ]; then - if [ -L ${LINKNAME} -a -d ${LINKNAME}/. ]; then + if [ -r ".flxpkg/Version" ]; then + REPLY="$(cat .flxpkg/Version)" + REPLY="${REPLY##*/}" + PKGDIR="$CURDIR/.flxpkg/." + return + elif [ -L ${LINKNAME} -a -d ${LINKNAME}/. ]; then # the link is always an EXACT name, so we return it as-is. - pattern=$(readlink ${LINKNAME}) - REPLY=$(basename $pattern) + pattern="$(readlink ${LINKNAME})" + PKGDIR="$pattern/." + REPLY="${pattern##*/}" return else continue @@ -394,13 +559,18 @@ function get_name { # we loop until pkg_name is empty, which allows recursive choices. while [ "$pkg_name" ]; do # now we'll try to build a list of potentially matching packages for - # each pattern. We'll reduce the original name until either we have - # a non-empty list or the package name is void. + # each pattern. A valid package needs to host 'build.cfg'. We could + # also look for the 'RELEASED' entry for released packages, but there + # are still a lot of old ones without this entry. We'll reduce the + # original name until either we have a non-empty list or the package + # name is void. rel_list=( ); dev_list=( ) while [ "$pkg_name" -a -z "$rel_list" -a -z "$dev_list" ]; do - rel_list=( $(find $PKGROOT/ -maxdepth 1 -type d -name ${pkg_name} -printf "%f\n" 2>/dev/null) ) + #rel_list=( $(find ${search_dir:+$search_dir/} $PKGROOT/ -maxdepth 2 -type f -path ${pkg_name}/build.cfg -printf "%h\n" 2>/dev/null) ) + #rel_list=( ${search_dir:+$CURDIR} $(find $PKGROOT/ -maxdepth 2 -type f -path ${pkg_name}/build.cfg -printf "%h\n" 2>/dev/null) ) + rel_list=( $(find ${search_dir:+$CURDIR/} $PKGROOT/ -maxdepth 2 -type f -path "*/${pkg_name}/build.cfg" -printf "%h\n" 2>/dev/null | uniq) ) if [ "$release_only" != "1" ]; then - dev_list=( $(find $DEVROOT/ -maxdepth 1 -type d -name ${pkg_name} -printf "%f\n" 2>/dev/null) ) + dev_list=( $(find $DEVROOT/ -maxdepth 2 -type f -path "*/${pkg_name}/build.cfg" -printf "%h\n" 2>/dev/null) ) fi if [ -z "${rel_list[*]}" -a -z "${dev_list[*]}" ]; then @@ -434,7 +604,9 @@ function get_name { if [ ${#sort_list[*]} -eq 0 ]; then continue elif [ ${#sort_list[*]} -eq 1 ]; then - REPLY=${sort_list[0]} + REPLY="${sort_list[0]}" + PKGDIR="${REPLY/*}" + REPLY="${REPLY##*/}" return fi @@ -443,21 +615,24 @@ function get_name { printf " %5d : - None of the following packages -\n" 0 while [ $i -lt ${#sort_list[*]} ]; do # we'll display an 'R' in front of released names, or a 'D' for dev. + # FIXME : we risk a wrong match here (eg: flx0.1 <-> flx0.10) if [ "${rel_list[*]/${sort_list[$i]}/}" != "${rel_list[*]}" ]; then - printf " %5d : [R] %s\n" $[$i+1] ${sort_list[$i]} + printf " %5d : [R] %s\n" $[$i+1] ${sort_list[$i]##*/} else - printf " %5d : [D] %s\n" $[$i+1] ${sort_list[$i]} + printf " %5d : [D] %s\n" $[$i+1] ${sort_list[$i]##*/} fi i=$[$i+1] done echo while : ; do - echo -n "Choice [${sort_list[${#sort_list[*]}-1]}]: "; read i + echo -n "Choice [${sort_list[${#sort_list[*]}-1]##*/}]: "; read i if [ -z "$i" ]; then # empty string, we use the last choice which is the preferred one. i=${#sort_list[*]} - REPLY=${sort_list[$[$i-1]]} + REPLY="${sort_list[$[$i-1]]}" + PKGDIR="${REPLY/*}" + REPLY="${REPLY##*/}" return elif [ "${i//[0-9]/}" ]; then # not a plain integer, we'll allow to recursively re-select @@ -472,7 +647,9 @@ function get_name { # if the user explicitly replied "0", then he wants other choices. break; elif [ $i -le ${#sort_list[*]} ]; then - REPLY=${sort_list[$[$i-1]]} + REPLY="${sort_list[$[$i-1]]}" + PKGDIR="${REPLY/*}" + REPLY="${REPLY##*/}" return fi done @@ -480,6 +657,8 @@ function get_name { # if he refuses these ones. done done + PKGDIR="${REPLY/*}" + REPLY="${REPLY##*/}" } # choose a package and make ${LINKNAME} point to it @@ -525,7 +704,7 @@ function do_newpkg { if [ -z "$new_name" ]; then # the user has not specified any version string, we'll use the directory # name. - new_name=$(basename $(pwd)) + new_name=$(basename $CURDIR) fi rel_list=( ); dev_list=( ) @@ -541,13 +720,13 @@ function do_newpkg { build=$(get_build_num $new_name) new_name=${radix:-*}-${ver:-*} - rel_list=( $(find $PKGROOT/ -maxdepth 1 -type d -name ${new_name}\* -printf "%f\n" 2>/dev/null) ) - dev_list=( $(find $DEVROOT/ -maxdepth 1 -type d -name ${new_name}\* -printf "%f\n" 2>/dev/null) ) + rel_list=( $(find $PKGROOT/ -maxdepth 1 -type d -name ${new_name}\* -printf "%p\n" 2>/dev/null) ) + dev_list=( $(find $DEVROOT/ -maxdepth 1 -type d -name ${new_name}\* -printf "%p\n" 2>/dev/null) ) sort_list=(${rel_list[*]} ${dev_list[*]}) if [ "${sort_list[*]}" ]; then sort_list=($(IFS=$'\n'; echo "${sort_list[*]%-${BUILDSFX}*([0-9]).+([0-9])*}" | sort -u) ) - sort_list=( $(sortnames ${sort_list[*]}) ) + sort_list=( $(sortnames ${sort_list[*]##*/} | uniq) ) if [ "${radix/*\\**/}" -a "${ver/*\\**/}" ] && \ ! (IFS=$'\n';echo "${sort_list[*]}"|grep -q "^$new_name\$"); then # if the package was properly named, and not already listed, let's @@ -561,21 +740,13 @@ function do_newpkg { local i=0 echo; echo ">>> Please select the name of the package to create :";echo while [ $i -lt ${#sort_list[*]} ]; do - # we'll display an 'R' in front of released names, 'P' - # in front of packaged ones, or a 'D' for dev. - if [ -e "$PKGROOT/${sort_list[$i]}/RELEASED" ]; then - printf " %5d : [R] %s\n" $[$i+1] ${sort_list[$i]} - elif [ "${rel_list[*]/${sort_list[$i]}/}" != "${rel_list[*]}" ]; then - printf " %5d : [P] %s\n" $[$i+1] ${sort_list[$i]} - else - printf " %5d : [D] %s\n" $[$i+1] ${sort_list[$i]} - fi + printf " %5d : %s\n" $[$i+1] ${sort_list[$i]##*/} i=$[$i+1] done echo while : ; do - echo -n "Choice [${sort_list[${#sort_list[*]}-1]}]: "; read i + echo -n "Choice [${sort_list[${#sort_list[*]}-1]##*/}]: "; read i if [ -z "$i" ]; then new_name=${sort_list[${#sort_list[*]}-1]} break @@ -594,8 +765,8 @@ function do_newpkg { # we'll search for all packages starting with the same name and version # in both release and dev dirs. Then we'll be able to deduce the latest # build number used. -# sort_list=( $(find $PKGROOT/ $DEVROOT/ -maxdepth 1 -type d -name ${new_name}-${BUILDSFX}*.\* -printf "%f\n" 2>/dev/null|sort -u) ) - sort_list=( $(find $PKGROOT/ $DEVROOT/ -maxdepth 1 -type d -name ${new_name}-${BUILDSFX}${BUILDVER}.\* -printf "%f\n" 2>/dev/null|sort -u) ) + #sort_list=( $(find $PKGROOT/ $DEVROOT/ -maxdepth 1 -type d -name ${new_name}-${BUILDSFX}*.\* -printf "%f\n" 2>/dev/null|sort -u) ) + sort_list=( $(find $PKGROOT/ $DEVROOT/ -maxdepth 1 -type d -name ${new_name}-${BUILDSFX}${BUILDVER}.\* -printf "%p\n" 2>/dev/null|sort -u) ) if [ ${#sort_list[*]} -eq 0 ]; then # this can happen with new BUILDSFX/BUILDVER new_name=${new_name}-${BUILDSFX}${BUILDVER}.1 @@ -648,7 +819,7 @@ function do_newpkg { rm -f ${LINKNAME} && mkdir -p $new_name && ln -s $new_name ${LINKNAME} && \ tar -C $pkg_name --exclude='./compiled/*' --exclude='./RELEASED*' --exclude='./pkg.*' \ --exclude='./CFLAGS' --exclude='./.dep' --exclude='./.lst' --exclude='./.tgz' \ - -cplf - . | tar -C $new_name -xf - || (rmdir $new_name ; rm -f ${LINKNAME}) + --exclude='./Version' --one-file-system -cpf - . | tar -C $new_name -xf - || (rmdir $new_name ; rm -f ${LINKNAME}) chmod u+rw $new_name/build.cfg echo "A new package '$(basename $new_name)' has been created as '$new_name', based on '$(basename $pkg_name)'." @@ -680,13 +851,14 @@ function do_cat { function do_lst { local FPNAME - FPNAME=$PKGDIR/compiled/$EXACTPKG-$FLXARCH + FPNAME=$PKGDIR/compiled/${EXACTPKG##*/}-$FLXARCH cat $FPNAME.lst } function pre_info { - echo "Information for package '$EXACTPKG' :" + echo "Information for package '${EXACTPKG##*/}' (\${EXACTPKG##*/}) :" + echo " Package name : $PKGRADIX (\$PKGRADIX)" echo " Package version : $PKGVER (\$PKGVER)" echo " Distrib version : $DISTVER (\$DISTVER)" echo -n " Config. file : " @@ -695,10 +867,10 @@ function pre_info { else echo "none found." fi - echo " Package file : $PKGDIR/compiled/$EXACTPKG-$FLXARCH.$PKGSUFF" + echo " Package file : $PKGDIR/compiled/${EXACTPKG##*/}-$FLXARCH.$PKGSUFF" echo -n " Package size : " - if [ -e $PKGDIR/compiled/$EXACTPKG-$FLXARCH.$PKGSUFF ]; then - echo "$(du -b $PKGDIR/compiled/$EXACTPKG-$FLXARCH.$PKGSUFF |cut -f1) bytes." + if [ -e $PKGDIR/compiled/${EXACTPKG##*/}-$FLXARCH.$PKGSUFF ]; then + echo "$(du -b $PKGDIR/compiled/${EXACTPKG##*/}-$FLXARCH.$PKGSUFF |cut -f1) bytes." else echo "does not exist yet." fi @@ -752,10 +924,10 @@ function pre_prepack { fi # WARNING! here, we don't use $ROOTDIR because we don't want to risk # erasing a wrong directory as root ! - [ -d $(pwd)/${INSTNAME} ] && rm -rf $(pwd)/${INSTNAME} + [ -d "$(pwd)/${INSTNAME}" ] && rm -rf "$(pwd)/${INSTNAME}" # permissions are important here because we don't want to get an # inherited setgid or something alike on the root dir - [ ! -d "$ROOTDIR" ] && { mkdir -p $ROOTDIR; chmod 0755 $ROOTDIR; } + [ ! -d "$ROOTDIR" ] && { mkdir -p $ROOTDIR; chown 0:0 $ROOTDIR; chmod 0755 $ROOTDIR; } #mkdir -p "$EXAMPLEDIR" return 0 } @@ -783,7 +955,7 @@ function build_opt { function do_delpack { # WARNING! here, we don't use $ROOTDIR because we don't want to risk # erasing a wrong directory as root ! - [ -d $(pwd)/${INSTNAME} ] && rm -rf $(pwd)/${INSTNAME} + [ -d "$(pwd)/${INSTNAME}" ] && rm -rf "$(pwd)/${INSTNAME}" return 0 } @@ -844,7 +1016,7 @@ function do_unpatch { # extracts a binary package into $ROOTDIR, to reflect the state prior to pack(). function do_unpack { - local FILE=$PKGDIR/compiled/$EXACTPKG-$FLXARCH.$PKGSUFF + local FILE=$PKGDIR/compiled/${EXACTPKG##*/}-$FLXARCH.$PKGSUFF mkdir -p $ROOTDIR cd $ROOTDIR @@ -881,7 +1053,7 @@ function pre_pack { function get_perl_depend { local filename=$1 local dep DEP - local DEP_FILE=$PKGDIR/compiled/$EXACTPKG-$FLXARCH.dep + local DEP_FILE=$PKGDIR/compiled/${EXACTPKG##*/}-$FLXARCH.dep DEP=$(grep "^\(.*['{\"]\)*[ ]*\(require\|use\) \+['\"]*[a-zA-Z][a-z:/A-Z0-9_-]*[; '\"]" $filename | \ sed -e 's/.*\(require\|use\) \+["'\'']\?\([^'\''" };]\+\)["'\'']\?/§§\2§§/g' \ @@ -913,7 +1085,7 @@ function _do_pack_files { echo "done." # full path name of different files - FPNAME=$PKGDIR/compiled/$EXACTPKG-$FLXARCH + FPNAME=$PKGDIR/compiled/${EXACTPKG##*/}-$FLXARCH DEP_FILE=$FPNAME.dep rm -rf $DEP_FILE @@ -935,7 +1107,7 @@ function _do_pack_files { bin/*|sbin/*|lib/*|*/sbin/*|*/bin/*|*/lib/*|*/libexec/*) flr="$(file $REPLY)" case "$flr" in - *\ shell\ *) + *\ script\ *) echo "$REPLY $(head -1 $REPLY| sed -e 's/^#\! *\([^ ]\+\).*/\1/') \$SHELL">>$DEP_FILE ;; *perl\ commands*) @@ -943,13 +1115,13 @@ function _do_pack_files { get_perl_depend $REPLY ;; *:\ symbolic\ link*) - echo "$REPLY $(readlink $REPLY)" >> $DEP_FILE + echo "$REPLY %L:$(readlink $REPLY)" >> $DEP_FILE ;; *\ ELF\ [0-9][0-9]-bit\ *dynamically\ linked*) - echo "$REPLY $(ldd $REPLY 2>/dev/null | grep -v 'statically linked' | awk '{print $1}' | tr '\012' ' ')" >> $DEP_FILE + elf_get_dep $REPLY >> $DEP_FILE ;; *\ ELF\ [0-9][0-9]-bit\ *shared\ object*) - echo "$REPLY $(ldd $REPLY 2>/dev/null | grep -v 'statically linked' | awk '{print $1}' | tr '\012' ' ')" >> $DEP_FILE + elf_get_dep $REPLY >> $DEP_FILE ;; esac ;; @@ -972,12 +1144,12 @@ function _do_pack_files { echo -n "Creating $FPNAME.$PKGSUFF ... " # we want everything, including directories. - cut -f1 -d' ' $FILE_LIST|sed -e 's,/$,,' | tar -T - --no-recursion -cf - | gzip -9 >$FPNAME.$PKGSUFF 2>/dev/null + cut -f1 -d' ' $FILE_LIST|sed -e 's,/$,,' | tar -T - --no-recursion --numeric-owner -cf - | gzip -9 >$FPNAME.$PKGSUFF 2>/dev/null # create shortcuts ".*" for tgz, dep and lst files for ext in dep lst tgz; do rm -f $PKGDIR/.$ext - ln -sf compiled/$EXACTPKG-$FLXARCH.$ext $PKGDIR/.$ext + ln -sf compiled/${EXACTPKG##*/}-$FLXARCH.$ext $PKGDIR/.$ext done echo "done." return 0 @@ -996,7 +1168,7 @@ function do_pack { if [ -z "${file##/*}" ]; then FILE_LISTS="$FILE_LISTS $file" else - FILE_LISTS="$FILE_LISTS $(pwd)/$file" + FILE_LISTS="$FILE_LISTS $CURDIR/$file" fi done # FIXME: is this normal ??? @@ -1025,7 +1197,7 @@ function do_pack { echo "done." # full path name of different files - FPNAME=$PKGDIR/compiled/$EXACTPKG-$FLXARCH + FPNAME=$PKGDIR/compiled/${EXACTPKG##*/}-$FLXARCH DEP_FILE=$FPNAME.dep # rebuild dependencies file, first is a diff file @@ -1083,7 +1255,7 @@ function do_pack { bin/*|sbin/*|lib/*|*/sbin/*|*/bin/*|*/lib/*|*/libexec/*) flr="$(file $REPLY)" case "$flr" in - *\ shell\ *) + *\ script\ *) echo "$REPLY $(head -1 $REPLY| sed -e 's/^#\! *\([^ ]\+\).*/\1/') \$SHELL">>$DEP_FILE ;; *perl\ commands*) @@ -1091,13 +1263,13 @@ function do_pack { get_perl_depend $REPLY ;; *:\ symbolic\ link*) - echo "$REPLY $(readlink $REPLY)" >> $DEP_FILE + echo "$REPLY %L:$(readlink $REPLY)" >> $DEP_FILE ;; *\ ELF\ [0-9][0-9]-bit\ *dynamically\ linked*) - echo "$REPLY $(ldd $REPLY 2>/dev/null | grep -v 'statically linked' | awk '{print $1}' | tr '\012' ' ')" >> $DEP_FILE + elf_get_dep $REPLY >> $DEP_FILE ;; *\ ELF\ [0-9][0-9]-bit\ *shared\ object*) - echo "$REPLY $(ldd $REPLY 2>/dev/null | grep -v 'statically linked' | awk '{print $1}' | tr '\012' ' ')" >> $DEP_FILE + elf_get_dep $REPLY >> $DEP_FILE ;; esac ;; @@ -1113,32 +1285,20 @@ function do_pack { # we want everything, and directories only if they're empty. # All this without './' we shouldn't get an empty line since . # should contain at least what we want to tar ! - $FIND_CMD . | tar --no-recursion -T - -cf - | gzip -9 >$FPNAME.$PKGSUFF 2>/dev/null + $FIND_CMD . | tar --no-recursion -T - --numeric-owner -cf - | gzip -9 >$FPNAME.$PKGSUFF 2>/dev/null # create shortcuts ".*" for tgz, dep and lst files for ext in dep lst tgz; do rm -f $PKGDIR/.$ext - ln -sf compiled/$EXACTPKG-$FLXARCH.$ext $PKGDIR/.$ext + ln -sf compiled/${EXACTPKG##*/}-$FLXARCH.$ext $PKGDIR/.$ext done echo "done." return 0 } -# this function sets all needed compiler options -function set_compiler_options { - # now we'll set default ARCH and CPU for the current FLXARCH if none is set. - case "$FLXARCH" in - i686) arch=${arch:-i686} cpu=${cpu:-i686} basearch=${basearch:-i386} ;; - i586) arch=${arch:-i586} cpu=${cpu:-i686} basearch=${basearch:-i386} ;; - i486) arch=${arch:-i486} cpu=${cpu:-i486} basearch=${basearch:-i386} ;; - i386) arch=${arch:-i386} cpu=${cpu:-i386} basearch=${basearch:-i386} ;; - ev[456]*) arch=${arch:-$FLXARCH} cpu=${cpu:-$FLXARCH} basearch=${basearch:-$FLXARCH} ;; - parisc) arch=${arch:-1.1} cpu=${cpu:-7100LC} basearch=${basearch:-1.1} ;; - sparc) arch=${arch:-sparc} cpu=${cpu:-sparc} basearch=${basearch:-sparc} ;; - sparc64) arch=${arch:-ultrasparc} cpu=${cpu:-ultrasparc} basearch=${basearch:-ultrasparc} ;; - *) arch=${arch:-i586} cpu=${cpu:-i686} basearch=${basearch:-i386} ;; - esac - + +# this function prepares all needed variables to work in a cross-compiler environment +function set_cross_environment { # Handling of cross-compilers : # - setting CC will force both HOSTCC and FLXCROSSCC # - setting HOSTCC will keep it @@ -1147,25 +1307,31 @@ function set_compiler_options { if [ -z "$FLX_CROSS_OPT_SET" ]; then CC=${CC:-gcc} + CXX=${CXX:-g++} AS=${AS:-as} LD=${LD:-ld} AR=${AR:-ar} + NM=${NM:-nm} RANLIB=${RANLIB:-ranlib} STRIP=${STRIP:-strip} OBJDUMP=${OBJDUMP:-objdump} HOSTCC=${HOSTCC:-$CC} + HOSTCXX=${HOSTCXX:-$CXX} HOSTAS=${HOSTAS:-$AS} HOSTLD=${HOSTLD:-$LD} HOSTAR=${HOSTAR:-$AR} + HOSTNM=${HOSTNM:-$NM} HOSTSTRIP=${HOSTSTRIP:-$STRIP} HOSTOBJDUMP=${HOSTOBJDUMP:-$OBJDUMP} if [ -n "$FLXCROSS" ]; then CC=${FLXCROSS}${CC} ; CC=${FLXCROSSCC:-$CC} + CXX=${FLXCROSS}${CXX} ; CXX=${FLXCROSSCXX:-$CXX} AS=${FLXCROSS}${AS} ; AS=${FLXCROSSAS:-$AS} LD=${FLXCROSS}${LD} ; LD=${FLXCROSSLD:-$LD} AR=${FLXCROSS}${AR} ; AR=${FLXCROSSAR:-$AR} + NM=${FLXCROSS}${NM} ; NM=${FLXCROSSNM:-$NM} RANLIB=${FLXCROSS}${RANLIB} ; RANLIB=${FLXCROSSRANLIB:-$RANLIB} STRIP=${FLXCROSS}${STRIP} ; STRIP=${FLXCROSSSTRIP:-$STRIP} OBJDUMP=${FLXCROSS}${OBJDUMP} ; OBJDUMP=${FLXCROSSOBJDUMP:-$OBJDUMP} @@ -1173,10 +1339,28 @@ function set_compiler_options { # specify that we don't want to do this again FLX_CROSS_OPT_SET=1 fi - +} + +# this function sets all needed compiler options +function set_compiler_options { + # now we'll set default ARCH and CPU for the current FLXARCH if none is set. + case "$FLXARCH" in + i586|"") arch=${arch:-i586} cpu=${cpu:-i686} basearch=${basearch:-i386} ;; + i686) arch=${arch:-i686} cpu=${cpu:-i686} basearch=${basearch:-i386} ;; + i486) arch=${arch:-i486} cpu=${cpu:-i486} basearch=${basearch:-i386} ;; + i386) arch=${arch:-i386} cpu=${cpu:-i386} basearch=${basearch:-i386} ;; + parisc) arch=${arch:-1.1} cpu=${cpu:-7100LC} basearch=${basearch:-1.1} ;; + sparc) arch=${arch:-sparc} cpu=${cpu:-sparc} basearch=${basearch:-sparc} ;; + sparc64) arch=${arch:-ultrasparc} cpu=${cpu:-ultrasparc} basearch=${basearch:-ultrasparc} ;; + ev[456]*|arm*|ppc*) arch=${arch:-$FLXARCH} cpu=${cpu:-$FLXARCH} basearch=${basearch:-$FLXARCH} ;; + *) arch=${arch:-$FLXARCH} cpu=${cpu:-$FLXARCH} basearch=${basearch:-$FLXARCH} ;; + esac + + # FIXME: this should go into a per-architecture file case "$FLXARCH" in *86) CC=${CC:-gcc} + CXX=${CXX:-g++} FLX_ARCH_CURRENT="$FLXARCH" FLX_ARCH_COMMON="i586" FLX_ARCH_SMALL="$basearch" @@ -1189,15 +1373,16 @@ function set_compiler_options { GCC_OPT_FASTEST="-O3 -fomit-frame-pointer" GCC_OPT_FAST="-O2 -momit-leaf-frame-pointer -mpreferred-stack-boundary=2 -malign-jumps=0" GCC_OPT_SMALL="-Os -momit-leaf-frame-pointer -mpreferred-stack-boundary=2 -malign-jumps=0 -malign-loops=0 -malign-functions=0" - if [ $TESTGCC -gt 0 ] && $CC -falign-loops=0 -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then + if [ $TESTGCC -gt 0 ] && $CC -fno-align-loops -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then GCC_OPT_FASTEST="-O3 -fomit-frame-pointer" - GCC_OPT_FAST="-O2 -momit-leaf-frame-pointer -mpreferred-stack-boundary=2 -falign-jumps=0" - GCC_OPT_SMALL="-Os -momit-leaf-frame-pointer -mpreferred-stack-boundary=2 -falign-jumps=0 -falign-loops=0 -falign-functions=0" + GCC_OPT_FAST="-O2 -momit-leaf-frame-pointer -mpreferred-stack-boundary=2 -fno-align-jumps" + GCC_OPT_SMALL="-Os -momit-leaf-frame-pointer -mpreferred-stack-boundary=2 -fno-align-functions -fno-align-loops -fno-align-jumps -fno-align-labels" fi - ;; - + ;; + parisc*) CC=${CC:-gcc} + CXX=${CXX:-g++} FLX_ARCH_CURRENT="${FLXARCH##parisc}" ; FLX_ARCH_CURRENT="${FLX_ARCH_CURRENT:-1.1}" FLX_ARCH_COMMON="1.0" FLX_ARCH_SMALL="1.0" @@ -1208,12 +1393,13 @@ function set_compiler_options { GCC_CPU_COMMON="-mschedule=7100" GCC_CPU_SMALL="-mschedule=7100" GCC_OPT_FASTEST="-O3 -fomit-frame-pointer" - GCC_OPT_FAST="-O2 -falign-jumps=0" - GCC_OPT_SMALL="-Os -falign-jumps=0 -falign-loops=0 -falign-functions=0" + GCC_OPT_FAST="-O2 -fno-align-jumps" + GCC_OPT_SMALL="-Os -fno-align-functions -fno-align-loops -fno-align-jumps -fno-align-labels" ;; sparc*) CC=${CC:-gcc} + CXX=${CXX:-g++} FLX_ARCH_CURRENT="$FLXARCH" FLX_ARCH_COMMON="$FLXARCH" FLX_ARCH_SMALL="$FLXARCH" @@ -1224,12 +1410,13 @@ function set_compiler_options { GCC_CPU_COMMON="-mtune=$cpu" GCC_CPU_SMALL="-mtune=$cpu" GCC_OPT_FASTEST="-O3 -fomit-frame-pointer" - GCC_OPT_FAST="-O2 -falign-jumps=0" - GCC_OPT_SMALL="-Os -falign-jumps=0 -falign-loops=0 -falign-functions=0" + GCC_OPT_FAST="-O2 -fno-align-jumps" + GCC_OPT_SMALL="-Os -fno-align-functions -fno-align-loops -fno-align-jumps -fno-align-labels" ;; ev[456]*) CC=${CC:-gcc} + CXX=${CXX:-g++} FLX_ARCH_CURRENT="$FLXARCH" FLX_ARCH_COMMON="$FLXARCH" FLX_ARCH_SMALL="$FLXARCH" @@ -1240,38 +1427,107 @@ function set_compiler_options { GCC_CPU_COMMON="-mtune=$cpu" GCC_CPU_SMALL="-mtune=$cpu" GCC_OPT_FASTEST="-O3 -fomit-frame-pointer" - GCC_OPT_FAST="-O2 -falign-jumps=0" - GCC_OPT_SMALL="-Os -falign-jumps=0 -falign-loops=0 -falign-functions=0" + GCC_OPT_FAST="-O2 -fno-align-jumps" + GCC_OPT_SMALL="-Os -fno-align-functions -fno-align-loops -fno-align-jumps -fno-align-labels" ;; *) CC=${CC:-gcc} + CXX=${CXX:-g++} FLX_ARCH_CURRENT="$FLXARCH" FLX_ARCH_COMMON="$FLXARCH" FLX_ARCH_SMALL="$FLXARCH" GCC_OPT_FASTEST="-O3 -fomit-frame-pointer" GCC_OPT_FAST="-O2 -malign-jumps=0" GCC_OPT_SMALL="-Os -malign-jumps=0 -malign-loops=0 -malign-functions=0" - if [ $TESTGCC -gt 0 ] && $CC -falign-loops=0 -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then + if [ $TESTGCC -gt 0 ] && $CC -fno-align-loops -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then GCC_OPT_FASTEST="-O3 -fomit-frame-pointer" - GCC_OPT_FAST="-O2 -falign-jumps=0" - GCC_OPT_SMALL="-Os -falign-jumps=0 -falign-loops=0 -falign-functions=0" + GCC_OPT_FAST="-O2 -fno-align-jumps" + GCC_OPT_SMALL="-Os -fno-align-functions -fno-align-loops -fno-align-jumps -fno-align-labels" fi ;; esac + case "$FLXHOSTARCH" in + *86) + HOSTCC=${HOSTCC:-$CC} + HOSTCXX=${HOSTCXX:-$CXX} + HOSTCC_OPT_FASTEST="-O3 -fomit-frame-pointer" + HOSTCC_OPT_FAST="-O2 -momit-leaf-frame-pointer -mpreferred-stack-boundary=2 -malign-jumps=0" + HOSTCC_OPT_SMALL="-Os -momit-leaf-frame-pointer -mpreferred-stack-boundary=2 -malign-jumps=0 -malign-loops=0 -malign-functions=0" + if [ $TESTGCC -gt 0 ] && $HOSTCC -fno-align-loops -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then + HOSTCC_OPT_FASTEST="-O3 -fomit-frame-pointer" + HOSTCC_OPT_FAST="-O2 -momit-leaf-frame-pointer -mpreferred-stack-boundary=2 -fno-align-jumps" + HOSTCC_OPT_SMALL="-Os -momit-leaf-frame-pointer -mpreferred-stack-boundary=2 -fno-align-functions -fno-align-loops -fno-align-jumps -fno-align-labels" + fi + ;; + parisc*) + HOSTCC_OPT_FASTEST="$GCC_OPT_FASTEST" + HOSTCC_OPT_FAST="$GCC_OPT_FAST" + HOSTCC_OPT_SMALL="$GCC_OPT_SMALL" + ;; + + sparc*) + HOSTCC_OPT_FASTEST="$GCC_OPT_FASTEST" + HOSTCC_OPT_FAST="$GCC_OPT_FAST" + HOSTCC_OPT_SMALL="$GCC_OPT_SMALL" + ;; + + ev[456]*) + HOSTCC_OPT_FASTEST="$GCC_OPT_FASTEST" + HOSTCC_OPT_FAST="$GCC_OPT_FAST" + HOSTCC_OPT_SMALL="$GCC_OPT_SMALL" + ;; + + *) + HOSTCC=${HOSTCC:-$CC} + HOSTCXX=${HOSTCXX:-$CXX} + HOSTCC_OPT_FASTEST="-O3 -fomit-frame-pointer" + HOSTCC_OPT_FAST="-O2 -malign-jumps=0" + HOSTCC_OPT_SMALL="-Os -malign-jumps=0 -malign-loops=0 -malign-functions=0" + if [ $TESTGCC -gt 0 ] && $HOSTCC -fno-align-loops -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then + HOSTCC_OPT_FASTEST="-O3 -fomit-frame-pointer" + HOSTCC_OPT_FAST="-O2 -fno-align-jumps" + HOSTCC_OPT_SMALL="-Os -fno-align-functions -fno-align-loops -fno-align-jumps -fno-align-labels" + fi + ;; + esac + export FLX_ARCH_CURRENT FLX_ARCH_COMMON FLX_ARCH_SMALL - export CC AS LD AR STRIP OBJDUMP GCC_ARCH_CURRENT GCC_ARCH_COMMON GCC_ARCH_SMALL + export FLXHOSTOS FLXHOSTARCH FLXHOST FLXTARGOS FLXTARGARCH FLXTARG + export CC CXX AS LD AR OBJDUMP NM STRIP RANLIB GCC_ARCH_CURRENT GCC_ARCH_COMMON GCC_ARCH_SMALL export GCC_CPU_CURRENT GCC_CPU_COMMON GCC_CPU_SMALL export GCC_OPT_FASTEST GCC_OPT_FAST GCC_OPT_SMALL + export HOSTCC_OPT_FASTEST HOSTCC_OPT_FAST HOSTCC_OPT_SMALL return 0 } +# displays used environment variables +function print_env { + set_cross_environment + set_compiler_options + for i in FLXHOSTOS FLXHOSTARCH FLXHOST FLXTARGOS FLXTARGARCH FLXTARG \ + FLX_ARCH_CURRENT FLX_ARCH_COMMON FLX_ARCH_SMALL FLXARCH \ + FLXCROSS FLXTOOLDIR FLXROOTDIR \ + AR AS CC CXX LD NM OBJDUMP RANLIB STRIP \ + GCC_ARCH_CURRENT GCC_ARCH_COMMON GCC_ARCH_SMALL \ + GCC_CPU_CURRENT GCC_CPU_COMMON GCC_CPU_SMALL \ + GCC_OPT_FASTEST GCC_OPT_FAST GCC_OPT_SMALL \ + HOSTCC HOSTCXX \ + HOSTCC_OPT_FASTEST HOSTCC_OPT_FAST HOSTCC_OPT_SMALL \ + FLXMAKE FLXPMAKE; do + echo "$i=$(eval echo \$$i)" + done + exit 0 +} + function usage { # this is needed to present current options to the user + set_cross_environment set_compiler_options + echo "PKG version $PKG_VERSION - Formilux package build utility." echo "Usage:" echo " pkg [-options]* <action> [ pkg [ pkg2 ] ]" echo @@ -1313,6 +1569,8 @@ function usage { echo "GCC_OPT_FASTEST=$GCC_OPT_FASTEST" echo "GCC_OPT_FAST=$GCC_OPT_FAST" echo "GCC_OPT_SMALL=$GCC_OPT_SMALL" + echo + echo "Use pkg --env to get all variables." # Those two are not user-settable anymore # echo "CFGFILE : force to use of a .pkg, <$CFGFILE>" @@ -1359,11 +1617,11 @@ function do_release { fi # first, the destination directory must not exist - if [ -d "$PKGROOT/$EXACTPKG" ]; then - if [ -e "$PKGROOT/$EXACTPKG/RELEASED" ]; then + if [ -d "$PKGROOT/${EXACTPKG##*/}" ]; then + if [ -e "$PKGROOT/${EXACTPKG##*/}/RELEASED" ]; then echo "Error: This package already exists." else - echo "Error: The package directory $PKGROOT/$EXACTPKG already exists." + echo "Error: The package directory $PKGROOT/${EXACTPKG##*/} already exists." fi exit 1 fi @@ -1375,11 +1633,11 @@ function do_release { last_pkg=${last_pkg##*released } fi - if [ "$last_pkg" != "$EXACTPKG" ]; then + if [ "$last_pkg" != "${EXACTPKG##*/}" ]; then # Let's create a new changelog entry touch $PKGDIR/ChangeLog # avoid error message in case it doesn't exist (echo '0a'; date +"%Y/%m/%d %H:%M $LOGNAME@$HOSTNAME"; - echo ''; echo $'\t'"* released $EXACTPKG"; + echo ''; echo $'\t'"* released ${EXACTPKG##*/}"; echo ''; echo '.' ; echo '1,$wq') | ed $PKGDIR/ChangeLog >/dev/null fi @@ -1394,15 +1652,71 @@ function do_release { echo "Error: cannot move the package to the released directory. Cancelling." # the mv here fails atomically, so nothing's lost in PKGDIR, but we have # to clean a possible partial copy - rm -rf $PKGROOT/$EXACTPKG + rm -rf $PKGROOT/${EXACTPKG##*/} exit 2 fi - touch $PKGROOT/$EXACTPKG/RELEASED + touch $PKGROOT/${EXACTPKG##*/}/RELEASED return 0 } +# usage: install-files <owner> <perm> <dest> file... +# +function install-files { + local owner="$1" ; shift + local perm="$1" ; shift + local dst="$1" ; shift + local file + + [ -n "${dst##*/*}" -o -d "$ROOTDIR/${dst%/*}" ] || mkdir -p "$ROOTDIR/${dst%/*}" + cp -dpfP "$@" "$ROOTDIR/$dst/" && \ + ( cd "$ROOTDIR/$dst" && chown -h $owner "${@##*/}" && chmod $perm "${@##*/}" ) + + [ -n "$FILE_LIST" ] && for file in "$@"; do echo "$dst/$file $owner $perm"; done >> $FILE_LIST +} + +# usage: install-file <owner> <perm> <file> <dest> +# +function install-file { + local owner="$1" ; shift + local perm="$1" ; shift + local src="$1" ; shift + local dst="$1" ; shift + + [ -n "${dst##*/*}" -o -d "$ROOTDIR/${dst%/*}" ] || mkdir -p "$ROOTDIR/${dst%/*}" + if cp -dpfP "$src" "$ROOTDIR/$dst" && chown -h $owner "$ROOTDIR/$dst" \ + && [ ! -L "$ROOTDIR/$dst" ]; then chmod $perm "$ROOTDIR/$dst"; fi + + [ -n "$FILE_LIST" ] && echo $dst $owner $perm >> $FILE_LIST +} + +# usage: install-dir <owner> <perm> <dir>... +# +function install-dir { + local owner="$1" ; shift + local perm="$1" ; shift + local dst + + for dst in "$@"; do + mkdir -pm $perm "$ROOTDIR/$dst" && chown -h $owner "$ROOTDIR/$dst" + [ -n "$FILE_LIST" ] && echo $dst $owner $perm >> $FILE_LIST + done +} + +# usage: install-ln <owner> <target> <dest> +# +function install-ln { + local owner="$1" ; shift + local target="$1" ; shift + local dst="$1" ; shift + + [ -n "${dst##*/*}" -o -d "$ROOTDIR/${dst%/*}" ] || mkdir -p "$ROOTDIR/${dst%/*}" + ln -s "$target" "$ROOTDIR/$dst" && chown -h $owner "$ROOTDIR/$dst" + [ -n "$FILE_LIST" ] && echo $dst $owner 000 >> $FILE_LIST +} + + ###### ###### here are some functions used only from main ###### @@ -1425,6 +1739,7 @@ release_only=0 force=0 TESTGCC=0 PRINTUSAGE=0 +PRINTENV=0 ARGLIST=( ) ACTION= CHAINCMD=1 @@ -1439,6 +1754,10 @@ while [ $# -gt 0 ] ; do --help|-h) PRINTUSAGE=1 ;; + --env|-e) + PRINTENV=1 + TESTGCC=1 + ;; --rel|-r*) release_only=1 ;; @@ -1460,6 +1779,7 @@ done #echo "arglist=${ARGLIST[*]}" +[ $PRINTENV -gt 0 ] && print_env [ $PRINTUSAGE -gt 0 ] && usage [ ${#ARGLIST[*]} -lt 1 ] && usage @@ -1488,32 +1808,57 @@ while [ $CHAINCMD -gt 0 -a ${#ARGLIST[@]} -gt 0 ]; do CHAINCMD=0 KNOWNCMD=1 get_name ${ARGLIST[0]} %L %P %D + [ -d "$PKGDIR" ] || PKGDIR= ;; patch|unpatch) CHAINCMD=0 KNOWNCMD=1 - REPLY=$(basename $(readlink ${LINKNAME}) 2>/dev/null) - PKGDIR=$(readlink ${LINKNAME} 2>/dev/null) + if [ -r ".flxpkg/Version" ]; then + REPLY="$(cat .flxpkg/Version)" + REPLY="${REPLY##*/}" + PKGDIR="$CURDIR/.flxpkg/." + else + REPLY="$(basename $(readlink ${LINKNAME}) 2>/dev/null)" + PKGDIR="$(readlink ${LINKNAME} 2>/dev/null)" + fi # get_name %L ;; compile_only|config|config_only|compile|build) KNOWNCMD=1 - REPLY=$(basename $(readlink ${LINKNAME}) 2>/dev/null) - PKGDIR=$(readlink ${LINKNAME} 2>/dev/null) + if [ -r ".flxpkg/Version" ]; then + REPLY="$(cat .flxpkg/Version)" + REPLY="${REPLY##*/}" + PKGDIR="$CURDIR/.flxpkg/." + else + REPLY="$(basename $(readlink ${LINKNAME}) 2>/dev/null)" + PKGDIR="$(readlink ${LINKNAME} 2>/dev/null)" + fi TESTGCC=1 # get_name %L ;; prepack|strip|pack|delpack|release|clean) KNOWNCMD=1 - REPLY=$(basename $(readlink ${LINKNAME}) 2>/dev/null) - PKGDIR=$(readlink ${LINKNAME} 2>/dev/null) + if [ -r ".flxpkg/Version" ]; then + REPLY="$(cat .flxpkg/Version)" + REPLY="${REPLY##*/}" + PKGDIR="$CURDIR/.flxpkg/." + else + REPLY="$(basename $(readlink ${LINKNAME}) 2>/dev/null)" + PKGDIR="$(readlink ${LINKNAME} 2>/dev/null)" + fi # get_name %L ;; *) CHAINCMD=0 KNOWNCMD=0 - REPLY=$(basename $(readlink ${LINKNAME}) 2>/dev/null) - PKGDIR=$(readlink ${LINKNAME} 2>/dev/null) + if [ -r ".flxpkg/Version" ]; then + REPLY="$(cat .flxpkg/Version)" + REPLY="${REPLY##*/}" + PKGDIR="$CURDIR/.flxpkg/." + else + REPLY="$(basename $(readlink ${LINKNAME}) 2>/dev/null)" + PKGDIR="$(readlink ${LINKNAME} 2>/dev/null)" + fi # get_name %L ;; esac @@ -1526,27 +1871,28 @@ while [ $CHAINCMD -gt 0 -a ${#ARGLIST[@]} -gt 0 ]; do echo "Error: package name not found." exit 1 fi - EXACTPKG=$REPLY + EXACTPKG="$PKGDIR/$REPLY" if [ -z "$PKGDIR" ]; then - if [ -e "$PKGROOT/$EXACTPKG/build.cfg" ]; then - PKGDIR=$PKGROOT/$EXACTPKG + if [ -e "$PKGROOT/${EXACTPKG##*/}/build.cfg" ]; then + PKGDIR="$PKGROOT/${EXACTPKG##*/}" else - PKGDIR=$DEVROOT/$EXACTPKG + PKGDIR="$DEVROOT/${EXACTPKG##*/}" fi fi - CFGFILE=$PKGDIR/build.cfg - PKGRADIX=$(get_pkg_radix $EXACTPKG) - PKGVER=$(get_pkg_ver $EXACTPKG) - DISTVER=$(get_build_num $EXACTPKG) - ROOTDIR=${ROOTDIR:-$(pwd)/${INSTNAME}} - EXAMPLEDIR=${ROOTDIR}/usr/share/examples + CFGFILE="$PKGDIR/build.cfg" + PKGRADIX="$(get_pkg_radix ${EXACTPKG##*/})" + PKGVER="$(get_pkg_ver ${EXACTPKG##*/})" + DISTVER="$(get_build_num ${EXACTPKG##*/})" + ROOTDIR="${ROOTDIR:-$CURDIR/${INSTNAME}}" + EXAMPLEDIR="${ROOTDIR}/usr/share/examples" # for compatibility with old functions. Not used anywhere outside this script. - packver=$EXACTPKG - pack=$PKGRADIX + packver="${EXACTPKG##*/}" + pack="$PKGRADIX" fi + set_cross_environment set_compiler_options if [ "$ACTION" != "newpkg" ]; then @@ -1554,10 +1900,10 @@ while [ $CHAINCMD -gt 0 -a ${#ARGLIST[@]} -gt 0 ]; do fi # FLXMAKE is used for sequential make and FLXPMAKE for parallel make - FLXMAKE=${FLXMAKE:-make} - FLXPMAKE=${FLXPMAKE:-$FLXMAKE} + FLXMAKE="${FLXMAKE:-make}" + FLXPMAKE="${FLXPMAKE:-$FLXMAKE}" - export DISTVER PKGRADIX PKGVER FLXMAKE PATCH_LIST FILE_LIST + export DISTVER PKGRADIX PKGVER FLXMAKE FLXPMAKE PATCH_LIST FILE_LIST # echo "ACTION=$ACTION, KNOWNCMD=$KNOWNCMD, CHAINCMD=$CHAINCMD" # echo "ARGLIST=${ARGLIST[*]}" @@ -1577,415 +1923,3 @@ done [ $CHAINCMD -gt 0 ] && (echo "===> PKG: [END] <===";echo) >&2 exit 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -exit 99 - -############################################################################################################### -############################################################################################################### -############################################################################################################### -############################################################################################################### - - -DEAD CODE BELOW !!! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -function usage { - echo "Usage: pkg <action> [new_pkg [old_pkg]]" - echo " action is one of :" - echo " help : display this help." - echo " info : get information on current package." - echo " newpkg : build a more recent .pkg script from an old one." - echo " cat : display last .pkg file." - echo " edit : edit last .pkg file." - echo " patch : apply a list of patches to the directory prior to compile." - echo " unpatch : revert a list of patches to the directory." - echo " compile : do_compile=do_config_only+do_compile_only in .pkg script ($CFGROOT/$CFGDIR)" - echo " prepack : execute do_prepack in .pkg script ($CFGROOT/$CFGDIR)" - echo " strip : strip binaries in temporary directory" - echo " pack : strip binaries, then package into $PKGROOT" - echo " delpack : remove temporary directory" - echo " clean : execute 'make clean' and remove temporary directory." - echo " build : execute clean compile prepack pack." - echo " unpack : extract package into temporary directory" - echo "Variables are :" - echo "CFGROOT : directory for .pkg and patches, <$CFGROOT>" - echo "CFGFILE : force to use of a .pkg, <$CFGFILE>" - echo "PKGROOT : directory for .lst, .tgz and .dep, <$PKGROOT>" - echo "ROOTDIR : base directory for package (not source), <$ROOTDIR>" - echo "EXAMPLEDIR : base directory for sample config , <$EXAMPLEDIR>" - echo "FLXARCH : architecture for package name, <$FLXARCH>" - echo "KERNDIR : base directory for package (not source), <$KERNDIR>" - echo "DISTVER : build version (flx.1)" - exit 1 -} - - - - - - - - - -for ACTION in ${ARGLIST[*]}; do - -# now we will try to identify two packages names : -# - the EXACT one, deduced from command line, then version symlink, then the -# directory name ; this one doesn't have to exist to be correct. -# - the NEAREST one, deduced from the same criterions, with and without -# versions, and based on EXISTING files only. -# The NEAREST one will be used as a source, while the EXACT one will be used as -# a target. When the EXACT one exists, the NEAREST one must obviously be the -# same. - -# EXACTPKG can be specified as an environment variable if needed -[ $NEAREST_IS_SRC -eq 0 ] && [ -z "$EXACTPKG" -a ${#ARGLIST[*]} -gt 0 ] && EXACTPKG=$(basename ${ARGLIST[0]}) -[ -z "$EXACTPKG" -a -L .flxver ] && EXACTPKG=$(readlink .flxver) -[ -z "$EXACTPKG" ] && EXACTPKG=$(basename $(pwd)) - -if [ -z "$(get_pkg_ver $EXACTPKG)" ]; then - TEMP=$(sortnames $CFGROOT/$EXACTPKG-[0-9]* | tail -1) - TEMP=${TEMP:-$(sortnames $CFGROOT/$EXACTPKG.* | tail -1)} - TEMP=${TEMP:-$(sortnames $CFGROOT/$EXACTPKG-* | tail -1)} - TEMP=${TEMP:-$(sortnames $CFGROOT/$EXACTPKG* | tail -1)} -# if [ -z "$TEMP" ]; then -# echo "Cannot find a suitable package for the current directory. Please specify" -# echo "a correct name on the command line." -# usage -# exit 1 -# fi - [ "$TEMP" ] && EXACTPKG=$(basename $TEMP) - [ -z "$(get_pkg_ver $EXACTPKG)" ] && EXACTPKG=$EXACTPKG-0 -fi - -if [ -z "$(get_build_num $EXACTPKG)" ]; then - RADIX=$(get_pkg_radix $EXACTPKG) - TEMP=$(sortnames $CFGROOT/$EXACTPKG-* $CFGROOT/$EXACTPKG $CFGROOT/$RADIX | tail -1) - - VER=$(get_pkg_ver $TEMP) - BUILD=$(get_build_num $TEMP) - EXACTPKG=${RADIX}-${VER:-0}-${BUILD:-flx.1} -fi - -NEWPKGRADIX=$(get_pkg_radix $EXACTPKG) -NEWPKGVER=$(get_pkg_ver $EXACTPKG) -NEWDISTVER=$(get_build_num $EXACTPKG) -NEWDISTVER=${NEWDISTVER:-flx.1} -EXACTPKG=$NEWPKGRADIX-$NEWPKGVER-$NEWDISTVER - -trylist=( ) -[ -d "$CFGROOT/$EXACTPKG" -o -f "$CFGROOT/$EXACTPKG.$PKGSUFF" ] && trylist=( ${trylist[*]} $EXACTPKG) -[ ${#ARGLIST[*]} -gt 0 ] && trylist=( ${trylist[*]} $(basename ${ARGLIST[0]})) -[ -L .flxver ] && trylist=( ${trylist[*]} $(readlink .flxver)) -trylist=( ${trylist[*]} $NEWPKGRADIX-$NEWPKGVER ) -trylist=( ${trylist[*]} $NEWPKGRADIX ) -trylist=( ${trylist[*]} $(basename $(pwd))) -trylist=( ${trylist[*]} "default") - -echo trylist=${trylist[*]} - -for NEARESTPKG in ${trylist[*]}; do - if [ -z "$(get_pkg_ver $NEARESTPKG)" ]; then - TEMP=$(sortnames $CFGROOT/$NEARESTPKG-[0-9]* | tail -1) - TEMP=${TEMP:-$(sortnames $CFGROOT/$NEARESTPKG.* | tail -1)} - TEMP=${TEMP:-$(sortnames $CFGROOT/$NEARESTPKG-* | tail -1)} - #TEMP=${TEMP:-$(sortnames $CFGROOT/$NEARESTPKG | tail -1)} - [ "$TEMP" ] && NEARESTPKG=$(basename $TEMP) || continue - fi - - RADIX=$(get_pkg_radix $NEARESTPKG) - VER=$(get_pkg_ver $NEARESTPKG) - BUILD=$(get_build_num $NEARESTPKG) - NEARESTPKG=${RADIX}${VER:+-$VER}${BUILD:+-$BUILD} - - #### [ "$(get_build_num $NEARESTPKG)" ] && - - [ -d "$CFGROOT/$NEARESTPKG" -o -f "$CFGROOT/$NEARESTPKG.$PKGSUFF" ] && break -echo NEARESTPKG=$NEARESTPKG - - ###TEMP=$(sortnames $CFGROOT/$NEARESTPKG-* | tail -1) - ###[ "$(get_build_num $TEMP)" ] && NEARESTPKG=$(basename $TEMP) && break -done - -RADIX=$(get_pkg_radix $NEARESTPKG) -VER=$(get_pkg_ver $NEARESTPKG) -BUILD=$(get_build_num $NEARESTPKG) -NEARESTPKG=${RADIX}${VER:+-$VER}${BUILD:+-$BUILD} - -echo "EXACTPKG=$EXACTPKG" -echo "NEARESTPKG=$NEARESTPKG" - -# to be removed ## look if there was an argument, in which case we would treat it as a package -# to be removed ## name (either source or destination, depending on the action). These variables -# to be removed ## are set : -# to be removed ## - ARGPKGFULL : full package name with version -# to be removed ## - ARGPKGRADIX : package radix name (without version) -# to be removed ## - ARGPKGVER : package version without -flx* -# to be removed ## - ARGDISTVER : package build version (flx*) -# to be removed # -# to be removed #if [ ${#ARGLIST[*]} -gt 0 ]; then -# to be removed # ARGPKGFULL=$(basename ${ARGLIST[0]}) -# to be removed # ARGPKGRADIX=$(get_pkg_radix $ARGPKGFULL) -# to be removed # ARGPKGVER=$(get_pkg_ver $ARGPKGFULL) -# to be removed # if echo $ARGPKGFULL | grep -q -- "-flx\." ; then -# to be removed # ARGDISTVER=$(get_build_num $ARGPKGFULL) -# to be removed # fi -# to be removed # ARGBASECFG=${ARGBASECFG:-$(sortnames $CFGROOT/$ARGPKGFULL* |tail -1)} -# to be removed # ARGBASECFG=${ARGBASECFG:-$(sortnames $CFGROOT/$ARGPKGRADIX-$ARGPKGVER-* |tail -1)} -# to be removed # ARGBASECFG=${ARGBASECFG:-$(sortnames $CFGROOT/$ARGPKGRADIX-$ARGPKGVER* |tail -1)} -# to be removed # ARGBASECFG=${ARGBASECFG:-$(sortnames $CFGROOT/$ARGPKGRADIX-* |tail -1)} -# to be removed #fi -# to be removed # -# to be removed ## look for package name from the '.flxver' link in current dir, then dir name -# to be removed # -# to be removed #if [ -L .flxver ]; then -# to be removed # PKGFULL=$(readlink .flxver) -# to be removed #else -# to be removed # PKGFULL=$(basename $(pwd)) -# to be removed #fi -# to be removed # -# to be removed #PKGRADIX=$(get_pkg_radix $PKGFULL) -# to be removed #PKGVER=$(get_pkg_ver $PKGFULL) -# to be removed # -# to be removed #if [ -z "$DISTVER" ] && echo $PKGFULL | grep -q -- "-flx\." ; then -# to be removed # DISTVER=$(get_build_num $PKGFULL) -# to be removed #fi -# to be removed # -# to be removed #BASECFG=${BASECFG:-$(sortnames $CFGROOT/$PKGFULL* |tail -1)} -# to be removed #BASECFG=${BASECFG:-$(sortnames $CFGROOT/$PKGRADIX-$PKGVER-* |tail -1)} -# to be removed #BASECFG=${BASECFG:-$(sortnames $CFGROOT/$PKGRADIX-$PKGVER* |tail -1)} -# to be removed #BASECFG=${BASECFG:-$(sortnames $CFGROOT/$PKGRADIX-* |tail -1)} -# to be removed # -# to be removed # -# to be removed # -# to be removed ## now process the destination parameters -# to be removed # -# to be removed #if [ -L .flxver ]; then -# to be removed # NEWPKGFULL=$(readlink .flxver) -# to be removed #else -# to be removed # NEWPKGFULL=$(basename $(pwd)) -# to be removed #fi -# to be removed # -# to be removed #NEWPKGRADIX=$(get_pkg_radix $NEWPKGFULL) -# to be removed #NEWPKGVER=$(get_pkg_ver $NEWPKGFULL) -# to be removed #NEWPKGVER=${NEWPKGVER:-$PKGVER} -# to be removed # -# to be removed #if [ -z "$NEWDISTVER" ] && echo $NEWPKGFULL | grep -q -- "-flx\." ; then -# to be removed # NEWDISTVER=$(get_build_num $NEWPKGFULL) -# to be removed #fi -# to be removed #NEWDISTVER=${NEWDISTVER:-$DISTVER} -# to be removed # -# to be removed ## recompute the new package version -# to be removed #NEWBASECFG=${NEWBASECFG:-$NEWPKGRADIX-$NEWPKGVER-$NEWDISTVER} -# to be removed # - - -# now this is rather simple : for nearly all actions, NEWPKGFULL is used as the -# directory name for the new package. If it cannot be found, all actions except -# info and newpkg will fail. So we have to do a newpkg before using a new dir. - -if [ ! -d "$CFGROOT/$NEARESTPKG" -a ! -f "$CFGROOT/$NEARESTPKG.$PKGSUFF" ]; then - echo "Config directory <$NEARESTPKG> (NEARESTPKG) does not exist, use 'newpkg' first." - exit 1 -fi - -# source configuration -ROOTDIR=${ROOTDIR:-$(pwd)/${INSTNAME}} - - -CURPKG=$NEARESTPKG -PKGRADIX=$(get_pkg_radix $NEARESTPKG) -PKGVER=$(get_pkg_ver $NEARESTPKG) -if echo $NEARESTPKG | grep -q -- "-flx\." ; then - DISTVER=$(get_build_num $NEARESTPKG) - NEARESTPKG=$PKGRADIX-$PKGVER-$DISTVER -else - DISTVER= - NEARESTPKG=$PKGRADIX-$PKGVER -fi - -CFGDIR=$CFGROOT/$CURPKG -CFGFILE=$CFGDIR/$PKGRADIX.$CFGSUFF - -echo "CFGFILE=$CFGFILE, PKGVER=$PKGVER, CFGDIR=$CFGDIR" - -exit 0 - - - -if [ -n "$CFGFILE" ]; then - CFGDIR=$NEWCFGROOT/$NEWBASECFG - . $CFGFILE -else - #CFGFILE=`find $CFGROOT/ -name "$pack[-_]*-${DISTVER:-*}-$FLXARCH.$CFGSUFF"|sed -e "s/\.$CFGSUFF\$//"|sort|tail -1` - #CFGFILE=${CFGFILE:-`find $CFGROOT/ -name "$pack[-_]*-${DISTVER:-*}-*.$CFGSUFF"|sed -e "s/\.$CFGSUFF\$//"|sort|tail -1`} - #CFGFILE=${CFGFILE:-`find $CFGROOT/ -name "$pack[-_]*.$CFGSUFF"|sed -e "s/\.$CFGSUFF\$//"|sort|tail -1`} - #CFGFILE=${CFGFILE:-`find $CFGROOT/ -name "$pack.$CFGSUFF"|sed -e "s/\.$CFGSUFF\$//"|sort|tail -1`} - CFGFILE=`find $CFGROOT/ -maxdepth 1 -type d -name "$pack[-_]*-${DISTVER:-*}-pkg"|sed -e "s/-pkg\$//"|sort|tail -1` - CFGFILE=${CFGFILE:-`find $CFGROOT/ -maxdepth 1 -type d -name "$pack[-_]*-pkg"|sed -e "s/-pkg\$//"|sort|tail -1`} - CFGFILE=${CFGFILE:-`find $CFGROOT/ -maxdepth 1 -type f -name "$pack[-_]*-${DISTVER:-*}-pkg.$PKGSUFF"|sed -e "s/-pkg\.$PKGSUFF\$//"|sort|tail -1`} - CFGFILE=${CFGFILE:-`find $CFGROOT/ -maxdepth 1 -type f -name "$pack[-_]*-pkg.$PKGSUFF"|sed -e "s/-pkg\.$PKGSUFF\$//"|sort|tail -1`} - - # to be completed - - if [ -z "$CFGFILE" ]; then - echo "CFGFILE not found. Cannot continue." >&2 - exit 1 - fi - - if [ -d $CFGFILE ]; then - CFGROOT=`dirname $CFGFILE` - CFGDIR=`basename $CFGFILE`-pkg - CFGFILE=$CFGROOT/$CFGDIR/$pack.$CFGSUFF - else - CFGROOT=`dirname $CFGFILE` - CFGDIR=`basename $CFGFILE`-pkg - CFGFILE=$CFGROOT/$CFGDIR/$pack.$CFGSUFF - if [ ! -e $CFGROOT/$CFGDIR ]; then - echo "Opening package $CFGROOT/$CFGDIR.$PKGSUFF into $CFGROOT/$CFGDIR..." - mkdir -p $CFGROOT/$CFGDIR && tar -C $CFGROOT/$CFGDIR -Uxpf $CFGROOT/$CFGDIR.$PKGSUFF - if [ $? != 0 ]; then - echo "There was an error during this operation. You may have to manually clean $CFGROOT/$CFGDIR. Cannot continue !" - exit 1 - else - echo "Done !" - fi - fi - fi - - if [ -e "$CFGFILE" ]; then - . $CFGFILE - else - echo "CFGFILE ($CFGFILE) not found. Cannot continue." >&2 - exit 1 - fi - fi - - if [ -z "$DISTVER" ]; then - if echo $CFGFILE | grep -q -- "-flx\." ; then - DISTVER=`echo $CFGFILE|sed 's/\(.*-\)\(flx.[0-9]\+\)\(.*\)/\2/'` - else - DISTVER='flx.1' - fi - fi - - echo $packver | grep -q -- "-flx\." - if [ $? != 0 ] ; then - packver=$packver-$DISTVER - fi - - echo $packver | grep -q -- "-$FLXARCH\$" - if [ $? != 0 ] ; then packver=$packver-$FLXARCH ; fi - - prefix=${packver%%[._-][0-9]*} - suffix=${packver#$prefix[._-]} - PKGVER=${suffix%-flx*} - PKGRADIX=$prefix - #echo "packver=$packver suffix=$suffix PKGVER=$PKGVER" - if [ -z "$DISTVER" ]; then - DISTVER=${suffix#$PKGVER-} - if [ "$DISTVER" = "$PKGVER" ]; then - DISTVER="flx.1" - else - DISTVER=${DISTVER%-*} - fi - fi - - case "$FLXARCH" in - i686) arch=i686 cpu=i686 basearch=i386 ;; - i486) arch=i486 cpu=i486 basearch=i386 ;; - i386) arch=i386 cpu=i386 basearch=i386 ;; - *) arch=i586 cpu=i686 basearch=i386 ;; - esac - - if [ -z "$FLXMAKE" ]; then - FLXMAKE=make - fi - - - if [ -z "${PATCH_LIST}" ]; then - PATCH_LIST=${CFGFILE%%.$CFGSUFF}.diff - if [ ! -e ${PATCH_LIST} ]; then - unset PATCH_LIST - fi - fi - - export DISTVER PKGRADIX PKGVER FLXMAKE PATCH_LIST FILE_LIST - - declare -f pre_$ACTION > /dev/null && ( pre_$ACTION ) - [ $? != 0 ] && exit $? - declare -f do_$ACTION > /dev/null && ( do_$ACTION ) - [ $? != 0 ] && exit $? - declare -f post_$ACTION > /dev/null && ( post_$ACTION ) - [ $? != 0 ] && exit $? - fi -fi - |