Compare commits

...

15 Commits

Author SHA1 Message Date
2d1c5d47d9 chore(release): 0.4.12 2021-05-17 23:14:50 +01:00
30a71c423e Merge pull request #40 from jimeh/fix-svg
fix(svg): fix SVG rendering crash and enable SVG support by default
2021-05-17 23:12:44 +01:00
5c48445397 chore(cli): improve CLI help output 2021-05-17 23:12:12 +01:00
bf7c4d5deb fix(svg): enable SVG by default via librsvg 2021-05-17 23:12:12 +01:00
3ffeb4854c chore(shared-libraries): add @executable_path/lib to @rpath for good measure 2021-05-17 23:12:12 +01:00
0a22d8393c fix(shared-libraries): stop aggressive dylib re-linking
This seems to be the cause of SVG rendering crashing, as it re-links
libiconv.2.dylib from /usr/lib/libiconv.2.dylib to
@executable_path/lib/lib/libiconv.2.dylib within libintl.8.dylib. When
this re-linking does not happen, SVG rendering works without crashing
Emacs.

Some further testing is needed by installing brew dependencies by
building them from source, in an attempt to get various libraries all
linking to homebrew-built versions, to get as many shared libraries as
possible embedded into the application bundle.

Fixes #12
2021-05-17 23:11:51 +01:00
ac8348323d chore(release): 0.4.11 2021-05-08 19:56:42 +01:00
59f52b65ee Merge pull request #39 from jimeh/emacs-builds
feat(builds): prepare for automated builds in jimeh/emacs-builds repo
2021-05-08 19:51:26 +01:00
81a96f4d60 chore(builds): remove github-release tool
This now lives in the jimeh/emacs-builds repo, which focuses on building
and publishing binary releases, using the build-emacs-for-macos script.
2021-05-08 19:10:46 +01:00
1df39fafe6 feat(builds): update build script for new plan.yml format 2021-05-08 19:07:13 +01:00
14a8d1aaaf chore(release): enable full native-compilation AoT 2021-05-07 09:15:14 +01:00
272a3000a1 fix(release): attempt to fix issue with talking to GitHub API 2021-05-07 01:12:57 +01:00
d684cf560f ci(build): fix typo 2021-05-06 23:39:16 +01:00
ea189a6713 Merge pull request #38 from jimeh/automatic-builds
feat(release): automatic builds
2021-05-06 23:37:20 +01:00
63289216d7 feat(release): initial attempt at providing automatic builds 2021-05-06 23:36:12 +01:00
2 changed files with 91 additions and 49 deletions

View File

