#!/bin/sh

# Building requires fakedestdir. It should be in PATH.

# Build and install GNU emacs for Slackware.
# Before starting, you might want to reduce dependancies in the
# .tgz packages by doing this (no, you really don't want to do this):
#                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#removepkg xaw3d
#rm /usr/lib/libjpeg.so
#rm /usr/lib/libpng.so
#rm /usr/lib/libtiff.so
#rm /usr/lib/libungif.so
# and then replace these things after the build.

VERSION=21.4
ARCH=${ARCH:-i486}
BUILD=1unknown
PKGFORMAT=tgz
TMP=${TMP:-/tmp}
case "$ARCH" in
  i386)     SLKCFLAGS="-O2 -march=i386 -mcpu=i686" ;;
  i486)     SLKCFLAGS="-O2 -march=i486 -mcpu=i686" ;;
  s390)     SLKCFLAGS="-O2" ;;
  powerpc)  SLKCFLAGS="-O2" ;;
  x86_64)   SLKCFLAGS="-O2 -fPIC"; LIBDIRSUFFIX="64" ;;
esac
            
export CFLAGS=$SLKCFLAGS
export LDFLAGS="-s"

set -e
CWD=`pwd`
PKG=$TMP/package-emacs-common
PKG_INFO=$TMP/package-emacs-info
PKG_LEIM=$TMP/package-emacs-leim
PKG_LISP=$TMP/package-emacs-lisp
PKG_MISC=$TMP/package-emacs-misc
PKG_NOX=$TMP/package-emacs-nox
PKG_X=$TMP/package-emacs-withx
umask 0022
rm -rf $PKG $PKG_INFO $PKG_LEIM $PKG_LISP $PKG_MISC $PKG_NOX $PKG_X

