非程序员写的 macOS 版 Emacs 构建脚本

可以实时查看安装过程中的步骤,可指定emacs 仓库地址,可导出安装记录(build-log)。

不直接依赖 Homebrew,所以安装后的 Emacs 不会出现在 Homebrew 列表里(这是对操作系统的基本尊重 :laughing:)。

GitHub 关注了 @qingshuizheng 大佬才发现的。

脚本的作者和我电脑配置(M1 + macOS)接近,也不是程序员,需求高度重合,能力比我强很多。

刚好我更新 emacs-plus 失败,所以就立刻用这个脚本重新安装了 Emacs,感觉比我之前用 emacs-plus 安装的要快很多(30%~40%的样子)。

只修改了原来脚本的一行,用来指定自己克隆的 Emacs 官方仓库在电脑中的位置:

- SRC_DIR=emacs-git
+ SRC_DIR=$HOME/Documents/emacs/

完整用法:

克隆 Emacs 官方仓库和本脚本仓库,然后

cd '~/Documents/GitHub/build-emacs-macos/'

# 安装依赖
chmod u+x bemacs-requirements.sh
./bemacs-requirements.sh

# 安装 Emacs
chmod u+x build-emacs.sh
./build-emacs.sh
3 个赞

从安装脚本里面学习了几个patch,看看以后是不是需要打。现在没打patch,使用中也没什么问题。

patch 都是锦上添花,有没有都无伤大雅。

关键是用这个脚本就不需要 Homebrew 来安装别人的 Emacs Tap 了,可以指定自己 clone 的 Emacs 官方仓库,而不是每次都让 Homebrew clone 一个临时的仓库,brew cleanup --prune=all 会把这些东西清理掉。

昨天emacs-plus 死活编译不了,用 mclear大佬的 build-emacs-macos 仓库译了一个。过程是完全透明的,发生错误了也都有日志可以看。

话题无关:mclear 的环境是:macOS + meow + 围绕搞科研。如果刚好需求一致,他的emacs配置和几个仓库还是值得翻一下的。两个补全包也是他写的:citar-capf 以及 capf-bibtex-mode, 后者不依赖citar就可以插入引用。

哈哈,我能说咱俩遇到的问题一模一样吗 :laughing:

我可太喜欢安装时滚动的信息流了,就像在安装操作系统一样。

感谢提醒,我去看看他的配置有哪些好用的小函数,偷一波去 :stuck_out_tongue_closed_eyes:

昨天的编译真是见鬼了,brew unstall/reinstall 也译不了。后来通过 brew cleanup --prune=all 之后才重装了emacs-plus。

不过因为个人配置写了一些 homebrew 目录依赖,自己译的 emacs 还要一些小改动才能适配,暂时回 emacs-plus,远期目标还是要迁移到手动编译。

除了 Emacs 别的都可以交给 Homebrew 傻瓜式安装。

Emacs 每次都 brew uninstall/reinstall 实在是有点浪费时间,也不方便自己随时看看仓库里有什么,还要去 homebrew 的 cache 文件夹里找。

虽然可以清缓存,但只是一个变通之法。

我的机器上有一份代码,因为改了一点和输入法相关的代码,每次都从master分支编译就可以了,而且也没必要一直用最新的,看看log里有什么值得编译的再pull下来。有时最新的代码出了问题就没法解决了。

真大佬用的是深度定制版 Emacs :+1:

其实我想说的是,没事不要随便更新emacs和elpa的package,能用就用,不然总有挂掉的时候。org mode、magit、evil都挂掉过,定位起来还非常麻烦。

我也是想更多的控制和了解如何安装 Emacs 而不是交给 brew reinstall,根本不知道下一个版本能开出什么彩蛋来。

有了 clone 的 Emacs 仓库,就可以看到每次都 commit 了些什么。

有了 build 脚本,就可以自己决定要不要从 Emacs 仓库重新安装了。

有了 git 管理的 emacs.d 就能给自己的配置做“镜像/snapshot”,有问题随时能回退。

1 个赞

