#!/bin/bash buildpkgver=1.4.0 startdir="$(pwd)" err() { echo "$1" exit 1 } help_msg() { cat <" $startdir/ZENBUILD)" ]; then err "Maintainer isn't set in ZENBUILD, exiting" fi #Check for numerous commentaries NUMCOM=$(grep -e "^#[a-zA-Z]*=[a-zA-Z]*" ${startdir}/ZENBUILD | wc -l) [[ $NUMCOM -ge 2 ]] && echo "WARNING: You appear to have too many commented variables, you should look into it." #source sanity for SOURCES in "${source[@]}"; do if [ ! -f "$(basename $SOURCES)" ]; then protocol=$(echo $SOURCES | sed 's|:.*||') if [ "$protocol" = "http" -o "$protocol" = "https" -o "$protocol" = "ftp" ]; then echo -e "\nDownloading $(basename $SOURCES)\n" wget $SOURCES if [ ! "$?" == "0" ]; then echo "Download failed" exit 2 fi else err "$SOURCES does not appear to be a url nor is it in the directory" fi else echo "$(basename $SOURCES) found in current directory" fi done #slackdesc sanity for ((LINE=0 ; LINE < 10 ; LINE++)); do REALLINE=$(expr $LINE + 1) if [ "${#slackdesc[$LINE]}" -gt "70" ] ; then let "extrachar=${#slackdesc[$LINE]}-70" err "Line ${REALLINE}: '${slackdesc[$LINE]}' is greater than 70 characters, make it $extrachar characters shorter." fi done #clean dotnew if [[ "$dotnew" ]]; then NUM='0' for dot in ${dotnew[@]}; do if [ "${dotnew[$NUM]:0:1}" == "/" ]; then dotnew[$NUM]=${dotnew[$NUM]:1} fi let "NUM++" done fi #########Sanity Tests End######################################## #options=() if [ -n "$options" ]; then unset NOEXTRACT unset NOREQUIREDBUILDER unset REQUIREDBUILDERFLATDEPS unset NOSTRIP unset KEEPDEPFILE for opts in ${options[@]}; do case $opts in noextract) echo "Setting option noextract" NOEXTRACT='1' ;; norequiredbuilder) echo "Setting option norequiredbuilder" NOREQUIREDBUILDER='1' ;; nostrip) echo "Setting option nostrip" NOSTRIP='1' ;; requiredbuilderflatdeps) echo "Setting option requiredbuilderflatdeps" REQUIREDBUILDERFLATDEPS='1' ;; keepdepfile) echo "Setting option keepdepfile" KEEPDEPFILE='1' ;; *) echo "$opts is not a correct option, exiting." exit 2 ;; esac done fi #######Generate Build Script##################################### cat < ${startdir}/build-${pkgname}.sh #!/bin/bash #Automatically Created by buildpkg $buildpkgver EOA if [ "$(grep -e "^#Maintainer" $startdir/ZENBUILD)" ]; then grep -e "^#Maintainer" $startdir/ZENBUILD >> $startdir/build-$pkgname.sh fi [[ "$(grep -e "^#Former Maintainer(s)" $startdir/ZENBUILD)" ]] && grep -e "^#Former Maintainer(s)" $startdir/ZENBUILD >> $startdir/build-$pkgname.sh [[ "$url" ]] && echo "#url: $url" >> $startdir/build-$pkgname.sh [[ "$KEEPDEPFILE" ]] && echo "KEEPDEPFILE='1'" >> $startdir/build-$pkgname.sh cat <<"EOREDUNDANT" >> $startdir/build-$pkgname.sh ######Begin Redundant Code###################################### check_for_root() { if [ "$UID" != "0" ]; then echo "You need to be root" exit 1 fi } clean_dirs () { for COMPLETED in src pkg; do if [ -e $COMPLETED ]; then rm -rf $COMPLETED fi done } clean_old_builds () { for COMPLETED in $package.{tgz,md5,dep}; do if [ "$KEEPDEPFILE" = "1" ] && [ $COMPLETED = $package.dep ]; then continue elif [ -e $COMPLETED ]; then rm -rf $COMPLETED fi done clean_dirs } set_pre_permissions() { cd $startdir/src find . -perm 664 -exec chmod 644 {} \; find . -perm 600 -exec chmod 644 {} \; find . -perm 444 -exec chmod 644 {} \; find . -perm 400 -exec chmod 644 {} \; find . -perm 440 -exec chmod 644 {} \; find . -perm 777 -exec chmod 755 {} \; find . -perm 775 -exec chmod 755 {} \; find . -perm 511 -exec chmod 755 {} \; find . -perm 711 -exec chmod 755 {} \; find . -perm 555 -exec chmod 755 {} \; } check_for_menu_compliance() { if [ -d "$startdir/pkg/usr/share/applications" ]; then cd $startdir/pkg/usr/share/applications for desktop in *.desktop; do Icon=$(grep -e "^Icon=" $desktop | sed 's/Icon=//') if [[ "$Icon" ]]; then if [ ! "$Icon" == "${Icon%.*}" ]; then sed '/Icon/s/\..*$//' -i $desktop Icon=$(grep -e "^Icon=" $desktop | sed 's/Icon=//') fi if [ -d "$startdir/pkg/usr/share/pixmaps" ]; then cd $startdir/pkg/usr/share/pixmaps for pixmaps in *; do [ -d $pixmaps ] && continue [ ! "${pixmaps##*.}" == "png" -a ! "${pixmaps##*.}" == "svg" ] && continue if [ "${pixmaps%.*}" == "$Icon" ]; then DIR=$(file $pixmaps | awk -F, '{print $2}' | sed 's/ //g') [ o"$DIR" == "o" ] && DIR="scalable" mkdir -p $startdir/pkg/usr/share/icons/hicolor/$DIR/apps mv $pixmaps $startdir/pkg/usr/share/icons/hicolor/$DIR/apps if [[ ! "$(ls $startdir/pkg/usr/share/pixmaps)" ]]; then rm -rf $startdir/pkg/usr/share/pixmaps fi fi done fi if [ -d "$startdir/pkg/usr/share/icons" ]; then cd $startdir/pkg/usr/share/icons for icons in *; do if [ "${icons%.*}" == "$Icon" ]; then [ ! "${pixmaps##*.}" == "png" -a ! "${pixmaps##*.}" == "svg" ] && continue DIR=$(file $icons | awk -F, '{print $2}' | sed 's/ //g') [ o"$DIR" == "o" ] && DIR="scalable" mkdir -p $startdir/pkg/usr/share/icons/hicolor/$DIR/apps mv $icons $startdir/pkg/usr/share/icons/hicolor/$DIR/apps fi done fi fi done fi } gzip_man_and_info_pages() { for DOCS in man info; do if [ -d "$startdir/pkg/usr/share/$DOCS" ]; then mv $startdir/pkg/usr/share/$DOCS $startdir/pkg/usr/$DOCS if [[ ! "$(ls $startdir/pkg/usr/share)" ]]; then rm -rf $startdir/pkg/usr/share fi fi if [ -d "$startdir/pkg/usr/$DOCS" ]; then # I've never seen symlinks in info pages.... if [ "$DOCS" == "man" ]; then (cd $startdir/pkg/usr/$DOCS for manpagedir in $(find . -type d -name "man*" 2> /dev/null) ; do ( cd $manpagedir for eachpage in $( find . -type l -maxdepth 1 2> /dev/null) ; do ln -s $( readlink $eachpage ).gz $eachpage.gz rm $eachpage done ) done) fi find $startdir/pkg/usr/$DOCS -type f -exec gzip -9 '{}' \; fi done } set_post_permissions() { for DIRS in usr/share/icons usr/doc; do if [ -d "$startdir/pkg/$DIRS" ]; then if [ "$DIRS" == "usr/doc" ]; then find $startdir/pkg/$DIRS -type f -exec chmod 644 {} \; find $startdir/pkg/$DIRS -type d -exec chmod 755 {} \; fi fi [ -d $startdir/pkg/$DIRS ] && chown root:root -R $startdir/pkg/$DIRS done [ -d $startdir/pkg/usr/bin ] && find $startdir/pkg/usr/bin -user root -group bin -exec chown root:root {} \; } copy_build_script() { mkdir -p $startdir/pkg/usr/src/$pkgname-$pkgver/ cp $startdir/build-$pkgname.sh $startdir/pkg/usr/src/$pkgname-$pkgver/build-$pkgname.sh [ -f $startdir/ZENBUILD ] && cp $startdir/ZENBUILD $startdir/pkg/usr/src/$pkgname-$pkgver/ZENBUILD } create_package() { cd $startdir/pkg /sbin/makepkg -l y -c n $startdir/$package.tgz cd $startdir md5sum $package.tgz > $startdir/$package.md5 } EOREDUNDANT if [ -z "$NOSTRIP" ]; then cat <<"EOREDUNDANT1" >> $startdir/build-$pkgname.sh strip_binaries() { cd $startdir/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 } EOREDUNDANT1 fi cat <<"EOREDUNDANT2" >> $startdir/build-$pkgname.sh #########End Redundant Code##################################### #########Begin Non Redundant Code############################## EOREDUNDANT2 if [[ "$source" ]]; then cat <>$startdir/build-$pkgname.sh prepare_directory() { mkdir \$startdir/src mkdir -p \$startdir/pkg/usr/src/\$pkgname-\$pkgver for SOURCES in \${source[@]}; do protocol=\$(echo \$SOURCES | sed 's|:.*||') if [ ! -f "\$(basename \$SOURCES)" ]; then if [ "\$protocol" = "http" -o "\$protocol" = "https" -o "\$protocol" = "ftp" ]; then echo -e "\nDownloading \$(basename \$SOURCES)\n" wget \$SOURCES if [ ! "\$?" == "0" ]; then echo "Download failed" exit 2 fi else echo "\$SOURCES does not appear to be a url nor is it in the directory" exit 2 fi fi cp -R \$(basename \$SOURCES) \$startdir/src if ! [ "\$protocol" = "http" -o "\$protocol" = "https" -o "\$protocol" = "ftp" ]; then cp -R \$startdir/\$(basename \$SOURCES) \$startdir/pkg/usr/src/\$pkgname-\$pkgver/ fi if [ "\${SOURCES##*.}" == "desktop" ]; then [[ "\$(grep -e "^Categories=[a-zA-Z]*;" \$(basename \$SOURCES))" ]] && install -D \$startdir/\$(basename \$SOURCES) $startdir/pkg/usr/share/applications/\$(basename \$SOURCES) fi done } EOPREPAREDIRECTORY else cat <<"EOPREPAREDIRECTORY" >>$startdir/build-$pkgname.sh prepare_directory() { mkdir $startdir/src mkdir $startdir/pkg } EOPREPAREDIRECTORY fi if [ -z "$NOEXTRACT" ]; then cat <>$startdir/build-$pkgname.sh extract_source() { cd \$startdir/src if [[ "\$(ls \$startdir/src)" ]]; then for FILES in \${source[@]}; do FILES="\$(basename \$FILES)" file_type=\$(file -biz "\$FILES") unset cmd case "\$file_type" in *application/x-tar*) cmd="tar -xf" ;; *application/x-zip*) cmd="unzip" ;; *application/x-gzip*) cmd="gunzip -d -f" ;; *application/x-bzip*) cmd="bunzip2 -f" ;; esac if [ "\$cmd" != "" ]; then echo "\$cmd \$FILES" \$cmd \$FILES fi done elif [ ! "\$source" ]; then echo -n "" # lame fix else echo "no files in the src directory \$startdir/src" exit 2 fi } EOEXTRACTSOURCES fi sed -n '/^build()/,/^}$/p' $startdir/ZENBUILD >> $startdir/build-$pkgname.sh cat <>$startdir/build-$pkgname.sh create_slackdesc() { mkdir \$startdir/pkg/install cat <<"EODESC" >\$startdir/pkg/install/slack-desc $pkgname: ${slackdesc[0]} $pkgname: $pkgname: ${slackdesc[1]} $pkgname: ${slackdesc[2]} $pkgname: ${slackdesc[3]} $pkgname: ${slackdesc[4]} $pkgname: ${slackdesc[5]} $pkgname: ${slackdesc[6]} $pkgname: ${slackdesc[7]} $pkgname: ${slackdesc[8]} $pkgname: ${slackdesc[9]} EODESC } EOM if [[ "$dotnew" ]]; then cat<>$startdir/build-${pkgname}.sh setup_dotnew() { for files in ${dotnew[@]} ; do fullfile="\${startdir}/pkg/\${files}" if [ -e "\$fullfile" ]; then mv \$fullfile \${fullfile}.new else echo "\$fullfile was not found" exit 2 fi done cat<<"EODOTNEW" >\$startdir/pkg/install/doinst.sh #Added by buildpkg $buildpkgver dotnew() { NEW="\${1}.new" OLD="\$1" if [ ! -e \$OLD ]; then mv \$NEW \$OLD elif [ -z "\$(cmp \$NEW \$OLD)" ]; then rm \$NEW fi } EOP for i in ${dotnew[@]}; do echo "dotnew $i" >> $startdir/build-$pkgname.sh done cat <<"EOQ" >>$startdir/build-$pkgname.sh EODOTNEW } EOQ fi if [[ "$(grep '^doinst\(\)' $startdir/ZENBUILD)" ]]; then cat <>$startdir/build-$pkgname.sh setup_doinst() { cat <<"EODOINST" >>\$startdir/pkg/install/doinst.sh $(sed -n '/doinst()/,/^}$/p' $startdir/ZENBUILD) doinst EODOINST } EOPOSTINSTALL fi if [[ "$docs" ]]; then cat <> $startdir/build-$pkgname.sh copy_docs() { for stuff in \${docs[@]}; do if [ ! -d "\$startdir/pkg/usr/doc/\$pkgname-\$pkgver" ]; then mkdir -p \$startdir/pkg/usr/doc/\$pkgname-\$pkgver fi find \$startdir/src -type f -iname "\$stuff" -exec cp -R '{}' \$startdir/pkg/usr/doc/\$pkgname-\$pkgver \; done } EOEXTRADOCS fi if [[ "$extradepends" ]]; then unset FIRST for deps in ${extradepends[@]} ; do if [[ ! "$FIRST" ]]; then depstring=",${deps}" FIRST="1" continue fi depstring="${depstring},${deps}" done fi cat <>$startdir/build-$pkgname.sh detect_dependencies() { echo "Detecting dependencies..." EODEPS1 if [ -z "$NOREQUIREDBUILDER" ]; then if [ -z "$REQUIREDBUILDERFLATDEPS" ]; then echo ' depends=$(requiredbuilder -z $startdir/$package.tgz)' >> $startdir/build-$pkgname.sh else echo ' depends=$(requiredbuilder -r -z $startdir/$package.tgz)' >> $startdir/build-$pkgname.sh fi else echo ' depends=""' >> $startdir/build-$pkgname.sh fi if [[ "$lessdepends" ]]; then for deps in ${lessdepends[@]}; do cat <>$startdir/build-$pkgname.sh depends="\$(echo \$depends | sed -e 's/\<${deps}\>//' -e 's/,,/,/')" EODEPS2 done fi cat <>$startdir/build-$pkgname.sh depstring=\$depends$depstring unset FIRST for deps in \$(echo "\${depstring}" | sed 's/,/\n/g' | sort -u); do if [[ ! "\$FIRST" ]]; then finaldeps=\$deps, FIRST='1' continue fi finaldeps=\${finaldeps}\${deps}, done echo "\$finaldeps" | sed -e 's/^,//' -e 's/,$//' > \$startdir/\$package.dep } EODEPS3 cat <>$startdir/build-$pkgname.sh ####End Non Redundant Code############################ #Variables startdir=\$(pwd) SRC=\$startdir/src PKG=\$startdir/pkg pkgname=$pkgname pkgver=$pkgver pkgrel=$pkgrel zenver=$zenver arch=$arch package=\$pkgname-\$pkgver-\$arch-\$zenver.\$pkgrel EOVARIABLES grep -e "^_[a-zA-Z]*=[a-zA-Z]*" $startdir/ZENBUILD >> $startdir/build-$pkgname.sh echo "source=(${source[@]})" >> $startdir/build-$pkgname.sh echo "docs=(${docs[@]})" >> $startdir/build-$pkgname.sh CFLAGS=${CFLAGS:-"-O2 -march=$arch -mtune=i686"} CXXFLAGS=${CFLAGS:-"-O2 -march=$arch -mtune=i686"} for FLAGS in CFLAGS CXXFLAGS; do echo "export $FLAGS=\"${!FLAGS}\"" >>$startdir/build-$pkgname.sh done cat <<"EOEXECUTION1" >> $startdir/build-$pkgname.sh #Execution check_for_root clean_old_builds prepare_directory EOEXECUTION1 [ -z "$NOEXTRACT" ] && echo "extract_source" >>$startdir/build-$pkgname.sh cat <<"EOEXECUTION2">>$startdir/build-$pkgname.sh set_pre_permissions build if [ ! "$?" = "0" ]; then echo "build() failed." exit 2 fi create_slackdesc EOEXECUTION2 [[ "$dotnew" ]] && echo "setup_dotnew" >>$startdir/build-$pkgname.sh [[ "$(grep '^doinst\(\)' $startdir/ZENBUILD)" ]] && echo "setup_doinst" >>$startdir/build-$pkgname.sh [[ "$docs" ]] && echo "copy_docs" >>$startdir/build-$pkgname.sh cat <<"EOEXECUTION31" >> $startdir/build-$pkgname.sh check_for_menu_compliance EOEXECUTION31 [ -z "$NOSTRIP" ] && echo "strip_binaries" >>$startdir/build-$pkgname.sh cat <<"EOEXECUTION32" >> $startdir/build-$pkgname.sh gzip_man_and_info_pages set_post_permissions copy_build_script create_package EOEXECUTION32 [[ -z "$KEEPDEPFILE" ]] && echo "detect_dependencies" >> $startdir/build-$pkgname.sh cat <<"EOEXECUTION31" >> $startdir/build-$pkgname.sh echo "Package has been built." EOEXECUTION31 if [ "$REMOVEDIRS" == "1" ]; then echo 'echo "Cleaning pkg and src directories"' >> $startdir/build-$pkgname.sh echo "clean_dirs" >> $startdir/build-$pkgname.sh fi chmod +x $startdir/build-$pkgname.sh echo "build-$pkgname.sh has been created" if [ "$EXECUTE" == "1" ]; then ./build-$pkgname.sh 2>&1 | tee build-$pkgname.log fi