diff options
Diffstat (limited to 'scripts/build-emacs-from-source.sh')
| -rwxr-xr-x | scripts/build-emacs-from-source.sh | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/scripts/build-emacs-from-source.sh b/scripts/build-emacs-from-source.sh new file mode 100755 index 00000000..a2272838 --- /dev/null +++ b/scripts/build-emacs-from-source.sh @@ -0,0 +1,102 @@ +#!/usr/bin/env bash +# Craig Jennings <c@cjennings.net> +# Builds Emacs from source using the variables below. + +# - creates the directory if needed +# - uninstalls emacs if it exists +# - pulls latest source from repo below +# unless "latest" is passed as parameter +# - checks out the tag below +# - uses all available processors when compiling + +# NOTES: +# building xwidgets is broken on Linux in 29/30 tags +# ./configure --with-xwidgets \ + +# ...and I'm avoiding native compilation at the moment +#./configure --with-native-compilation \ + +set -e + +# Review These Variables + +src_dir="$HOME/code/emacs" +emacs_repo="https://github.com/mirrors/emacs.git" +emacs_tag="emacs-29.1" +logfile="$HOME/emacs_build.log" + +# Function to remove + recreate directory, and clone source +nuke_and_clone () { + cd "$HOME" + if [ -d "$src_dir" ]; then + printf "...removing directory %s\n\n" "$src_dir" + rm -rf "$src_dir" >> "$logfile" 2>&1 + fi + + printf "...creating directory %s\n" "$src_dir" + mkdir -p "$src_dir" >> "$logfile" 2>&1 + printf "...cloning source files\n" + git clone "$emacs_repo" "$src_dir" >> "$logfile" 2>&1 +} + +# Script Execution Begins Here + +printf "\n\n### BUILDING EMACS FROM SOURCE ###\n\n" > "$logfile" + +printf "...checking directory: %s\n" "$src_dir" | tee -a "$logfile" + +# if the source directory already exists +if [ -d "$src_dir" ]; then + cd "$src_dir" + + # if emacs was previously built, uninstall it. + { + if [ -n "$(which emacs)" ]; then + printf "...uninstalling previous build\n" + sudo make uninstall + fi + } >> "$logfile" 2>&1 + + printf "...cleaning repo\n" | tee -a "$logfile" + make clean >> "$logfile" 2>&1 + + if [[ -n $(git status --porcelain) ]]; then + printf "...repository is dirty. recreating.\n" | tee -a "$logfile" + nuke_and_clone + else + printf "...pulling latest source files\n" | tee -a "$logfile" + git pull >> "$logfile" 2>&1 + fi +else + nuke_and_clone +fi + +if [ ! $1 == "latest" ]; then + printf "...checking out tag: %s\n" "$emacs_tag" | tee -a "$logfile" + git checkout "$emacs_tag" >> "$logfile" 3>&1 +else + printf "...keeping source at latest commit\n" | tee -a "$logfile" +fi + +printf "...building config script\n" | tee -a "$logfile" +./autogen.sh >> "$logfile" 2>&1 + +printf "...configuring build\n" | tee -a "$logfile" +./configure --with-json \ + --with-x-toolkit=lucid \ + --with-modules \ + --with-mailutils \ + --with-imagemagick\ + CFLAGS='-O2 -march=native' >> "$logfile" 2>&1 + +# compile with all available cores +printf "...compiling Emacs\n" | tee -a "$logfile" +make -j$(nproc) >> "$logfile" 2>&1 + +printf "...installing Emacs\n" | tee -a "$logfile" +sudo make install >> "$logfile" 2>&1 +make clean >> "$logfile" 2>&1 +cd "$HOME" + +printf "...done\n" | tee -a "$logfile" +printf "Please review log at: %s\n" "$logfile" |
