ffi-compiler2 2.0.1 → 2.2.2

Sign up to get free protection for your applications and to get access to all the features.
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