[ffigen] Add /usr/lib to default locations and update readme. (#196)
diff --git a/pkgs/ffigen/CHANGELOG.md b/pkgs/ffigen/CHANGELOG.md index 1f2afa4..b037c39 100644 --- a/pkgs/ffigen/CHANGELOG.md +++ b/pkgs/ffigen/CHANGELOG.md
@@ -1,3 +1,6 @@ +# 2.4.1 +- Added `/usr/lib` to default dynamic library location for linux. + # 2.4.0 - Added new config key `llvm-path` that accepts a list of `path/to/llvm`. - Deprecated config key `llvm-lib`.
diff --git a/pkgs/ffigen/README.md b/pkgs/ffigen/README.md index 19cbf56..cc1aeac 100644 --- a/pkgs/ffigen/README.md +++ b/pkgs/ffigen/README.md
@@ -21,15 +21,21 @@ Output (_generated_bindings.dart_). ```dart class NativeLibrary { - final DynamicLibrary _dylib; - - NativeLibrary(DynamicLibrary dynamicLibrary) : _dylib = dynamicLibrary; + final Pointer<T> Function<T extends NativeType>(String symbolName) + _lookup; + NativeLibrary(DynamicLibrary dynamicLibrary) + : _lookup = dynamicLibrary.lookup; + NativeLibrary.fromLookup( + Pointer<T> Function<T extends NativeType>(String symbolName) + lookup) + : _lookup = lookup; int sum(int a, int b) { - return (_sum ??= _dylib.lookupFunction<_c_sum, _dart_sum>('sum'))(a, b); + return _sum(a, b); } - _dart_sum? _sum; + late final _sum_ptr = _lookup<NativeFunction<_c_sum>>('sum'); + late final _dart_sum _sum = _sum_ptr.asFunction<_dart_sum>(); } typedef _c_sum = Int32 Function(Int32 a, Int32 b); typedef _dart_sum = int Function(int a, int b); @@ -77,7 +83,7 @@ </thead> <tbody> <tr> - <td>output<br><i>(Required)</i></td> + <td>output<br><i><b>(Required)</b></i></td> <td>Output path of the generated bindings.</td> <td> @@ -88,20 +94,24 @@ </tr> <tr> <td>llvm-path</td> - <td>Path to <i>llvm</i> folder. ffigen will sequentially search all the specified paths. Required if ffigen is unable to find this at default locations.</td> + <td>Path to <i>llvm</i> folder.<br> ffigen will sequentially search + for `lib/libclang.so` on linux, `lib/libclang.dylib` on macOs and + `bin\libclang.dll` on windows, in the specified paths.<br> + <i>Required</i> if ffigen is unable to find this at default locations.</td> <td> ```yaml llvm-path: - - '/usr/local/opt/llvm/lib' + - '/usr/local/opt/llvm' - 'C:\Program Files\llvm` - '/usr/lib/llvm-11' ``` </td> </tr> <tr> - <td>headers<br><i>(Required)</i></td> - <td>The header entry-points and include-directives. Glob syntax is allowed.</td> + <td>headers<br><i><b>(Required)</b></i></td> + <td>The header entry-points and include-directives. Glob syntax is allowed.<br> + If include-directives are not specified ffigen will generate everything directly/transitively under the entry-points.</td> <td> ```yaml @@ -156,7 +166,7 @@ <tr> <td>compiler-opts-automatic -> macos -> include-c-standard-library</td> <td>Tries to automatically find and add C standard library path to - compiler-opts on macos. + compiler-opts on macos.<br> <b>Default: true</b> </td> <td> @@ -169,23 +179,32 @@ </td> </tr> <tr> - <td>functions<br>structs<br>enums<br>unnamed-enums<br>macros<br>globals</td> - <td>Filters for declarations.<br><b>Default: all are included</b></td> + <td>functions<br><br>structs<br><br>enums<br><br>unnamed-enums<br><br>macros<br><br>globals</td> + <td>Filters for declarations.<br><b>Default: all are included.</b><br><br> + Options -<br> + - Include/Exclude declarations.<br> + - Rename declarations.<br> + - Rename enum and struct members.<br> + - Expose symbol-address and typedef for functions and globals.<br> + </td> <td> ```yaml functions: include: # 'exclude' is also available. - - [a-z][a-zA-Z0-9]* # Matches using regexp. - - prefix.* # '.' matches any character. - - someFuncName # Matches with exact name - - anotherName # Full names have higher priority. + # Matches using regexp. + - [a-z][a-zA-Z0-9]* + # '.' matches any character. + - prefix.* + # Matches with exact name + - someFuncName + # Full names have higher priority. + - anotherName rename: # Regexp groups based replacement. 'clang_(.*)': '$1' - # full name matches have higher priority. 'clang_dispose': 'dispose' - # Removes '_' from beginning of a name. + # Removes '_' from beginning. '_(.*)': '$1' symbol-address: # Used to expose symbol and typedef. @@ -194,16 +213,20 @@ enums: member-rename: '(.*)': # Matches any enum. - # Removes '_' from beginning enum member name. + # Removes '_' from beginning + # enum member name. '_(.*)': '$1' - 'CXTypeKind': # Full names have higher priority. - # $1 keeps only the 1st group i.e '(.*)'. + # Full names have higher priority. + 'CXTypeKind': + # $1 keeps only the 1st + # group i.e only '(.*)'. 'CXType(.*)': '$1' globals: exclude: - aGlobal rename: - # Removes '_' from beginning of a name. + # Removes '_' from + # beginning of a name. '_(.*)': '$1' ``` </td> @@ -223,7 +246,7 @@ <tr> <td>comments</td> <td>Extract documentation comments for declarations.<br> - The style and length of the comments can be specified with the following options.<br> + The style and length of the comments recognized can be specified with the following options- <br> <i>style: doxygen(default) | any </i><br> <i>length: brief | full(default) </i><br> If you want to disable all comments you can also pass<br> @@ -233,7 +256,7 @@ ```yaml comments: - style: doxygen + style: any length: full ``` </td> @@ -243,7 +266,7 @@ <td>If `opaque`, generates empty `Opaque` structs if structs were not included in config (but were added since they are a dependency) and only passed by reference(pointer).<br> - Options - full(default) | opaque </i><br> + <i>Options - full(default) | opaque</i><br> </td> <td> @@ -279,7 +302,7 @@ </tr> <tr> <td>dart-bool</td> - <td>Should generate dart `bool` for c99 bool in functions.<br> + <td>Should generate dart `bool` instead of Uint8 for c99 bool in functions.<br> <b>Default: true</b> </td> <td> @@ -338,7 +361,8 @@ ```yaml # These are optional and also default, -# Omitting any and the default will be used. +# Omitting any and the default +# will be used. size-map: char: 1 unsigned char: 1
diff --git a/pkgs/ffigen/example/libclang-example/pubspec.yaml b/pkgs/ffigen/example/libclang-example/pubspec.yaml index a7cbf4a..e048fe5 100644 --- a/pkgs/ffigen/example/libclang-example/pubspec.yaml +++ b/pkgs/ffigen/example/libclang-example/pubspec.yaml
@@ -30,7 +30,7 @@ - '**Index.h' compiler-opts: - - '-Ithird_party/libclang/include' + - '-I../../third_party/libclang/include' - '-Wno-nullability-completeness' functions: include:
diff --git a/pkgs/ffigen/lib/src/config_provider/spec_utils.dart b/pkgs/ffigen/lib/src/config_provider/spec_utils.dart index 68246b4..6875af1 100644 --- a/pkgs/ffigen/lib/src/config_provider/spec_utils.dart +++ b/pkgs/ffigen/lib/src/config_provider/spec_utils.dart
@@ -380,7 +380,7 @@ return res; } catch (e) { _logger.severe( - "Couldn't find libclang dynamic library in specified locations."); + "Couldn't find ${p.join(strings.dynamicLibParentName, strings.dylibFileName)} in specified locations."); exit(1); } }
diff --git a/pkgs/ffigen/lib/src/strings.dart b/pkgs/ffigen/lib/src/strings.dart index dcbae34..2f592a2 100644 --- a/pkgs/ffigen/lib/src/strings.dart +++ b/pkgs/ffigen/lib/src/strings.dart
@@ -146,7 +146,8 @@ const linuxDylibLocations = [ '/usr/lib/llvm-9/lib/', '/usr/lib/llvm-10/lib/', - '/usr/lib/llvm-11/lib/' + '/usr/lib/llvm-11/lib/', + '/usr/lib/' ]; const windowsDylibLocations = [ r'C:\Program Files\LLVM\bin\',
diff --git a/pkgs/ffigen/pubspec.yaml b/pkgs/ffigen/pubspec.yaml index bc514bf..deb1c68 100644 --- a/pkgs/ffigen/pubspec.yaml +++ b/pkgs/ffigen/pubspec.yaml
@@ -3,7 +3,7 @@ # BSD-style license that can be found in the LICENSE file. name: ffigen -version: 2.4.0 +version: 2.4.1 homepage: https://github.com/dart-lang/ffigen description: Generator for FFI bindings, using LibClang to parse C header files.