#!/bin/sh # # extbuild - a script to build extensions for Tiny Core Linux # .desc file idea derived from SvOlli (thanks!) # code (c) 2011 gutmensch # version 0.1 # licensed under gplv3 # # Root? [ `id -u` -ne 0 ] && { echo "Must be root!"; exit 1; } [ -z "$1" -o ! -e "$1" ] && { echo "Usage: sudo ../extbuild extension.tcz.bld"; exit 1; } # Source tc-functions and colors . "/etc/init.d/tc-functions" ##################################################################### ############## Modify .desc file before sourcing it ################# ##################################################################### STDIFS=" " IFS=$'\n' DESCFILE="`realpath $1`" DATE=`date +%Y/%m/%d` CHANGE=`cat $DESCFILE | grep "CHANGE=\"" | sed 's?CHANGE=\"\(.*\)\"?\1?'` # if change has no entry then dismiss if [ "$CHANGE" = "__TODAY__ " ]; then echo -e -n "${YELLOW}Warning: No new changelog entry made.${NORMAL}\n${WHITE}Continue, overwrite with new date or abort? [c/o/a]: " read junk echo "${NORMAL}" # Abort [ "$junk" = "a" ] && echo "Aborting." && exit 1 # Overwrite if [ "$junk" = "o" ]; then # Setting date of last changelog entry to current date lastline="`grep CHANGELOG $DESCFILE | head -n 1 | cut -d'=' -f2`" lastdate=`echo "$lastline" | sed 's:"\([0-9]*/[0-9]*/[0-9]*\) .*:\1:' 2>/dev/null` if [ "$DATE" != "$lastdate" ]; then newline=`echo $lastline | sed "s:$lastdate:$DATE:" 2>/dev/null` sed -i -e "s:$lastline:$newline:" $DESCFILE 2>/dev/null fi fi else # maybe new package and empty changelog? if [ -z "`cat $DESCFILE | grep CHANGELOG | head -n 1`" ];then endofchangelog="`cat $DESCFILE | grep '############### end of changelog'`" indexnext=0 CHANGE=`echo $CHANGE | sed "s?__TODAY__?$DATE?" 2>/dev/null` nextentry="#CHANGELOG[$indexnext]=\"$CHANGE\"" sed -i "s?############### end of changelog.*?$nextentry\n$endofchangelog?" $DESCFILE 2>/dev/null else # get latest changelog entry for i in `cat $DESCFILE | grep CHANGELOG | head -n 1` do lastentry="`echo $i | sed 's?#CHANGELOG.*=\"\(.*\)\"?\1?' 2>/dev/null`" indexlast="`echo $i | sed 's?#CHANGELOG\[\(.*\)\].*?\1?' 2>/dev/null`" indexnext=$(( $indexlast + 1 )) # modify date string to version appendix if same date of last change datestring="`echo $lastentry | cut -d' ' -f1`" if [ "$datestring" = "$DATE" ];then DATE="$DATE-1" else datestring2="`echo $datestring | cut -d'-' -f1`" if [ "$datestring2" = "$DATE" ];then dateversion="`echo $datestring | cut -d'-' -f2`" newdateversion=$(( $dateversion + 1 )) DATE="$DATE-$newdateversion" fi fi CHANGE=`echo $CHANGE | sed "s?__TODAY__?$DATE?"` nextentry="#CHANGELOG[$indexnext]=\"$CHANGE\"" sed -i "s?#CHANGELOG.$indexlast.=.*?$nextentry\n$i?" "$DESCFILE" 2>/dev/null done fi # reset CHANGE var sed -i "s?CHANGE=\".*\"?CHANGE=\"__TODAY__ \"?" "$DESCFILE" 2>/dev/null fi # Reset IFS IFS=$STDIFS ##################################################################### ##################################################################### ##################################################################### ##################################### VARS ############################################# # Static compiler flags export LANG="C" export LANGUAGE="C" export LC_ALL="C" export CFLAGS="-march=i486 -mtune=i686 -Os -pipe -fomit-frame-pointer" export CXXFLAGS="-march=i486 -mtune=i686 -Os -pipe -fno-exceptions -fno-rtti" export CPPFLAGS="-I/usr/local/include -I/usr/include" export LDFLAGS="-L/usr/local/lib -L/usr/lib -L/lib -Wl,-O1 -Wl,--hash-style=gnu" export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig BASE_FLAGS="--enable-static --enable-shared --prefix=/usr/local --localstatedir=/var --sysconfdir=/usr/local/etc --mandir=/usr/local/share/man" BASE_BUILD_DEPS="compiletc squashfs-tools-4.x ntpclient sstrip upx gzip lsof xz zsync findutils file" UPX_OPTS="--best --ultra-brute -f" COMPRESSOR="xz -z -f -9 -e" let BUILD_THREADS="`cat /proc/cpuinfo | grep -e 'processor[[:space:]]*:' | wc -l`+1" CONFIGURE_CMD="./configure" MAKE_CMD="make -j$BUILD_THREADS" MAKE_TEST_CMD="make test ; make check" MAKE_INSTALL_CMD="make install" AFTER_INSTALL_CMD="" AFTER_CONFIGURE_CMD="" RELEASE=`uname -r` # Misc static vars TCB_SRCDIR="`pwd`/src" TCB_BLDDIR="`pwd`/build" TODAY="`date +%Y/%m/%d`" TCUSER=`cat /etc/sysconfig/tcuser` TCEMIRROR="http://distro.ibiblio.org/pub/linux/distributions/tinycorelinux/3.x/tcz/" DUMMY_FILES="" # Getting extension info . "$DESCFILE" # Correcting place of logfile if RENAME_TO used LOGFILE="${TCB_BLDDIR}/../build.log" #################################### END OF VARS ###################################### ### FUNCTIONS log() { if [ -n "$1" ] && [ -n "$2" ];then tstamp=`date +"%d.%m.%y %T"` # $1 = Level: 0 Info, 1 Warning, 2 Error # $2 = Text case $1 in 0) ERRORMSG="[$tstamp] Info : $2" ;; 1) ERRORMSG="[$tstamp] Warning: $2" ;; 2) ERRORMSG="[$tstamp] *ERROR*: $2" ;; *) return ;; esac echo "${ERRORMSG}" >> ${LOGFILE} [ $1 -eq 2 ] && fail fi } init_logfile() { # creating log file and dumping all config info mkdir -p `dirname ${LOGFILE}` 2>/dev/null touch $LOGFILE || export LOGFILE=/dev/null chown ${TCUSER}:staff $LOGFILE log 0 " ====== Welcome to tcbuild :-) ====== " log 0 "Printing environment:" printenv >> $LOGFILE log 0 "Dumping variables:" for var in DESCFILE DATE CHANGE LANG LANGUAGE LC_ALL RELEASE \ CFLAGS CXXFLAGS CPPFLAGS ACLOCAL_AMFLAGS LDFLAGS \ PKG_CONFIG_PATH BASE_FLAGS BASE_BUILD_DEPS COMPRESSOR \ CONFIGURE_CMD MAKE_CMD MAKE_TEST_CMD MAKE_INSTALL_CMD \ AFTER_CONFIGURE_CMD AFTER_INSTALL_CMD BUILD_THREADS \ TCB_SRCDIR TCB_BLDDIR TODAY TCUSER TCEMIRROR \ STYPE MIRROR PACKAGE SEP VERSION PKG_EXT RENAME_TO \ BUILD_DEPS RUN_DEPS TCE_REPO FLAGS OVERWRITE_LOCAL \ DEV_MASK CONF_MASK CONF_MAND_MASK LOCALE_MASK DOC_MASK \ NO_PERL NO_OWN_MOD NO_AUTOTOOLS NO_DESTDIR DBG_PKG UPX_COMPRESS UPX_OPTS \ DESCRIPTION AUTHORS MAINTAINER HOMEPAGE LICENSE COMMENTS do value="$(eval echo \${$var})" log 0 "$var: $value" done } online() { ping www.google.de -c 1 1>/dev/null 2>&1 echo $? } update_files() { if [ -n "$1" ];then chown -R root:staff "$1" find "$1" -type f -exec touch {} + fi } success() { echo "${GREEN}success.${NORMAL}" } fail() { echo "${RED}failed." echo "Last ten lines of log show:" cat $LOGFILE | tail -n 10 echo "${NORMAL}" exit 1 } check_perl() { # searching for perl files in ext directory FOUND=1 log 0 "Searching for perl dependencies... " find "${TCB_BLDDIR}/$1" -type f -exec file {} \; | grep perl | cut -d: -f1 | xargs sed -i -e '1s"^#!.\+$"#!/usr/local/bin/perl -w"' 1>>$LOGFILE 2>&1 && FOUND=0 find "${TCB_BLDDIR}/$1" -type f -exec file {} \; | grep perl 1>>$LOGFILE 2>&1 echo $FOUND } strip_compress_files() { if [ -z "${DBG_PKG}" ]; then # no dbg extension, just strip everything for elf in `find ${TCB_BLDDIR} -exec file {} \; | grep -e "ELF.*shared object\|ELF.*executable" | cut -d: -f1`; do origsize=`du -h $elf | awk '{print $1}'` strip --strip-unneeded --strip-debug $elf 1>>$LOGFILE 2>&1 newsize=`du -h $elf | awk '{print $1}'` log 0 "Stripping file $elf... reduced from $origsize to $newsize." if [ -n "`file $elf | grep executable`" ]; then origsize=`du -h $elf | awk '{print $1}'` sstrip $elf 1>> $LOGFILE 2>&1 newsize=`du -h $elf | awk '{print $1}'` log 0 "S-stripping executable $elf... reduced from $origsize to $newsize." fi done else # create debug extension for elf in `find ${TCB_BLDDIR} -exec file {} \; | grep -e "ELF.*shared object\|ELF.*executable" | cut -d: -f1`; do origsize=`du -h $elf | awk '{print $1}'` objcopy --only-keep-debug $elf $elf.dbg objcopy --strip-debug --strip-unneeded $elf objcopy --add-gnu-debuglink=$elf.dbg $elf newsize1=`du -h $elf | awk '{print $1}'` newsize2=`du -h $elf.dbg | awk '{print $1}'` log 0 "Stripped debug info from $elf ($origsize) into `basename $elf` ($newsize1) and `basename $elf.dbg` ($newsize2)." done fi if [ -n "${UPX_COMPRESS}" ]; then # requested to compress executables with upx echo "${RED}Warning: Using UPX to compress files.${NORMAL}" for elf in `find ${TCB_BLDDIR} -exec file {} \; | grep -e "ELF.*executable" | cut -d: -f1`; do origsize=`du -h $elf | awk '{print $1}'` upx ${UPX_OPTS} $elf 1>>$LOGFILE 2>&1 newsize=`du -h $elf | awk '{print $1}'` log 0 "Upx'ing `basename $elf`... reduced from $origsize to $newsize." done fi } dummy_file() { # create temporary executable dummy file needed by some builds # def. goes to /usr/local/bin/ # $1 should be the name # $2 can be optional cmd list for content of dummy file if [ -n "$1" ];then for file in $@ do if [ ! -e /usr/local/bin/$file ];then log 0 "Creating dummy file /usr/local/bin/$file." touch /usr/local/bin/$file echo -e "#!/bin/sh\n" >> /usr/local/bin/$file [ -n "$2" ] && echo -e "$2\n" >> /usr/local/bin/$file echo -e "exit 0\n" >> /usr/local/bin/$file chmod +x /usr/local/bin/$file DUMMY_FILES="${DUMMY_FILES} /usr/local/bin/$file" fi done fi } tmp_install() { touch /tmp/tmp_install_mark ${MAKE_INSTALL_CMD} 1>>$LOGFILE 2>&1 retval=$? find $1 -newer /tmp/tmp_install_mark -not -type d > /tmp/tmp_install_list [ ! -s /tmp/tmp_install_list ] && echo -e "\n" && log 2 "tmp_install_list from $1 is empty, no files found, maybe wrong prefix installation?!" tar -T /tmp/tmp_install_list -czf ${TCB_BLDDIR}/${PACKAGE}_installed.tgz 1>>$LOGFILE 2>&1 find /usr/local -newer /tmp/tmp_install_mark -not -type d -exec rm -rvf {} 1>>$LOGFILE 2>&1 \; tar -xzf ${TCB_BLDDIR}/${PACKAGE}_installed.tgz -C ${TCB_BLDDIR}/${PACKAGE}/ 1>>$LOGFILE 2>&1 rm -f /tmp/tmp_install_list rm -f /tmp/tmp_install_mark rm -f ${TCB_BLDDIR}/${PACKAGE}_installed.tgz return $retval } fn_exists() { type $1 | grep -q 'shell function' echo $? } install_license() { if [ -d "${TCB_BLDDIR}/$1" ];then EMPTY="`find ${TCB_BLDDIR}/$1 -type f`" if [ ! -z "${EMPTY}" ];then # pkg should be $1 licdir="${TCB_BLDDIR}/${1}/usr/local/share/doc/License" mkdir -p "${licdir}" || exit 1 # copying license, patents or authors files # CREDITS THANKS CHANGELOG COMPATIBILITY README VERSION for i in LICENSE COPYING COPYRIGHT AUTHORS PATENTS ; do doctype="-$(echo $i | tr '[:upper:]' '[:lower:]')" [ "$doctype" = "-license" ] && doctype="" [ -e "${TCB_SOURCE}/$i" ] && cp "${TCB_SOURCE}/$i" "${licdir}/${1}${doctype}.txt" && log 0 "Installed ${licdir}/${1}${doctype}.txt." [ -e "${TCB_SOURCE}/$i.txt" ] && cp "${TCB_SOURCE}/$i.txt" "${licdir}/${1}${doctype}.txt" && log 0 "Installed ${licdir}/${1}${doctype}.txt." done fi fi } to_new_extension() { EMPTY=0 CURRDIR=$(pwd) cd ${TCB_BLDDIR}/${PACKAGE} # $1 should be find regex, for example "-name bla.conf -o -name blu.txt" # $2 should be name of new package # $3 should be list of deps # # unloading if loaded [ -d /tmp/tcloop/$2 ] && tceunload $2 # generating if [ -n "$1" ] && [ -n "$2" ];then for I in $(find `ls` $1 ); do [ ! -e "${TCB_BLDDIR}/$2" ] && mkdir -p "${TCB_BLDDIR}/$2" export DIR=`dirname "$I"` [ -d "${TCB_BLDDIR}/$2/${DIR}" ] || mkdir -p "${TCB_BLDDIR}/$2/${DIR}" mv "$I" "${TCB_BLDDIR}/$2/${DIR}/" 2>/dev/null EMPTY=1 done if [ $EMPTY -eq 1 ];then # generate dep file for dep in $3 do echo -n -e "$dep.tcz\n" | sed "s:${RELEASE}:KERNEL:" >> ${TCB_BLDDIR}/$2.tcz.dep done fi fi cd ${TCB_BLDDIR} # license only in main extension #install_license $2 # remove empty dirs remove_empty_dirs "${TCB_BLDDIR}" cd ${CURRDIR} } tceunload() { # need file list to remove files from system if [ ! -e "${TCE_REPO}/optional/$1.tcz.list" ];then # try downloading echo "Downloading $TCEMIRROR/$1.tcz.list... " >> $LOGFILE wget "$TCEMIRROR/$1.tcz.list" -O "${TCE_REPO}/optional/$1.tcz.list" 1>/dev/null 2>>$LOGFILE if [ $? -eq 0 ];then chown tc:staff "${TCE_REPO}/optional/$1.tcz.list" else return; fi fi # Search for open files for openfile in `lsof | grep /tmp/tcloop/$1/` do pname=`echo $openfile | awk '{print $1}'` ppid=`echo $openfile | awk '{print $2}'` puser=`echo $openfile | awk '{print $3}'` pfile=`echo $openfile | awk '{print $9}'` log 1 "Found open file $pfile by process $pname (PID $ppid) from user $puser! Umount of extension maybe not possible." [ "$$" != "$ppid" ] && { log 0 "Killing $ppid." ; kill $ppid 2>>$LOGFILE ; } done # Umounting and erasing umount -f /tmp/tcloop/$1 || log 1 "Could not umount tcz $1." loopdev=`losetup | grep $1.tcz | cut -d: -f1` losetup -d $loopdev 1>>$LOGFILE 2>&1 && \ rmdir /tmp/tcloop/$1 1>>$LOGFILE 2>&1 || \ log 1 "Could not detach loop device $loopdev!" [ -e "/usr/local/tce.installed/$1" ] && rm /usr/local/tce.installed/$1 for file in `cat ${TCE_REPO}/optional/$1.tcz.list`; do [ -z `echo $file | grep init.d` ] || { log 0 "Trying to stop /$file..." ; sh /$file stop 1>>$LOGFILE 2>&1 ; sleep 2 ; } if [ -e "/$file" ] || [ -L "/$file" ];then log 0 "Removing /$file" rm -rf "/$file" fi done } generate_changelog () { # $1 must be desc file IFS=$'\n' tmpfile1=`mktemp` for i in `cat $1 | grep CHANGELOG | sed '/^\s*$/d'` do index=`echo $i | cut -d'[' -f2 | cut -d']' -f1` index5=`printf "%.5d" "$index"` entry=`echo $i | sed "s?#CHANGELOG\[.*\]?#CHANGELOG[${index5}]?"` echo "$entry" >> $tmpfile1 done for i in `cat $tmpfile1 | sort | sed '$d'` do entry="`echo $i | sed 's?#CHANGELOG.*=\"\(.*\)\"?\1?' | sed 's? ? ?'`" if [ -z "$CHANGELOG" ];then CHANGELOG="$entry" else CHANGELOG="$CHANGELOG $entry" fi done CURRENT="`cat $tmpfile1 | sort | tail -n 1 | sed 's?#CHANGELOG.*=\"\(.*\)\"?\1?' | sed 's? ? ?'`" IFS=$STDIFS rm $tmpfile1 } init_build () { # Initializing logfile init_logfile # get tce repo [ -z "${TCE_REPO}" ] && export TCE_REPO="`cat /opt/.tce_dir`" # Creating dirs busybox mkdir -p "${TCB_SRCDIR}" [ -d "${TCB_BLDDIR}" ] && busybox rm -rf "${TCB_BLDDIR}" busybox mkdir -p "${TCB_BLDDIR}/src" # Add debugging to build if DBG_PKG is set if [ -n "$DBG_PKG" ]; then # Remove omit frame pointer when debugging because it can lead to errors export CFLAGS="`echo ${CFLAGS} | sed 's/-fomit-frame-pointer//'` -g3 -DDEBUG" log 0 "Changed CFLAGS to ${CFLAGS}." export CXXFLAGS="${CXXFLAGS} -g3 -DDEBUG" log 0 "Changed CXXFLAGS to ${CXXFLAGS}." BASE_FLAGS="${BASE_FLAGS} --enable-debug" log 0 "Changed BASE_FLAGS to ${BASE_FLAGS}." fi # Remove old versions from tce repo and unload if loaded [ -n "${OVERWRITE_LOCAL}" ] && [ -d /tmp/tcloop/${PACKAGE} ] && tceunload ${PACKAGE} [ -n "${OVERWRITE_LOCAL}" ] && rm -f ${TCE_REPO}/optional/${PACKAGE}*.tcz* # Set date if possible if [ -e "/usr/local/bin/ntpclient" ] && [ $(online) -eq 0 ]; then log 0 "Adjusting time." ntpclient -s -c 1 -h 0.de.pool.ntp.org 1>>$LOGFILE 2>&1 else log 1 "Could not update time!" fi # Getting build deps if [ $(online) -eq 0 ];then for bbdep in ${BASE_BUILD_DEPS} ; do log 0 "Got $bbdep as base building dependency." if [ ! -d "/tmp/tcloop/$bbdep" ];then log 0 "Installing base build dep: $bbdep..." su -c "tce-load -wi $bbdep 1>/dev/null 2>&1" ${TCUSER} su -c "tce-load -i $bbdep 1>>$LOGFILE 2>&1" ${TCUSER} su -c "tce-load -i ${TCE_REPO}/optional/$bbdep.tcz 1>/dev/null 2>&1" ${TCUSER} else log 1 "Directory '/tmp/tcloop/$bbdep' already exists. Won't install." fi done for bdep in ${BUILD_DEPS} ; do log 0 "Got $bdep as building dependency." if [ ! -d "/tmp/tcloop/$bdep" ];then log 0 "Installing build dep: $bdep..." su -c "tce-load -wi $bdep 1>>$LOGFILE 2>&1" ${TCUSER} su -c "tce-load -i $bdep 1>>$LOGFILE 2>&1" ${TCUSER} su -c "tce-load -i ${TCE_REPO}/optional/$bdep.tcz 1>>$LOGFILE 2>&1" ${TCUSER} else log 1 "Directory '/tmp/tcloop/$bdep' already exists. Won't install." fi # trying to install dev package for extension if [ -z "`echo $bdep | grep "\-dev"`" ]; then if [ ! -d "/tmp/tcloop/$bdep-dev" ];then log 0 "Installing build dep development extension: $bdep-dev..." su -c "tce-load -wi $bdep-dev 1>>$LOGFILE 2>&1" ${TCUSER} su -c "tce-load -i $bdep-dev 1>>$LOGFILE 2>&1" ${TCUSER} su -c "tce-load -i ${TCE_REPO}/optional/$bdep-dev.tcz 1>>$LOGFILE 2>&1" ${TCUSER} else log 1 "Directory '/tmp/tcloop/$bdep-dev' already exists. Won't install." fi fi done # download list files from extensions download_lists else log 1 "No Internet connection available." fi # generating changelog from desc file generate_changelog "$1" # copy desc file to src folder if [ -z "${RENAME_TO}" ]; then mkdir -p "${TCB_BLDDIR}/src/${PACKAGE}" cp "$1" "${TCB_BLDDIR}/src/${PACKAGE}/${PACKAGE}.desc" else mkdir -p "${TCB_BLDDIR}/src/${RENAME_TO}" cp "$1" "${TCB_BLDDIR}/src/${RENAME_TO}/${RENAME_TO}.desc" fi } get_source () { # Erasing old source folder [ -d "${TCB_SRCDIR}/${PACKAGE}${SEP}${VERSION}" ] && rm -rf "${TCB_SRCDIR}/${PACKAGE}${SEP}${VERSION}" 2>/dev/null [ -d "${TCB_SRCDIR}/${RENAME_TO}${SEP}${VERSION}" ] && rm -rf "${TCB_SRCDIR}/${RENAME_TO}${SEP}${VERSION}" 2>/dev/null if [ ! -e "${TCB_SRCDIR}/${PACKAGE}${SEP}${VERSION}${PKG_EXT}" ];then case ${STYPE} in git) get_source_git ;; svn) get_source_svn ;; *) get_source_http ;; esac fi # Unpacking source if [ "${PKG_EXT}" = ".zip" ];then cd ${TCB_SRCDIR} unzip ${PACKAGE}${SEP}${VERSION}${PKG_EXT} 2>>$LOGFILE || log 2 "Failed to unzip." cd - else tar xf ${TCB_SRCDIR}/${PACKAGE}${SEP}${VERSION}${PKG_EXT} -C ${TCB_SRCDIR} 2>>$LOGFILE || log 2 "Failed to untar." fi update_files "${TCB_SRCDIR}" # Renaming folder if RENAME_TO set if [ -n "$RENAME_TO" ];then mv "${TCB_SRCDIR}/${PACKAGE}${SEP}${VERSION}" "${TCB_SRCDIR}/${RENAME_TO}${SEP}${VERSION}" export ORIG_NAME="${PACKAGE}" export PACKAGE="${RENAME_TO}" fi # Exporting variable TCB_SOURCE export TCB_SOURCE="${TCB_SRCDIR}/${PACKAGE}${SEP}${VERSION}" } get_source_http () { if [ $(online) -eq 0 ]; then log 0 "Downloading ${STYPE}://${MIRROR}/${PACKAGE}${SEP}${VERSION}${PKG_EXT}" ; wget --no-check-certificate -q "${STYPE}://${MIRROR}/${PACKAGE}${SEP}${VERSION}${PKG_EXT}" -O ${TCB_SRCDIR}/${PACKAGE}${SEP}${VERSION}${PKG_EXT} ; if [ $? -ne 0 ];then log 1 "Could not receive file, will try again with -src suffix." ; wget --no-check-certificate -q "${STYPE}://${MIRROR}/${PACKAGE}${SEP}${VERSION}-src${PKG_EXT}" -O ${TCB_SRCDIR}/${PACKAGE}${SEP}${VERSION}${PKG_EXT} || log 2 "Failed to download." ; fi else log 1 "No network connectivity?!" fi } get_source_git () { if [ ! -e /usr/local/tce.installed/git-2.6 ];then if [ $(online) -eq 0 ];then su -c "tce-load -wi git-2.6.tcz 1>/dev/null 2>&1" ${TCUSER} su -c "tce-load -i git-2.6.tcz 1>/dev/null 2>&1" ${TCUSER} echo "git:" >> ${ABLDEXTS} else log 2 "Could not download git." fi fi CURRDIR=`pwd` cd ${TCB_SRCDIR} ### downloading ### GITCMD=`which git` log 0 "Running ${GITCMD} clone ${STYPE}://${MIRROR}/${PACKAGE}.git ... " ${GITCMD} clone ${STYPE}://${MIRROR}/${PACKAGE}.git 1>>$LOGFILE 2>&1 || log 2 "Could not checkout git version." cd ${PACKAGE} git describe 1>/dev/null 2>&1 if [ $? -eq 0 ];then export VERSION=`git describe | sed 's/^v//'` else export VERSION=git`git log --pretty=oneline | wc -l` fi export PKG_EXT=".tar.gz" cd .. mv ${PACKAGE} ${PACKAGE}${SEP}${VERSION} tar czf ${PACKAGE}${SEP}${VERSION}.tar.gz ${PACKAGE}${SEP}${VERSION} sed -i -e "s%VERSION=\".*\"%VERSION=\"${VERSION}\"%" $DESCFILE sed -i -e "s%PKG_EXT=\".*\"%PKG_EXT=\".tar.gz\"%" $DESCFILE rm -rf ${PACKAGE}${SEP}${VERSION} cd ${CURRDIR} } get_source_svn () { if [ ! -e /usr/local/tce.installed/svn ];then if [ $(online) -eq 0 ];then su -c "tce-load -wi svn.tcz 1>/dev/null 2>&1" ${TCUSER} su -c "tce-load -i svn.tcz 1>/dev/null 2>&1" ${TCUSER} echo "svn:" >> ${ABLDEXTS} else log 2 "Could not download svn." fi fi CURRDIR=`pwd` cd ${TCB_SRCDIR} ### downloading ### SVNCMD=`which svn` ${SVNCMD} checkout ${MIRROR} ${PACKAGE} 1>>$LOGFILE 2>&1 || log 2 "Could not checkout svn version." cd ${PACKAGE} SVNVERS=`svn info | grep Revision | cut -d' ' -f2` export VERSION="svn${SVNVERS}" export PKG_EXT=".tar.gz" cd .. mv ${PACKAGE} ${PACKAGE}${SEP}${VERSION} tar czf ${PACKAGE}${SEP}${VERSION}.tar.gz ${PACKAGE}${SEP}${VERSION} sed -i -e "s%VERSION=\".*\"%VERSION=\"${VERSION}\"%" $DESCFILE sed -i -e "s%PKG_EXT=\".*\"%PKG_EXT=\".tar.gz\"%" $DESCFILE rm -rf ${PACKAGE}${SEP}${VERSION} cd ${CURRDIR} } download_lists () { for extension in `ls ${TCE_REPO}/optional/*.tcz` do if [ ! -f "$extension.list" ] || [ ! -s "$extension.list" ]; then # KERNEL variable? extension=`echo $extension | sed "s:KERNEL:${RELEASE}:"` su -c "wget -q ${TCEMIRROR}/`basename $extension`.list -O $extension.list" ${TCUSER} && { log 0 "Downloaded $extension.list." ; } || { log 1 "Could not download `basename $extension`.list." ; } fi done } check_run_deps () { [ ! -d "${TCB_BLDDIR}/$1" ] && return CURRDIR=`pwd` cd ${TCB_BLDDIR} log 0 "Recursively checking deps of modules and binaries for package $1." templist=`mktemp` for item in `find $1 -name "*.so" -o -wholename "*bin/*" | tr '\n' ' '` do log 0 " + Checking deps of file `basename $item`." ldd $item 2>/dev/null | grep "local\|not found" 1>/dev/null 2>&1 if [ $? -ne 0 ];then log 0 " - No additional deps needed for $item." else for moddep in `ldd $item 2>/dev/null | grep "local\|not found" | awk '{print \$1}' | tr '\n' ' '` do log 0 " + Found module dep: $moddep." MISSINGLIB=1 # dep must be in build folder itself or... tempval=`find ${TCB_BLDDIR} -name $moddep` [ ! -z "$tempval" ] && { tempname=`basename $(find ${TCB_BLDDIR} -name $moddep | sed 's:\(.*\)/usr/local/.*:\1:')` ; MISSINGLIB=0 ; log 0 " => satisfied by : *** $tempname.tcz *** " ; } # ..in any list file of TCE_REPO if [ ${MISSINGLIB} -eq 1 ];then for listfile in `ls ${TCB_BLDDIR}/*.list ${TCE_REPO}/optional/*.list 2>/dev/null` do grep -e "/$moddep\$" $listfile 1>/dev/null 2>&1 && { log 0 " => satisfied by : *** `basename $listfile | sed 's/\.list//'` *** " ; echo $listfile | sed 's/\.list//' >> $templist ; MISSINGLIB=0 ; break ; } done fi # ...still missing, dep not found! if [ ${MISSINGLIB} -eq 1 ];then log 1 " CRITICAL: Dependency ${moddep} not found!" fi done fi done # sort dep file, deps with most own deps first cat $templist | sort | uniq | sed 's:.*/\(.*\):\1:g' > ${TCB_BLDDIR}/src/${PACKAGE}/${1}.tcz.dep-auto rm -f $templist if [ ! -e ${TCB_BLDDIR}/${1}.tcz.dep ];then echo "${YELLOW} * Warning: No $1.tcz.dep file found!${NORMAL}" fi for extensionfile in `cat ${TCB_BLDDIR}/src/${PACKAGE}/${1}.tcz.dep-auto | tr '\n' ' '` ; do grep $extensionfile ${TCB_BLDDIR}/$1.tcz.dep 1>/dev/null 2>&1 [ $? -ne 0 ] && echo "${YELLOW} * Warning: ${WHITE}$1.tcz${YELLOW} probably needs ${RED}$extensionfile${YELLOW} as dep!${NORMAL}" done cd ${CURRDIR} } configure_source () { # Starting configuration [ -n "${TCB_SOURCE}" ] && update_files "${TCB_SOURCE}" && cd "${TCB_SOURCE}" || log 2 "Could not cd to source dir!" if [ -n "${BOOTSTRAP}" ]; then [ -e "./bootstrap" ] && ./bootstrap 1>>$LOGFILE 2>&1 fi if [ -z "${NO_AUTOTOOLS}" ];then [ -e "./autogen.sh" ] && ./autogen.sh 1>>$LOGFILE 2>&1 [ -e "./configure.ac" ] && [ -e "/usr/local/bin/autoreconf" ] && autoreconf -vfi 1>>$LOGFILE 2>&1 [ -e "./acconfig.h" ] && [ -e "/usr/local/bin/autoreconf" ] && autoreconf -vfi 1>>$LOGFILE 2>&1 [ -e "/usr/local/bin/autoscan" ] && autoscan 1>>$LOGFILE 2>&1 fi if [ -e "${CONFIGURE_CMD}" ];then echo "+++++++++++++++++++++++++++ ./configure --help ++++++++++++++++++++++++++++++++" >> $LOGFILE ${CONFIGURE_CMD} --help 1>>${LOGFILE} 2>&1 echo "++++++++++++++++++++++++++ end of configure help +++++++++++++++++++++++++++++++" >> $LOGFILE trap 'cat ${LOGFILE} && exit 0' SIGINT echo "${WHITE}------------------------------------------------------------------------" echo -n -e " Configure help and build log can be found in:\n\t\t ${MAGENTA}`realpath ${LOGFILE}`${WHITE}.\n" echo " Press Ctrl + C to quit and show it now." echo " Waiting 10 seconds... " echo "------------------------------------------------------------------------${NORMAL}" sleep 10 trap - SIGINT echo -n -e "${YELLOW} * Configuring source... \t\t\t\t\t${NORMAL}" ${CONFIGURE_CMD} ${BASE_FLAGS} ${FLAGS} 1>>$LOGFILE 2>&1 && success || fail else if [ -n "${CONFIGURE_CMD}" ];then log 0 "Executing special configure command: ${CONFIGURE_CMD} in `pwd`." echo -n -e "${YELLOW} * Configuring source... \t\t\t\t\t${NORMAL}" eval "${CONFIGURE_CMD} ${BASE_FLAGS} ${FLAGS}" 1>>$LOGFILE 2>&1 && success || fail else echo echo ${RED}WARNING: No configure script found!${NORMAL} fi fi if [ -e "config.log" ];then log 0 "Checking for not found files from config.log:" grep "No such file" config.log 1>>$LOGFILE 2>&1 fi if [ -n "${AFTER_CONFIGURE_CMD}" ];then eval "${AFTER_CONFIGURE_CMD}" fi } make_build () { [ -n "${TCB_SOURCE}" ] && cd "${TCB_SOURCE}" || log 2 "Could not cd to source dir!" # Building echo -n -e "${YELLOW} * Making... \t\t\t\t\t\t\t${NORMAL}" if [ -n "${MAKE_CMD}" ];then log 0 "Executing make command ${MAKE_CMD}... " eval "${MAKE_CMD}" 1>>$LOGFILE 2>&1 && success || fail else log 2 "No MAKE_CMD given." fi if [ -n "${MAKE_TEST_CMD}" ];then log 0 "Executing test." eval "${MAKE_TEST_CMD}" 1>>$LOGFILE 2>&1 else log 0 "No MAKE_TEST_CMD given." fi # Installing echo -n -e "${YELLOW} * Installing... \t\t\t\t\t\t${NORMAL}" mkdir -p ${TCB_BLDDIR}/${PACKAGE} if [ -n "${NO_DESTDIR}" ];then tmp_install /usr/local && success || fail else export INSTALL_ROOT="${TCB_BLDDIR}/${PACKAGE}" export DESTDIR="${TCB_BLDDIR}/${PACKAGE}" eval "${MAKE_INSTALL_CMD}" 1>>$LOGFILE 2>&1 && success || fail [ -n "${AFTER_INSTALL_CMD}" ] && eval ${AFTER_INSTALL_CMD} 1>>$LOGFILE 2>&1 fi } create_start_script () { # $1 should be package name, if empty then use ${PACKAGE} [ -z "$1" ] && PKG=${PACKAGE} || PKG=$1 [ ! -d "${TCB_BLDDIR}/${PKG}" ] && log 2 "Did not find extension folder for specified start script." # Create start script and put to first free var from SS1 to SS4 if [ ! -e "${TCB_BLDDIR}/${PKG}/usr/local/tce.installed/${PKG}" ];then mkdir -p ${TCB_BLDDIR}/${PKG}/usr/local/tce.installed touch ${TCB_BLDDIR}/${PKG}/usr/local/tce.installed/${PKG} chmod -R 775 ${TCB_BLDDIR}/${PKG}/usr/local/tce.installed chown -R root:staff ${TCB_BLDDIR}/${PKG}/usr/local/tce.installed echo "#!/bin/sh" >> ${TCB_BLDDIR}/${PKG}/usr/local/tce.installed/${PKG} [ -z "${SS1}" ] && export SS1=${TCB_BLDDIR}/${PKG}/usr/local/tce.installed/${PKG} && DONE=1 && log 0 "Created start script $SS1." [ -z "${DONE}" ] && [ -z "${SS2}" ] && export SS2=${TCB_BLDDIR}/${PKG}/usr/local/tce.installed/${PKG} && DONE=1 && log 0 "Created start script $SS2." [ -z "${DONE}" ] && [ -z "${SS3}" ] && export SS3=${TCB_BLDDIR}/${PKG}/usr/local/tce.installed/${PKG} && DONE=1 && log 0 "Created start script $SS3." [ -z "${DONE}" ] && [ -z "${SS4}" ] && export SS4=${TCB_BLDDIR}/${PKG}/usr/local/tce.installed/${PKG} && DONE=1 && log 0 "Created start script $SS4." [ -z "${DONE}" ] && log 2 "No more free start scripts!" fi } rename_config_files () { # renaming config files so that they are writable for user # renaming mandatory config files and edit start script of extension # to automatically copy one file to system if [ -n "${CONF_MASK}" ];then for conffile in `find ${TCB_BLDDIR}/${PACKAGE} ${CONF_MASK}` do cfile=$(basename $conffile) echo -e "${YELLOW} * Renaming ${BLUE}$cfile ${YELLOW}to ${WHITE}$cfile.sample.${NORMAL}\t\t\t" mv $conffile $conffile.sample 2>/dev/null done fi if [ -n "${CONF_MAND_MASK}" ];then for conffile in `find ${TCB_BLDDIR}/${PACKAGE} ${CONF_MAND_MASK}` do [ -z "${DONE}" ] && create_start_script $1 DONE=1 cfile=$(basename $conffile) echo -e "${YELLOW} * Renaming ${BLUE}$cfile ${YELLOW}to ${WHITE}$cfile.sample.${NORMAL}\t\t\t" echo -e "${YELLOW} * Putting ${WHITE}$cfile ${YELLOW}to startup script.${NORMAL}\t\t\t" mv $conffile $conffile.sample 2>/dev/null relfile=`echo $conffile | sed "s%${TCB_BLDDIR}/${PACKAGE}%%"` echo "[ ! -e $relfile ] && busybox cp $relfile.sample $relfile" >> ${SS1} done fi } work_build () { cd ${TCB_BLDDIR} # strip and or compress executable files strip_compress_files # Remove man and doc or let it be # First: compress man pages for mandir in `find ${TCB_BLDDIR}/${PACKAGE} -type d -name man`; do for manfile in `find $mandir -type f -name *.1 -o -name *.2 -o -name *.3 -o -name *.4 -o -name *.5 -o -name *.6 -o -name *.7 -o -name *.8`; do log 0 "Compressing man file $manfile." eval "${COMPRESSOR} $manfile" done done # debug package if [ -n "${DBG_PKG}" ]; then log 0 "Creating debug extension ${PACKAGE}-dbg." to_new_extension "-name *.dbg" "${PACKAGE}-dbg" "${PACKAGE} gdb" fi # Check for removing, excorp., etc. if [ -n "${DOC_MASK}" ];then if [ "${DOC_MASK}" = "remove" ];then find ${TCB_BLDDIR}/${PACKAGE} -type d -a \( -name man -o -name manual -o -name info -o -name doc \) | xargs rm -rf else log 0 "Creating doc extension ${PACKAGE}-doc." to_new_extension "${DOC_MASK}" "${PACKAGE}-doc" "${PACKAGE} man" fi fi # Renaming confs rename_config_files ${PACKAGE} # Splitting into dev and main if [ -n "${DEV_MASK}" ];then log 0 "Creating dev extension ${PACKAGE}-dev." to_new_extension "${DEV_MASK}" "${PACKAGE}-dev" "${PACKAGE}" fi # excorporating locale if [ -n "${LOCALE_MASK}" ];then log 0 "Creating locale extension ${PACKAGE}-locale." to_new_extension "${LOCALE_MASK}" "${PACKAGE}-locale" "${PACKAGE}" fi # rm empty dirs remove_empty_dirs "${TCB_BLDDIR}" # copy license and author files install_license ${PACKAGE} } remove_empty_dirs() { # $1 should be build dir find $1 -depth -type d -not -name "src" -empty -exec echo "Removing empty {}." >> $LOGFILE \; -a -exec rmdir {} \; } package_build () { mkdir -p ${TCB_BLDDIR}/src/${PACKAGE} cd ${TCB_BLDDIR} for i in $(find `ls` -maxdepth 0 -type d -not -name "src" | cut -d'/' -f1); do # deps RUN_DEPSA="${RUN_DEPS}" # checking for perl dep if [ -z "${NO_PERL}" ];then [ `check_perl $i` -eq 0 ] && RUN_DEPSA="${RUN_DEPS} perl5" fi if [ "$i" = "${PACKAGE}" ];then for each in ${RUN_DEPSA}; do echo -n -e "${each}.tcz\n" | sed "s:${RELEASE}:KERNEL:" >> $i.tcz.dep; done fi # check running deps check_run_deps ${i} # fitting in description, first normal package, then dev, locale, doc [ "$i" = "${PACKAGE}" ] && DESCRIPTIONA="${DESCRIPTION}" [ -n "`echo $i | grep '\-dev'`" ] && DESCRIPTIONA="${DESCRIPTION} - dev files" [ -n "`echo $i | grep '\-locale'`" ] && DESCRIPTIONA="${DESCRIPTION} - locale data" [ -n "`echo $i | grep '\-doc'`" ] && DESCRIPTIONA="${DESCRIPTION} - doc files" [ -n "`echo $i | grep '\-lib'`" ] && DESCRIPTIONA="${DESCRIPTION} - library files" [ -n "`echo $i | grep '\-dbg'`" ] && DESCRIPTIONA="${DESCRIPTION} - debuginfo files" [ -n "`echo $i | grep '\-bin'`" ] && DESCRIPTIONA="${DESCRIPTION} - binary files" if [ -z "${DESCRIPTIONA}" ];then # non standard package DESCRIPTIONA="$i - extension made from ${PACKAGE}" fi if [ -z "${NO_OWN_MOD}" ];then chmod -R g-s $i chown -R root:staff $i fi find $i -name tce.installed -exec chmod -R 775 {} \; mksquashfs $i $i.tcz -info 1>>$LOGFILE 2>&1 SIZE=`du -h $i.tcz | cut -f 1 2>/dev/null` [ $? -eq 0 ] && echo -e "${YELLOW} * Built extension: \t\t *** ${WHITE}$i.tcz ($SIZE)${YELLOW} ***${NORMAL}" || echo "${RED}Build failed${NORMAL}." md5sum $i.tcz > $i.tcz.md5.txt zsyncmake $i.tcz 1>>$LOGFILE 2>&1 find $i ! -type d | sed "s%[a-zA-Z0-9\._\-]*/\(.*\)%\1%" |sort > $i.tcz.list ### License ### if [ -e "${TCB_BLDDIR}/$i/usr/local/share/doc/License/$i.txt" ];then LICENSEA="${LICENSE} (see /usr/local/share/doc/License/$i.txt)" elif [ -e "${TCB_BLDDIR}/$i/usr/local/share/doc/License/$i-copying.txt" ];then LICENSEA="${LICENSE} (see /usr/local/share/doc/License/$i-copying.txt)" else LICENSEA="${LICENSE}" fi ### Authors ### [ -e "${TCB_BLDDIR}/$i/usr/local/share/doc/License/$i-authors.txt" ] && AUTHORSA="${AUTHORS} (see /usr/local/share/doc/License/$i-authors.txt)" || AUTHORSA="${AUTHORS}" if [ -z "`grep -v local $i.tcz.list`" ];then COMMENTSA="${COMMENTS} --- This extension is PPI compatible." fi cat < $i.tcz.info Title: $i.tcz Description: ${DESCRIPTIONA} Version: ${VERSION} Author: ${AUTHORSA} Original-site: ${HOMEPAGE} Copying-policy: ${LICENSEA} Size: ${SIZE} Extension_by: ${MAINTAINER} Comments: ${COMMENTSA} Change-log: ${CHANGELOG} Current: ${CURRENT} EOF # clean up DESCRIPTIONA="" COMMENTSA="" AUTHORSA="" LICENSEA="" # removing rm -rf $i done # remove empty dep-auto files from source find ${TCB_BLDDIR}/src/${PACKAGE}/ -type f -size 0 -exec rm -f {} \; # copy and compress log file cp $LOGFILE ${TCB_BLDDIR}/src/${PACKAGE}/${PACKAGE}.log xz -z -9 ${TCB_BLDDIR}/src/${PACKAGE}/*.log # set user rights to tc user chown -R tc:staff ./* if [ -n "${OVERWRITE_LOCAL}" ];then for extfile in `find ${TCB_BLDDIR} -name \*.tcz\*` ; do extname=`basename $extfile` su -c "cp $extfile ${TCE_REPO}/optional/" ${TCUSER} chmod 664 ${TCE_REPO}/optional/${extname} if [ -n "`echo $extname | grep .tcz.dep`" ];then sed -i "s:KERNEL:${RELEASE}:g" ${TCE_REPO}/optional/${extname} fi done fi cd ${TCB_SRCDIR} if [ -z "${ORIG_NAME}" ]; then cp ${PACKAGE}${SEP}${VERSION}${PKG_EXT} ${TCB_BLDDIR}/src/${PACKAGE}/${PACKAGE}${SEP}${VERSION}${PKG_EXT} else cp ${ORIG_NAME}${SEP}${VERSION}${PKG_EXT} ${TCB_BLDDIR}/src/${PACKAGE}/${ORIG_NAME}${SEP}${VERSION}${PKG_EXT} fi cd ${TCB_BLDDIR}/src/${PACKAGE} for archive in `ls *`; do archext=${archive##*.} archname=${archive%.*} case $archext in gz|tgz) gunzip $archive ;; bz2|tbz2) bunzip2 $archive ;; zip) unzip -d $archname $archive ; tar cf $archname.tar $archname ; rm -f $archive ; archname=$archname.tar ;; *) echo noop >/dev/null ;; esac for tarfile in `find . -name *.tar`; do echo -e -n "${YELLOW} * Compressing source: ${BLUE}$archname.xz ... \t\t" xz -9 -z $tarfile && success || fail done done } clean_up() { # unset vars unset PACKAGE ORIG_NAME RENAME_TO CFLAGS CXXFLAGS LDFLAGS CPPFLAGS PKG_CONFIG_PATH LANG LANGUAGE LC_ALL SS1 SS2 SS3 SS4 TCB_SOURCE VERSION PKG_EXT INSTALL_ROOT DESTDIR TCE_REPO LOGFILE # Removing dummy files for file in ${DUMMY_FILES} ; do log 0 "Removing dummy file $file." rm $file done } upload_to_repo() { if [ $(online) -eq 0 ] && [ -f "`dirname $1`/my.repo" ];then . "`dirname $1`/my.repo" huser=`echo $MYREPO | cut -d@ -f1` hhost=`echo $MYREPO | cut -d@ -f2 | cut -d: -f1` hpath=`echo $MYREPO | cut -d: -f2 | sed 's%~/public_html%%'` scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -r ${TCB_BLDDIR}/* $MYREPO 1>/dev/null [ $? -ne 0 ] && exit 1 for ext in `ls ${TCB_BLDDIR}/../*.tar.gz.bfe`;do echo "${YELLOW} * Release:${WHITE} http://${hhost}/~${huser}${hpath}/`basename $ext`${NORMAL}" done fi } create_initd_script() { # $1 extension name e.g. pcsc-lite # $2 path to daemon file e.g. /usr/local/sbin/pcscd # $3 user:group for daemon e.g. "pcscd:pcscd" # $4 path to pid file e.g. /var/run/pcscd.pid # $5 daemon options e.g. "-p /var/run/pcscd.pid -l /var/log/pcscd.log" initscript="${TCB_BLDDIR}/$1/usr/local/etc/init.d/`basename $2`" if [ -d "${TCB_BLDDIR}/$1" ]; then log 0 "Creating initd script: $initscript... " mkdir -p `dirname $initscript` cat < $initscript #!/bin/sh DAEMON=$2 DAEMON_NAME=`basename $2` DAEMON_PIDFILE=$4 DAEMON_OPTS="$5" DAEMON_USER=`echo $3 | cut -d: -f1` DAEMON_GROUP=`echo $3 | cut -d: -f2` start() { if [ -x \${DAEMON} ] && [ ! -e \${DAEMON_PIDFILE} ]; then mkdir -p \$(dirname \${DAEMON_PIDFILE}) 2>/dev/null echo Starting \${DAEMON_NAME}... \${DAEMON} \${DAEMON_OPTS} fi } stop() { if [ -e \${DAEMON_PIDFILE} ] || [ -n "\$(pidof \${DAEMON_NAME})" ]; then echo Stopping \${DAEMON_NAME}... kill \$(cat \${DAEMON_PIDFILE}) if [ \$? -ne 0 ]; then killall \${DAEMON_NAME} rm -f \${DAEMON_PIDFILE} 2>/dev/null fi sleep 1 fi } status() { RUNNING=\$(pidof \${DAEMON_NAME}) if [ -z "\${RUNNING}" ]; then echo "Running no \${DAEMON_NAME} services." else echo Running \${DAEMON_NAME} services with pids: \$(pidof \${DAEMON_NAME}). fi } case \$1 in start) start ;; stop) stop ;; restart) stop ; start ;; status) status ;; *) echo "Usage: \$0 [start|stop|restart|status]" ;; esac EOF chmod 755 $initscript fi } create_wbar_icon() { # $1 - package name # $2 - icon path (will be renamed) # $3 - command to execute if [ -n "$1" ] && [ -n "$2" ] && [ -n "$3" ];then mkdir -p ${TCB_BLDDIR}/$1/usr/local/share/applications 2>/dev/null mkdir -p ${TCB_BLDDIR}/$1/usr/local/share/pixmaps 2>/dev/null FEXT=${2##*.} cp "$2" "${TCB_BLDDIR}/$1/usr/local/share/pixmaps/$1.${FEXT}" cat < ${TCB_BLDDIR}/$1/usr/local/share/applications/$1.desktop [Desktop Entry] Type=Application Name=$1 Exec=$3 Icon=$1 X-FullPathIcon=/usr/local/share/pixmaps/$1.${FEXT} Categories=GNOME;Network; EOF fi } ############## run script ################# init_build "$DESCFILE" get_source if [ $(fn_exists configure_special_source) -eq 0 ];then echo -e -n "${YELLOW} * Editing source... \t\t\t\t\t\t" configure_special_source fi configure_source make_build work_build if [ $(fn_exists work_special_build) -eq 0 ];then echo -e -n "${YELLOW} * Special adjustments... \t\t\t\t\t" work_special_build fi package_build clean_up upload_to_repo $0 ########### end of script ##############