-
Notifications
You must be signed in to change notification settings - Fork 341
Add support for passing ABI version to FFI.map_library_name.
#963
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -31,6 +31,53 @@ | |
| module FFI | ||
| CURRENT_PROCESS = USE_THIS_PROCESS_AS_LIBRARY = Object.new | ||
|
|
||
| class LibraryPath < ::Struct.new(:name, :abi_number, :root) | ||
| PATTERN = /(#{Platform::LIBPREFIX})?(?<name>.*?)(\.|\z)/ | ||
|
|
||
| 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 | ||
| if match = PATTERN.match(value) | ||
| return self.new(match[:name]) | ||
| end | ||
| end | ||
|
|
||
| # Otherwise, we assume it's a full path to a library: | ||
| return value | ||
| end | ||
|
|
||
| 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 use a generic format: | ||
| "#{Platform::LIBPREFIX}#{name}.#{Platform::LIBSUFFIX}" | ||
| end | ||
| end | ||
|
|
||
| def to_s | ||
| if root | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't see much value to pass
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's a more convenient interface: e.g. lib_path = __dir__ # or something
ffi_lib LibraryPath.new('vips', 42, lib_path)It's easier to understand the intention of the user (a library in a given path) and easier to print out/debug later on. A lot of native libraries follow this pattern, i.e. compile a shared library into a known path. In theory, if someone provides a |
||
| # If the root path is given, we generate the full path: | ||
| File.join(root, full_name) | ||
| else | ||
| full_name | ||
| end | ||
| end | ||
| end | ||
|
|
||
| # @param [#to_s] lib library name | ||
| # @return [String] library name formatted for current platform | ||
| # Transform a generic library name to a platform library name | ||
|
|
@@ -41,17 +88,9 @@ module FFI | |
| # # Windows | ||
| # FFI.map_library_name 'c' # -> "msvcrt.dll" | ||
| # FFI.map_library_name 'jpeg' # -> "jpeg.dll" | ||
| def self.map_library_name(lib) | ||
| def self.map_library_name(value) | ||
| # Mangle the library name to reflect the native library naming conventions | ||
| lib = Library::LIBC if lib == 'c' | ||
|
|
||
| if lib && File.basename(lib) == lib | ||
| lib = Platform::LIBPREFIX + lib unless lib =~ /^#{Platform::LIBPREFIX}/ | ||
| r = Platform::IS_WINDOWS || Platform::IS_MAC ? "\\.#{Platform::LIBSUFFIX}$" : "\\.so($|\\.[1234567890]+)" | ||
| lib += ".#{Platform::LIBSUFFIX}" unless lib =~ /#{r}/ | ||
| end | ||
|
|
||
| lib | ||
| LibraryPath.wrap(value).to_s | ||
| end | ||
|
|
||
| # Exception raised when a function is not found in libraries | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would like to preserve the LIBSUFFIX-addition like so