Module: FFI::Compiler::Loader

Defined in:
lib/ffi-compiler/loader.rb,
lib/ffi-compiler/fake_ffi/ffi-compiler/loader.rb

Class Method Summary collapse

Class Method Details

.caller_path(line = caller[0]) ⇒ Object



41
42
43
44
45
46
47
48
49
50
# File 'lib/ffi-compiler/loader.rb', line 41

def self.caller_path(line = caller[0])
  if FFI::Platform::OS == 'windows'
    drive = line[0..1]
    path =  line[2..-1].split(/:/)[0]
    full_path = drive + path
  else
    full_path = line.split(/:/)[0]
  end
  File.dirname full_path
end

.find(*args) ⇒ Object

Raises:

  • (LoadError)


8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/ffi-compiler/loader.rb', line 8

def self.find(name, start_path = nil)
  library = Platform.system.map_library_name(name)
  start_path ||= caller_path(caller[0])

  # Load from modern extension fast-path when called from an active gem spec
  if defined?(Gem::Specification) &&
     (spec = Gem::Specification.find_active_stub_by_path(library)) &&
     spec.respond_to?(:extension_dir) &&
     start_path.start_with?(spec.gem_dir)

    ext_path = File.join(spec.extension_dir, library)
    return ext_path if File.exist?(ext_path)
  end

  # Try to find the library in the legacy lib path, passed start_path or local folder
  root = false
  Pathname.new(start_path).ascend do |path|
    Dir.glob("#{path}/**/#{FFI::Platform::ARCH}-#{FFI::Platform::OS}/#{library}") do |f|
      return f
    end

    Dir.glob("#{path}/**/#{library}") do |f|
      return f
    end

    break if root

    # Next iteration will be the root of the gem if this is the lib/ dir - stop after that
    root = File.basename(path) == 'lib'
  end
  raise LoadError.new("cannot find '#{name}' library")
end