overdue commit lots of changes
[buildscripts] / emacs
diff --git a/emacs b/emacs
index 488da0cc27e75d1adb23c002c32415c809d06c26..5fe4e2f4222a3e414aefa80d5385c58084d1501c 100755 (executable)
--- a/emacs
+++ b/emacs
@@ -1,5 +1,12 @@
 #!/bin/bash
-# Copyright (C) 2016 Ian Kelling
+# I, Ian Kelling, follow the GNU license recommendations at
+# https://www.gnu.org/licenses/license-recommendations.en.html. They
+# recommend that small programs, < 300 lines, be licensed under the
+# Apache License 2.0. This file contains or is part of one or more small
+# programs. If a small program grows beyond 300 lines, I plan to switch
+# its license to GPL.
+
+# Copyright 2024 Ian Kelling
 
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -13,6 +20,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+
 if [[ -s ~/.bashrc ]];then . ~/.bashrc;fi
 
 #set -x
@@ -22,10 +30,12 @@ update=false
 bootstrap=false
 recompile=false
 show_pkgs=false
+dryrun=false
 
 while [[ $1 == -* ]]; do
   case $1 in
     -b) bootstrap=true; recompile=true ;;
+    -n) dryrun=true ;;
     -r) recompile=true ;;
     --no-r) recompile=false ;;
     -u) update=true ;;
@@ -42,15 +52,24 @@ export CFLAGS="-Og -g3"
 
 export DEBIAN_FRONTEND=noninteractive
 pupdate
-for x in {35..24}; do
+
+# some distros, the package name is like emacs25, some its just emacs
+ver=$(apt-cache showsrc emacs | sed -rn 's/^Version: 1:([0-9]+).*/\1/p' | sort -n | tail -n1) ||:
+for x in {35..25} ""; do
+  if [[ $ver ]] && (( ver >= x )); then
+    echo latest_emacs=emacs
+    latest_emacs=emacs
+    break
+  fi
   if apt-cache showsrc emacs$x 2>/dev/null |grep . &>/dev/null; then
-    echo $x
+    echo latest_emacs=$x
     latest_emacs=emacs$x
     break
   fi
 done
 
-pkgs=(gawk attr autoconf-archive git install-info)
+# ccache is a missing build dep for mu
+pkgs=(gawk attr autoconf-archive git install-info ccache)
 ##### warning, apt-rdepends seems to look at the newest version of the package,
 ##### not the one that build-dep would install.
 if $show_pkgs; then
@@ -70,6 +89,10 @@ fi
 
 #building emacs, INSTALL.BZR
 
+# gawk and attr were no longer automatically installed in stretch,
+# looking back, i assume i got some error.
+# autoconf-archive due to come error
+pi ${pkgs[@]}
 
 #git repo
 dir=/a/opt/emacs-$(distro-name)$(distro-num)
@@ -77,70 +100,90 @@ last_build=$dir/iank-emacs-build
 
 # e/e because autofs failing to mount will make it so
 # you cant ls whatever directory it is in, so we
-# need an extra directory
-dirs=($dir $dir-nox/.iank/e/e)
-
-m cd $dir
-
-rev=$(cat $last_build 2>/dev/null) ||:
-head=$(git rev-parse HEAD)
+# need an extra directory. i dunno why this was like this instead of just $dir-nox.
+#dirs=($dir $dir-nox/.iank/e/e)
+
+dirs=($dir $dir-nox)
+
+m cd /a/opt/emacs
+
+if [[ -e $dir ]]; then
+  m cd $dir
+  rev=$(cat $last_build 2>/dev/null) ||:
+  head=$(git rev-parse HEAD)
+  if ! $recompile && ! $bootstrap && [[ $rev == "$head" ]]; then
+    echo "already compiled"
+    installed_info=$(file $(readlink -f $(type -P emacs)))
+    build_info=$(file $dir/src/emacs)
+    if [[ $installed_info == "$build_info" ]]; then
+      echo "already installed exiting"
+      # this isn't perfect, because install could partially fail or the
+      # command after it could
+      exit 0
+    fi
+  fi
+  if [[ $rev != "$head" ]]; then
+    bootstrap=true
+  fi
+else
+  head=$(git rev-parse HEAD)
+  bootstrap=true
+fi
 
-if ! $recompile && [[ $rev == "$head" ]]; then
-  echo "already compiled, exiting"
+if $dryrun; then
+  echo recompile=$recompile bootstrap=$bootstrap update=$update
   exit 0
 fi
 
-if [[ ! -e $dir || $rev != "$head" ]]; then
-  m cp -ar /a/opt/emacs $dir
-  bootstrap=true
+if $bootstrap; then
+  m rsync --delete -ra /a/opt/emacs/ $dir
   recompile=true
 fi
 
-# gawk and attr were no longer automatically installed in stretch,
-# looking back, i assume i got some error.
-# autoconf-archive due to come error
-pi ${pkgs[@]}
+case $(distro-name) in
+  fedora )
+    logq s yum-builddep -y emacs
+    logq pi texlive-dvipng
+    ;;&
+  debian|ubuntu|trisquel)
+    # todo: unknown for other distros, this will fail
+    logq p -y build-dep maildir-utils
+    # oddly, on ubuntu 14.04 this installs postfix, but I dun care
+    # ubuntu 14.04 gave this error message
+    # Unable to satisfy the build-depends: Build-Depends: libpng-dev
+    # this is satisfied by dvipng. the build-dep is just wrong
+    # minor bug I'm not going to bother reporting.
+    #
+    # note, useful command to see build dep packagages:
+    # apt-rdepends --build-depends --follow=DEPENDS emacs25
+    logq p -y build-dep $latest_emacs
+    ;;&
+esac
 
 if $recompile; then