@@ -2,6 +2,27 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
### [0.4.12](https://github.com/jimeh/build-emacs-for-macos/compare/0.4.11...0.4.12) (2021-05-17)
### Bug Fixes
* **shared-libraries:** stop aggressive dylib re-linking ([0a22d83](https://github.com/jimeh/build-emacs-for-macos/commit/0a22d8393c53305354c4c6d8e784e7d59caa039a)), closes [#12](https://github.com/jimeh/build-emacs-for-macos/issues/12)
* **svg:** enable SVG by default via librsvg ([bf7c4d5](https://github.com/jimeh/build-emacs-for-macos/commit/bf7c4d5debf32980dbbabc1ea99b58b266390011))
### [0.4.11](https://github.com/jimeh/build-emacs-for-macos/compare/0.4.10...0.4.11) (2021-05-08)
### Features
* **builds:** update build script for new plan.yml format ([1df39fa](https://github.com/jimeh/build-emacs-for-macos/commit/1df39fafe62ada385aa1d92e6b7f591c16c0a80c))
* **release:** initial attempt at providing automatic builds ([6328921](https://github.com/jimeh/build-emacs-for-macos/commit/63289216d70e496d664a7e3078dea5a82eb8f65d))
### Bug Fixes
* **release:** attempt to fix issue with talking to GitHub API ([272a300](https://github.com/jimeh/build-emacs-for-macos/commit/272a3000a1f96d8f131e684736127b923513a205))
### [0.4.10](https://github.com/jimeh/build-emacs-for-macos/compare/0.4.9...0.4.10) (2021-04-25) ### [0.4.10](https://github.com/jimeh/build-emacs-for-macos/compare/0.4.9...0.4.10) (2021-04-25)

View File

@@ -10,7 +10,9 @@ require 'json'
require 'net/http' require 'net/http'
require 'optparse' require 'optparse'
require 'pathname' require 'pathname'
require 'time'
require 'uri' require 'uri'
require 'yaml'
class Error < StandardError; end class Error < StandardError; end
@@ -21,9 +23,9 @@ module Output
def out(msg, newline: true) def out(msg, newline: true)
if newline if newline
puts "==> #{msg}" warn "==> #{msg}"
else else
print "==> #{msg}" STDERR.print "==> #{msg}"
end end
end end
@@ -87,8 +89,10 @@ class Build
end end
def build def build
load_plan(options[:plan]) if options[:plan]
unless meta[:sha] && meta[:date] unless meta[:sha] && meta[:date]
err 'Failed to get commit info from GitHub API.' err 'Failed to get commit info from GitHub.'
end end
tarball = download_tarball(meta[:sha]) tarball = download_tarball(meta[:sha])
@@ -108,6 +112,17 @@ class Build
private private
def load_plan(filename)
plan = YAML.safe_load(File.read(filename), [:Time])
@meta = {
sha: plan.dig('commit', 'sha'),
ref: plan.dig('commit', 'ref'),
date: plan.dig('commit', 'date')
}
@archive_filename = plan['archive']
end
def tarballs_dir def tarballs_dir
@tarballs_dir ||= File.join(root_dir, 'tarballs') @tarballs_dir ||= File.join(root_dir, 'tarballs')
end end
@@ -299,7 +314,7 @@ class Build
configure_flags << '--with-xwidgets' configure_flags << '--with-xwidgets'
end end
configure_flags << native_comp_configure_flag if options[:native_comp] configure_flags << native_comp_configure_flag if options[:native_comp]
configure_flags << '--without-rsvg' unless options[:rsvg] configure_flags << '--without-rsvg' if options[:rsvg] == false
run_cmd './configure', *configure_flags run_cmd './configure', *configure_flags
@@ -358,29 +373,39 @@ class Build
end end
end end
def archive_app(app) def archive_filename
FileUtils.mkdir_p(builds_dir) return @archive_filename if @archive_filename
metadata = [ metadata = [
meta[:ref]&.gsub(/\W/, '-'), meta[:ref]&.gsub(/\W/, '-'),
meta[:date], meta[:date]&.strftime('%Y-%m-%d'),
meta[:sha][0..6], meta[:sha][0..6],
"macOS-#{OS.version}", "macOS-#{OS.version}",
OS.arch OS.arch
].compact ].compact
filename = "Emacs.app-[#{metadata.join('][')}].tbz" filename = "Emacs.app-[#{metadata.join('][')}].tbz"
target = "#{builds_dir}/#{filename}" @archive_filename = File.join(builds_dir, filename)
end
def archive_app(app)
filename = File.basename(archive_filename)
target_dir = File.dirname(archive_filename)
relative_target_dir = target_dir.gsub(root_dir + '/', '')
FileUtils.mkdir_p(target_dir)
app_base = File.basename(app) app_base = File.basename(app)
app_dir = File.dirname(app) app_dir = File.dirname(app)
if !File.exist?(target) if !File.exist?(archive_filename)
info "Creating #{filename} archive in \"#{builds_dir}\"..." info "Creating #{filename} archive in \"#{relative_target_dir}\"..."
FileUtils.cd(app_dir) { system('tar', '-cjf', target, app_base) } FileUtils.cd(app_dir) do
system('tar', '-cjf', archive_filename, app_base)
end
else else
info "#{filename} archive exists in " \ info "#{filename} archive exists in " \
"#{builds_dir.gsub(root_dir + '/', '')}, skipping archving." "#{relative_target_dir}, skipping archving."
end end
end end
@@ -411,7 +436,7 @@ class Build
commit = JSON.parse(commit_json) commit = JSON.parse(commit_json)
meta = { meta = {
sha: commit['sha'], sha: commit['sha'],
date: Date.parse(commit['commit']['committer']['date']) date: Time.parse(commit['commit']['committer']['date'])
} }
meta[:ref] = ref if ref && ref[0..6] != meta[:sha][0..6] meta[:ref] = ref if ref && ref[0..6] != meta[:sha][0..6]
@@ -592,7 +617,6 @@ class LibEmbedder < AbstractEmbedder
FileUtils.cd(File.dirname(app)) do FileUtils.cd(File.dirname(app)) do
copy_libs(binary) copy_libs(binary)
copy_extra_libs(extra_libs, binary) if extra_libs.any? copy_extra_libs(extra_libs, binary) if extra_libs.any?
self_ref_libs(binary)
end end
end end
@@ -604,6 +628,11 @@ class LibEmbedder < AbstractEmbedder
Pathname.new(File.dirname(exe)) Pathname.new(File.dirname(exe))
).to_s ).to_s
while_writable(exe) do
system('install_name_tool', '-add_rpath',
File.join('@executable_path', rel_path), exe)
end
`otool -L "#{exe}"`.split("\n")[1..-1].each do |line| `otool -L "#{exe}"`.split("\n")[1..-1].each do |line|
match = line.match(%r{^\s+(.+/(lib[^/ ]+))\s}) match = line.match(%r{^\s+(.+/(lib[^/ ]+))\s})
next unless match && match[1].start_with?(lib_source) next unless match && match[1].start_with?(lib_source)
@@ -648,31 +677,6 @@ class LibEmbedder < AbstractEmbedder
end end
end end
def self_ref_libs(exe)
rel_path = Pathname.new(lib_dir).relative_path_from(
Pathname.new(File.dirname(exe))
).to_s
lib_paths ||= Dir.glob("#{lib_dir}/*").select { |f| File.file?(f) }
libs = lib_paths.map { |f| File.basename(f) }
([exe] + lib_paths).each do |bin_path|
`otool -L "#{bin_path}"`.split("\n")[1..-1].each do |line|
match = line.match(%r{^\s+(.+/(lib[^/ ]+))\s})
next unless match
next if match[1].start_with?('@executable_path/')
next unless libs.include?(match[2])
while_writable(bin_path) do
system(
'install_name_tool', '-change', match[1],
File.join('@executable_path', rel_path, match[2].to_s),
bin_path
)
end
end
end
end
def while_writable(file) def while_writable(file)
mode = File.stat(file).mode mode = File.stat(file).mode
File.chmod(0o775, file) File.chmod(0o775, file)
@@ -812,9 +816,10 @@ end
if __FILE__ == $PROGRAM_NAME if __FILE__ == $PROGRAM_NAME
cli_options = { cli_options = {
work_dir: File.expand_path(__dir__),
native_full_aot: false, native_full_aot: false,
parallel: Etc.nprocessors, parallel: Etc.nprocessors,
rsvg: false, rsvg: true,
xwidgets: true xwidgets: true
} }
@@ -831,18 +836,19 @@ if __FILE__ == $PROGRAM_NAME
opts.on('-j', '--parallel COUNT', opts.on('-j', '--parallel COUNT',
'Compile using COUNT parallel processes ' \ 'Compile using COUNT parallel processes ' \
"(detected: #{cli_options[:parallel]})") do |v| "(default: #{cli_options[:parallel]})") do |v|
cli_options[:parallel] = v cli_options[:parallel] = v
end end
opts.on('--git-sha SHA', 'Override detected git SHA of specified ' \ opts.on('--git-sha SHA',
'branch allowing builds of old commits') do |v| 'Override detected git SHA of specified ' \
'branch allowing builds of old commits') do |v|
cli_options[:git_sha] = v cli_options[:git_sha] = v
end end
opts.on('--[no-]xwidgets', opts.on('--[no-]xwidgets',
'Enable/disable XWidgets ' \ 'Enable/disable XWidgets if supported ' \
'(default: enabled if supported)') do |v| '(default: enabled)') do |v|
cli_options[:xwidgets] = v cli_options[:xwidgets] = v
end end
@@ -858,9 +864,10 @@ if __FILE__ == $PROGRAM_NAME
cli_options[:native_full_aot] = v cli_options[:native_full_aot] = v
end end
opts.on('--rsvg', 'Enable SVG image support via librsvg, ' \ opts.on('--[no-]rsvg',
'can yield a unstable build (default: disabled)') do 'Enable/disable SVG image support via librsvg ' \
cli_options[:rsvg] = true '(default: enabled)') do |v|
cli_options[:rsvg] = v
end end
opts.on('--no-titlebar', 'Apply no-titlebar patch (default: disabled)') do opts.on('--no-titlebar', 'Apply no-titlebar patch (default: disabled)') do
@@ -872,6 +879,19 @@ if __FILE__ == $PROGRAM_NAME
cli_options[:no_frame_refocus] = true cli_options[:no_frame_refocus] = true
end end
opts.on('--work-dir DIR',
'Specify a working directory where tarballs, sources, and ' \
'builds will be stored and worked with') do |v|
cli_options[:work_dir] = v
end
opts.on(
'--plan FILE',
'Follow given plan file, instead of using given git ref/sha'
) do |v|
cli_options[:plan] = v
end
opts.on('--[no-]native-fast-boot', opts.on('--[no-]native-fast-boot',
'DEPRECATED: use --[no-]native-full-aot instead') do |v| 'DEPRECATED: use --[no-]native-full-aot instead') do |v|
if v if v
@@ -890,7 +910,8 @@ if __FILE__ == $PROGRAM_NAME
end end
end.parse! end.parse!
Build.new(File.expand_path(__dir__), ARGV.shift, cli_options).build work_dir = cli_options.delete(:work_dir)
Build.new(work_dir, ARGV.shift, cli_options).build
rescue Error => e rescue Error => e
warn "ERROR: #{e.message}" warn "ERROR: #{e.message}"
exit 1 exit 1