cd $TMP
rm -rf emacs-$VERSION
tar xjvf $CWD/emacs-$VERSION.tar.bz2
tar xjvf $CWD/leim-$VERSION.tar.bz2
cd emacs-$VERSION
# Fix AltGr problem in X11 build. http://bugs.gentoo.org/show_bug.cgi?id=66508
zcat $CWD/emacs.xorg.patch.gz | patch -p1
# Save some docs:
mkdir -p $PKG/usr/doc/emacs-$VERSION
cp -a BUGS FTP INSTALL README $PKG/usr/doc/emacs-$VERSION
chmod 644 $PKG/usr/doc/emacs-$VERSION/*
( cd $PKG/usr/doc/emacs-$VERSION ; ln -sf /usr/share/emacs/$VERSION/etc . )
# Build a version of emacs that is not linked to the X11 libraries:
./configure $ARCH-slackware-linux \
  --prefix=/usr \
  --libdir=/usr/lib$LIBDIRSUFFIX \
  --with-x=no \
  --with-pop
make
fakedestdir "$PKG" install
( cd $PKG/usr/bin ; mv emacs-$VERSION emacs-$VERSION-no-x11 )
# OK, now we start over building the full X11 emacs:
./configure $ARCH-slackware-linux \
  --prefix=/usr \
  --libdir=/usr/lib$LIBDIRSUFFIX \
  --with-x11 \
  --with-x-toolkit \
  --with-pop
make
fakedestdir "$PKG" install
( cd $PKG/usr/bin ; mv emacs-$VERSION emacs-$VERSION-with-x11 ; rm -f emacs )

######################################################################

# Split into a separate packages:

# emacs-info:
mkdir -p $PKG_INFO/usr $PKG_INFO/install
mv $PKG/usr/info $PKG_INFO/usr
rm $PKG_INFO/usr/info/dir
gzip -9 $PKG_INFO/usr/info/*
cat $CWD/slack-desc.emacs-info > $PKG_INFO/install/slack-desc

# emacs-leim:
mkdir -p $PKG_LEIM/usr/share/emacs/$VERSION $PKG_LEIM/install
mv $PKG/usr/share/emacs/$VERSION/leim $PKG_LEIM/usr/share/emacs/$VERSION
cat $CWD/slack-desc.emacs-leim > $PKG_LEIM/install/slack-desc

# emacs-lisp
mkdir -p $PKG_LISP/usr/share/emacs/$VERSION $PKG_LISP/install
# We cp instead of mv and remove the rest of the duplicates later.
cp -a $PKG/usr/share/emacs/$VERSION/lisp $PKG_LISP/usr/share/emacs/$VERSION
find $PKG_LISP \! -type d \! -name "*.el" | xargs rm -f
cat $CWD/slack-desc.emacs-lisp > $PKG_LISP/install/slack-desc

# emacs-misc:
mkdir -p $PKG_MISC/usr/share/emacs/$VERSION $PKG_MISC/install
mv $PKG/usr/share/emacs/$VERSION/etc $PKG_MISC/usr/share/emacs/$VERSION
mkdir -p $PKG/usr/share/emacs/$VERSION/etc
mv $PKG_MISC/usr/share/emacs/$VERSION/etc/DOC-$VERSION.* $PKG/usr/share/emacs/$VERSION/etc
cat $CWD/slack-desc.emacs-misc > $PKG_MISC/install/slack-desc

# emacs-nox:
mkdir -p $PKG_NOX/usr/bin $PKG_NOX/usr/libexec/emacs/21.4/$ARCH-slackware-linux $PKG_NOX/install
mv $PKG/usr/bin/emacs-$VERSION-no-x11 $PKG_NOX/usr/bin
ln -s emacs-$VERSION-no-x11 $PKG_NOX/usr/bin/emacs
cp -a lib-src/fns-$VERSION.1.el $PKG_NOX/usr/libexec/emacs/21.4/$ARCH-slackware-linux
cat $CWD/slack-desc.emacs-nox > $PKG_NOX/install/slack-desc

# emacs-withx:
mkdir -p $PKG_X/usr/bin $PKG_X/usr/libexec/emacs/21.4/$ARCH-slackware-linux $PKG_X/install
mv $PKG/usr/bin/emacs-$VERSION-with-x11 $PKG_X/usr/bin
ln -s emacs-$VERSION-with-x11 $PKG_X/usr/bin/emacs
cp -a lib-src/fns-$VERSION.2.el $PKG_X/usr/libexec/emacs/21.4/$ARCH-slackware-linux
cat $CWD/slack-desc.emacs-withx > $PKG_X/install/slack-desc

# emacs-common:
# The directory 'leim' is nice to exists even as empty to avoid a warning
# when starting Emacs without the 'emacs-leim' package:
mkdir -p $PKG/usr/share/emacs/$VERSION/leim $PKG/install
gzip -9r $PKG/usr/man
rm -f $PKG/usr/share/emacs/$VERSION/etc/DOC-$VERSION.2
ln -s DOC-$VERSION.1 $PKG/usr/share/emacs/$VERSION/etc/DOC-$VERSION.2
cat $CWD/slack-desc.emacs-common > $PKG/install/slack-desc

######################################################################

# This script emits a list of all the .el files for which
# there is no corresponding .elc file, as well as all the
# terminal related .el files, and other special .el files
# suggested by Emacs users over the years.
#
# These should always be installed.

( cd $PKG
  # Seems that all .el files are now also as .elc so this
  # the for-loop below might be unneeded. --Larhzu
  for file in `find usr/share/emacs -name "*.el"` ; do
    [ ! -e "${file}c" ] && echo "$file"
  done
  # OK, now out with the term .el files:
  find usr/share/emacs/$VERSION/lisp/term -name "*.el"
  # Next, the user-supplied list:
  echo usr/share/emacs/$VERSION/lisp/abbrevlist.el
  echo usr/share/emacs/$VERSION/lisp/bindings.el
  echo usr/share/emacs/$VERSION/lisp/cdl.el
  echo usr/share/emacs/$VERSION/lisp/emacs-lisp/cl-specs.el
  echo usr/share/emacs/$VERSION/lisp/emulation/edt-lk201.el
  echo usr/share/emacs/$VERSION/lisp/emulation/edt-vt100.el
  echo usr/share/emacs/$VERSION/lisp/foldout.el
  echo usr/share/emacs/$VERSION/lisp/gnus/nnlistserv.el
  echo usr/share/emacs/$VERSION/lisp/international/iso-transl.el
  echo usr/share/emacs/$VERSION/lisp/mail/rmailmsc.el
  #echo usr/share/emacs/$VERSION/lisp/mail/rnews.el
  #echo usr/share/emacs/$VERSION/lisp/mail/sc.el
  echo usr/share/emacs/$VERSION/lisp/misc.el
  echo usr/share/emacs/$VERSION/lisp/vt-control.el
  #echo usr/share/emacs/$VERSION/lisp/x-apollo.el
) | sort -u | ( cd $PKG_LISP ; xargs rm -f )

# Then remove the duplicates:
( cd $PKG_LISP ; find usr -type f > filelist.tmp )
( cd $PKG
  find usr -type f > filelist.tmp
  sort filelist.tmp $PKG_LISP/filelist.tmp | uniq -d | xargs rm -f
)
rm -r $PKG/filelist.tmp $PKG_LISP/filelist.tmp

######################################################################


# Slackware-specific stuff:
chown -R root:root $PKG $PKG_INFO $PKG_LEIM $PKG_LISP $PKG_MISC $PKG_NOX $PKG_X
find $PKG $PKG_INFO $PKG_LEIM $PKG_LISP $PKG_MISC $PKG_NOX $PKG_X -perm +0111 -print0 | xargs -0r chmod 0755
find $PKG $PKG_INFO $PKG_LEIM $PKG_LISP $PKG_MISC $PKG_NOX $PKG_X \! -perm +0111 -print0 | xargs -0r chmod 0644
chgrp -R bin $PKG/usr/bin $PKG_NOX/usr/bin $PKG_X/usr/bin

# Make the packages:

cd $PKG
makepkg -c n -l y ../emacs-common-$VERSION-$ARCH-$BUILD.$PKGFORMAT
cd $PKG_INFO
makepkg -c n -l y ../emacs-info-$VERSION-$ARCH-$BUILD.$PKGFORMAT
cd $PKG_LEIM
makepkg -c n -l y ../emacs-leim-$VERSION-$ARCH-$BUILD.$PKGFORMAT
cd $PKG_LISP
makepkg -c n -l y ../emacs-lisp-$VERSION-$ARCH-$BUILD.$PKGFORMAT
cd $PKG_MISC
makepkg -c n -l y ../emacs-misc-$VERSION-$ARCH-$BUILD.$PKGFORMAT
cd $PKG_NOX
makepkg -c n -l y ../emacs-nox-$VERSION-$ARCH-$BUILD.$PKGFORMAT
cd $PKG_X
makepkg -c n -l y ../emacs-withx-$VERSION-$ARCH-$BUILD.$PKGFORMAT

