gem-ext-zig_builder 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/gem/ext/zig_builder/version.rb +4 -1
- data/lib/gem/ext/zig_builder.rb +80 -32
- data/lib/rubygems_plugin.rb +9 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 352295a2ed859fecfef121e9b8748b10efaa83eb2cc14842307cd43779c21724
|
4
|
+
data.tar.gz: 6222bdbd160014d6cf7c0e060a49d9ce9da9e8f37b4e774937ea3f7da0b912a9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f38796b73f8c45131a5b0b6281304f2b8e5b76d2aab3a50bac322843794f24af60adea60c0a4ff295a24d9ebde9d8eba90a1f4966a999c0379abb125164c915d
|
7
|
+
data.tar.gz: 727f9954335613743bbd4dceaf35e7d359c4fa0bb5759c109323a1f6ad679e11a7d68446c13d5ae3771b2e5fb9fb40278f035163010b10660423883b38af0b80
|
data/lib/gem/ext/zig_builder.rb
CHANGED
@@ -1,28 +1,83 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
2
|
+
|
3
|
+
require_relative 'zig_builder/version'
|
3
4
|
require 'rubygems/ext/builder'
|
4
|
-
require 'rubygems/command'
|
5
|
-
require 'shellwords'
|
6
5
|
require 'rbconfig'
|
7
6
|
require 'tmpdir'
|
8
7
|
|
8
|
+
# This class is used by rubygems to build Zig extensions. It is a thin-wrapper
|
9
|
+
# over the zig build command. To trigger this builder, specify a build.zig
|
10
|
+
# file in the gem spec.
|
11
|
+
#
|
12
|
+
# A minimal zig.build example:
|
13
|
+
#
|
14
|
+
# const std = @import("std");
|
15
|
+
# pub fn build(b: *std.Build) void {
|
16
|
+
# const optimize = b.standardOptimizeOption(.{});
|
17
|
+
# const target = b.standardTargetOptions(.{});
|
18
|
+
# const lib = b.addSharedLibrary(.{
|
19
|
+
# .name = "zigrb_example",
|
20
|
+
# .root_source_file = .{ .path = "src/zigrb.zig" },
|
21
|
+
# .target = target,
|
22
|
+
# .optimize = optimize,
|
23
|
+
# });
|
24
|
+
# lib.linkSystemLibrary(std.os.getenv("RUBY_PC") orelse "ruby");
|
25
|
+
# lib.linkSystemLibrary("c");
|
26
|
+
# b.installArtifact(lib);
|
27
|
+
# }
|
28
|
+
#
|
29
|
+
# A minimal zigrb.zig example:
|
30
|
+
#
|
31
|
+
# const std = @import("std");
|
32
|
+
# const ruby = @cImport(@cInclude("ruby/ruby.h"));
|
33
|
+
# export fn Init_libzigrb_example() void {
|
34
|
+
# ruby.ruby_init();
|
35
|
+
# }
|
36
|
+
#
|
37
|
+
# An example of defining a ruby class and adding a zig method:
|
38
|
+
#
|
39
|
+
# var zig_rb_class: ruby.VALUE = ruby.rb_define_class("ZigExample", ruby.rb_cObject);
|
40
|
+
# _ = ruby.rb_define_method(zig_rb_class, "method_name", rb_example_method, 2);
|
41
|
+
#
|
42
|
+
# An example of a zig ruby method:
|
43
|
+
#
|
44
|
+
# fn rb_example_method(...) callconv(.C) ruby.VALUE {
|
45
|
+
# var ap = @cVaStart();
|
46
|
+
# defer @cVaEnd(&ap);
|
47
|
+
# // first argument is `self` in ruby; discard it
|
48
|
+
# var self = @cVaArg(&ap, ruby.VALUE); _ = self;
|
49
|
+
# // additional arguments
|
50
|
+
# var _ = @cVaArg(&ap, ruby.VALUE);
|
51
|
+
# var _ = @cVaArg(&ap, ruby.VALUE);
|
52
|
+
# return ruby.QNil
|
53
|
+
# }
|
54
|
+
#
|
55
|
+
# An example of ruby zig type conversions:
|
56
|
+
#
|
57
|
+
# var m = ruby.NUM2INT(@cVaArg(&ap, ruby.VALUE));
|
58
|
+
# var n = ruby.NUM2INT(@cVaArg(&ap, ruby.VALUE));
|
59
|
+
# return ruby.INT2NUM(f(m, n));
|
60
|
+
#
|
9
61
|
class Gem::Ext::ZigBuilder < Gem::Ext::Builder
|
62
|
+
#
|
63
|
+
# This module patches the Builder builder_for method to ensure that
|
64
|
+
# this builder class is used for build.zig extensions.
|
65
|
+
#
|
10
66
|
module PatchBuilderLookup
|
11
67
|
def builder_for(extension)
|
12
68
|
/build.zig/ === extension ? Gem::Ext::ZigBuilder : super
|
13
69
|
end
|
14
70
|
end
|
15
71
|
|
16
|
-
class <<self
|
17
|
-
def build(
|
18
|
-
|
19
|
-
|
72
|
+
class << self
|
73
|
+
def build(_extension, dest_path, results, _args = [], _lib_dir = nil, extension_dir = nil)
|
74
|
+
dlext = RbConfig::CONFIG['DLEXT']
|
20
75
|
tmp_dir = Dir.mktmpdir
|
21
|
-
|
22
|
-
|
76
|
+
command = _build_command(tmp_dir)
|
77
|
+
envvars = _build_envvars
|
23
78
|
|
24
|
-
_run(
|
25
|
-
_install_artifacts(tmp_dir, dest_path)
|
79
|
+
_run(command, results, 'zig', extension_dir, envvars)
|
80
|
+
_install_artifacts(tmp_dir, dlext, dest_path)
|
26
81
|
|
27
82
|
results
|
28
83
|
ensure
|
@@ -31,61 +86,54 @@ class Gem::Ext::ZigBuilder < Gem::Ext::Builder
|
|
31
86
|
|
32
87
|
private
|
33
88
|
|
34
|
-
def _set_vars
|
35
|
-
@dlext = RbConfig::CONFIG['DLEXT']
|
36
|
-
@target_vendor = RbConfig::CONFIG['target_vendor']
|
37
|
-
@pkg_config_path = "#{RbConfig::CONFIG['libdir']}/pkgconfig"
|
38
|
-
@ruby_pc = "#{File.basename(RbConfig::CONFIG['ruby_pc'], '.pc')}"
|
39
|
-
end
|
40
|
-
|
41
89
|
def _build_command(tmp_dir)
|
42
|
-
[].tap {|c|
|
90
|
+
[].tap { |c|
|
43
91
|
c << 'zig' << 'build' << '-Doptimize=ReleaseSafe'
|
44
92
|
c << '--prefix-lib-dir' << tmp_dir
|
45
93
|
c << 'test' << 'install'
|
46
94
|
}
|
47
95
|
end
|
48
96
|
|
49
|
-
def
|
97
|
+
def _build_envvars
|
50
98
|
{
|
51
|
-
'PKG_CONFIG_PATH' =>
|
52
|
-
'RUBY_PC' =>
|
53
|
-
}
|
54
|
-
end
|
99
|
+
'PKG_CONFIG_PATH' => "#{RbConfig::CONFIG['libdir']}/pkgconfig",
|
100
|
+
'RUBY_PC' => File.basename(RbConfig::CONFIG['ruby_pc'], '.pc'),
|
101
|
+
}
|
55
102
|
end
|
56
103
|
|
57
104
|
def _run(command, results, command_name, dir, env)
|
105
|
+
# old versions do not support the 4th `dir` arg
|
106
|
+
# old versions do not support the 5th `env` arg
|
58
107
|
case method(:run).parameters.count
|
59
108
|
when 3
|
60
|
-
# old versions do not support the 4th `dir` arg
|
61
|
-
# old versions do not support the 5th `env` arg
|
62
109
|
_pollute_env(env)
|
63
110
|
run(command, results, command_name)
|
64
111
|
when 4
|
65
|
-
# old versions do not support the 5th `env` arg
|
66
112
|
_pollute_env(env)
|
67
113
|
run(command, results, command_name, dir)
|
68
114
|
when 5
|
69
115
|
run(command, results, command_name, dir, env)
|
70
116
|
else
|
71
|
-
raise ArgumentError
|
117
|
+
raise ArgumentError, 'wrong number of arguments'
|
72
118
|
end
|
73
119
|
end
|
74
120
|
|
75
121
|
def _pollute_env(env)
|
76
|
-
env.each do |k,v| ENV[k] = v end
|
122
|
+
env.each do |k, v| ENV[k] = v end
|
77
123
|
end
|
78
124
|
|
79
|
-
def _install_artifacts(tmp_dir, dest_path)
|
125
|
+
def _install_artifacts(tmp_dir, dlext, dest_path)
|
126
|
+
target_vendor = RbConfig::CONFIG['target_vendor']
|
127
|
+
|
80
128
|
Dir.chdir tmp_dir do
|
81
|
-
if
|
129
|
+
if target_vendor == 'apple' && dlext == 'bundle'
|
82
130
|
# zig builds a .dylib but ruby wants to load a .bundle
|
83
131
|
Dir.glob('*.dylib').each do |dylib|
|
84
132
|
FileUtils.mv dylib, "#{File.basename(dylib, '.dylib')}.bundle"
|
85
133
|
end
|
86
134
|
end
|
87
135
|
|
88
|
-
FileUtils.mv Dir.glob("
|
136
|
+
FileUtils.mv Dir.glob("*.#{dlext}"), dest_path
|
89
137
|
end
|
90
138
|
end
|
91
139
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# RubyGems will load plugins in the latest version of each installed gem
|
4
|
+
# or $LOAD_PATH. Plugins must be named ‘rubygems_plugin’ (.rb, .so,
|
5
|
+
# etc) and placed at the root of your gem’s #require_path. Plugins are
|
6
|
+
# installed at a special location and loaded on boot.
|
7
|
+
# https://guides.rubygems.org/plugins/
|
8
|
+
|
9
|
+
require_relative 'gem/ext/zig_builder'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gem-ext-zig_builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Frank J. Cameron
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-05-
|
11
|
+
date: 2023-05-20 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: ''
|
14
14
|
email:
|
@@ -19,6 +19,7 @@ extra_rdoc_files: []
|
|
19
19
|
files:
|
20
20
|
- lib/gem/ext/zig_builder.rb
|
21
21
|
- lib/gem/ext/zig_builder/version.rb
|
22
|
+
- lib/rubygems_plugin.rb
|
22
23
|
homepage: https://gitlab.com/fjc/gem-ext-zig_builder
|
23
24
|
licenses:
|
24
25
|
- MIT
|
@@ -26,6 +27,7 @@ metadata:
|
|
26
27
|
homepage_uri: https://gitlab.com/fjc/gem-ext-zig_builder
|
27
28
|
source_code_uri: https://gitlab.com/fjc/gem-ext-zig_builder
|
28
29
|
changelog_uri: https://gitlab.com/fjc/gem-ext-zig_builder
|
30
|
+
rubygems_mfa_required: 'true'
|
29
31
|
post_install_message:
|
30
32
|
rdoc_options: []
|
31
33
|
require_paths:
|
@@ -34,7 +36,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
34
36
|
requirements:
|
35
37
|
- - ">="
|
36
38
|
- !ruby/object:Gem::Version
|
37
|
-
version: 2.
|
39
|
+
version: 2.5.0
|
38
40
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
41
|
requirements:
|
40
42
|
- - ">="
|