#!/bin/bash # # Copyright (C) 2008, 2009 Renato Cunha # # This is free software. # You can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This software is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA # ## new-build-script.sh Documentation ## ## Motivation for this script: ## ## I think that the DBS should have some kind of template generator ## like: ## newbuildscript nameofpackage ## then it would create ## SCRIPTS/nameofpackage/{build,desc,ChangeLog} ## SOURCES/nameofpackage/ ## and, preferrably, the build script would have a skeleton build script, like zenity's one ## and, why not ## a self generated first changelog entry with todays date and I think you got it ## that's also not hard ## actually, its fairly easy to do ## cool ## thats true ## just something like ./build new_pack ## then you receive a question ## new_pack doesnt exist ## do you want to create it ? ## if yes, then it creates everything asking you for the name url and version of the pack ## name could be passed by the ./build script ## for example ./build dubidubi ## dubidubi doesnt exist in the repos, do you want to create it ? ## wow ## if yes, you enter all the needed data ## and you are set up ## that's a nice use cas ## :) ## s/cas/case ## go ahead , code it :) export DLG_ROOT=${DLG_ROOT:-$(pwd)} . ${DLG_ROOT}/config . ${DLG_ROOT}/SCRIPTS/dropline-header . ${DLG_ROOT}/SCRIPTS/dropline-functions.sh if [ -e "/usr/games/rot13" ]; then ROT13=/usr/games/rot13 else ROT13=/usr/bin/cat fi ## Variable documentation ## ## YOUR_NAME ## holds your (yeah, you, the one reading this file) name. ## HINT: It should be better to save this variable to your Dropline Build ## System config file ## YOUR_NAME=${YOUR_NAME:-"Your name"} ## YOUR_EMAIL ## holds your (yeah, you, the one reading this file) email address ## HINT: It should be better to save this variable to your Dropline Build ## System config file ## YOUR_EMAIL=${YOUR_EMAIL:-"your@email.com"} ## SUPPORTED_BUILD_SYSTEMS ## holds the build systems supported by this script ## Please, *don't* edit this variable ## SUPPORTED_BUILD_SYSTEMS="autotools distutils perl" ## Bash function call documentation ## ## create_dirs name ## This will create a new directory named 'name' inside $DLG_ROOT/SCRIPTS ## and $DLG_ROOT/SOURCES (or on its extras/contrib counterparts) ## function create_dirs() { NAME=${1:?'Internal error, create_dirs requires a name.'} if [ "${2}" == "extras" ]; then DIRS="extras/dropline/SCRIPTS extras/dropline/SOURCES" elif [ "${2}" == "contrib" ]; then DIRS="extras/contrib/SCRIPTS extras/contrib/SOURCES" else DIRS="SCRIPTS SOURCES" fi for dir in $DIRS do createdir ${DLG_ROOT}/${dir}/${NAME} done } ## fallback ## If this is called, it will fallback and remove the newly created ## directories. function fallback() { if [ "${1}" == "extras" ]; then DIRS="extras/dropline/SCRIPTS extras/dropline/SOURCES" elif [ "${1}" == "contrib" ]; then DIRS="extras/contrib/SCRIPTS extras/contrib/SOURCES" else DIRS="SCRIPTS extras/dropline/SOURCES" fi for dir in $DIRS do # removedir is implemented by the dropline-build-system removedir ${DLG_ROOT}/${dir}/${NAME} done } ## create_changelog name version ## This will create a file named ChangeLog in the directory named 'name' ## inside $DLG_ROOT/SCRIPTS (or in its extras/contrib counterparts) ## function create_changelog() { NAME=${1:?'Internal error, create_changelog requires a name.'} VERSION=${2:?'Internal error, create_changelog requires a version.'} PKGER=${4:'dl'} TODAY=$(date +%Y-%m-%d) if [ "${3}" == "extras" ]; then DIR="extras/dropline/SCRIPTS" elif [ "${3}" == "contrib" ]; then DIR="extras/contrib/SCRIPTS" else DIR="SCRIPTS" fi # rot13'ing the email is better to protect it from spammers YOUR_EMAIL=$(echo $YOUR_EMAIL | rot13) cat << EOF > ${DLG_ROOT}/${DIR}/${NAME}/ChangeLog $TODAY $YOUR_NAME <$YOUR_EMAIL> Released revision ${VERSION}-${DLG_ARCH}-1${DLG_PKGER}. * desc: Initial release. * build: Initial release. EOF status=$? if [ $status != 0 ]; then fallback $PACKAGE_TYPE die "The cat command, called from within the create_changelog function,\ exited with status $status!" fi } ## create_descfile name ## This will call the script $DLG_ROOT/editdesc and edit the file named ## 'desc' inside $DLG_ROOT/SCRIPTS (or its extras/contrib counterpart) function create_descfile() { NAME=${1:?'Internal error, create_descfile requires a name.'} bash $DLG_ROOT/editdesc $NAME ${2} status=$? if [ $status != 0 ]; then fallback $PACKAGE_TYPE die "The editdesc script failed with status $status!" fi } function populate_autotools_commands() { if [ "${2}" == "extras" ]; then DIR="extras/dropline/SCRIPTS" elif [ "${2}" == "contrib" ]; then DIR="extras/contrib/SCRIPTS" else DIR="SCRIPTS" fi cat << EOF >> ${DLG_ROOT}/${DIR}/${NAME}/build cflags cxxflags prepare analyzesource configure make makeinstall tidydocumentation analyzebinaries finalizepackage packagize cleanup EOF } function populate_distutils_commands() { if [ "${2}" == "extras" ]; then DIR="extras/dropline/SCRIPTS" elif [ "${2}" == "contrib" ]; then DIR="extras/contrib/SCRIPTS" else DIR="SCRIPTS" fi cat << EOF >> ${DLG_ROOT}/${DIR}/${NAME}/build # This package gets it's CFLAGS info from what was compiled into Python. # Changing this variable is mainly a formality caused by this. if [ "\${PKG_ARCH%86}" != "\$PKG_ARCH" ]; then PKG_ARCH=i486 fi PKG_LOCALSTATEDIR=/var prepare analyzesource spewdo "cd \$PKG_SRCROOT" spewdo "python setup.py build" spewdo "python setup.py install --prefix=\$PKG_PREFIX --root=\$PKG_STAGEROOT" tidydocumentation analyzebinaries finalizepackage packagize cleanup EOF } function populate_perl_commands() { if [ "${2}" == "extras" ]; then DIR="extras/dropline/SCRIPTS" elif [ "${2}" == "contrib" ]; then DIR="extras/contrib/SCRIPTS" else DIR="SCRIPTS" fi cat << EOF >> ${DLG_ROOT}/${DIR}/${NAME}/build # This makes sure our 32bit builds get the right ARCH tag. The main reason # for doing this is to avoid a naming collision with the x86-64 builds. if [ "\${PKG_ARCH%86}" != "\$PKG_ARCH" ]; then PKG_ARCH=i486 fi cflags cxxflags prepare analyzesource loggedcommand configure "cd \$PKG_SRCROOT ; perl Makefile.PL" make makeinstall tidydocumentation analyzebinaries finalizepackage packagize cleanup EOF } function populate_build_system_commands() { BUILD_SYSTEM=${1:-'autotools'} SUPPORTED=false for build_system in $SUPPORTED_BUILD_SYSTEMS do if [ "$BUILD_SYSTEM" == "$build_system" ]; then SUPPORTED=true fi done if [ "$SUPPORTED" == "false" ]; then die "$BUILD_SYSTEM build system not supported. Aborting." fi eval "populate_${BUILD_SYSTEM}_commands" ${2} } ## create_buildscript name version sourceurl ## This will create the build script for the package named 'name' inside ## $DLG_ROOT/SCRIPTS/name based on a very simple template that will cover ## most of autotools based programs. 'version' and 'sourceurl' will be used ## to populate the proper entries in the build script. function create_buildscript() { NAME=$1 VERSION=$2 SOURCEURL=$3 BUILD_SYSTEM=${5:-'autotools'} if [ "${4}" == "extras" ]; then DIR="extras/dropline/SCRIPTS" elif [ "${4}" == "contrib" ]; then DIR="extras/contrib/SCRIPTS" else DIR="SCRIPTS" fi YEAR=$(date +%Y) cat << EOF > ${DLG_ROOT}/${DIR}/${NAME}/build #!/bin/sh # # Copyright $YEAR $YOUR_NAME # Available under the terms of the GNU GPL. # NAME="$NAME" VERSION="$VERSION" REVISION="1" PKG_SOURCEURL='$SOURCEURL' . \$DLG_ROOT/config . \$DLG_ROOT/SCRIPTS/dropline-functions.sh EOF populate_build_system_commands $BUILD_SYSTEM ${4} status=$? if [ $status != 0 ]; then fallback $PACKAGE_TYPE die "The cat command, called from within the create_buildscript function,\ exited with status $status!" fi } # # Actual body # if [ "$1" == "" ]; then echo -n "Please tell me the name of the build script you intend to create: " read NAME else NAME=$1 fi if [ "$2" == "" ]; then echo -n "Please tell me what version of $NAME you want to build: " read VERSION else VERSION=$2 fi if [ "$3" == "" ]; then echo "If you know from where to download $NAME version $VERSION from\ , please type it here: " read URL else URL=$3 fi if [ "$4" == "" ]; then echo -n "Please select one of the following build systems: autotools, distutils, perl. \ (autotools is the default, distutils is commonly used by python programs and perl is used \ by perl programs): " read BUILD_SYSTEM if [ "$BUILD_SYSTEM" == "" ]; then BUILD_SYSTEM=autotools fi else BUILD_SYSTEM=$4 fi if [ "$5" == "" ]; then echo -n "Is this an official Dropline package, an extra or a contrib package? Please \ select one of the following options: dlg, extra, contrib. \ (dlg is the default and will place your build script on the main tree, extra will place it \ on extras/dropline and contrib will place it on extras/contrib): " read PACKAGE_TYPE PACKAGE_TYPE=$(echo $PACKAGE_TYPE | tr [A-Z] [a-z]) if [ "$PACKAGE_TYPE" == "extra" ]; then PACKAGE_TYPE="extra" elif [ "$PACKAGE_TYPE" == "contrib" ]; then PACKAGE_TYPE="contrib" else PACKAGE_TYPE="dlg" fi fi # This variable uses an inverted logic: 0 -> true / 1 -> false echo $URL | grep $NAME &> /dev/null can_subst_name=$? # This variable uses an inverted logic: 0 -> true / 1 -> false echo $URL | grep $VERSION &> /dev/null can_subst_version=$? if [ "$can_subst_name" == "0" ]; then NEWURL=$(echo $URL | sed -e 's/'$NAME'/'\${NAME}'/g') echo -n "I noticed that $NAME occurs in the URL you typed, should I\ substitute it with the \$NAME variable resulting in the URL $NEWURL? (Y/n) " read should_subst_name if [ "$should_subst_name" != "n" ]; then URL=$NEWURL fi if [ "$can_subst_version" == "0" ]; then echo -n "I also noticed the same with $VERSION. Should I do the analog\ with it? (Y/n) " read should_subst_version NEWURL=$(echo $URL | sed -e 's/'$VERSION'/'\${VERSION}'/g') if [ "$should_subst_version" != "n" ]; then URL=$NEWURL fi fi else if [ "$can_subst_version" == "0" ]; then NEWURL=$(echo $URL | sed -e 's/'$VERSION'/'\$VERSION'/g') if [ "$should_subst_version" != "n" ]; then URL=$NEWURL fi echo -n "I noticed that $VERSION occurs in the URL you typed, should I\ substitute it with the \$VERSION variable resulting in the URL $NEWURL? (Y/n) " read should_subst_version fi fi create_dirs $NAME $PACKAGE_TYPE create_changelog $NAME $VERSION $PACKAGE_TYPE create_descfile $NAME $PACKAGE_TYPE create_buildscript $NAME $VERSION $URL $PACKAGE_TYPE $BUILD_SYSTEM # vim: ts=4 sw=4 expandtab