#!/bin/bash # # Script para gerar SlackBuild # Por Rudson R. Alves # # Este script auxilia a criação de SlackBuilds, com o modelo # do Luiz do Sarava Linux # # SlackBuilds são scripts utilizados no Slackware para gerar # pacotes tgz. # # Version 0.9.3 PROG_VERSION=0.9.3 #-------------------------------------------------------------------- # Functions #-------------------------------------------------------------------- function mkbuild_use() { # mkbuild help function echo " NAME mkbuild - create SlackBuild script from mkbuild_file input SYNOPSIS mkbuild [OPIONS] [mkbuild_file] DESCRIPTION input file with build rules and variables Input options: -a, --author author name -ai, --author_initials author signature -cs, --const_string construction string to source name -u, --url url address to source -pn, --pkg_name package name -sn, --src_name source name -pv, --pkg_version package version -md, --model SlackBuild model file -j, --jobs Number of jobs to run simultaneously --prefix Prefix install directory Program options: -h, --help this help mesage -s, --show show output files -v, --version program version EXAMPLES mkbuild --prefix /usr/local pyrex.mkbuild build pyrex.SlackBuild with prefix /usr/local and pyrex.mkbuild variables and options definitions. AUTHOR Written by Rduson R. Alves REPORTING BUGS Report bugs to COPYRIGHT Copyright © 2006 Free Software Foundation, Inc. This is free software. You may redistribute copies of it under the terms of the GNU General Public License . There is NO WARRANTY, to the extent permitted by law. " | less } function error_codes { # Start error codes function NULL_STRING=499 ERROR_FILE_NOT_FOUND=500 ERROR_CONSTRUCTION=501 ERROR_PROGRAM=502 ERROR_INPUT_PAR=503 } function mkbuild_error { # Error function case $1 in "$ERROR_FILE_NOT_FOUND") echo "File $2 not found!" ;; "$ERROR_CONSTRUCTION") echo "Construction error in $2 variable." ;; "$ERROR_PROGRAM") echo "Program logical error." ;; "$ERROR_INPUT_PAR") echo "Input parameter $2 error. See \"mkbuild --help\"." ;; *) echo "Unknow error!" ;; esac exit $1 } function is_number { # Check if argument is a number local -i int if [ $# -eq 0 ]; then return 1 else (let int=$1) 2>/dev/null return $? # Exit status of the let thread fi } function set_parameters { # Get and set mkbuild variables with parameters input # Use: set_parameters $@ # where $@ are the parameters input # ALL_PAR=( $@ ) # carrega todos os parâmetros N_PAR=$# # carrega o número de parâmetros i=0 # inicia o contador # Checa todos os parâmetros passados while [ $i -lt $N_PAR ]; do # get parameter[i] PAR=${ALL_PAR[$i]} case $PAR in '-d'|'--debug') # Debug mode set -x ;; '-h'|'--help' ) # Show help mesage mkbuild_use && exit 0 ;; '-v'|'--version') # Show program version echo -e "\nmkbuild version $PROG_VERSION\n" && exit 0 ;; '-a'|'--author') # Enter with author name let i++ AUTHOR=${ALL_PAR[$i]} [ ${AUTHOR:0:1} = "-" ] && mkbuild_error $ERROR_INPUT_PAR AUTHOR ;; '-ai'|'--author_initials') # Enter with author name let i++ AUTHOR_INITIALS=${ALL_PAR[$i]} [ ${AUTHOR_INITIALS:0:1} = "-" ] && mkbuild_error $ERROR_INPUT_PAR AUTHOR_INITIALS ;; '-cs'|'--const_string') # Enter with construction source name string let i++ CONST_STRING=${ALL_PAR[$i]} [ ${CONST_STRING:0:1} = "-" ] && mkbuild_error $ERROR_INPUT_PAR CONST_STRING ;; '-md'|'--model') # Enter with SlackBuild model let i++ MODEL=${ALL_PAR[$i]} [ ${MODEL:0:1} = "-" ] && mkbuild_error $ERROR_INPUT_PAR MODEL ;; '-j'|'--jobs') # Enter with SlackBuild model let i++ NUMJOBS=${ALL_PAR[$i]} [ ${NUMJOBS:0:1} = "-" ] && mkbuild_error $ERROR_INPUT_PAR NUMJOBS [ ! is_number $NUMJOBS ] && mkbuild_error $ERROR_INPUT_PAR NUMJOBS NUMJOBS="-j$NUMJOBS" ;; '--prefix') # Enter with SlackBuild model let i++ PREFIX=${ALL_PAR[$i]} [ ${PREFIX:0:1} = "-" ] && mkbuild_error $ERROR_INPUT_PAR PREFIX ;; '-pn'|'--pkg_name') # Enter with package name let i++ PKG_NAME=${ALL_PAR[$i]} [ ${PKG_NAME:0:1} = "-" ] && mkbuild_error $ERROR_INPUT_PAR PKG_NAME ;; '-pv'|'pkg_version') # Enter with package version let i++ VERSION=${ALL_PAR[$i]} [ ${VERSION:0:1} = "-" ] && mkbuild_error $ERROR_INPUT_PAR VERSION ;; '-sn'|'--src_name') # Enter with source name let i++ SRC_NAME=${ALL_PAR[$i]} [ ${SRC_NAME:0:1} = '-' ] && mkbuild_error $ERROR_INPUT_PAR SRC_NAME ;; '-u'|'--url') # Enter with url address let i++ URL=${ALL_PAR[$i]} [ ${URL:0:1} = '-' ] && mkbuild_error $ERROR_INPUT_PAR URL ;; *) # mkbuild input file MK_INPUT_FILE="${PAR//.mkbuild}.mkbuild" [ ! -e $MK_INPUT_FILE ] && mkbuild_error $ERROR_FILE_NOT_FOUND $MK_INPUT_FILE ;; esac let i++ done } function get_variable { # Get variable value from mkbuild file (MK_INPUT_FILE) [ $# -ne 1 ] && mkbuild_error $ERROR_PROGRAM [ -z $MK_INPUT_FILE ] && echo "Warning: no [mkbuild_file]." && return 0 grep "^\[\[${1}\]\]" $MK_INPUT_FILE | cut -f2 -d\" } function edit_file { # Edit file $3, by change string [[$1]] to $2 local STR_OLD local STR_NEW [ $# -ne 3 ] && mkbuild_error $ERROR_PROGRAM STR_OLD=$( echo $1 | sed 's/\//\\\//g' ) STR_NEW=$( echo $2 | sed 's/\//\\\//g' ) eval "sed 's/\[\[$STR_OLD\]\]/$STR_NEW/' $3 > $AUX_TMP" mv $AUX_TMP $3 } function edit_file_full { # Edit file $3, by change string $1 to $2 local STR_OLD local STR_NEW [ $# -ne 3 ] && mkbuild_error $ERROR_PROGRAM STR_OLD=$( echo $1 | sed 's/\//\\\//g' ) STR_NEW=$( echo $2 | sed 's/\//\\\//g' ) eval "sed 's/$STR_OLD/$STR_NEW/' $3 > $AUX_TMP" mv $AUX_TMP $3 } function start_build { # Build initial sections [ $# -ne 1 ] && mkbuild_error $ERROR_PROGRAM edit_file "SLACKBUILD AUTHOR" "$AUTHOR" $1 edit_file "SLACKBUILD AUTHOR INITIALS" $AUTHOR_INITIALS $1 edit_file "SOURCE NAME" "$SRC_NAME" $1 edit_file "PROGRAM NAME" "$PKG_NAME" $1 edit_file "PACKAGE NAME" "$PKG_NAME" $1 edit_file "DECOMPRESSOR" "$DECOMPRESSOR" $1 edit_file "DECOMPRESSOR TEST FLAG" "$DECOMPRESSOR_TEST_FLAG" $1 edit_file "PROGRAM URL" "$URL" $1 edit_file "ARCH" "$ARCH" $1 edit_file "NUMBER OF JOBS" "$NUMJOBS" $1 edit_file "VERSION" $VERSION $1 edit_file "SOURCE NAME CONSTRUCTION STRING" "$CONST_STRING" $1 edit_file "EXTENSION" "$EXTENSION" $1 edit_file "DOWNLOAD FOLDER URL" "$URL" $1 edit_file "OTHER CONFIGURE ARGS" "$OPTIONS" $1 edit_file "DOCUMENTATION FILES" "$DOCFILES" $1 edit_file "PREFIX" "$PREFIX" $1 edit_file_full "\$EXTENSION" "$EXTENSION" $1 } function clear_files { # Remove temporary files rm $AUX_TMP 2>/dev/null rm $SLACKBUILD_TEMP 2>/dev/null } function set_status { # Set status section # $1 - Section # $2 - Status # $3 - file [ $# -ne 3 ] && mkbuild_error $ERROR_PROGRAM if [ "`get_status $1 $3`" != "all" ]; then eval "sed 's/^<$1>.*$/<$1> $2/' $3" > $AUX_TMP mv $AUX_TMP $3 else echo "Warning: Section $1 have status all. Can't change!" fi } function get_status { # Get status from section # $1 - Section # $2 - file [ $# -ne 2 ] && mkbuild_error $ERROR_PROGRAM eval "sed '/^<$1>.*$/! d' $2" } function activate_sections { # Enable and desable sections ACTIONS_LIST=`sed '/^#>>/,/< off/, /^<\/[a-z].*>$/ d' $SLACKBUILD_TEMP > $AUX_TMP # Remove sections names sed '/^<.*$/ d' $AUX_TMP > $SLACKBUILD_TEMP # Remove clear lines sed ':i ; $! N; s/\n// ; t i' $SLACKBUILD_TEMP | sed 's///g' | sed 's///g' | sed 's//\n/g' > $AUX_TMP sed '1,/^#\!/ {/^#\!/ b; d }' $AUX_TMP > $SLACKBUILD } function section_edit { # Edit sections by change you values [ -z $MK_INPUT_FILE ] && return 0 SECTION_LIST=`grep '^#>[a-z]' $MK_INPUT_FILE | cut -c3-` # Check for sections change [ -z "$SECTION_LIST" ] && return 0 # Change sections for i in $SECTION_LIST; do if [ "$i" = "slackdesc" ]; then # Special slackdesc section slackdesc_edit > $AUX_TMP mv $AUX_TMP $SLACKBUILD_TEMP else # Others sections section_change $i fi done } function slackdesc_edit { # Edit slackdesc section sed -n '1,/|-----/ { // b; /|-----/ b; p; }' $SLACKBUILD_TEMP echo -n $PKG_NAME | tr [a-z+\-] " " echo -n "|-----handy-ruler" let N=18+${#PKG_NAME} for i in `seq $N $SLACKDESC_LEN`; do echo -n "-" done echo -en "|\n" sed -n '/#>slackdesc/,/#/! d' $SLACKBUILD_TEMP > $AUX_TMP" # Paste new section eval "sed -n '/#>$1/,/#<$1/ { /^#>/ b; /^#> $AUX_TMP" # Copy second halt eval "sed '/^<\/$1>/,$ ! d' $SLACKBUILD_TEMP >> $AUX_TMP" mv $AUX_TMP $SLACKBUILD_TEMP } function make_slack_required { # Build slack-required file rm slack-required 2>/dev/null [ -z "$SLACK_REQUIRED" ] && return 0 echo -e "# Dependency list to broffice\n#\n# dependency [condition] [version]]" > slack-required echo $SLACK_REQUIRED | sed 's/:/\n/g' | while read i; do REQ=`echo $i | awk '{ print $1 }'` CON=`echo $i | awk '{ print $2 }'` VER=`echo $i | awk '{ print $3 }'` echo -e "$REQ\t\t$CON\t\t$VER" >> slack-required done } function change_others_fields { # Change others fields started by '[[' in .mkbuild file grep '\[\[[A-Za-z]' $MK_INPUT_FILE | while read i; do CHANGE="`echo $i | sed 's/\[\[\(.*\)\]\]=\"\(.*\)\"/\1/'`" VALUE="`echo $i | sed 's/\[\[\(.*\)\]\]=\"\(.*\)\"/\2/'`" edit_file "$CHANGE" "$VALUE" $SLACKBUILD done } #============================= # Main Program #============================= # Start variables DOWNLOAD_SOURCE=0 # desable download source # Auxiliar file AUX_TMP=/tmp/mkbuild_tmp.$RANDOM # Derectory to SlackBuild models MODEL_DIR=${MODEL_DIR:="/etc/simplepkg/defaults/mkbuild"} # SlackDesk line length SLACKDESC_LEN=78 # Load error codes error_codes [ $# -eq 0 ] && mkbuild_use && exit 1 # Configure input parameters set_parameters $@ # Get values AUTHOR=${AUTHOR:="`get_variable "SLACKBUILD AUTHOR"`"} [ -z "$AUTHOR" ] && mkbuild_error $ERROR_CONSTRUCTION "SLACKBUILD AUTHOR" AUTHOR_INITIALS=${AUTHOR_INITIALS:="`get_variable "SLACKBUILD AUTHOR INITIALS"`"} [ -z $AUTHOR_INITIALS ] && mkbuild_error $ERROR_CONSTRUCTION "SLACKBUILD AUTHOR INITIALS" URL=${URL:="`get_variable "DOWNLOAD FOLDER URL"`"} EXTENSION=${EXTENSION:="`echo $URL | rev | cut -c1-3 | rev | tr -d '.'`"} if [ $EXTENSION = "gz" -o $EXTENSION = "tgz" -o $EXTENSION = "bz2" -o $EXTENSION = "zip" ]; then SOURCE_NAME=`basename $URL` URL_BASE=`dirname $URL` else EXTENSION=`get_variable "EXTENSION"` [ -z $EXTENSION ] && mkbuild_error $ERROR_CONSTRUCTION "EXTENSION" URL_BASE=$URL fi # Source name SRC_NAME=${SRC_NAME:="`get_variable "SOURCE NAME"`"} [ -z $SRC_NAME ] && SRC_NAME=`echo $SOURCE_NAME | sed -r 's/(.*)-(.*)\.(.*\..*)$/\1/'` [ -z $SRC_NAME ] && mkbuild_error $ERROR_CONSTRUCTION "SOURCE NAME" # Package name PKG_NAME=${PKG_NAME:="`get_variable "PACKAGE NAME"`"} [ -z $PKG_NAME ] && PKG_NAME=`echo $SRC_NAME | tr [A-Z_] [a-z\-]` # Version VERSION=${VERSION:="`get_variable "VERSION"`"} [ -z $VERSION ] && VERSION=`echo $SRC_NAME | sed -r 's/(.*)-(.*)\.(.*\..*)$/\2/'` [ -z $VERSION ] && mkbuild_error $ERROR_CONSTRUCTION "VERSION" # Construction source name string CONST_STRING=${CONST_STRING:="`get_variable "SOURCE NAME CONSTRUCTION STRING"`"} [ -z "$CONST_STRING" ] && CONST_STRING="\$SRC_NAME-\$VERSION.tar.$EXTENSION" # Build Source Name [ -z $SOURCE_NAME ] && SOURCE_NAME=`eval "echo $CONST_STRING"` # Decompressor program and test flag DECOMPRESSOR=${DECOMPRESSOR:="`get_variable "DECOMPRESSOR"`"} if [ -z $DECOMPRESSOR ]; then case $EXTENSION in 'gz'|'GZ') DECOMPRESSOR="gunzip" DECOMPRESSOR_TEST_FLAG="-t" ;; 'bz2'|'BZ2') DECOMPRESSOR="bunzip2" DECOMPRESSOR_TEST_FLAG="-t" ;; 'zip'|'ZIP') DECOMPRESSOR="unzip" DECOMPRESSOR_TEST_FLAG="-t" ;; *) mkbuild_error $ERROR_CONSTRUCTION "DECOMPRESSOR" ;; esac fi [ -z $DECOMPRESSOR_TEST_FLAG ] && DECOMPRESSOR_TEST_FLAG=`get_variable "DECOMPRESSOR TEST FLAG"` [ -z $DECOMPRESSOR_TEST_FLAG ] && mkbuild_error $ERROR_CONSTRUCTION "DECOMPRESSOR TEST FLAG" # Documentations list DOCFILES=${DOCFILES:="`get_variable "DOCUMENTATION FILES"`"} if [ -z "$DOCFILES" ]; then DOCFILES="NEWS TODO README AUTHORS INSTALL ChangeLog MAINTAINERS COPYING readme.*" fi # ./configure option OPTIONS=${OPTIONS:="`get_variable "OTHER CONFIGURE ARGS"`"} # PREFIX PREFIX=${PREFIX:="`get_variable "PREFIX"`"} [ -z $PREFIX ] && PREFIX="/usr" # Number of jobs NUMJOBS=${NUMJOBS:="`get_variable "NUMBER OF JOBS"`"} # Make slack-required file. SLACK_REQUIRED=${SLACK_REQUIRED:="`get_variable "SLACK REQUIRED"`"} [ -z "$SLACK_REQUIRED" ] && make_slack_required # SlackBuild model MODEL=${MODEL:="`get_variable "SLACKBUILD MODEL"`"} [ -z $MODEL ] && MODEL="generic.mkSlackbuild" # # Start build SlackBuild SLACKBUILD=${PKG_NAME}.SlackBuild SLACKBUILD_TEMP=$SLACKBUILD.tmp cp $MODEL_DIR/$MODEL $SLACKBUILD_TEMP # Change Strings from model start_build $SLACKBUILD_TEMP # On/Off sections activate_sections # Change sections section_edit # Remove off sections build_slackbuild # Make slack-required file make_slack_required if [ -e slack-required ]; then DEPENDENCY_LIST="`cat slack-required | awk '{print $1}' | grep '^[a-z]' | tr '\012' ' '`" edit_file "REQUIRES" "$DEPENDENCY_LIST" $SLACKBUILD fi # Others changes change_others_fields # Clear temporary files clear_files