blob: a22728387529906f5f908496dc2566d95c9484f2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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"
|