ffi-compiler2 2.0.1 → 2.2.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c8549789704a6cca51363e043802e3da1509e6db8e8cb04e3371fbd1d353d719
4
- data.tar.gz: d59762c7609d6e148c6dda92ceb2067875e5c8b73c9802b68180fbbc6c941aba
3
+ metadata.gz: 7298668a9fdd9774299a0e8f7db5f707a5ddfe07dec06fa4386a01bcee7db5a5
4
+ data.tar.gz: ce654d24c586edaa2dc571d7a71548bd15a64576367ae8b0e0a97df44e29454f
5
5
  SHA512:
6
- metadata.gz: 4938d40f72c31d3d280952c99964091215ee50991292466bca16d7e8dea9e8d525c5399f289cd6d025ccc26aa0745faca437a6b5db96757b93205cbc569e9277
7
- data.tar.gz: f70c97cf7e3cd83a06d901393c331e7e52cb8f174f9548807bad3cdd175cd50f00c87b6e9686398ee3531c498baa395f1a09f34f535806f2a8a7081c1d2107e4
6
+ metadata.gz: bee061257b683286b3caea10927543ca3d554500facb5f6465710652c23dd0ebbc287ac0e4abed006a6cdc27b5c3eeb1645cda97e325468316d508b89bf6f360
7
+ data.tar.gz: 98550ca8ca4c4ba8bcb8ccc7b979b8365143037d87169f7ca821d74fe4a61c45d2a969ef21f9d1e92da59e3ffcb8302872b25c657e351224c88860ac0a4eafad
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
data/LICENSE CHANGED
@@ -187,7 +187,7 @@
187
187
  same "printed page" as the copyright notice for easier
188
188
  identification within third-party archives.
189
189
 
190
- Copyright [yyyy] [name of copyright owner]
190
+ Copyright 2020 FFI
191
191
 
192
192
  Licensed under the Apache License, Version 2.0 (the "License");
193
193
  you may not use this file except in compliance with the License.
data/ffi-compiler.gemspec CHANGED
@@ -1,12 +1,12 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'ffi-compiler2'
3
- s.version = '2.0.1'
3
+ s.version = '2.2.2'
4
4
  s.author = 'Dāvis'
5
5
  s.email = 'davispuh@gmail.com'
6
6
  s.homepage = 'https://gitlab.com/davispuh/ffi-compiler'
7
7
  s.summary = 'Ruby FFI Rakefile generator'
8
8
  s.description = 'Ruby FFI library'
9
- s.files = %w(ffi-compiler.gemspec README.md Rakefile LICENSE) + Dir.glob("{lib,spec}/**/*")
9
+ s.files = %w(ffi-compiler.gemspec Gemfile Rakefile README.md LICENSE) + Dir.glob("{lib,spec}/**/*")
10
10
  s.license = 'Apache-2.0'
11
11
  s.required_ruby_version = '>= 1.9'
12
12
  s.add_dependency 'rake'
@@ -5,12 +5,38 @@ require 'ffi'
5
5
  require 'tmpdir'
6
6
  require 'rbconfig'
7
7
  require_relative 'platform'
8
+ require_relative 'shell'
8
9
 
9
10
  module FFI
10
11
  module Compiler
11
12
  DEFAULT_CFLAGS = %w(-fexceptions -O -fno-omit-frame-pointer -fno-strict-aliasing)
12
13
  DEFAULT_LDFLAGS = %w(-fexceptions)
13
14
 
15
+ class Flags
16
+ attr_accessor :raw
17
+
18
+ def initialize(flags)
19
+ @flags = flags
20
+ @raw = true # For backward compatibility
21
+ end
22
+
23
+ def <<(flag)
24
+ if @raw
25
+ @flags += shellsplit(flag.to_s)
26
+ else
27
+ @flags << flag
28
+ end
29
+ end
30
+
31
+ def to_a
32
+ @flags
33
+ end
34
+
35
+ def to_s
36
+ shelljoin(@flags)
37
+ end
38
+ end
39
+
14
40
  class CompileTask < Rake::TaskLib
