123456789_123456789_123456789_123456789_123456789_

Class: FFI::LibraryPath

Relationships & Source Files
Inherits: Object
Defined in: lib/ffi/library_path.rb

Overview

Transform a generic library name and ABI number to a platform library name

Example:

module LibVips
  extend FFI::Library
  ffi_lib LibraryPath.new("vips", abi_number: 42)
end

This translates to the following library file names:

libvips-42.dll    on Windows
libvips.so     on Linux
libvips.dylib  on Macos

See packaging.ubuntu.com/html/libraries.html for more information about library naming.

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(name, abi_number: nil, root: nil) ⇒ LibraryPath

Build a new library path

  • #name : The name of the library without file prefix or suffix.

  • #abi_number : The ABI number of the library.

  • #root : An optional base path prepended to the library name.

[ GitHub ]

  
# File 'lib/ffi/library_path.rb', line 56

def initialize(name, abi_number: nil, root: nil)
  @name = name
  @abi_number = abi_number
  @root = root
end

Class Method Details

.wrap(value)

[ GitHub ]

  
# File 'lib/ffi/library_path.rb', line 62

def self.wrap(value)
  # We allow instances of LibraryPath to pass through transparently:
  return value if value.is_a?(self)

  # We special case a library named 'c' to be the standard C library:
  return Library::LIBC if value == 'c'

  # If provided a relative file name we convert it into a library path:
  if value && File.basename(value) == value
    return self.new(value)
  end

  # Otherwise, we assume it's a full path to a library:
  return value
end

Instance Attribute Details

#abi_number (readonly)

[ GitHub ]

  
# File 'lib/ffi/library_path.rb', line 48

attr_reader :abi_number

#name (readonly)

[ GitHub ]

  
# File 'lib/ffi/library_path.rb', line 47

attr_reader :name

#root (readonly)

[ GitHub ]

  
# File 'lib/ffi/library_path.rb', line 49

attr_reader :root

Instance Method Details

#full_name

[ GitHub ]

  
# File 'lib/ffi/library_path.rb', line 78

def full_name
  # If the abi_number is given, we format it specifically according to platform rules:
  if abi_number
    if Platform.windows?
      "#{Platform::LIBPREFIX}#{name}-#{abi_number}.#{Platform::LIBSUFFIX}"
    elsif Platform.mac?
      "#{Platform::LIBPREFIX}#{name}.#{abi_number}.#{Platform::LIBSUFFIX}"
    else # Linux? BSD? etc.
      "#{Platform::LIBPREFIX}#{name}.#{Platform::LIBSUFFIX}.#{abi_number}"
    end
  else
    # Otherwise we just add prefix and suffix:
    lib = name
    # Add library prefix if missing
    lib = Platform::LIBPREFIX + lib unless lib =~ /^#{Platform::LIBPREFIX}/
    # Add library extension if missing
    r = Platform.windows? || Platform.mac? ? "\\.#{Platform::LIBSUFFIX}$" : "\\.so($|\\.[1234567890]+)"
    lib += ".#{Platform::LIBSUFFIX}" unless lib =~ /#{r}/
    lib
  end
end

#to_s

[ GitHub ]

  
# File 'lib/ffi/library_path.rb', line 100

def to_s
  if root
    # If the root path is given, we generate the full path:
    File.join(root, full_name)
  else
    full_name
  end
end