#!/bin/sh ###################################################### ## src2slack ## ## ## ## Slackware Package Creator/Editor ## ## ## ## Everything in this script is under GPL ## ## You have permission to copy it/change it ## ## ## ## I see no need in making package for one file, so ## ## -> copy this file in /usr/sbin and chmod +x ## ## ## ## Config file will be saved in /root/.src2slackrc ## ## When you make upgrades, config settings will not ## ## be overwritten ## ## ## ## Note #1: function set_arch_vars ## ## This function's content is from: ## ## http://www.slackware.com/~alien/ ## ## Copyright (c) 2007 Eric Hameleers ## ## ## ## All rights reserved. ## ## ## ###################################################### ## ## ChangeLog: ## 0.65: autogen.sh and configure bugs repaired ## 0.64: function get_slackware_dir removed ## added special code for myththemes ## 0.63: special code for mythtv package ## improved SlackBuild file ## ###################################################### ###################################################### ## ## Don't change these settings, use /root/.src2slackrc ## ## where to save packages on your machine ## package and all configure files will be saved in a subdirectory ## like this: $LOCAL_PACKAGE_DIR/mplayer LOCAL_PACKAGE_DIR=/tmp/packages ## save packages in version folder. ## like this: $LOCAL_PACKAGE_DIR/mplayer/1.0 LOCAL_PACKAGE_DIR_PER_VERSION=n ## package name architecture (default i486) ## possible values are: i386, i486, i686, s390, powerpc, x86_64, athlon-xp PACKAGE_ARCHITECTURE=i486 ## package name ending (ex. MPlayer-1.0-i686-1mm, "mm" is package name ending) PACKAGE_NAME_ENDING=mm ## do you want convert package name to lower case? ## usually all slackware package have lower case names (MPlayer => mplayer) PACKAGE_NAME_TO_LOWERCASE=y ## last line in package description (it could be your comment) ## comment out this line to disable it PACKAGE_DESCRIPTION_LAST_LINE="Packaged by MM: http://slackware.php.co.ba" ## create md5 checksum file. usefull if other people download your packages ## it will be named: $PACKAGE_NAME.md5 CREATE_MD5_CHECKSUM=y ## create SlackBuild file, which can be used w/o src2slack for creating packages ## i.e. run this to create package: ./mplayer.SlackBuild mplayer-1.0.tar.bz2 CREATE_SLACKBUILD=y ## where to extract source archive if you run "src2slack source-archive.tar.bz2"? ## default value is "." which describes the folder where you are currently being TMP_SOURCE_EXTRACT_DIR="." ## remove $TMP_SOURCE_EXTRACT_DIR after finishing with making package ## this will be only used if the source archive was unpacked TMP_SOURCE_EXTRACT_DIR_REMOVE=y ## where to put TMP files. Usually it looks like this: $TMP_PACKAGE_DIR/MPlayer-1.0rc2 TMP_PACKAGE_DIR=/tmp ## remove tmp files? TMP_PACKAGE_DIR_REMOVE=y ## FTP settings for transfering file(s) to FTP repository FTP_COPY_ENABLE=y ## "n" disables FTP copying FTP_COPY_WO_ASKING=n ## it will copy without asking you for permission every time FTP_COPY_DEFAULT=n ## default answer when asking you whether you want to copy FTP_COPY_RETRIES=3 ## how many retries FTP_HOST=ftp.your-host ## FTP host FTP_DIR=. ## FTP folder ("." is the default user's folder) FTP_USER=your_username ## FTP user FTP_PASS=your_password ## FTP password ## editor which you want to use to edit description TEXTEDITOR=vi ## default values for questions ASK_FOR_EXTRACTED_FILES_LIST=y ## offer user to see list of extracted files WRITE_DESCRIPTION_DEFAULT=y ## default answer whether you want to write pkg description OVERWRITE_ALREADY_EXTRACTED_DEFAULT=n ## default answer whether you want overwrite already extracted files CONFIGURE_DEFAULT=y ## default answer whether you want to run ./configure CONFIGURE_OPTIONS_DEFAULT=y ## default answer whether you want to use default configure options INSTALL_PACKAGE_DEFAULT=n ## default answer whether you want install package uppon creation ########################################################################## SRC2SLACK_VER=0.65 show_header() { echo echo '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' echo '++' echo '++ Name: src2slack v.'$SRC2SLACK_VER echo '++ Author: derliebegott@gmail.com' echo '++' echo '++ Slackware Package Creator/Editor' echo '++' echo '++ Usage: src2slack --help' echo '++' echo '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' echo } show_error() { echo $1 echo echo " Exiting ..." echo exit } check_root() { ## I like whoami more if [ `whoami` != "root" ]; then show_error "You have to be root to run src2slack." fi } set_arch_vars() { # This function's content is from alien's slackbuilds: # http://www.slackware.com/~alien/ # Copyright (c) 2007 Eric Hameleers # All rights reserved. # # Slackware 11 and up need other option (gcc > 3.3.x) if [ `gcc -dumpversion | tr -d '.' |cut -c 1-2` -gt 33 ]; then MOPT=tune else MOPT=cpu fi case "$PACKAGE_ARCHITECTURE" in i386) SLKCFLAGS="-O2 -march=i386 -m${MOPT}=i686" SLKLDFLAGS=""; LIBDIRSUFFIX="" ;; i486) SLKCFLAGS="-O2 -march=i486 -m${MOPT}=i686" SLKLDFLAGS=""; LIBDIRSUFFIX="" ;; i686) SLKCFLAGS="-O3 -march=i686 -m${MOPT}=i686" SLKLDFLAGS=""; LIBDIRSUFFIX="" ;; s390) SLKCFLAGS="-O2" SLKLDFLAGS=""; LIBDIRSUFFIX="" ;; powerpc) SLKCFLAGS="-O2" SLKLDFLAGS=""; LIBDIRSUFFIX="" ;; x86_64) SLKCFLAGS="-O2 -fPIC" SLKLDFLAGS="-L/usr/lib64"; LIBDIRSUFFIX="64" ;; athlon-xp) SLKCFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer" SLKLDFLAGS=""; LIBDIRSUFFIX="" ;; *) echo "Unknown architecture: $PACKAGE_ARCHITECTURE" show_error "Allowed values: i386, i486, i686, s390, powerpc, x86_64, athlon-xp" esac } check_makefile() { ! [ -e Makefile ] && show_error "File \"Makefile\" is not available." } create_package_dir() { chown -R root:root . chmod -R u+w,go+r-w,a-s . APPLICATION_BASENAME=`basename $PWD` if [ "$PACKAGE_NAME_TO_LOWERCASE" == "y" ]; then echo "Package name will be lowercased." echo APPLICATION_BASENAME_ORIGINAL="$APPLICATION_BASENAME" APPLICATION_BASENAME=`echo $APPLICATION_BASENAME | tr "[:upper:]" "[:lower:]"` fi APPLICATION_NAME=`echo -n $APPLICATION_BASENAME | sed -re 's/^(.*)(\-.*?)$/\1/'` APPLICATION_VERSION=`echo -n $APPLICATION_BASENAME | sed -re 's/^(.*\-)(.*?)$/\2/'` if [[ "$APPLICATION_VERSION" == "$APPLICATION_NAME" ]]; then APPLICATION_VERSION=`date +%Y%m%d` fi APPLICATION_NAME_VERSION="$APPLICATION_NAME-$APPLICATION_VERSION" if [ "$LOCAL_PACKAGE_DIR_PER_VERSION" == "y" ]; then LOCAL_PACKAGE_DIR="$LOCAL_PACKAGE_DIR/$APPLICATION_NAME/$APPLICATION_VERSION" else LOCAL_PACKAGE_DIR="$LOCAL_PACKAGE_DIR/$APPLICATION_NAME" fi ! [ -d $LOCAL_PACKAGE_DIR ] && mkdir -p $LOCAL_PACKAGE_DIR } get_filename() { echo "Checking package dir ($LOCAL_PACKAGE_DIR) for existing (old) packages..." PACKAGE_NAME_BEGINNING=$APPLICATION_NAME_VERSION-$PACKAGE_ARCHITECTURE i=1 if [ -e "$LOCAL_PACKAGE_DIR/$PACKAGE_NAME_BEGINNING-$i$PACKAGE_NAME_ENDING.tgz" ]; then while [ $i -lt 100 ]; do echo "Found: $PACKAGE_NAME_BEGINNING-$i$PACKAGE_NAME_ENDING" let "i=$i + 1" if [ ! -e "$LOCAL_PACKAGE_DIR/$PACKAGE_NAME_BEGINNING-$i$PACKAGE_NAME_ENDING.tgz" ]; then PACKAGE_NAME=$PACKAGE_NAME_BEGINNING-$i$PACKAGE_NAME_ENDING break fi done echo else PACKAGE_NAME=$PACKAGE_NAME_BEGINNING-1$PACKAGE_NAME_ENDING fi APPLICATION_BUILD=$i echo -n "Use this package name: [$PACKAGE_NAME] " read answer if [ -z "$answer" ]; then PACKAGE_NAME="$PACKAGE_NAME".tgz else APPLICATION_BUILD=`echo -n $answer | sed -re 's/(.*\-)([0-9]+)(.*)$/\2/'` PACKAGE_NAME="$answer".tgz fi } want_write_description() { echo echo -n "Do you want to write package description ([y]es|[n]o|[f]ile): [$WRITE_DESCRIPTION_DEFAULT] " read answer case "$answer" in "f" | "n" | "y") DESCRIPTION_WANT_ANSWER=$answer;; "" ) DESCRIPTION_WANT_ANSWER="$WRITE_DESCRIPTION_DEFAULT";; *) echo echo "Invalid value: '$answer'. Available answers: 'y' or 'n' or 'f' or hit ENTER for default ('$WRITE_DESCRIPTION_DEFAULT')." want_write_description ;; esac } get_pkgname_spaces() { i=0 while [ "$i" -lt ${#APPLICATION_NAME} ]; do echo -ne ' ' let "i=$i + 1" done } get_description() { want_write_description if [[ "$DESCRIPTION_WANT_ANSWER" == "y" ]] || [[ "$DESCRIPTION_WANT_ANSWER" == "f" ]]; then DESC_TMP_IO_FILE="/tmp/$APPLICATION_NAME.desc.tmp" USE_EXISTING_DESC=1 ## is there an old description file? if [ -e "$LOCAL_PACKAGE_DIR/slack-desc" ]; then cat "$LOCAL_PACKAGE_DIR/slack-desc" > "$DESC_TMP_IO_FILE" fi ## use it or not? if [ -e "$DESC_TMP_IO_FILE" ]; then echo echo "Found description file with this content:" echo cat "$DESC_TMP_IO_FILE" echo echo -n "Do you want to use the description from this file for your package ([y]es|[n]o): [y] " read USE_EXISTING_DESC fi if [[ -e "$DESC_TMP_IO_FILE" ]] && [[ $USE_EXISTING_DESC != "n" ]]; then edit_description else rm "$DESC_TMP_IO_FILE" > /dev/null 2>&1 if [ "$DESCRIPTION_WANT_ANSWER" == "y" ]; then echo echo "Enter here your package description. Try to enter a full description and" echo "not just 1-2 words. You can also use new lines by using ENTER. Last line" echo "has to be 'EOF' to know where package description ends. You can also just" echo "press ENTER until the last line and script will finish it automaticaly." get_pkgname_spaces echo "|---------------------------- Description -----------------------------|" write_description get_pkgname_spaces echo "|---------------------------- Description -----------------------------|" put_description_in_tmp elif [ "$DESCRIPTION_WANT_ANSWER" == "f" ]; then echo echo "Enter the path to the file with package description." echo -n "Don't forget that description file has to have right format: " read answer if [ ! -e $answer ]; then echo echo -n "File '$answer' does not exist. Please check your path." get_description else get_description_from_file $answer put_description_in_tmp fi fi edit_description fi ## save description cat "$DESC_TMP_IO_FILE" > "$LOCAL_PACKAGE_DIR/slack-desc" fi } write_description() { if [ ! $1 ]; then i=8 else i=$1 fi if [[ $PACKAGE_DESCRIPTION_LAST_LINE != "" ]]; then last_desc_line_nr=17 else last_desc_line_nr=18 fi echo -n $APPLICATION_NAME': ' read answer if [[ "$answer" != "EOF" ]] && [[ "$i" != "$last_desc_line_nr" ]]; then DESCRIPTION[$i]=$APPLICATION_NAME': '"$answer" let "i=$i + 1" write_description $i fi DESCRIPTION[0]="# HOW TO EDIT THIS FILE:" DESCRIPTION[1]="# The \"handy ruler\" below makes it easier to edit a package description. Line" DESCRIPTION[2]="# up the first '|' above the ':' following the base package name, and the '|'" DESCRIPTION[3]="# on the right side marks the last column you can put a character in. You must" DESCRIPTION[4]="# make exactly 11 lines for the formatting to be correct. It's also" DESCRIPTION[5]="# customary to leave one space after the ':'." DESCRIPTION[6]="" DESCRIPTION[7]="|-----handy-ruler------------------------------------------------------|" ## fill the rest, because description must have 11 lines while [ "$i" -le $last_desc_line_nr ]; do DESCRIPTION[$i]=$APPLICATION_NAME': ' let "i=$i + 1" done if [[ $PACKAGE_DESCRIPTION_LAST_LINE != "" ]]; then DESCRIPTION[18]=$APPLICATION_NAME': '$PACKAGE_DESCRIPTION_LAST_LINE fi } edit_description() { echo echo -n "Do you want to edit description last time before putting it into package? (y|n): [n] " read answer if [ "$answer" == "y" ]; then $TEXTEDITOR "$DESC_TMP_IO_FILE" 2>&1 fi get_description_from_file $DESC_TMP_IO_FILE cat "$DESC_TMP_IO_FILE" > "$LOCAL_PACKAGE_DIR/slack-desc" } put_description_in_tmp() { j=0 while [ "$j" -lt "${#DESCRIPTION[@]}" ]; do ## bash is not able to write SPACES from variables ## into file. I write it here directly for the 8th line if [ "$j" == "7" ]; then get_pkgname_spaces >> $DESC_TMP_IO_FILE fi echo ${DESCRIPTION[$j]} >> $DESC_TMP_IO_FILE let "j=$j + 1" done } get_description_from_file() { i=0 while read line; do DESCRIPTION[$i]="$line" let "i=$i + 1"; done < $1 } get_configure() { if [ $1 ]; then rerun=1 echo echo -n "Invalid value: '$1'. Available answers: 'y' or 'n' or hit ENTER for default ('$CONFIGURE_DEFAULT')" echo fi CONFIGURE_ANSWER="n" AUTOGENSH_ANSWER="n" if [ ! -e configure ]; then if [ -e autogen.sh ]; then if [[ $rerun != 1 ]]; then echo echo "\"configure\" does not exist, but \"autogen.sh\" is available." echo "\"autogen.sh\" is usually able to create \"configure\" script." echo fi echo -n "Do you want to run './autogen.sh' (y|n) [$CONFIGURE_DEFAULT] " read answer if [ -z "$answer" ]; then CONFIGURE_ANSWER="$CONFIGURE_DEFAULT" answer="$answer" fi if [[ "$answer" != "y" ]] && [[ "$answer" != "n" ]]; then get_configure $answer else CONFIGURE_ANSWER="$answer" AUTOGENSH_ANSWER="$answer" fi else echo echo "'./configure' will not be run, because file \"configure\" is not available." check_makefile fi else echo echo -n "Do you want to run './configure'? (y|n): [$CONFIGURE_DEFAULT] " read answer if [ -z "$answer" ]; then CONFIGURE_ANSWER="$CONFIGURE_DEFAULT" else if [[ "$answer" != "y" ]] && [[ "$answer" != "n" ]]; then get_configure $answer else CONFIGURE_ANSWER="$answer" fi fi fi if [ "$CONFIGURE_ANSWER" == "y" ]; then if [[ ! -e ./configure ]] && [[ $AUTOGENSH_ANSWER == "y" ]]; then echo echo "I will run ./autogen.sh now to be able to get ./configure options" echo -n "Press ENTER to continue" read answer echo ./autogen.sh >/dev/null fi if [[ ! -e ./configure ]]; then echo echo "'./configure' will not be run, because file \"configure\" is not available." check_makefile else get_configure_prefix fi fi } get_configure_prefix() { ## does --sysconfdir exists in configure? configure_sysconfdir=" --sysconfdir=/etc" if [ `./configure --help | grep '\-\-sysconfdir=' >/dev/null ; echo $?` -eq 1 ]; then if [ `./configure --help | grep '\-\-confdir=' >/dev/null ; echo $?` -eq 0 ]; then configure_sysconfdir=" --confdir=/etc" else configure_sysconfdir="" fi fi ## does --localstatedir exists in configure? configure_localstatedir=" --localstatedir=/var" if [ `./configure --help | grep '\-\-localstatedir=' >/dev/null ; echo $?` -eq 1 ]; then configure_localstatedir="" fi ## these params are usually enough. I could add more, but why? configure_params="--prefix=/usr$configure_sysconfdir$configure_localstatedir" echo ## is there a not-zero-size file with configure params? if [[ -e "$LOCAL_PACKAGE_DIR/configure-params" && -s "$LOCAL_PACKAGE_DIR/configure-params" ]]; then old_configure_params=`cat "$LOCAL_PACKAGE_DIR/configure-params"` echo "I found old configure parameters:" echo "$old_configure_params" configure_params="$old_configure_params" else echo "Default configure parameters:" echo "$configure_params" fi echo echo -n "Do you want to use these configure params? ([y]es|[n]o|[a]dditional): [$CONFIGURE_OPTIONS_DEFAULT] " read answer if [[ -z "$answer" ]] || [[ "$answer" == "$CONFIGURE_OPTIONS_DEFAULT" ]]; then answer="$CONFIGURE_OPTIONS_DEFAULT" fi if [ "$answer" == "y" ]; then CONFIGURE_OPTIONS="$configure_params" elif [ "$answer" == "a" ]; then echo echo -n "Enter your configure options in addition to '$configure_params': " read answer CONFIGURE_OPTIONS="$configure_params ""$answer" else if [ "$answer" != "n" ]; then echo "Unrecognized answer. Assuming \"No\"" fi echo echo -n "Enter your configure options instead of using defaults: " read answer CONFIGURE_OPTIONS="$answer" fi ## save/overwrite configure params in configure-params ## file, if new configure params exist [ -n "$CONFIGURE_OPTIONS" ] && echo "$CONFIGURE_OPTIONS" > "$LOCAL_PACKAGE_DIR/configure-params" } exit_src2slack() { exit } ## recursive reading of files (no dirs) in $1 get_only_files_in_dir() { local etc=$1 for i in `ls -1 "$etc"`; do if [ -d "$etc/$i" ]; then get_only_files_in_dir "$etc/$i" else echo "$etc/$i.new" | sed -e "${TMP_PACKAGE_DIR_BACKSLASHES[@]}" fi done } create_package() { ## create temp directory echo "Preparing directory for temporary files" sleep 2 ### "sleep" ... to make it look better ;-) TMP_PACKAGE_DIR="$TMP_PACKAGE_DIR/$APPLICATION_NAME_VERSION" if [[ `pwd` == "$TMP_PACKAGE_DIR" ]]; then ### if source dir == tmp dir TMP_PACKAGE_DIR="$TMP_PACKAGE_DIR"`date +%N` fi [ -e "$TMP_PACKAGE_DIR" ] && rm -rf "$TMP_PACKAGE_DIR" mkdir "$TMP_PACKAGE_DIR" ## run autogen.sh? if [ $AUTOGENSH_ANSWER == "y" ]; then echo echo "Running ./autogen.sh $CONFIGURE_OPTIONS" sleep 1 LDFLAGS="$SLKLDFLAGS" CFLAGS="$SLKCFLAGS" ./autogen.sh $CONFIGURE_OPTIONS || exit_src2slack fi ## run configure if [ $CONFIGURE_ANSWER == "y" ]; then echo echo "Running ./configure $CONFIGURE_OPTIONS" sleep 1 LDFLAGS="$SLKLDFLAGS" CFLAGS="$SLKCFLAGS" ./configure $CONFIGURE_OPTIONS || exit_src2slack fi ## patch for mythtv [ -e "mythplugins.pro" ] && qmake mythplugins.pro ## patch for mythtv [ -e "myththemes.pro" ] && qmake myththemes.pro ## run make clear echo echo "Running make" echo sleep 2 make || exit_src2slack ## run make install in our dir clear echo echo "Running make install" echo sleep 2 ## patch for mythtv if [[ `echo $APPLICATION_NAME_VERSION | grep -P ^myth\(tv\|plugins\|themes\) >/dev/null; echo $?` -eq 0 ]]; then echo "Recognized MythTV..." echo is_mythtv=1 sleep 1 make INSTALL_ROOT="$TMP_PACKAGE_DIR" install || exit_src2slack else make DESTDIR="$TMP_PACKAGE_DIR" install || exit_src2slack fi ## add description if [ -e $DESC_TMP_IO_FILE ]; then echo echo "Adding description to package ..." ! [ -d $TMP_PACKAGE_DIR/install ] && mkdir -p $TMP_PACKAGE_DIR/install cat "$DESC_TMP_IO_FILE" > "$TMP_PACKAGE_DIR/install/slack-desc" sleep 2 fi ## add AUTHORS,INSTALL,COPYING etc. in the package PACKAGE_DOC_DIR="$TMP_PACKAGE_DIR/usr/doc/$APPLICATION_NAME_VERSION" ! [ -d "$PACKAGE_DOC_DIR" ] && mkdir -p "$PACKAGE_DOC_DIR" cp -r AUTHORS ChangeLog* Changelog Copyright COPYING* COPYRIGHT HACKING INSTALL GPL\ HOWTO LICENSE MAINTAINERS NEWS README* THANKS TODO *.txt *.html readme PKG-INFO \ "$PACKAGE_DOC_DIR" >/dev/null 2>&1 chmod -R a-w $PACKAGE_DOC_DIR/* ## Strip binaries ( cd $TMP_PACKAGE_DIR find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null cd - >/dev/null ) ## chown executables to root:bin to do it right way echo echo "Changing ownership of executables ..." chown root:bin $TMP_PACKAGE_DIR/usr/bin/* $TMP_PACKAGE_DIR/usr/sbin/* \ $TMP_PACKAGE_DIR/sbin/* $TMP_PACKAGE_DIR/bin/* >/dev/null 2>&1 ## make default doinst.sh file ## what does default doinst.sh do: ## - check for config files in /etc, rename foo to foo.new if foo exist ## - if foo does not exist, rename foo.new to foo ## - if foo's md5sum == foo.new's md5sum, remove foo.new if [ -e $TMP_PACKAGE_DIR/etc ]; then ## get all files' names from the package's /etc to use it doinst.sh TMP_PACKAGE_DIR_BACKSLASHES=("s/^$(echo $TMP_PACKAGE_DIR | sed -e 's/\//\\\//g')\///g") etc_files=`get_only_files_in_dir $TMP_PACKAGE_DIR/etc` ## put checking code in install/doinst.sh ! [ -d "$TMP_PACKAGE_DIR/install" ] && mkdir -p "$TMP_PACKAGE_DIR/install" cat <> $TMP_PACKAGE_DIR/install/doinst.sh ## check every file in package's /etc for NEW in ${etc_files}; do OLD="\`dirname \$NEW\`/\`basename \$NEW .new\`" if [ ! -r \$OLD ]; then mv "\$NEW" "\$OLD" elif [ "\`cat \$OLD | md5sum\`" = "\`cat \$NEW | md5sum\`" ]; then rm "\$NEW" fi done EOINS fi ## doinst.sh creation done sleep 2 ## make package (make symbolic links, compress etc) echo echo "Making package ..." cd "$TMP_PACKAGE_DIR" makepkg -l y -c n "$LOCAL_PACKAGE_DIR/$PACKAGE_NAME" || exit_src2slack ## remove unpacked source archive if [[ "$TMP_SOURCE_EXTRACT_DIR_REMOVE" == "y" && "$EXTRACTME" == 1 ]]; then cd - >/dev/null tmp_source_extract_dir=`basename $(pwd)` cd .. echo "Removing unpacked source archive [$tmp_source_extract_dir]." rm -rf "$tmp_source_extract_dir" fi ## create simple SlackBuild. when the user runs src2slack next time, ## src2slack will offer him/her to run SlackBuild script instead of src2slack. if [[ $CREATE_SLACKBUILD == "y" ]]; then echo "Creating SlackBuild file in $LOCAL_PACKAGE_DIR" echo create_slack_build_file fi rm "$DESC_TMP_IO_FILE" >/dev/null 2>&1 ## done !!! echo "Package was saved in $LOCAL_PACKAGE_DIR/$PACKAGE_NAME" echo } ## this SlackBuild builder is working only with standard sources which ## follow standard installation process: configure, make, make install ## but you can modify it after creation and add your code create_slack_build_file() { SLACKBUILD_FILE="$LOCAL_PACKAGE_DIR/$APPLICATION_NAME.SlackBuild" APPLICATION_NAME_ORIGINAL=`echo -n $APPLICATION_BASENAME_ORIGINAL | sed -re 's/^(.*)(\-.*?)$/\1/'` rm "$SLACKBUILD_FILE" 2>/dev/null cat <> $SLACKBUILD_FILE #!/bin/sh # Slackware build script for $APPLICATION_NAME_ORIGINAL # Automaticaly written by src2slack: http://slackware.php.co.ba PRGNAM=$APPLICATION_NAME_ORIGINAL VERSION=$APPLICATION_VERSION ARCH=\${ARCH:-$PACKAGE_ARCHITECTURE} BUILD=\${BUILD:-$APPLICATION_BUILD} TAG=\${TAG:-$PACKAGE_NAME_ENDING} CWD=\$(pwd) TMP=\${TMP:-/tmp} PKG=\$TMP/package-\$PRGNAM OUTPUT=\${OUTPUT:-/tmp} rm -rf "\$PKG" mkdir -p "\$TMP" "\$PKG" "\$OUTPUT" rm -rf \$PRGNAM-\$VERSION # let's find source file if [[ -e \$CWD/\$PRGNAM-\$VERSION.tar.bz2 ]]; then tar -jxvf \$CWD/\$PRGNAM-\$VERSION.tar.bz2 || exit 1 elif [[ -e \$CWD/\$PRGNAM-\$VERSION.tar.gz ]]; then tar -zxvf \$CWD/\$PRGNAM-\$VERSION.tar.gz || exit 1 else echo "Source file not found [ \$PRGNAM-\$VERSION.tar.gz or \$PRGNAM-\$VERSION.tar.bz2 ]." echo echo -n "Do you maybe want to run this script in this (current) directory? (y|n) [n] " read answer if [[ "\$answer" != "y" ]]; then echo "No? OK, I will exit now..." echo echo "Open this file in your editor and change values for PRGNAM and VERSION." exit 1 else NO_CD=1 fi fi [[ \$NO_CD != 1 ]] && ( cd \$PRGNAM-\$VERSION || exit 1 ) chown -R root:root . chmod -R u+w,go+r-w,a-s . $( if [ $AUTOGENSH_ANSWER == "y" ]; then echo "LDFLAGS=\"$SLKLDFLAGS\" CFLAGS=\"$SLKCFLAGS\" ./autogen.sh $CONFIGURE_OPTIONS || exit 1" fi if [ $CONFIGURE_ANSWER == "y" ]; then echo "LDFLAGS=\"$SLKLDFLAGS\" CFLAGS=\"$SLKCFLAGS\" ./configure $CONFIGURE_OPTIONS || exit 1" fi ## patch for mythtv if [[ $is_mythtv == 1 ]]; then echo '[ -e "mythplugins.pro" ] && qmake mythplugins.pro' fi ) if [[ -e Makefile ]]; then make || exit 1 $( ## patch for mythtv if [[ $is_mythtv == 1 ]]; then echo " make INSTALL_ROOT=\"\$PKG\" install || exit 1" else echo " make DESTDIR=\"\$PKG\" install || exit 1" fi ) fi ( cd \$PKG find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null cd - ) PKG_DOC_DIR="\$PKG/usr/doc/\$PRGNAM-\$VERSION" ! [ -d "\$PKG_DOC_DIR" ] && mkdir -p "\$PKG_DOC_DIR" cp -r AUTHORS ChangeLog* Changelog Copyright COPYING* COPYRIGHT HACKING INSTALL GPL \\ HOWTO LICENSE MAINTAINERS NEWS README* THANKS TODO *.txt *.html readme PKG-INFO \\ "\$PKG_DOC_DIR" >/dev/null 2>&1 chmod -R a-w \$PKG_DOC_DIR/* chown root:bin \$PKG/usr/bin/* \$PKG/usr/sbin/* \$PKG/sbin/* \$PKG/bin/* >/dev/null 2>&1 mkdir -p \$PKG/install ## recursive reading of files (no dirs) in $1 get_only_files_in_dir() { local etc=\$1 for i in \`ls -1 "\$etc"\`; do if [ -d "\$etc/\$i" ]; then get_only_files_in_dir "\$etc/\$i" else echo "\$etc/\$i.new" | sed -e "\${PKG_BACKSLASHES[@]}" fi done } if [ -e \$PKG/etc ]; then PKG_BACKSLASHES=("s/^\$(echo \$PKG | sed -e 's/\//\\\\\//g')\///g") etc_files=\`get_only_files_in_dir \$PKG/etc\` cat <> \$PKG/install/doinst.sh ## check every file in package's /etc for NEW in \$etc_files; do OLD="\\\`dirname \\\$NEW\\\`/\\\`basename \\\$NEW .new\\\`" if [ ! -r \\\$OLD ]; then mv "\\\$NEW" "\\\$OLD" elif [ "\\\`cat \\\$OLD | md5sum\\\`" = "\\\`cat \\\$NEW | md5sum\\\`" ]; then rm "\\\$NEW" fi done } DOINST fi # description $( if [ -e "$DESC_TMP_IO_FILE" ]; then echo "cat <> \$PKG/install/slack-desc" IFS_OLD="$IFS" IFS=$'\n' for desc_line in `cat $DESC_TMP_IO_FILE`; do echo $desc_line done echo "DESCR" IFS="$IFS_OLD" fi ) cd \$PKG makepkg -l y -c n \$OUTPUT/\${PRGNAM}-\${VERSION}-\${ARCH}-\${BUILD}\${TAG}.tgz cd - >/dev/null cd .. rm -rf \$PRGNAM-\$VERSION echo "Package: \$OUTPUT/\${PRGNAM}-\${VERSION}-\${ARCH}-\${BUILD}\${TAG}.tgz" echo SLACKBUILD ## make SlackBuild executable chmod 544 "$SLACKBUILD_FILE" } want_to_install_package() { echo echo -n "Do you want to install package after creation? (y|n): [$INSTALL_PACKAGE_DEFAULT] " read answer if [[ -z "$answer" ]] || [[ "$answer" == "$INSTALL_PACKAGE_DEFAULT" ]]; then INSTALL_PACKAGE_ANSWER=$INSTALL_PACKAGE_DEFAULT else if [[ "$answer" == "y" ]] || [[ "$answer" == "n" ]]; then INSTALL_PACKAGE_ANSWER="$answer" else echo "Unknown value. Assuming \"No\". Package will not be installed." echo fi fi } install_package() { if [ "$INSTALL_PACKAGE_ANSWER" == "y" ]; then echo Installing "$LOCAL_PACKAGE_DIR"/"$PACKAGE_NAME" upgradepkg --install-new --reinstall "$LOCAL_PACKAGE_DIR"/"$PACKAGE_NAME" echo fi } want_to_copy_to_ftp() { if [ "$FTP_COPY_ENABLE" == "y" ]; then if [ "$FTP_COPY_WO_ASKING" == "y" ]; then FTP_COPY_ANSWER=y echo echo "Package will be copied on FTP server after creation." echo sleep 1 else echo echo -n "Do you want to copy package after creation to your FTP repository? (y|n): [$FTP_COPY_DEFAULT] " read answer if [[ "$answer" == "$FTP_COPY_DEFAULT" ]] || [[ -z "$answer" ]]; then FTP_COPY_ANSWER="$FTP_COPY_DEFAULT" elif [[ "$answer" == "y" ]] || [[ "$answer" == "n" ]]; then FTP_COPY_ANSWER="$answer" else echo echo -n "Unknown value. Please type or or just press ENTER" want_to_copy_to_ftp fi fi fi } try_to_copy() { m="$1" echo if [ "$m" -gt 1 ]; then echo "Trying again ($m/$FTP_COPY_RETRIES)" fi echo "$PACKAGE_NAME is being copied to your FTP repository [ftp://$FTP_HOST:/$FTP_DIR]" ## open 2nd connection for upload ftp -n $FTP_HOST 2>"$FTP_TMP_IO_FILE" 1>"$FTP_TMP_IO_FILE" </dev/null 2>&1 cd "$LOCAL_PACKAGE_DIR" ## open 1st connection to make a dir ftp -n $FTP_HOST 2>/dev/null 1>/dev/null </dev/null 2>&1 try_to_copy 1 cd - ## I am not using EXITSTATUS $? because ftp ## doesn't give the right exit status if [ -s "$FTP_TMP_IO_FILE" ]; then echo echo "An error occured while uploading $PACKAGE_NAME." echo -n "Do you want to see log file? (y|n): [y] " read answer if [[ "$answer" == "y" ]] || [[ -z "$answer" ]]; then echo echo "--------------------------------------------------" echo cat "$FTP_TMP_IO_FILE" echo echo "--------------------------------------------------" echo echo -n "Press ENTER to continue ..." read answer1 fi else echo "Upload was succesfull." fi rm "$FTP_TMP_IO_FILE" >/dev/null 2>&1 fi } create_md5_checksum_file() { if [ "$CREATE_MD5_CHECKSUM" == "y" ]; then echo "Creating md5 checksum file." echo md5sum "$LOCAL_PACKAGE_DIR/$PACKAGE_NAME" > "$LOCAL_PACKAGE_DIR/$PACKAGE_NAME".md5 fi } delete_temp() { if [ "$TMP_PACKAGE_DIR_REMOVE" == "y" ]; then echo "Removing temporary files ..." rm -rf "$TMP_PACKAGE_DIR" else echo "Tmp-Directory [$TMP_PACKAGE_DIR] will not be deleted." echo "You can use this directory to make install script in \"$TMP_PACKAGE_DIR/install/doinst.sh\"." echo "Rebuild package after adding/editing install/doinst.sh with:" echo " # cd $TMP_PACKAGE_DIR && makepkg -l y -c y \"$LOCAL_PACKAGE_DIR/$PACKAGE_NAME\"" fi } show_package_info() { PACKAGE_INFO=`ls -l "$LOCAL_PACKAGE_DIR/$PACKAGE_NAME"` let "PACKAGE_SIZE=`echo $PACKAGE_INFO | awk '{ print $5 }'`/1000" if [ "$PACKAGE_SIZE" == 0 ]; then PACKAGE_SIZE="<1 kb" fi echo echo echo "|------------------- PACKAGE INFO -------------------|" echo "| Name: $PACKAGE_NAME" echo "| Path: $LOCAL_PACKAGE_DIR" echo "| Size: $PACKAGE_SIZE kb (`echo $PACKAGE_INFO | awk '{ print $5 }'` bytes)" echo -n "| Time: `echo $PACKAGE_INFO | awk '{ print $6 }'`" echo ' '`echo $PACKAGE_INFO | awk '{ print $7 }'` echo "|----------------------------------------------------|" } footer() { echo echo echo "Thank you for using src2slack." echo } ask_questions() { create_package_dir get_filename get_description get_configure want_to_install_package want_to_copy_to_ftp } check_for_package() { if [ ! -e "$1" ]; then show_error "Package \"$1\" could not be found." fi } edit_description_in_pkg() { PACKAGE="$1" PKG_NAME=`basename $PACKAGE tgz` TMP_PKG_TGZ="$TMP_PACKAGE_DIR"/"$PKG_NAME"tgz TMP_PKG_TAR="$TMP_PACKAGE_DIR"/"$PKG_NAME"tar TMP_PKG_DESC="$TMP_PACKAGE_DIR"/"install/slack-desc" ## do we have relative or absolute path? echo $PACKAGE | grep '^/' >/dev/null if [ $? -ne 1 ]; then PKG_PATH="" else PKG_PATH="$PWD""/" fi ## make tmp dirs and files mkdir -p "$TMP_PACKAGE_DIR"/"install" cp "$PACKAGE" "$TMP_PKG_TGZ" ## put description into tmp file echo echo "Getting package description. This may take a while with big packages. Please wait ..." echo cd "$TMP_PACKAGE_DIR" gunzip "$TMP_PKG_TGZ" >/dev/null 2>&1 tar xf "$TMP_PKG_TAR" install/slack-desc 1>"$TMP_PKG_DESC" 2>/dev/null if [ $? -ne 0 ]; then PKGNAME=`echo "$PKG_NAME"tgz | sed -re "s/^(.*)\-([A-Za-z0-9\.]+)(\-\w+)(\-\w+)(\.tgz)/\1/"` PKG_VERS_FILL=`echo "$PKG_NAME"tgz | sed -re "s/^(.*)\-([A-Za-z0-9\.]+)(\-\w+)(\-\w+)(\.tgz)/\2/"` echo -n "There is no description file in this package. Do you want to make a new one? (y|n): [y] " read answer if [[ -z "$answer" ]] || [[ "$answer" == "y" ]]; then echo "# HOW TO EDIT THIS FILE:" >> "$TMP_PKG_DESC" echo "# The \"handy ruler\" below makes it easier to edit a package description. Line" >> "$TMP_PKG_DESC" echo "# up the first '|' above the ':' following the base package name, and the '|'" >> "$TMP_PKG_DESC" echo "# on the right side marks the last column you can put a character in. You must" >> "$TMP_PKG_DESC" echo "# make exactly 11 lines for the formatting to be correct. It's also" >> "$TMP_PKG_DESC" echo "# customary to leave one space after the ':'." >> "$TMP_PKG_DESC" echo "" >> "$TMP_PKG_DESC" get_pkgname_spaces $PKGNAME >> "$TMP_PKG_DESC" echo "|-----handy-ruler------------------------------------------------------|" >> "$TMP_PKG_DESC" echo "$PKGNAME: $PKGNAME: $PKG_VERS_FILL" >> "$TMP_PKG_DESC" ## fill the rest, because description must have 11 lines i=1 if [[ $PACKAGE_DESC_LAST_LINE != "" ]]; then last_desc_line_nr=9 else last_desc_line_nr=10 fi while [ "$i" -le $last_desc_line_nr ]; do if [ "$i" -eq $last_desc_line_nr ]; then echo -n "$PKGNAME: " >> "$TMP_PKG_DESC" echo "$DEFAULT_PACKAGE_CREATOR" >> "$TMP_PKG_DESC" else echo $PKGNAME": " >> "$TMP_PKG_DESC" fi let "i=$i + 1" done if [[ $PACKAGE_DESC_LAST_LINE != "" ]]; then echo $PKGNAME": "$PACKAGE_DESC_LAST_LINE >> "$TMP_PKG_DESC" fi answer="y" else answer="n" fi else cat "$TMP_PKG_DESC" echo echo -n "Do you want to edit description of this package? (y|n): [y] " read answer fi ## edit description if [[ -z "$answer" ]] || [[ "$answer" == "y" ]]; then echo $TEXTEDITOR "$TMP_PKG_DESC" $TEXTEDITOR "$TMP_PKG_DESC" echo echo "Updating package description. Please wait ..." ## delete old install/slack-desc, because --update appends new text ## --update appends new text, because "tar" was made for tapes, and ## tapes were not designed to go backward tar --delete -vf "$TMP_PKG_TAR" install/slack-desc >/dev/null 2>&1 ## add new description in the package ( -r=append , -d=update) tar -rvf "$TMP_PKG_TAR" install/slack-desc >/dev/null 2>&1 ## backup old package mv "$PKG_PATH""$PACKAGE" "$PKG_PATH""$PACKAGE".old ## make new package cat "$TMP_PKG_TAR" | gzip > "$PKG_PATH""$PACKAGE" ## delete temp files rm -rf "$TMP_PACKAGE_DIR" >/dev/null 2>&1 echo echo "Original package was moved to "$PKG_PATH""$PACKAGE".old" echo echo "Package description was successfully updated." echo else rm -rf "$TMP_PACKAGE_DIR" >/dev/null 2>&1 echo show_error "Package will not be changed." fi } ## unpack source and cd to dir ## it handles only tar.bz2 and tar.gz unpack_source() { EXTRACTME=1 filename=$1 extracted=0 bz2=0 if [ `basename $filename | grep tar.bz2$ >/dev/null ; echo $?` -eq 0 ]; then bz2=1 source_dir=`basename $filename .tar.bz2` elif [ `basename $filename | grep tar.gz$ >/dev/null ; echo $?` -eq 0 ]; then source_dir=`basename $filename .tar.gz` else show_error "$filename is NOT tar.bz2 or tar.gz file." fi source_dir="$TMP_SOURCE_EXTRACT_DIR"/"$source_dir" if [ -e "$source_dir" ]; then echo "INFO: Source directory '$source_dir' exists." echo -n "Do you want to extract source file again and overwrite already extracted files? (y|n) : [$OVERWRITE_ALREADY_EXTRACTED_DEFAULT] " read answer fi if [[ -z "$answer" && "$OVERWRITE_ALREADY_EXTRACTED_DEFAULT" == "y" ]] || [[ "$answer" == "y" ]]; then if [ -e "$source_dir" ]; then echo "Removing old source files..." rm -rf "$source_dir" fi echo "Extracting `basename $filename`..." if [ $bz2 == 1 ]; then extracted_files=`tar jxvf "$filename" -C "$TMP_SOURCE_EXTRACT_DIR"` else extracted_files=`tar zxvf "$filename" -C "$TMP_SOURCE_EXTRACT_DIR"` fi extracted=1 fi if [ ! -e "$source_dir" ]; then echo echo "$filename is extracted, but usual source dir ($source_dir) does not exist." echo -n "Do you want to see a list of extracted files? (y|n) [y]: " read answer [[ -z "$answer" ]] && answer="y" if [ "$answer" == "y" ]; then clear extracted_source_dir="" for i in $extracted_files; do extracted_source_dir_parsed=`echo $i | sed -re 's/^(.*?)(\/.*)$/\1/'` echo $i done else if [ "$answer" != "n" ]; then echo "Unrecognized answer. Assuming \"No\"" fi fi show_error fi if [[ $extracted == 1 ]] && [[ $ASK_FOR_EXTRACTED_FILES_LIST == "y" ]]; then echo echo -n "Do you want to see a list of extracted files? (y|n) [n]: " read answer [[ -z "$answer" ]] && answer="n" if [ "$answer" == "y" ]; then for i in $extracted_files; do echo $i done echo echo -n "Click on Return to continue with creating package." read answer else echo "No? OK, let's continue!" fi fi extracted_files="" chown -R root:root "$source_dir" cd "$source_dir" || ( show_error "Source dir '$source_dir' does not exist." ) echo } get_user_config() { if [ -e ~/.src2slackrc ]; then . ~/.src2slackrc fi if [[ ! -e ~/.src2slackrc ]] || [[ "$SRC2SLACK_VERSION" != "$SRC2SLACK_VER" ]]; then rm ~/.src2slackrc 2>/dev/null cat <>~/.src2slackrc ################################## ## ## src2slack config file ## ## INFO: "y" is shortcut for "yes" ## "n" is shortcut for "no" ## ################################## ## Main settings ################################## ## where to save packages on your machine ## package and all configure files will be saved in a subdirectory ## like this: \$LOCAL_PACKAGE_DIR/mplayer LOCAL_PACKAGE_DIR=$LOCAL_PACKAGE_DIR ## save packages in version folder. ## like this: \$LOCAL_PACKAGE_DIR/mplayer/1.0 LOCAL_PACKAGE_DIR_PER_VERSION=$LOCAL_PACKAGE_DIR_PER_VERSION ## package name architecture (default i486) ## possible values are: i386, i486, i686, s390, powerpc, x86_64, athlon-xp PACKAGE_ARCHITECTURE=$PACKAGE_ARCHITECTURE ## package name ending (ex. MPlayer-1.0-i686-1mm, "mm" is package name ending) PACKAGE_NAME_ENDING=$PACKAGE_NAME_ENDING ## do you want convert package name to lower case? ## usually all slackware package have lower case names (MPlayer => mplayer) PACKAGE_NAME_TO_LOWERCASE=$PACKAGE_NAME_TO_LOWERCASE ## last line in package description (it could be your comment) ## comment out this line to disable it PACKAGE_DESCRIPTION_LAST_LINE="$PACKAGE_DESCRIPTION_LAST_LINE" ## create md5 checksum file. usefull if other people download your packages ## it will be named: \$PACKAGE_NAME.md5 CREATE_MD5_CHECKSUM=$CREATE_MD5_CHECKSUM ## create SlackBuild file, which can be used w/o src2slack for creating packages ## i.e. run this to create package: ./mplayer.SlackBuild mplayer-1.0.tar.bz2 ## if an old SlackBuild file exists, it will be overwritten CREATE_SLACKBUILD=$CREATE_SLACKBUILD ## where to extract source archive if you run "src2slack source-archive.tar.bz2"? ## default value is "." which describes the folder where you are currently being TMP_SOURCE_EXTRACT_DIR="$TMP_SOURCE_EXTRACT_DIR" ## remove \$TMP_SOURCE_EXTRACT_DIR after finishing with making package ## this will be only used if the source archive was unpacked TMP_SOURCE_EXTRACT_DIR_REMOVE=$TMP_SOURCE_EXTRACT_DIR_REMOVE ################################## ## Temporary files ################################## ## where to put TMP files. Usually it looks like this: \$TMP_PACKAGE_DIR/MPlayer-1.0rc2 TMP_PACKAGE_DIR=$TMP_PACKAGE_DIR ## remove tmp files? TMP_PACKAGE_DIR_REMOVE=$TMP_PACKAGE_DIR_REMOVE ################################## ## text editor to edit description ################################## TEXTEDITOR=$TEXTEDITOR ################################## ## FTP settings for transfering ## file(s) to FTP repository ################################# ## src2slack will transfer package file and slack-desc (description file) FTP_COPY_ENABLE=$FTP_COPY_ENABLE ## "n" disables FTP copying FTP_COPY_WO_ASKING=$FTP_COPY_WO_ASKING ## it will copy without asking you for permission every time FTP_COPY_DEFAULT=$FTP_COPY_DEFAULT ## default answer when asking you whether you want to copy FTP_COPY_RETRIES=$FTP_COPY_RETRIES ## how many retries FTP_HOST=$FTP_HOST ## FTP host FTP_DIR=$FTP_DIR ## FTP folder ("." is the default user's folder) FTP_USER=$FTP_USER ## FTP user FTP_PASS=$FTP_PASS ## FTP password ################################# ## default values for questions ################################# ## offer user to see list of extracted files ASK_FOR_EXTRACTED_FILES_LIST=$ASK_FOR_EXTRACTED_FILES_LIST ## default answer whether you want to write pkg description WRITE_DESCRIPTION_DEFAULT=$WRITE_DESCRIPTION_DEFAULT ## default answer whether you want overwrite already extracted files OVERWRITE_ALREADY_EXTRACTED_DEFAULT=$OVERWRITE_ALREADY_EXTRACTED_DEFAULT ## default answer whether you want to run ./configure CONFIGURE_DEFAULT=$CONFIGURE_DEFAULT ## default answer whether you want to use default configure options CONFIGURE_OPTIONS_DEFAULT=$CONFIGURE_OPTIONS_DEFAULT ## default answer whether you want install package uppon creation INSTALL_PACKAGE_DEFAULT=$INSTALL_PACKAGE_DEFAULT ################################# ## do not remove this line !!! ################################# SRC2SLACK_VERSION=$SRC2SLACK_VER SRC2SLACKRC . ~/.src2slackrc fi } ## are you root? check_root ## clear the screen clear ## show script info etc. show_header ## get/set user config if [[ $1 == "--recreate-config" ]]; then get_user_config recreate-config else get_user_config fi if [[ $1 == "--edit-desc" ]]; then ## does this file exist check_for_package $2 ## edit description edit_description_in_pkg $2 elif [[ $1 == "--version" ]] || [[ $1 == "-v" ]]; then exit elif [[ $1 == "--help" ]] || [[ $1 == "-h" ]]; then echo echo Config file: \~/.src2slackrc echo echo Usage: echo echo To create package: echo run this to extract source and make package: echo ' src2slack package-source.tar.bz2' echo echo or unpack source file and use this in the source directory: echo ' src2slack' echo echo echo To edit description in a package, use: echo ' src2slack --edit-desc ' echo echo exit else set_arch_vars ## if $1 is source file: unpack and cd if [[ $1 ]]; then if [[ -e $1 ]]; then unpack_source $1 else show_error "$1 does not exist." fi fi ## ask all important questions ask_questions ## clear the screen clear ## configure, make, make install, create package ... create_package ## install pacakge install_package ## create md5 checksum file create_md5_checksum_file ## copy package on FTP repository copy_on_ftp_repository ## delete temporary files delete_temp ## show file info like size, file name etc show_package_info fi ## show footer footer exit