mirror of
https://github.com/jimeh/build-emacs-for-macos.git
synced 2026-02-19 13:06:38 +00:00
Compare commits
24 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
907f7babbc | ||
|
e030fee670
|
|||
|
|
0ea0596f69 | ||
| 03ed54ca78 | |||
|
|
9d98b6340b | ||
|
cbac633efb
|
|||
|
db723817bf
|
|||
|
|
509d8bf0b8 | ||
|
d7723ee766
|
|||
|
|
9c99da14b3 | ||
| ccb4f3f438 | |||
|
|
4c997758f8 | ||
| 8267ac1662 | |||
| 5c513ce2e7 | |||
| 6e2b9aa44a | |||
|
|
2758cc93cb | ||
|
|
970cb68701 | ||
|
|
a95a3c1c9a | ||
|
|
533dde85b1 | ||
| ca8951ccd3 | |||
|
cfc5155199
|
|||
|
|
78db99ea2d | ||
|
8a1ae4df1c
|
|||
|
|
5e2aaceb84 |
2
.github/.release-please-manifest.json
vendored
2
.github/.release-please-manifest.json
vendored
@@ -1,3 +1,3 @@
|
||||
{
|
||||
".": "0.6.47"
|
||||
".": "0.6.55"
|
||||
}
|
||||
|
||||
16
.github/workflows/ci.yml
vendored
16
.github/workflows/ci.yml
vendored
@@ -8,13 +8,13 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-go@v4
|
||||
- uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: "1.20"
|
||||
go-version: "1.23"
|
||||
- name: golangci-lint
|
||||
uses: golangci/golangci-lint-action@v3
|
||||
uses: golangci/golangci-lint-action@v6
|
||||
with:
|
||||
version: v1.55
|
||||
version: v1.61
|
||||
env:
|
||||
VERBOSE: "true"
|
||||
|
||||
@@ -23,9 +23,9 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-go@v4
|
||||
- uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: "1.20"
|
||||
go-version: "1.23"
|
||||
- name: Check if mods are tidy
|
||||
run: make check-tidy
|
||||
|
||||
@@ -34,9 +34,9 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-go@v4
|
||||
- uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: "1.20"
|
||||
go-version: "1.23"
|
||||
- name: Run tests
|
||||
run: make test
|
||||
env:
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,7 +1,6 @@
|
||||
.DS_Store
|
||||
.envrc
|
||||
Formula/*
|
||||
Gemfile.lock
|
||||
bin
|
||||
builds
|
||||
sources
|
||||
|
||||
@@ -7,7 +7,6 @@ linters-settings:
|
||||
gocyclo:
|
||||
min-complexity: 20
|
||||
govet:
|
||||
check-shadowing: true
|
||||
enable-all: true
|
||||
disable:
|
||||
- fieldalignment
|
||||
@@ -23,9 +22,9 @@ linters:
|
||||
disable-all: true
|
||||
enable:
|
||||
- bodyclose
|
||||
- copyloopvar
|
||||
- dupl
|
||||
- errcheck
|
||||
- exportloopref
|
||||
- funlen
|
||||
- gochecknoinits
|
||||
- goconst
|
||||
@@ -72,12 +71,12 @@ issues:
|
||||
- source: "`yaml:"
|
||||
linters:
|
||||
- lll
|
||||
|
||||
run:
|
||||
skip-dirs:
|
||||
exclude-dirs:
|
||||
- builds
|
||||
- sources
|
||||
- tarballs
|
||||
|
||||
run:
|
||||
timeout: 2m
|
||||
allow-parallel-runners: true
|
||||
modules-download-mode: readonly
|
||||
|
||||
59
CHANGELOG.md
59
CHANGELOG.md
@@ -1,5 +1,64 @@
|
||||
# Changelog
|
||||
|
||||
## [0.6.55](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.54...v0.6.55) (2024-12-03)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **nix/deps:** update nixpkgs from 24.11-beta to 24.11 ([e030fee](https://github.com/jimeh/build-emacs-for-macos/commit/e030fee6704618b7ddefea7424dff4e94f43e84d))
|
||||
|
||||
## [0.6.54](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.53...v0.6.54) (2024-12-01)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **startup:** replace bundled site-start.el approach with a custom source patch ([#124](https://github.com/jimeh/build-emacs-for-macos/issues/124)) ([03ed54c](https://github.com/jimeh/build-emacs-for-macos/commit/03ed54ca78ce15b61f5c875f97410b3ff21ecd62))
|
||||
|
||||
## [0.6.53](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.52...v0.6.53) (2024-12-01)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **help:** correct formatting of help text output ([db72381](https://github.com/jimeh/build-emacs-for-macos/commit/db723817bf6c0ac85da1790a1d50fbea774cc0c0))
|
||||
|
||||
## [0.6.52](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.51...v0.6.52) (2024-11-30)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **nix/flake:** rename flake-package-versions.txt to flake.pkgs ([d7723ee](https://github.com/jimeh/build-emacs-for-macos/commit/d7723ee766574b6597997de7c54fb7ed7f37965c))
|
||||
|
||||
## [0.6.51](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.50...v0.6.51) (2024-11-28)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **build/embed:** include all Emacs C sources and related files in the Emacs.app bundle ([#120](https://github.com/jimeh/build-emacs-for-macos/issues/120)) ([ccb4f3f](https://github.com/jimeh/build-emacs-for-macos/commit/ccb4f3f438652c7ae98c202b8afed8861f40eeec))
|
||||
|
||||
## [0.6.50](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.49...v0.6.50) (2024-11-25)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **build/options:** add --optimize and related flags ([#119](https://github.com/jimeh/build-emacs-for-macos/issues/119)) ([8267ac1](https://github.com/jimeh/build-emacs-for-macos/commit/8267ac166203c0c495520e6970650735702eac35))
|
||||
* **deps:** add support for Nix package manager ([#116](https://github.com/jimeh/build-emacs-for-macos/issues/116)) ([6e2b9aa](https://github.com/jimeh/build-emacs-for-macos/commit/6e2b9aa44ae1cbc3eec8ec7318ce9c9968e2d673))
|
||||
* **package:** produce and include configure output log ([#118](https://github.com/jimeh/build-emacs-for-macos/issues/118)) ([5c513ce](https://github.com/jimeh/build-emacs-for-macos/commit/5c513ce2e7536c57f43a49739b3f0f66d15f7b6d))
|
||||
|
||||
## [0.6.49](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.48...v0.6.49) (2024-11-03)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **compile-options:** increase runtime max open files limit ([#115](https://github.com/jimeh/build-emacs-for-macos/issues/115)) ([ca8951c](https://github.com/jimeh/build-emacs-for-macos/commit/ca8951ccd350ecee5ad6c637caae0af1831a9eb5)), closes [#106](https://github.com/jimeh/build-emacs-for-macos/issues/106)
|
||||
* **patches:** tidy up patches, deprecate optional poll patch ([cfc5155](https://github.com/jimeh/build-emacs-for-macos/commit/cfc5155199486c4e3fae7edbc7262299b3c9955c))
|
||||
|
||||
## [0.6.48](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.47...v0.6.48) (2024-08-09)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **local-lisp-path:** add Apple Silicon homebrew lisp-site ([8a1ae4d](https://github.com/jimeh/build-emacs-for-macos/commit/8a1ae4df1ca37a851f9936fcf2081536837e4c67))
|
||||
|
||||
## [0.6.47](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.46...v0.6.47) (2024-05-13)
|
||||
|
||||
|
||||
|
||||
3
Gemfile
3
Gemfile
@@ -5,8 +5,5 @@ source 'http://rubygems.org/'
|
||||
gem 'ruby-macho'
|
||||
|
||||
group :development do
|
||||
gem 'byebug'
|
||||
gem 'rubocop'
|
||||
gem 'rubocop-daemon'
|
||||
gem 'solargraph', '~> 0.39.17'
|
||||
end
|
||||
|
||||
40
Gemfile.lock
Normal file
40
Gemfile.lock
Normal file
@@ -0,0 +1,40 @@
|
||||
GEM
|
||||
remote: http://rubygems.org/
|
||||
specs:
|
||||
ast (2.4.2)
|
||||
json (2.8.2)
|
||||
language_server-protocol (3.17.0.3)
|
||||
parallel (1.26.3)
|
||||
parser (3.3.6.0)
|
||||
ast (~> 2.4.1)
|
||||
racc
|
||||
racc (1.8.1)
|
||||
rainbow (3.1.1)
|
||||
regexp_parser (2.9.2)
|
||||
rubocop (1.68.0)
|
||||
json (~> 2.3)
|
||||
language_server-protocol (>= 3.17.0)
|
||||
parallel (~> 1.10)
|
||||
parser (>= 3.3.0.2)
|
||||
rainbow (>= 2.2.2, < 4.0)
|
||||
regexp_parser (>= 2.4, < 3.0)
|
||||
rubocop-ast (>= 1.32.2, < 2.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (>= 2.4.0, < 3.0)
|
||||
rubocop-ast (1.36.1)
|
||||
parser (>= 3.3.1.0)
|
||||
ruby-macho (4.1.0)
|
||||
ruby-progressbar (1.13.0)
|
||||
unicode-display_width (2.6.0)
|
||||
|
||||
PLATFORMS
|
||||
arm64-darwin
|
||||
ruby
|
||||
x86_64-darwin
|
||||
|
||||
DEPENDENCIES
|
||||
rubocop
|
||||
ruby-macho
|
||||
|
||||
BUNDLED WITH
|
||||
2.5.23
|
||||
21
Makefile
21
Makefile
@@ -48,10 +48,12 @@ SHELL := env \
|
||||
bootstrap: bootstrap-brew bootstrap-ruby
|
||||
|
||||
bootstrap-ruby:
|
||||
bundle install
|
||||
env BUNDLE_WITHOUT=development bundle install
|
||||
|
||||
bootstrap-brew:
|
||||
ifndef IN_NIX_SHELL
|
||||
brew bundle --verbose
|
||||
endif
|
||||
|
||||
bootstrap-pip:
|
||||
$(PIP) install -r requirements-ci.txt
|
||||
@@ -69,7 +71,7 @@ $(TOOLDIR)/$(1): Makefile
|
||||
endef
|
||||
|
||||
$(eval $(call tool,gofumpt,mvdan.cc/gofumpt@latest))
|
||||
$(eval $(call tool,golangci-lint,github.com/golangci/golangci-lint/cmd/golangci-lint@v1.55))
|
||||
$(eval $(call tool,golangci-lint,github.com/golangci/golangci-lint/cmd/golangci-lint@v1.61))
|
||||
$(eval $(call tool,gomod,github.com/Helcaraxan/gomod@latest))
|
||||
|
||||
.PHONY: tools
|
||||
@@ -132,6 +134,21 @@ format: $(TOOLDIR)/gofumpt
|
||||
gen:
|
||||
go generate $$(go list ./... | grep -v 'sources/' | grep -v 'builds/')
|
||||
|
||||
.PHONY: nix-flake-update
|
||||
nix-flake-update:
|
||||
nix flake update \
|
||||
&& $(MAKE) flake.pkgs
|
||||
|
||||
.SILENT: flake-package-versions
|
||||
flake-package-versions:
|
||||
nix develop --command -- bash -c \
|
||||
'nix derivation show \
|
||||
$$(echo $$PATH | tr ":" "\n" | grep "/nix/store" | sort -u) \
|
||||
| jq -r ".[].name" | sort -u'
|
||||
|
||||
flake.pkgs: flake.nix flake.lock
|
||||
$(MAKE) flake-package-versions > "$@"
|
||||
|
||||
#
|
||||
# Dependencies
|
||||
#
|
||||
|
||||
112
README.md
112
README.md
@@ -36,42 +36,89 @@ The build produced does have some limitations:
|
||||
|
||||
## Requirements
|
||||
|
||||
Required with both Nix and Homebrew approaches:
|
||||
|
||||
- [Xcode](https://apps.apple.com/gb/app/xcode/id497799835?mt=12)
|
||||
- [Homebrew](https://brew.sh/)
|
||||
- All Homebrew formula listed in the `Brewfile`, which can all easily be
|
||||
installed by running:
|
||||
```
|
||||
brew bundle
|
||||
```
|
||||
- Ruby 2.3.0 or later is needed to execute the build script itself. macOS comes
|
||||
with Ruby, check your version with `ruby --version`. If it's too old, you can
|
||||
install a newer version with:
|
||||
```
|
||||
brew install ruby
|
||||
```
|
||||
|
||||
### Nix
|
||||
|
||||
The [Nix](https://nixos.org/) package manager is the preferred and most reliable
|
||||
way to install all dependencies required to build Emacs, by way of a Nix flake
|
||||
included in the project root.
|
||||
|
||||
To install all required dependencies within the nix shell, run:
|
||||
|
||||
```
|
||||
nix develop --command make bootstrap
|
||||
```
|
||||
|
||||
### Homebrew
|
||||
|
||||
If you do not have Nix installed, then the alternative way to manage and install
|
||||
build-time dependencies is via [Homebrew](https://brew.sh/).
|
||||
|
||||
Ruby 3.3.x or later is also needed to execute the build script. Earlier versions
|
||||
may work, but are untested. Simplest way to install a recent Ruby version is via
|
||||
Homebrew:
|
||||
|
||||
```
|
||||
brew install ruby
|
||||
```
|
||||
|
||||
And finally, to install all built-time dependencies, run:
|
||||
|
||||
```
|
||||
make bootstrap
|
||||
```
|
||||
|
||||
## Status
|
||||
|
||||
As of writing (2023-11-20) it works for me on my machine and for the nightly
|
||||
As of writing (2024-11-30) it works for me on my machine and for the nightly
|
||||
builds in [jimeh/emacs-builds](https://github.com/jimeh/emacs-builds). Your luck
|
||||
may vary.
|
||||
|
||||
I have successfully built:
|
||||
|
||||
- `emacs-29.1` release tag.
|
||||
- `master` branch (Emacs 30.x).
|
||||
- `emacs-29.4` release tag.
|
||||
- `emacs-30.0.92` pretest tag.
|
||||
- `master` branch (Emacs 31.x).
|
||||
|
||||
For reference, my machine is:
|
||||
|
||||
- 14-inch MacBook Pro (2023), Apple M3 Pro (11-cores)
|
||||
- macOS Sonoma 14.1.1 (23B2082)
|
||||
- Xcode 15.0.1 (15A507)
|
||||
- 14-inch MacBook Pro (2023), Apple M3 Max (16-cores)
|
||||
- macOS Sonoma 15.1.1 (24B91)
|
||||
- Xcode 16.1 (16B40)
|
||||
|
||||
Nightly builds are built with GitHub Actions on GitHub-hosted runners, using
|
||||
`macos-12` for Intel builds, and `macos-13-xlarge` for Apple Silicon builds.
|
||||
The [nightly builds](https://github.com/jimeh/emacs-builds) are built with
|
||||
GitHub Actions on GitHub-hosted runners, using `macos-13` for Intel builds, and
|
||||
`macos-14` for Apple Silicon builds. The build environment is managed with Nix,
|
||||
and targets the macOS 11 SDK.
|
||||
|
||||
## Usage
|
||||
|
||||
### Nix
|
||||
|
||||
Ensure [Flakes](https://nixos.wiki/wiki/Flakes) are enabled, and enter the flake
|
||||
development environment with `nix develop`. Within this environment, you can
|
||||
execute the `./build-emacs-for-macos --help` to get started.
|
||||
|
||||
Or you can run the build script via `nix develop`:
|
||||
|
||||
```
|
||||
nix develop --command ./build-emacs-for-macos --help
|
||||
```
|
||||
|
||||
The Nix environment defaults to targeting the macOS 11 SDK, which makes Emacs
|
||||
builds compatible with macOS 11.3 or later. You can easily target later macOS
|
||||
SDKs. Versions 11 to 15 are available. For example, to target the macOS 12 SDK,
|
||||
run `nix develop .#macos12`
|
||||
|
||||
### Homebrew
|
||||
|
||||
Run `make boostrap` to ensure all Ruby and Homebrew dependencies are installed.
|
||||
|
||||
### Build Script
|
||||
|
||||
```
|
||||
Usage: ./build-emacs-for-macos [options] <branch/tag/sha>
|
||||
|
||||
@@ -79,25 +126,38 @@ Branch, tag, and SHA are from the emacs-mirror/emacs/emacs Github repo,
|
||||
available here: https://github.com/emacs-mirror/emacs
|
||||
|
||||
Options:
|
||||
-j, --parallel COUNT Compile using COUNT parallel processes (detected: 8)
|
||||
--info Print environment info and detected library paths, then exit
|
||||
--preview Print preview details about build and exit.
|
||||
-j, --parallel COUNT Compile using COUNT parallel processes (detected: 16)
|
||||
--git-sha SHA Override detected git SHA of specified branch allowing builds of old commits
|
||||
--[no-]use-nix Use Nix instead of Homebrew to find dependencies (default: enabled if IN_NIX_SHELL is set)
|
||||
--[no-]xwidgets Enable/disable XWidgets if supported (default: enabled)
|
||||
--[no-]tree-sitter Enable/disable tree-sitter if supported (default: enabled)
|
||||
--[no-]native-comp Enable/disable native-comp (default: enabled if supported)
|
||||
--[no-]native-march Enable/disable -march=native CFLAG(default: disabled)
|
||||
--optimize Shorthand for --native-march --native-mtune --fomit-frame-pointer (default: disabled)
|
||||
--[no-]native-march Enable/disable -march=native CFLAG (default: disabled)
|
||||
--[no-]native-mtune Enable/disable -mtune=native CFLAG (default: disabled)
|
||||
--[no-]fomit-frame-pointer Enable/disable -fomit-frame-pointer CFLAG (default: disabled)
|
||||
--[no-]native-full-aot Enable/disable NATIVE_FULL_AOT / Ahead of Time compilation (default: disabled)
|
||||
--[no-]relink-eln-files Enable/disable re-linking shared libraries in bundled *.eln files (default: enabled)
|
||||
--[no-]rsvg Enable/disable SVG image support via librsvg (default: enabled)
|
||||
--[no-]dbus Enable/disable dbus support (default: enabled)
|
||||
--no-titlebar Apply no-titlebar patch (default: disabled)
|
||||
--posix-spawn Apply posix-spawn patch (default: disabled)
|
||||
--posix-spawn Apply posix-spawn patch (deprecated)
|
||||
--no-frame-refocus Apply no-frame-refocus patch (default: disabled)
|
||||
--[no-]poll Apply poll patch (deprecated)
|
||||
--[no-]fd-setsize SIZE Set an file descriptor (max open files) limit (default: 10000)
|
||||
--github-src-repo REPO Specify a GitHub repo to download source tarballs from (default: emacs-mirror/emacs)
|
||||
--[no-]github-auth Make authenticated GitHub API requests if GITHUB_TOKEN environment variable is set.(default: enabled)
|
||||
--work-dir DIR Specify a working directory where tarballs, sources, and builds will be stored and worked with
|
||||
-o, --output DIR Output directory for finished builds (default: <work-dir>/builds)
|
||||
--build-name NAME Override generated build name
|
||||
--dist-include x,y,z List of extra files to copy from Emacs source into build folder/archive (default: COPYING)
|
||||
--[no-]self-sign Enable/disable self-signing of Emacs.app (default: enabled)
|
||||
--[no-]archive Enable/disable creating *.tbz archive (default: enabled)
|
||||
--[no-]archive-keep-build-dir
|
||||
Enable/disable keeping source folder for archive (default: disabled)
|
||||
--log-level LEVEL Build script log level (default: info)
|
||||
--plan FILE Follow given plan file, instead of using given git ref/sha
|
||||
```
|
||||
|
||||
@@ -119,10 +179,10 @@ as of writing) and build Emacs.app from it:
|
||||
./build-emacs-for-macos
|
||||
```
|
||||
|
||||
To build the stable `emacs-29.1` release git tag run:
|
||||
To build the stable `emacs-29.4` release git tag run:
|
||||
|
||||
```
|
||||
./build-emacs-for-macos emacs-29.1
|
||||
./build-emacs-for-macos emacs-29.4
|
||||
```
|
||||
|
||||
All sources as downloaded as tarballs from the
|
||||
@@ -158,7 +218,7 @@ use the alias from the above example.
|
||||
The build script will automatically detect if the source tree being built
|
||||
supports native-compilation, and enable it if available. You can override the
|
||||
auto-detection logic to force enable or force disable native-compilation by
|
||||
passing `--native-comp` or `--no-native-comp` respectfully.
|
||||
passing `--native-comp` or `--no-native-comp` respectively.
|
||||
|
||||
By default `NATIVE_FULL_AOT` is disabled which ensures a fast build by native
|
||||
compiling as few elisp source files as possible to build Emacs itself. Any
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
61
flake.lock
generated
Normal file
61
flake.lock
generated
Normal file
@@ -0,0 +1,61 @@
|
||||
{
|
||||
"nodes": {
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1731533236,
|
||||
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1732981179,
|
||||
"narHash": "sha256-F7thesZPvAMSwjRu0K8uFshTk3ZZSNAsXTIFvXBT+34=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "62c435d93bf046a5396f3016472e8f7c8e2aed65",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-24.11",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
102
flake.nix
Normal file
102
flake.nix
Normal file
@@ -0,0 +1,102 @@
|
||||
{
|
||||
description = "Development environment flake";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
};
|
||||
|
||||
outputs = { self, nixpkgs, flake-utils }:
|
||||
flake-utils.lib.eachDefaultSystem (system:
|
||||
let
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
|
||||
# List of supported macOS SDK versions.
|
||||
sdk_versions = [ "11" "12" "13" "14" "15" ];
|
||||
default_sdk_version = "11";
|
||||
|
||||
mkDevShell = { macos_version ? default_sdk_version }:
|
||||
let
|
||||
apple_sdk = pkgs.${"apple-sdk_${macos_version}"};
|
||||
in
|
||||
pkgs.mkShell {
|
||||
# Package list specifically excludes ncurses, so that we link
|
||||
# against the system version of ncurses. This ensures emacs' TUI
|
||||
# works out of the box without the user having to manually set
|
||||
# TERMINFO in the shell before launching emacs.
|
||||
packages = with pkgs; [
|
||||
apple_sdk
|
||||
autoconf
|
||||
bash
|
||||
cairo
|
||||
clang
|
||||
coreutils
|
||||
curl
|
||||
darwin.DarwinTools # sw_vers
|
||||
dbus
|
||||
expat
|
||||
findutils
|
||||
gcc
|
||||
gettext
|
||||
giflib
|
||||
git
|
||||
gmp
|
||||
gnumake
|
||||
gnupatch
|
||||
gnused
|
||||
gnutar
|
||||
gnutls
|
||||
harfbuzz
|
||||
jansson
|
||||
jq
|
||||
lcms2
|
||||
libffi
|
||||
libgccjit
|
||||
libiconv
|
||||
libjpeg
|
||||
libpng
|
||||
librsvg
|
||||
libtasn1
|
||||
libunistring
|
||||
libwebp
|
||||
libxml2
|
||||
mailutils
|
||||
nettle
|
||||
pkg-config
|
||||
python3
|
||||
rsync
|
||||
ruby_3_3
|
||||
sqlite
|
||||
texinfo
|
||||
time
|
||||
tree-sitter
|
||||
which
|
||||
xcbuild
|
||||
zlib
|
||||
];
|
||||
|
||||
shellHook = ''
|
||||
export CC=clang
|
||||
export MACOSX_DEPLOYMENT_TARGET="${macos_version}.0"
|
||||
export DEVELOPER_DIR="${apple_sdk}"
|
||||
export NIX_LIBGCCJIT_VERSION="${pkgs.libgccjit.version}"
|
||||
export NIX_LIBGCCJIT_ROOT="${pkgs.libgccjit.outPath}"
|
||||
export BUNDLE_WITHOUT=development
|
||||
'';
|
||||
};
|
||||
|
||||
# Generate an attrset of shells for each macOS SDK version.
|
||||
versionShells = builtins.listToAttrs (
|
||||
map (version: {
|
||||
name = "macos${version}";
|
||||
value = mkDevShell { macos_version = version; };
|
||||
}) sdk_versions
|
||||
);
|
||||
in
|
||||
{
|
||||
devShells = versionShells // {
|
||||
default = mkDevShell {};
|
||||
};
|
||||
}
|
||||
);
|
||||
}
|
||||
67
flake.pkgs
Normal file
67
flake.pkgs
Normal file
@@ -0,0 +1,67 @@
|
||||
DarwinTools-1
|
||||
autoconf-2.72
|
||||
bash-5.2p37
|
||||
brotli-1.1.0
|
||||
bzip2-1.0.8
|
||||
cairo-1.18.2
|
||||
cctools-binutils-darwin-1010.6
|
||||
cctools-binutils-darwin-wrapper-1010.6
|
||||
clang-16.0.6
|
||||
clang-wrapper-16.0.6
|
||||
coreutils-9.5
|
||||
curl-8.11.0
|
||||
dbus-1.14.10
|
||||
diffutils-3.10
|
||||
expat-2.6.4
|
||||
file-5.45
|
||||
findutils-4.10.0
|
||||
fontconfig-2.15.0
|
||||
freetype-2.13.3
|
||||
gawk-5.3.1
|
||||
gcc-13.3.0
|
||||
gcc-wrapper-13.3.0
|
||||
gdk-pixbuf-2.42.12
|
||||
gettext-0.21.1
|
||||
giflib-5.2.2
|
||||
git-2.47.0
|
||||
glib-2.82.1
|
||||
gnugrep-3.11
|
||||
gnumake-4.4.1
|
||||
gnused-4.9
|
||||
gnutar-1.35
|
||||
gnutls-3.8.6
|
||||
graphite2-1.3.14
|
||||
gzip-1.13
|
||||
harfbuzz-10.0.1
|
||||
jq-1.7.1
|
||||
krb5-1.21.3
|
||||
lcms2-2.16
|
||||
libdeflate-1.22
|
||||
libgccjit-13.3.0
|
||||
libiconv-107
|
||||
libidn2-2.3.7
|
||||
libjpeg-turbo-3.0.4
|
||||
libpng-apng-1.6.43
|
||||
libpsl-0.21.5
|
||||
librsvg-2.58.3
|
||||
libtasn1-4.19.0
|
||||
libtiff-4.7.0
|
||||
libwebp-1.4.0
|
||||
libxml2-2.13.4
|
||||
mailutils-3.17
|
||||
nettle-3.10
|
||||
nghttp2-1.64.0
|
||||
openssl-3.3.2
|
||||
patch-2.7.6
|
||||
pkg-config-wrapper-0.29.2
|
||||
python3-3.12.7
|
||||
rsync-3.3.0
|
||||
ruby-3.3.5
|
||||
sqlite-3.46.1
|
||||
texinfo-7.1.1
|
||||
time-1.9
|
||||
tree-sitter-0.24.3
|
||||
which-2.21
|
||||
xcbuild-0.1.1-unstable-2019-11-20
|
||||
xz-5.6.3
|
||||
zstd-1.5.6
|
||||
8
go.mod
8
go.mod
@@ -1,6 +1,6 @@
|
||||
module github.com/jimeh/build-emacs-for-macos
|
||||
|
||||
go 1.20
|
||||
go 1.23
|
||||
|
||||
require (
|
||||
github.com/bearer/gon v0.0.36
|
||||
@@ -27,9 +27,9 @@ require (
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
|
||||
golang.org/x/crypto v0.15.0 // indirect
|
||||
golang.org/x/sys v0.14.0 // indirect
|
||||
golang.org/x/crypto v0.17.0 // indirect
|
||||
golang.org/x/sys v0.15.0 // indirect
|
||||
google.golang.org/appengine v1.6.8 // indirect
|
||||
google.golang.org/protobuf v1.31.0 // indirect
|
||||
google.golang.org/protobuf v1.33.0 // indirect
|
||||
howett.net/plist v1.0.0 // indirect
|
||||
)
|
||||
|
||||
13
go.sum
13
go.sum
@@ -24,6 +24,7 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/go-github/v35 v35.3.0 h1:fU+WBzuukn0VssbayTT+Zo3/ESKX9JYWjbZTLOTEyho=
|
||||
github.com/google/go-github/v35 v35.3.0/go.mod h1:yWB7uCcVWaUbUP74Aq3whuMySRMatyRmq5U9FTNlbio=
|
||||
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
||||
@@ -88,8 +89,8 @@ github.com/zclconf/go-cty v1.1.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLE
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA=
|
||||
golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g=
|
||||
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
|
||||
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
@@ -119,8 +120,8 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
|
||||
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
|
||||
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
@@ -138,8 +139,8 @@ google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAs
|
||||
google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
|
||||
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
|
||||
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
|
||||
@@ -110,6 +110,18 @@ func Create(ctx context.Context, opts *Options) (string, error) {
|
||||
})
|
||||
}
|
||||
|
||||
configureOutputFile := filepath.Join(sourceDir, "configure_output.txt")
|
||||
fi, err = os.Stat(configureOutputFile)
|
||||
if err != nil && !os.IsNotExist(err) {
|
||||
return "", err
|
||||
} else if err == nil && fi.Mode().IsRegular() {
|
||||
settings.Files = append(settings.Files, &dmgbuild.File{
|
||||
Path: configureOutputFile,
|
||||
PosX: 340,
|
||||
PosY: 756,
|
||||
})
|
||||
}
|
||||
|
||||
if opts.Output != nil {
|
||||
settings.Stdout = opts.Output
|
||||
settings.Stderr = opts.Output
|
||||
|
||||
@@ -116,7 +116,6 @@ func NewLicense() License {
|
||||
return License{}
|
||||
}
|
||||
|
||||
//nolint:goconst
|
||||
func (s *License) Render() []string {
|
||||
var l []string
|
||||
|
||||
|
||||
@@ -1,41 +1,65 @@
|
||||
package osinfo
|
||||
|
||||
import (
|
||||
"os"
|
||||
"os/exec"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type OSInfo struct {
|
||||
Name string `yaml:"name" json:"name"`
|
||||
Version string `yaml:"version" json:"version"`
|
||||
Arch string `yaml:"arch" json:"arch"`
|
||||
Name string `yaml:"name" json:"name"`
|
||||
Version string `yaml:"version" json:"version"`
|
||||
SDKVersion string `yaml:"sdk_version" json:"sdk_version"`
|
||||
Arch string `yaml:"arch" json:"arch"`
|
||||
}
|
||||
|
||||
func New() (*OSInfo, error) {
|
||||
version, err := exec.Command("sw_vers", "-productVersion").CombinedOutput()
|
||||
version, err := exec.Command("sw_vers", "-productVersion").Output()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
sdkVersion := os.Getenv("MACOSX_DEPLOYMENT_TARGET")
|
||||
if sdkVersion == "" {
|
||||
var ver []byte
|
||||
ver, err = exec.Command("xcrun", "--show-sdk-version").Output()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
sdkVersion = string(ver)
|
||||
}
|
||||
|
||||
arch, err := exec.Command("uname", "-m").CombinedOutput()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &OSInfo{
|
||||
Name: "macOS",
|
||||
Version: strings.TrimSpace(string(version)),
|
||||
Arch: strings.TrimSpace(string(arch)),
|
||||
Name: "macOS",
|
||||
Version: strings.TrimSpace(string(version)),
|
||||
SDKVersion: strings.TrimSpace(sdkVersion),
|
||||
Arch: strings.TrimSpace(string(arch)),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// DistinctVersion returns macOS version down to a distinct "major"
|
||||
// version. For macOS 10.x, this will include the first two numeric parts of the
|
||||
// version (10.15), while for 11.x and later, the first numeric part is enough
|
||||
// (11).
|
||||
// DistinctVersion returns macOS version down to a distinct "major" version. For
|
||||
// macOS 10.x, this will include the first two numeric parts of the version
|
||||
// (10.15), while for 11.x and later, the first numeric part is enough (11).
|
||||
func (s *OSInfo) DistinctVersion() string {
|
||||
parts := strings.Split(s.Version, ".")
|
||||
return s.distinctVersion(s.Version)
|
||||
}
|
||||
|
||||
// DistinctSDKVersion returns macOS version down to a distinct "major" version.
|
||||
// For macOS 10.x, this will include the first two numeric parts of the version
|
||||
// (10.15), while for 11.x and later, the first numeric part is enough (11).
|
||||
func (s *OSInfo) DistinctSDKVersion() string {
|
||||
return s.distinctVersion(s.SDKVersion)
|
||||
}
|
||||
|
||||
func (s *OSInfo) distinctVersion(version string) string {
|
||||
parts := strings.Split(version, ".")
|
||||
|
||||
if n, _ := strconv.Atoi(parts[0]); n >= 11 {
|
||||
return parts[0]
|
||||
|
||||
@@ -95,10 +95,17 @@ func Create(ctx context.Context, opts *Options) (*Plan, error) { //nolint:funlen
|
||||
releaseName = "Emacs." + version
|
||||
}
|
||||
|
||||
// Attempt to get the macOS SDK version from the environment, if it's not
|
||||
// available, use the version from the system.
|
||||
targetMacOSVersion := osInfo.DistinctSDKVersion()
|
||||
if targetMacOSVersion == "" {
|
||||
targetMacOSVersion = osInfo.DistinctVersion()
|
||||
}
|
||||
|
||||
buildName := fmt.Sprintf(
|
||||
"Emacs.%s.%s.%s",
|
||||
absoluteVersion,
|
||||
sanitize.String(osInfo.Name+"-"+osInfo.DistinctVersion()),
|
||||
sanitize.String(osInfo.Name+"-"+targetMacOSVersion),
|
||||
sanitize.String(osInfo.Arch),
|
||||
)
|
||||
diskImage := buildName + ".dmg"
|
||||
|
||||
@@ -123,7 +123,7 @@ func signCLIHelper(ctx context.Context, appBundle string, opts *Options) error {
|
||||
// app bundle itself.
|
||||
func elnFiles(emacsApp string) ([]string, error) {
|
||||
var files []string
|
||||
walkDirFunc := func(path string, d fs.DirEntry, _err error) error {
|
||||
walkDirFunc := func(path string, d fs.DirEntry, _ error) error {
|
||||
if d.Type().IsRegular() && strings.HasSuffix(path, ".eln") &&
|
||||
!strings.Contains(path, ".app/Contents/Frameworks/") {
|
||||
files = append(files, path)
|
||||
|
||||
Reference in New Issue
Block a user