-  case $(distro-name) in
-    fedora )
-      logq s yum-builddep -y emacs
-      logq pi texlive-dvipng
-      ;;&
-    debian|ubuntu|trisquel)
-      # todo: unknown for other distros, this will fail
-      logq p -y build-dep maildir-utils/$(debian-codename)
-      # oddly, on ubuntu 14.04 this installs postfix, but I dun care
-      # ubuntu 14.04 gave this error message
-      # Unable to satisfy the build-depends: Build-Depends: libpng-dev
-      # this is satisfied by dvipng. the build-dep is just wrong
-      # minor bug I'm not going to bother reporting.
-      #
-      # note, useful command to see build dep packagages:
-      # apt-rdepends --build-depends --follow=DEPENDS emacs25
-      logq p -y build-dep $latest_emacs
-      ;;&
-  esac
-fi
 
-nox=false
-for d in ${dirs[@]}; do
-  if [[ -d $d ]]; then
-    m cd $d
-  fi
-  if $nox; then
-    m mkdir -p ${d%/*}
-    m rsync --delete -ra $dir/ $d
-    mp=$HOME/.iank/e/e
-    if mountpoint $mp &>/dev/null; then
-      m sudo umount $mp
+  nox=false
+  for d in ${dirs[@]}; do
+    if $nox; then
+      # Commented stuff in this block had something to do with ssh / autofs, im not really using nox right now,
+      # so unless I figure out why it was this way, ignore this.
+      # m mkdir -p ${d%/*}
+      m rsync --delete -ra $dir/ $d
+      #
+      # mp=$HOME/.iank/e/e
+      # if mountpoint $mp &>/dev/null; then
+      #   m sudo umount $mp
+      # fi
+      # m mkdir -p $mp
+      # m sudo mount -o bind $d $mp
+      # m sudo chown $USER:$USER $mp
+      # m cd $mp
+
+      #  instead of $mp above
+      m cd $d
+    else
+      m cd $d
     fi
-    m mkdir -p $mp
-    m sudo mount -o bind $d $mp
-    m sudo chown $USER:$USER $mp
-    m cd $mp
-  fi
-  if $recompile || [[ ! -e configure ]]; then
     # todo, consider when this should be uncommented
     #logq s make uninstall
     m find ~/.emacs.d/ -name '*.elc' -delete
@@ -165,31 +208,31 @@ for d in ${dirs[@]}; do
     export CFLAGS='-g3 -Og'
     #CFLAGS='-std=gnu99 -g3 -O2' logq ./configure --enable-link-time-optimization
     # on ubuntu 12.04, the above fails, says my c compiler won't work, so intead, just use defaults
-  fi
-  if $nox; then
-    # mix of flags from arch and debians build flags
-    # note, youd think we could just run make again, but the
-    # build system isnt smart enough, we have to recompile
-    # from scratch.
-    logq ./configure --without-x --without-sound --without-gsettings --without-gconf
-    ln -s ~/.emacs.d .
-  else
-    logq ./configure
-  fi
-  if $recompile; then
+    if $nox; then
+      # mix of flags from arch and debians build flags
+      # note, youd think we could just run make again, but the
+      # build system isnt smart enough, we have to recompile
+      # from scratch.
+      logq ./configure --without-x --without-sound --without-gsettings --without-gconf
+      ln -s ~/.emacs.d .
+    else
+      logq ./configure
+    fi
     logq make -j `nproc` bootstrap
-  fi
-
-  logq make -j `nproc`
-  if ! $nox; then
-    logq sudo make install
-    # make emacs always work for root
-    sudo /a/exe/lnf /usr/local/bin/emacs /usr/bin
-
-    echo $head >$last_build
-  fi
-  nox=true
-done
+    logq make -j `nproc`
+    if ! $nox; then
+      logq sudo make install
+      # make emacs always work for root
+      sudo /a/exe/lnf /usr/local/bin/emacs /usr/bin
+    fi
+    nox=true
+  done
+else
+  m cd ${dirs[0]}
+  logq sudo make install
+  # make emacs always work for root
+  m sudo /a/exe/lnf /usr/local/bin/emacs /usr/bin
+fi
 
 #git clone https://github.com/djcb/mu
 # note: master failed on t8, i moved back to the commit before a bug
@@ -197,29 +240,6 @@ done
 # from its HACKING file
 
 
-cd /a/opt/mu
-
-last_build=$PWD/iank-mu-build
-
-rev=$(cat $last_build 2>/dev/null) ||:
-head=$(git rev-parse HEAD)
-if $recompile || [[ $rev != "$head" ]]; then
-
-  if [[ $(debian-codename) == flidas ]]; then
-    # use the flidas branch, stuck behind because
-    # needs newer crypt libraries that are too troublesome.
-    cd /a/opt/muflidas
-  else
-    # newer version than build-dep installs for buster
-    sudo apt-get -y install --purge --auto-remove libgmime-3.0-dev
-  fi
-  git clean -xfffd
-  ./autogen.sh
-  make
-  sudo make install
-  echo $head >~/.local/mu-build-git-revision
-  # note uninstall is implemented
-fi
 
 if $recompile; then
   # note, not totally sure its right to put this within recompile, but its taking up most of the time, so going for it.
@@ -250,3 +270,5 @@ fi
 # logq make
 
 my-update-info-dir
+
+echo $head >$last_build