#! /bin/bash # # author: hackbard@hackdaworld.dyndns.org # # this script is used to build hdw-linux packages. # hdw_status="" package="" no_src_del="" priority="" dir="*" while [ "$1" ] ; do case "$1" in -stage) hdw_status=$2 ; shift 2 ;; -package) package=$2 ; shift 2 ;; -no_src_del) no_src_del="1" ; shift 1 ;; -priority) priority=$2 ; shift 2 ;; -dir) dir=$2 ; shift 2 ;; *) echo echo "Usage:" echo echo -e " ./scripts/Build \t-stage stagelevel" echo -e "\t\t\t-package package-name" echo exit 1 ;; esac done if [ -z "$package" ]; then echo "no package specified, abort." exit 1 fi if [ -z "$hdw_status" ]; then echo "stage level not specified. something went wrong ... hey," echo "this is a development version ;)" exit 1 fi if [ -z "$priority" ] ; then echo "no priority specified, abort." exit 1 fi export priority # load config andsubroutines . ./scripts/Config -stage $hdw_status . ./scripts/subroutines # optimization . ./scripts/optimization # check for dietlibc if [ "$hdw_status" != "1" -a "$hdw_use_dietlibc" = "1" ] ; then export CC="diet-dyn $CC -nostdinc" export CXX="diet-dyn $CXX -nostdinc" fi # okay, this is going to be fun - happy h4ck1n6 # # defining build environment variables to build a package. if [ "$dir" = "*" ] ; then dirs="`ls ./packages/*/$package/$package`" if [ "`echo $dirs | awk '{ print NF }'`" -gt "1" ] ; then echo "please specify a category using -dir, possibilities:" for dir in $dirs; do echo "-> $dir" done exit 1 else dir="`echo $dirs | awk -F/ '{ print $3 }'`" fi fi if [ -f ./packages/$dir/$package/$package ] ; then echo "found $package config file ..." # defining help variables confdir="$hdw_home_dir/packages/$dir/$package" archdir="$hdw_home_dir/download/$dir/$package" # lets get some package info pkgs=`cat $confdir/$package | grep '^#\ \[D\]' | \ awk '{ print $3 }'` pkg=`echo $pkgs | awk '{ print $1 }'` # to make sure there is only 1 ver=`cat $confdir/$package | grep '^#\ \[V\]' | \ awk '{ print $3 }'` patch=`cat $confdir/$package | grep '^#\ \[P\]' | \ awk '{ print $3 }'` # lets see whether we have the source if [ ! -f ./download/$dir/$package/$pkg -a ! -z "$pkg" ]; then echo "sources for $package not found, trying to get them ..." ./scripts/Download -package $package fi if [ ! -f ./download/$dir/$package/$pkg -a ! -z "$pkg" ]; then echo "sources still not found, aborting ..." exit 1 fi # compress format of source? if [ ! -z "`echo \`detect_file_ending $pkg\` | grep 'bz2'`" ] ; then compress="bzip2" elif [ ! -z "`echo \`detect_file_ending $pkg\` | grep 'tbz2'`"] ; then compress="bzip2" else compress="gzip" fi # # defining elementary build functions and variables # custmain="0" autoextract="1" srcdir="$package*" skip=""; s_reason="" make_conf=""; install_conf="" prefix=""; docdir="" if [ "$hdw_status" -lt "2" ] ; then # use the symlink as prefix prefix="/${s1_prefix}" docdir="$prefix/share/doc/$package" install_conf="PREFIX=$prefix" else if [ "$hdw_status" = "2" -o "$hdw_status" = "3" ] ; then prefix="$root/usr"; docdir="$root/usr/doc/$package" localstatedir="$root/var" sysconfdir="$root/etc" elif [ "$hdw_status" = "4" ] ; then prefix="$root/opt/$package" docdir="$root/opt/$package/doc" localstatedir="$root/var/opt/$package" sysconfdir="$root/etc/opt/$package" fi fi if [ -z "$prefix" ] ; then echo "problem: no prefix found! aborting .." exit 1 fi # defining confopt now confopt="--prefix=$prefix --bindir=$prefix/bin" confopt="$confopt --sbindir=$prefix/sbin" confopt="$confopt --libdir=$prefix/lib" confopt="$confopt --datadir=$prefix/share" confopt="$confopt --infodir=$prefix/info" confopt="$confopt --mandir=$prefix/man" if [ "$hdw_status" -gt "1" ] ; then confopt="$confopt --localstatedir=$localstatedir" confopt="$confopt --sysconfdir=$sysconfdir" fi # architecture specific stuff confopt="$confopt --build=$hdw_arch_build" confopt="$confopt --host=$hdw_arch_host" # crosscompiling [ "$package" = "gcc" -o "$package" = "binutils" ] && \ confopt="$confopt --target=$hdw_arch_target" # buildfunctions pre_install() { echo "hdw rules!" } post_install() { echo "hdw rules!" } build_main () { echo echo "hdw-linux: \$confopt = $confopt" echo "hdw-linux: \$make_conf = $make_conf" echo "hdw-linux: \$install_conf = $install_conf" echo "lets do it ..." if [ -f ./configure ] ; then echo "run ./configure $confopt" ./configure $confopt fi echo ; echo "run make $make_conf" make $make_conf echo ; echo "run make $install_conf install" make $install_conf install } # flist find variables/command flist_path="bin/ boot/ etc/ lib/ opt/ sbin/ usr/ var/" [ "$hdw_status" -lt "2" ] && flist_path="${flist_path} ${s1_prefix}/" flist_cmd="find \$flist_path \( -cnewer $root/.time_$package -o \ -newer $root/.time_$package \) \( -not -type d -o \ -type d -empty \) -print" flist_pruned="var/adm|var/log|var/run|var/tmp|var/spool" flist_pruned="${flist_pruned}|var/cache|var/lock" # reading config functions and variables . $confdir/$package # lets begin building, in case we dont skip it! if [ -z "$skip" ] ; then # setting umask, we dont reset it! umask 0022 # run ldconfig to, maybe we installed some libs before! if [ "$hdw_status" != "1" ] ; then echo "running ldconfig ..." ldconfig fi # for creating the flist # cd $root/ touch .time_${package} && sleep 1 cd $hdw_home_dir set -e # use trap to catch errors in block # we may kick out abort_when_package_build_failed lines # can we use $_ instead off TRAP_ERR ? { trap 'abort_when_package_build_failed 1 $_' ERR # automated build procedure if [ "$custmain" != "0" ] ; then #build according packages custmain function if [ "$no_src_del" != "1" ] ; then rm -rf $root/src.$package fi mkdir -p $root/src.$package cd $root/src.$package if [ "$hdw_debug_buildenv" = "1" ] ; then echo echo "Debug: (buildenvironment)" printenv echo fi custmain cd $hdw_home_dir rm -rf $root/src.$package else #now we go for automated building # automated extract if [ "$no_src_del" != "1" ] ; then if [ "$autoextract" != "0" ] ; then rm -rf $root/src.$package mkdir -p $root/src.$package tar --use-compress-program=$compress \ -xvf ./download/$dir/$package/$pkg \ -C $root/src.$package fi fi # change to directory and build cd $root/src.$package/$srcdir && # patches from [P] tag if [ ! -z "$patch" ] ; then for every_single_patch in $patch; do echo "aplying patch $every_single_patch ..." patch -Nfp1 < $hdw_home_dir/download/$dir/$package/$every_single_patch done echo fi # patches from confdir # general patches for xtra_patch in `ls $confdir/*.patch 2> /dev/null`; do echo "applying patch $xtra_patch ..." patch -Nfp1 < $xtra_patch done # architecture dependent patches for xtra_patch in `ls $confdir/*.patch.${hdw_arch} 2> /dev/null`; do echo "applying patch $xtra_patch ..." patch -Nfp1 < $xtra_patch done # target specific patches for xtra_patch in `ls $confdir/*.patch.${hdw_target} 2> /dev/null`; do echo "applying patch $xtra_patch ..." patch -Nfp1 < $xtra_patch done # dietlibc patches if [ "$hdw_use_dietlibc" = "1" ] ; then for xtra_patch in `ls $confdir/*.patch.dietlibc 2> /dev/null`; do echo "applying patch $xtra_patch ..." patch -Nfp1 < $xtra_patch done fi # stage specific patches for xtra_patch in `ls $confdir/*.patch.${hdw_status} 2> /dev/null`; do echo "applying patch $xtra_patch ..." patch -Nfp1 < $xtra_patch done # patch section end ;) echo pre_install if [ "$hdw_debug_buildenv" = "1" ] ; then echo echo "Debug: (buildenvironment)" printenv echo fi build_main post_install cd $hdw_home_dir rm -rf $root/src.$package fi # init # dirty! not create *.init for 00-init-conf, manually done. if [ "$package" != "00-init-conf" ] ; then for my_init in `ls $confdir/*.init 2> /dev/null`; do create_init $my_init done fi # setup scripts if [ "$hdw_status" != "1" ] ; then for my_setup in `ls $confdir/*.setup 2> /dev/null`; do create_setup_scripts $my_setup done fi } # end of trap block # let's see what we installed # cd $root/ eval $flist_cmd | grep -vE $flist_pruned > flist.$package # let's create the flist append="" [ "$hdw_status" = "0" ] && append=".stage0" [ "$hdw_status" = "1" ] && append=".stage1" append="${append}-${priority}" export package export append export hdw_status export priority awk '\ BEGIN { package=ENVIRON["package"] ; append=ENVIRON["append"] ; \ stage=ENVIRON["hdw_status"] ; priority=ENVIRON["priority"] } \ { print package ": " $0 } \ END { print package ": " "var/adm/logs/" stage "-" priority "-" \ package ; \ print package ": " "var/adm/flists/" package append }' \ $root/flist.$package > $root/var/adm/flists/${package}${append} # manually add dependency files, calculated after flist if [ "$hdw_status" -ge "3" ] ; then echo "${package}: var/adm/deps/build/$package" >> \ $root/var/adm/flists/${package}${append} echo "${package}: var/adm/deps/run/$package" >> \ $root/var/adm/flists/${package}${append} fi # build/runtime dependencies (just libs >= stage 3, # default is 'hardcoded') # still in development !! if [ "$hdw_status" -ge "3" ] ; then # build deps rm -f $root/var/adm/deps/build/$package echo -n "calculating build dependencies ... " alldeps="" for lib in `grep '\ -l[A-Za-z]' \ $root/var/adm/logs/${hdw_status}-${priority}-$package.out`; do if [ -n "`echo $lib | grep '^-l'`" ] ; then lib=${lib//-l/lib} for dep in `grep "/$lib\." \ -r $root/var/adm/flists | \ awk -F: '{ print $2 }'`; do add=1 for cmp in $alldeps; do [ "$cmp" = "$dep" ] && add=0 done [ "$add" = "1" ] && \ alldeps="$dep $alldeps" done fi done for dep in $alldeps; do echo "$dep" >> $root/var/adm/deps/build/$package done touch $root/var/adm/deps/build/$package echo "done" # runtime deps rm -f $root/var/adm/deps/run/$package echo -n "calculating runtime dependencies ... " alldeps="" for binary in `grep 'bin\/' \ $root/var/adm/flists/${package}${append} | \ awk '{ print $2 }'`; do for rdep in `ldd $root/$binary 2>&1 | \ awk '{ print $3 }' | \ sed 's$/$$' | grep -v 'dynamic' | \ grep -v '^ldd'`; do for rpkg in `grep $rdep -r \ $root/var/adm/flists | \ grep -v $s1_prefix | \ awk -F: '{ print $2 }'`; do add=1 for cmp in $alldeps; do [ "$cmp" = "$rpkg" ] && add=0 done [ "$add" = "1" ] && \ alldeps="$rpkg $alldeps" done done done for library in `grep 'lib\/.*.so.*' \ $root/var/adm/flists/${package}${append} | \ awk '{ print $2 }'`; do for rdep in `ldd $root/$library 2>&1 | \ awk '{ print $3 }' | \ sed 's$/$$' | grep -v 'dynamic' | \ grep -v '^ldd'`; do for rpkg in `grep $rdep -r \ $root/var/adm/flists | \ grep -v $s1_prefix | \ awk -F: '{ print $2 }'`; do add=1 for cmp in $alldeps; do [ "$cmp" = "$rpkg" ] && add=0 done [ "$add" = "1" ] && \ alldeps="$rpkg $alldeps" done done done for dep in $alldeps; do echo "$dep" >> $root/var/adm/deps/run/$package done touch $root/var/adm/deps/run/$package echo "done" fi # remove flist stuff rm .time_${package} rm flist.$package cd $hdw_home_dir else [ -z "$s_reason" ] && s_reason=unknown echo echo "FYI: $package build skipped, reason: $s_reason" fi # (if [ -z "$skip" ]) else echo "cannot find $package config file ..." exit 1 fi