今天又build了一次,最后有两步是失败的,因为路径不对,一个是复制src 文件(多了一个斜杠/),另一个是logs,不知道你有没有这个情况:

# ======================================================
# Delete old app & Move new app
# ======================================================

DONE!

# ======================================================
# Record Git SHA
# ======================================================

DONE!

# ======================================================
# Change icon
# ======================================================

DONE!

# ======================================================
# Copy C Source Code
# ======================================================

cp: /Users/z/Developer/building-emacs/build-emacs-macos//Users/z/Developer/building-emacs/emacs/src: No such file or directory
DONE!

# ======================================================
# Create Log files
# ======================================================

mkdir: /Users/z/Developer/building-emacs/build-emacs-macos/build-logs: No such file or directory
mv: rename /tmp/emacs-build/config.log to /Users/z/Developer/building-emacs/build-emacs-macos/build-logs/Emacs_Cocoa_[30.0.50]_2023-01-04_05-30-13_Git_1ddd31bf98/Emacs_Cocoa_[30.0.50]_2023-01-04_05-30-13_Git_1ddd31bf98-config.log: No such file or directory
mv: rename /tmp/emacs-build/build-log.txt to /Users/z/Developer/building-emacs/build-emacs-macos/build-logs/Emacs_Cocoa_[30.0.50]_2023-01-04_05-30-13_Git_1ddd31bf98/Emacs_Cocoa_[30.0.50]_2023-01-04_05-30-13_Git_1ddd31bf98-build-log.txt: No such file or directory
mv: rename /tmp/emacs-build/bootstrap-log.txt to /Users/z/Developer/building-emacs/build-emacs-macos/build-logs/Emacs_Cocoa_[30.0.50]_2023-01-04_05-30-13_Git_1ddd31bf98/Emacs_Cocoa_[30.0.50]_2023-01-04_05-30-13_Git_1ddd31bf98-bootstrap-log.txt: No such file or directory
DONE!

# ======================================================
# Cleanup
# ======================================================

DONE!

把 257-260 行改成这样就可以了。

rm -rf ${ROOT_DIR}/build-logs/${DESCR}; mkdir ${ROOT_DIR}/build-logs/
mv ${BUILD_DIR}/config.log ${ROOT_DIR}/build-logs/config-${DESCR}.log
mv ${BUILD_DIR}/build-log.txt ${ROOT_DIR}/build-logs/build-log-${DESCR}.txt
mv ${BUILD_DIR}/bootstrap-log.txt ${ROOT_DIR}/build-logs/bootstrap-log-${DESCR}.txt

你一说提醒我了,刚提 PR 。

1 个赞

还是你看的比较细致 :grin:

关于复制 c source 部分,我也是只改了第21行:

SRC_DIR=$HOME/Developer/building-emacs/emacs

但最终的结果明显不对:

你那边的c source 复制成功了么

订正:我看到你的PR了。优秀,我也抄一个试试,感谢大佬

改成这样试试。我也重新安装一遍检查一下。

cp -r ${SRC_DIR}/src /Applications/Emacs.app/Contents/Resources/
1 个赞

这些 cp mv 不带双引号的,迟早药丸

怕啥,人家也不会用在 Windows 上,更不会在自己的电脑上 alias mv = rm -rf

学姐是经历了什么。。。

@suliveevil 我觉得mclear 的工作流没有更新在readme。 修正:再读了一遍readme:他把emacs.git 放进了build-emacs-macos文件夹下来编译,所以以没有复制src/文件的问题,emacs名还是要改一下的。然后可能要给转移build-logs 时的 mkdir 一个参数 -p,在目标文件夹不存在时创建一个。[已经重新编译成功]

原:

rm -rf ${ROOT_DIR}/build-logs/${DESCR}; mkdir ${ROOT_DIR}/build-logs/${DESCR}

加 -p

rm -rf ${ROOT_DIR}/build-logs/${DESCR}; mkdir -p ${ROOT_DIR}/build-logs/${DESCR}

不带引号, 如果有空格(比如 XX=“a b c”,rm ${XX} 会变成 rm a b c

2 个赞

懂了。 :rofl: