#!/bin/bash ### update_autogen - update the generated files in Emacs autogen/ directory ## Copyright (C) 2011-2013 Free Software Foundation, Inc. ## Author: Glenn Morris ## This file is part of GNU Emacs. ## GNU Emacs 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 3 of the License, or ## (at your option) any later version. ## GNU Emacs 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 GNU Emacs. If not, see . ### Commentary: ## This is a helper script to update the pre-built generated files in ## the autogen/ directory. This is suitable for running from cron. ## Only Emacs maintainers need use this, so it uses bash features. ## ## With the -l option, it also updates the versioned loaddefs-like ## files in lisp/. These include ldefs-boot, cl-loaddefs, rmail, etc. ### Code: die () # write error to stderr and exit { [ $# -gt 0 ] && echo "$PN: $@" >&2 exit 1 } PN=${0##*/} # basename of script PD=${0%/*} [ "$PD" = "$0" ] && PD=. # if PATH includes PWD ## This should be the autogen directory. cd $PD cd ../ [ -d autogen ] || die "Could not locate autogen directory" usage () { cat 1>&2 < /dev/null" EXIT while getopts ":hcflqCL" option ; do case $option in (h) usage ;; (c) commit=1 ;; (f) force=1 ;; (l) ldefs_flag=1 ;; (q) quiet=1 ;; (C) clean=1 ;; (L) lboot_flag=1 ;; (\?) die "Bad option -$OPTARG" ;; (:) die "Option -$OPTARG requires an argument" ;; (*) die "getopts error" ;; esac done shift $(( --OPTIND )) OPTIND=1 ## Does not work 100% because a lot of Emacs batch output comes on stderr (?). [ "$quiet" ] && exec 1> /dev/null echo "Running bzr status..." bzr status -S $sources ${ldefs_flag:+lisp} >| $tempfile || \ die "bzr status error for sources" ## The lisp portion could be more permissive, eg only care about .el files. while read stat file; do case $stat in M) echo "Locally modified: $file" [ "$force" ] || die "There are local modifications" ;; *) die "Unexpected status ($stat) for $file" ;; esac done < $tempfile ## Probably this is overkill, and there's no need to "bootstrap" just ## for making autoloads. [ "$clean" ] && { echo "Running 'make maintainer-clean'..." make maintainer-clean #|| die "Cleaning error" rm -f $ldefs_in } echo "Running autoreconf..." autoreconf ${clean:+-f} -i -I m4 2>| $tempfile retval=$? ## Annoyingly, autoreconf puts the "installing `./foo' messages on stderr. if [ "$quiet" ]; then grep -v 'installing `\.' $tempfile 1>&2 else cat "$tempfile" 1>&2 fi [ $retval -ne 0 ] && die "autoreconf error" cp $genfiles autogen/ cd autogen echo "Checking status of generated files..." bzr status -S $basegen >| $tempfile || \ die "bzr status error for generated files" modified= while read stat file; do [ "$stat" != "M" ] && die "Unexpected status ($stat) for generated $file" modified="$modified $file" done < $tempfile cd ../ ## Uses global $commit. commit () { local type=$1 shift [ $# -gt 0 ] || { echo "No files were modified" return 0 } echo "Modified file(s): $@" [ "$commit" ] || return 0 echo "Committing..." ## bzr status output is always relative to top-level, not PWD. bzr commit -m "Auto-commit of $type files." "$@" || return $? echo "Committed files: $@" } # function commit commit "generated" $modified || die "bzr commit error" [ "$ldefs_flag" ] || exit 0 echo "Finding loaddef targets..." sed -n -e '/^AUTOGEN_VCS/,/^$/ s/\\//p' lisp/Makefile.in | \ sed '/AUTOGEN_VCS/d' >| $tempfile || die "sed error" genfiles= while read genfile; do [ -r lisp/$genfile ] || die "Unable to read $genfile" genfiles="$genfiles $genfile" done < $tempfile [ "$genfiles" ] || die "Error setting genfiles" [ -e Makefile ] || { echo "Running ./configure..." ## Minimize required packages. ./configure --without-x || die "configure error" } ## Build the minimum needed to get the autoloads. echo "Running lib/ make..." make -C lib "$@" all || die "make lib error" echo "Running src/ make..." make -C src "$@" bootstrap-emacs || die "make src error" echo "Running lisp/ make..." make -C lisp "$@" autoloads EMACS=../src/bootstrap-emacs || die "make src error" ## Ignore comment differences. [ ! "$lboot_flag" ] || \ diff -q -I '^;' $ldefs_in $ldefs_out || \ cp $ldefs_in $ldefs_out || die "cp ldefs_boot error" cd lisp echo "Checking status of loaddef files..." ## It probably would be fine to just check+commit lisp/, since ## making autoloads should not effect any other files. But better ## safe than sorry. bzr status -S $genfiles ${ldefs_out#lisp/} >| $tempfile || \ die "bzr status error for generated files" modified= while read stat file; do [ "$stat" != "M" ] && die "Unexpected status ($stat) for generated $file" modified="$modified $file" done < $tempfile cd ../ commit "loaddefs" $modified || die "bzr commit error" exit 0 ### update_autogen ends here