15
41
  attr_reader :cflags, :cxxflags, :ldflags, :libs, :platform
16
42
  attr_accessor :name, :ext_dir, :source_dirs, :exclude
@@ -26,9 +52,9 @@ module FFI
26
52
  @libraries = []
27
53
  @headers = []
28
54
  @functions = []
29
- @cflags = DEFAULT_CFLAGS.dup
30
- @cxxflags = DEFAULT_CFLAGS.dup
31
- @ldflags = DEFAULT_LDFLAGS.dup
55
+ @cflags = Flags.new(shellsplit(ENV['CFLAGS']) || DEFAULT_CFLAGS.dup)
56
+ @cxxflags = Flags.new(shellsplit(ENV['CXXFLAGS']) || DEFAULT_CFLAGS.dup)
57
+ @ldflags = Flags.new(shellsplit(ENV['LDFLAGS']) || DEFAULT_LDFLAGS.dup)
32
58
  @libs = []
33
59
  @platform = Platform.system
34
60
  @exports = []
@@ -93,7 +119,7 @@ module FFI
93
119
  else
94
120
  so_flags << '-shared'
95
121
  end
96
- so_flags = so_flags.join(' ')
122
+ so_flags = shelljoin(so_flags)
97
123
 
98
124
  out_dir = "#{@platform.arch}-#{@platform.os}"
99
125
  if @ext_dir != '.'
@@ -106,13 +132,13 @@ module FFI
106
132
  lib_name = File.join(out_dir, Platform.system.map_library_name(@name))
107
133
 
108
134
  iflags = @include_paths.uniq.map { |p| "-I#{p}" }
109
- @defines << @functions.uniq.map { |f| "-DHAVE_#{f.upcase}=1" }
110
- @defines << @headers.uniq.map { |h| "-DHAVE_#{h.upcase.sub(/\./, '_')}=1" }
135
+ @defines += @functions.uniq.map { |f| "-DHAVE_#{f.upcase}=1" }
136
+ @defines += @headers.uniq.map { |h| "-DHAVE_#{h.upcase.sub(/\./, '_')}=1" }
111
137
 
112
- cflags = (@cflags + pic_flags + iflags + @defines).join(' ')
113
- cxxflags = (@cxxflags + @cflags + pic_flags + iflags + @defines).join(' ')
114
- ld_flags = (@library_paths.map { |path| "-L#{path}" } + @ldflags).join(' ')
115
- libs = (@libraries.map { |l| "-l#{l}" } + @libs).join(' ')
138
+ cflags = shelljoin(@cflags.to_a + pic_flags + iflags + @defines)
139
+ cxxflags = shelljoin(@cxxflags.to_a + @cflags.to_a + pic_flags + iflags + @defines)
140
+ ld_flags = shelljoin(@library_paths.map { |path| "-L#{path}" } + @ldflags.to_a)
141
+ libs = shelljoin(@libraries.map { |l| "-l#{l}" } + @libs)
116
142
 
117
143
  src_files = []
118
144
  obj_files = []
@@ -130,12 +156,12 @@ module FFI
130
156
  obj_file = obj_files[index]
131
157
  if src =~ /\.c$/
132
158
  file obj_file => [ src, File.dirname(obj_file) ] do |t|
133
- sh "#{cc} #{cflags} -o #{t.name} -c #{t.prerequisites[0]}"
159
+ sh "#{cc} #{cflags} -o #{shellescape(t.name)} -c #{shellescape(t.prerequisites[0])}"
134
160
  end
135
161
 
136
162
  else
137
163
  file obj_file => [ src, File.dirname(obj_file) ] do |t|
138
- sh "#{cxx} #{cxxflags} -o #{t.name} -c #{t.prerequisites[0]}"
164
+ sh "#{cxx} #{cxxflags} -o #{shellescape(t.name)} -c #{shellescape(t.prerequisites[0])}"
139
165
  end
140
166
  end
141
167
 
@@ -150,14 +176,14 @@ module FFI
150
176
 
151
177
  desc "Build dynamic library"
152
178
  file lib_name => obj_files do |t|
153
- sh "#{ld} #{so_flags} -o #{t.name} #{t.prerequisites.join(' ')} #{ld_flags} #{libs}"
179
+ sh "#{ld} #{so_flags} -o #{shellescape(t.name)} #{shelljoin(t.prerequisites)} #{ld_flags} #{libs}"
154
180
  end
155
181
  CLEAN.include(lib_name)
156
182
 
157
183
  @exports.each do |e|
158
184
  desc "Export #{e[:rb_file]}"
159
185
  file e[:header] => [ e[:rb_file] ] do |t|
160
- ruby "-I#{File.join(File.dirname(__FILE__), 'fake_ffi')} -I#{File.dirname(t.prerequisites[0])} #{File.join(File.dirname(__FILE__), 'exporter.rb')} #{t.prerequisites[0]} #{t.name}"
186
+ ruby "-I#{File.join(File.dirname(__FILE__), 'fake_ffi')} -I#{File.dirname(t.prerequisites[0])} #{File.join(File.dirname(__FILE__), 'exporter.rb')} #{shellescape(t.prerequisites[0])} #{shellescape(t.name)}"
161
187
  end
162
188
 
163
189
  obj_files.each { |o| file o => [ e[:header] ] }
@@ -221,10 +247,10 @@ module FFI
221
247
  File.open(path, 'w') do |f|
222
248
  f << src
223
249
  end
224
- cflags = opts.join(' ')
250
+ cflags = shelljoin(opts)
225
251
  output = File.join(dir, 'ffi-test')
226
252
  begin
227
- return system "#{cc} #{cflags} -o #{output} -c #{path} > #{path}.log 2>&1"
253
+ return system "#{cc} #{cflags} -o #{shellescape(output)} -c #{shellescape(path)} > #{shellescape(path)}.log 2>&1"
228
254
  rescue
229
255
  return false
230
256
  end
@@ -0,0 +1,24 @@
1
+ require 'shellwords'
2
+ require 'rbconfig'
3
+
4
+ def shellescape(str)
5
+ return str unless str
6
+ if FFI::Platform::OS == 'windows'
7
+ '"' + str.gsub('"', '""') + '"'
8
+ else
9
+ str.shellescape
10
+ end
11
+ end
12
+
13
+ def shelljoin(args)
14
+ if FFI::Platform::OS == 'windows'
15
+ args.reduce { |cmd, arg| cmd + ' "' + arg.gsub('"', '""') + '"' }
16
+ else
17
+ args.shelljoin
18
+ end
19
+ end
20
+
21
+ def shellsplit(str)
22
+ return str unless str
23
+ str.shellsplit
24
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ffi-compiler2
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dāvis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-25 00:00:00.000000000 Z
11
+ date: 2024-02-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -72,6 +72,7 @@ executables: []
72
72
  extensions: []
73
73
  extra_rdoc_files: []
74
74
  files:
75
+ - Gemfile
75
76
  - LICENSE
76
77
  - README.md
77
78
  - Rakefile
@@ -83,6 +84,7 @@ files:
83
84
  - lib/ffi-compiler/fake_ffi/ffi.rb
84
85
  - lib/ffi-compiler/loader.rb
85
86
  - lib/ffi-compiler/platform.rb
87
+ - lib/ffi-compiler/shell.rb
86
88
  - lib/ffi-compiler/task.rb
87
89
  homepage: https://gitlab.com/davispuh/ffi-compiler
88
90
  licenses:
@@ -103,7 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
103
105
  - !ruby/object:Gem::Version
104
106
  version: '0'
105
107
  requirements: []
106
- rubygems_version: 3.1.4
108
+ rubygems_version: 3.5.6
107
109
  signing_key:
108
110
  specification_version: 4
109
111
  summary: Ruby FFI Rakefile generator