diff options
author | Xavier Claessens <xavier.claessens@collabora.com> | 2023-04-21 16:21:48 -0400 |
---|---|---|
committer | Xavier Claessens <xclaesse@gmail.com> | 2023-09-19 13:54:49 -0400 |
commit | 10dcd87d002f6f36b1f60371dc807b8d9959d97b (patch) | |
tree | 676b5597a7accdd4e2853d7c53f3453535dc5727 | |
parent | 8ccdb881374084ddb90ef259539cfd3bb748c904 (diff) | |
download | meson-10dcd87d002f6f36b1f60371dc807b8d9959d97b.zip meson-10dcd87d002f6f36b1f60371dc807b8d9959d97b.tar.gz meson-10dcd87d002f6f36b1f60371dc807b8d9959d97b.tar.bz2 |
Rust: Replace rust_crate_type with rust_abi
Meson already knows if it's a shared or static library, user only need
to specify the ABI (Rust or C).
-rw-r--r-- | docs/markdown/snippets/rust_crate_type.md | 11 | ||||
-rw-r--r-- | docs/yaml/functions/_build_target_base.yaml | 5 | ||||
-rw-r--r-- | docs/yaml/functions/library.yaml | 11 | ||||
-rw-r--r-- | docs/yaml/functions/shared_library.yaml | 8 | ||||
-rw-r--r-- | docs/yaml/functions/shared_module.yaml | 8 | ||||
-rw-r--r-- | docs/yaml/functions/static_library.yaml | 8 | ||||
-rw-r--r-- | mesonbuild/backend/ninjabackend.py | 11 | ||||
-rw-r--r-- | mesonbuild/build.py | 78 | ||||
-rw-r--r-- | mesonbuild/interpreter/type_checking.py | 25 | ||||
-rw-r--r-- | test cases/rust/4 polyglot/meson.build | 51 | ||||
-rw-r--r-- | test cases/rust/4 polyglot/proc.rs | 7 | ||||
-rw-r--r-- | test cases/rust/4 polyglot/stuff.rs | 2 | ||||
-rw-r--r-- | test cases/rust/4 polyglot/test.json | 94 |
13 files changed, 263 insertions, 56 deletions
diff --git a/docs/markdown/snippets/rust_crate_type.md b/docs/markdown/snippets/rust_crate_type.md new file mode 100644 index 0000000..9b32f0e --- /dev/null +++ b/docs/markdown/snippets/rust_crate_type.md @@ -0,0 +1,11 @@ +## Deprecated `rust_crate_type` and replaced by `rust_abi` + +The new `rust_abi` keyword argument is accepted by [[shared_library]], +[[static_library]], [[library]] and [[shared_module]] functions. It can be either +`'rust'` (the default) or `'c'` strings. + +`rust_crate_type` is now deprecated because Meson already knows if it's a shared +or static library, user only need to specify the ABI (Rust or C). + +`proc_macro` crates are now handled by the [`rust.proc_macro()`](Rust-module.md#proc_macro) +method. diff --git a/docs/yaml/functions/_build_target_base.yaml b/docs/yaml/functions/_build_target_base.yaml index 724b6a4..3f0e881 100644 --- a/docs/yaml/functions/_build_target_base.yaml +++ b/docs/yaml/functions/_build_target_base.yaml @@ -289,6 +289,7 @@ kwargs: rust_crate_type: type: str since: 0.42.0 + deprecated: 1.3.0 description: | Set the specific type of rust crate to compile (when compiling rust). @@ -306,6 +307,10 @@ kwargs: "proc-macro" is new in 0.62.0. + *Since 1.3.0* this is deprecated and replaced by "rust_abi" keyword argument. + `proc_macro` crates are now handled by the [`rust.proc_macro()`](Rust-module.md#proc_macro) + method. + rust_dependency_map: type: dict[str] since: 1.2.0 diff --git a/docs/yaml/functions/library.yaml b/docs/yaml/functions/library.yaml index f10ef8e..f9e336b 100644 --- a/docs/yaml/functions/library.yaml +++ b/docs/yaml/functions/library.yaml @@ -21,3 +21,14 @@ varargs_inherit: _build_target_base kwargs_inherit: - shared_library - static_library + +kwargs: + rust_abi: + type: str + since: 1.3.0 + description: | + Set the specific ABI to compile (when compiling rust). + - 'rust' (default): Create a "rlib" or "dylib" crate depending on the library + type being build. + - 'c': Create a "cdylib" or "staticlib" crate depending on the library + type being build. diff --git a/docs/yaml/functions/shared_library.yaml b/docs/yaml/functions/shared_library.yaml index 956fb2c..5076b93 100644 --- a/docs/yaml/functions/shared_library.yaml +++ b/docs/yaml/functions/shared_library.yaml @@ -44,3 +44,11 @@ kwargs: description: | Specify a Microsoft module definition file for controlling symbol exports, etc., on platforms where that is possible (e.g. Windows). + + rust_abi: + type: str + since: 1.3.0 + description: | + Set the specific ABI to compile (when compiling rust). + - 'rust' (default): Create a "dylib" crate. + - 'c': Create a "cdylib" crate. diff --git a/docs/yaml/functions/shared_module.yaml b/docs/yaml/functions/shared_module.yaml index 20bd5c4..46086ba 100644 --- a/docs/yaml/functions/shared_module.yaml +++ b/docs/yaml/functions/shared_module.yaml @@ -39,3 +39,11 @@ kwargs: description: | Specify a Microsoft module definition file for controlling symbol exports, etc., on platforms where that is possible (e.g. Windows). + + rust_abi: + type: str + since: 1.3.0 + description: | + Set the specific ABI to compile (when compiling rust). + - 'rust' (default): Create a "dylib" crate. + - 'c': Create a "cdylib" crate. diff --git a/docs/yaml/functions/static_library.yaml b/docs/yaml/functions/static_library.yaml index 1d42d60..615baa2 100644 --- a/docs/yaml/functions/static_library.yaml +++ b/docs/yaml/functions/static_library.yaml @@ -23,3 +23,11 @@ kwargs: If `true` the object files in the target will be prelinked, meaning that it will contain only one prelinked object file rather than the individual object files. + + rust_abi: + type: str + since: 1.3.0 + description: | + Set the specific ABI to compile (when compiling rust). + - 'rust' (default): Create a "rlib" crate. + - 'c': Create a "staticlib" crate. diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 491f2a6..767baea 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -1937,16 +1937,7 @@ class NinjaBackend(backends.Backend): if main_rust_file is None: raise RuntimeError('A Rust target has no Rust sources. This is weird. Also a bug. Please report') target_name = os.path.join(target.subdir, target.get_filename()) - if isinstance(target, build.Executable): - cratetype = 'bin' - elif hasattr(target, 'rust_crate_type'): - cratetype = target.rust_crate_type - elif isinstance(target, build.SharedLibrary): - cratetype = 'dylib' - elif isinstance(target, build.StaticLibrary): - cratetype = 'rlib' - else: - raise InvalidArguments('Unknown target type for rustc.') + cratetype = target.rust_crate_type args.extend(['--crate-type', cratetype]) # If we're dynamically linking, add those arguments diff --git a/mesonbuild/build.py b/mesonbuild/build.py index fece0be..5820b50 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -115,9 +115,9 @@ known_build_target_kwargs = ( cs_kwargs) known_exe_kwargs = known_build_target_kwargs | {'implib', 'export_dynamic', 'pie'} -known_shlib_kwargs = known_build_target_kwargs | {'version', 'soversion', 'vs_module_defs', 'darwin_versions'} -known_shmod_kwargs = known_build_target_kwargs | {'vs_module_defs'} -known_stlib_kwargs = known_build_target_kwargs | {'pic', 'prelink'} +known_shlib_kwargs = known_build_target_kwargs | {'version', 'soversion', 'vs_module_defs', 'darwin_versions', 'rust_abi'} +known_shmod_kwargs = known_build_target_kwargs | {'vs_module_defs', 'rust_abi'} +known_stlib_kwargs = known_build_target_kwargs | {'pic', 'prelink', 'rust_abi'} known_jar_kwargs = known_exe_kwargs | {'main_class', 'java_resources'} def _process_install_tag(install_tag: T.Optional[T.List[T.Optional[str]]], @@ -1980,6 +1980,13 @@ class Executable(BuildTarget): if create_debug_file: self.debug_filename = self.name + '.pdb' + def process_kwargs(self, kwargs): + super().process_kwargs(kwargs) + + self.rust_crate_type = kwargs.get('rust_crate_type') or 'bin' + if self.rust_crate_type != 'bin': + raise InvalidArguments('Invalid rust_crate_type: must be "bin" for executables.') + def get_default_install_dir(self) -> T.Tuple[str, str]: return self.environment.get_bindir(), '{bindir}' @@ -2052,18 +2059,12 @@ class StaticLibrary(BuildTarget): super().post_init() if 'cs' in self.compilers: raise InvalidArguments('Static libraries not supported for C#.') - if 'rust' in self.compilers: - # If no crate type is specified, or it's the generic lib type, use rlib - if not hasattr(self, 'rust_crate_type') or self.rust_crate_type == 'lib': - mlog.debug('Defaulting Rust static library target crate type to rlib') - self.rust_crate_type = 'rlib' - # Don't let configuration proceed with a non-static crate type - elif self.rust_crate_type not in ['rlib', 'staticlib']: - raise InvalidArguments(f'Crate type "{self.rust_crate_type}" invalid for static libraries; must be "rlib" or "staticlib"') + if self.uses_rust(): # See https://github.com/rust-lang/rust/issues/110460 if self.rust_crate_type == 'rlib' and any(c in self.name for c in ['-', ' ', '.']): - raise InvalidArguments('Rust crate type "rlib" does not allow spaces, periods or dashes in the library name ' - 'due to a limitation of rustc. Replace them with underscores, for example') + raise InvalidArguments(f'Rust crate {self.name} type {self.rust_crate_type} does not allow spaces, ' + 'periods or dashes in the library name due to a limitation of rustc. ' + 'Replace them with underscores, for example') if self.rust_crate_type == 'staticlib': # FIXME: In the case of no-std we should not add those libraries, # but we have no way to know currently. @@ -2085,8 +2086,8 @@ class StaticLibrary(BuildTarget): if not hasattr(self, 'prefix'): self.prefix = 'lib' if not hasattr(self, 'suffix'): - if 'rust' in self.compilers: - if not hasattr(self, 'rust_crate_type') or self.rust_crate_type == 'rlib': + if self.uses_rust(): + if self.rust_crate_type == 'rlib': # default Rust static library suffix self.suffix = 'rlib' elif self.rust_crate_type == 'staticlib': @@ -2107,12 +2108,20 @@ class StaticLibrary(BuildTarget): def process_kwargs(self, kwargs): super().process_kwargs(kwargs) - if 'rust_crate_type' in kwargs: - rust_crate_type = kwargs['rust_crate_type'] - if isinstance(rust_crate_type, str): + + rust_abi = kwargs.get('rust_abi') + rust_crate_type = kwargs.get('rust_crate_type') + if rust_crate_type: + if rust_abi: + raise InvalidArguments('rust_abi and rust_crate_type are mutually exclusive.') + if rust_crate_type == 'lib': + self.rust_crate_type = 'rlib' + elif rust_crate_type in {'rlib', 'staticlib'}: self.rust_crate_type = rust_crate_type else: - raise InvalidArguments(f'Invalid rust_crate_type "{rust_crate_type}": must be a string.') + raise InvalidArguments(f'Crate type {rust_crate_type!r} invalid for static libraries; must be "rlib" or "staticlib"') + else: + self.rust_crate_type = 'staticlib' if rust_abi == 'c' else 'rlib' def is_linkable_target(self): return True @@ -2153,18 +2162,12 @@ class SharedLibrary(BuildTarget): def post_init(self) -> None: super().post_init() - if 'rust' in self.compilers: - # If no crate type is specified, or it's the generic lib type, use dylib - if not hasattr(self, 'rust_crate_type') or self.rust_crate_type == 'lib': - mlog.debug('Defaulting Rust dynamic library target crate type to "dylib"') - self.rust_crate_type = 'dylib' - # Don't let configuration proceed with a non-dynamic crate type - elif self.rust_crate_type not in ['dylib', 'cdylib', 'proc-macro']: - raise InvalidArguments(f'Crate type "{self.rust_crate_type}" invalid for dynamic libraries; must be "dylib", "cdylib", or "proc-macro"') + if self.uses_rust(): # See https://github.com/rust-lang/rust/issues/110460 if self.rust_crate_type != 'cdylib' and any(c in self.name for c in ['-', ' ', '.']): - raise InvalidArguments('Rust crate types "dylib" and "proc-macro" do not allow spaces, periods or dashes in the library name ' - 'due to a limitation of rustc. Replace them with underscores, for example') + raise InvalidArguments(f'Rust crate {self.name} type {self.rust_crate_type} does not allow spaces, ' + 'periods or dashes in the library name due to a limitation of rustc. ' + 'Replace them with underscores, for example') if not hasattr(self, 'prefix'): self.prefix = None @@ -2335,14 +2338,19 @@ class SharedLibrary(BuildTarget): 'a file object or a Custom Target') self.process_link_depends(path) - if 'rust_crate_type' in kwargs: - rust_crate_type = kwargs['rust_crate_type'] - if isinstance(rust_crate_type, str): + rust_abi = kwargs.get('rust_abi') + rust_crate_type = kwargs.get('rust_crate_type') + if rust_crate_type: + if rust_abi: + raise InvalidArguments('rust_abi and rust_crate_type are mutually exclusive.') + if rust_crate_type == 'lib': + self.rust_crate_type = 'dylib' + elif rust_crate_type in {'dylib', 'cdylib', 'proc-macro'}: self.rust_crate_type = rust_crate_type else: - raise InvalidArguments(f'Invalid rust_crate_type "{rust_crate_type}": must be a string.') - if rust_crate_type == 'proc-macro': - FeatureNew.single_use('Rust crate type "proc-macro"', '0.62.0', self.subproject) + raise InvalidArguments(f'Crate type {rust_crate_type!r} invalid for shared libraries; must be "dylib", "cdylib" or "proc-macro"') + else: + self.rust_crate_type = 'cdylib' if rust_abi == 'c' else 'dylib' def get_import_filename(self) -> T.Optional[str]: """ diff --git a/mesonbuild/interpreter/type_checking.py b/mesonbuild/interpreter/type_checking.py index 59dae9a..9a1904d 100644 --- a/mesonbuild/interpreter/type_checking.py +++ b/mesonbuild/interpreter/type_checking.py @@ -498,6 +498,21 @@ TEST_KWS: T.List[KwargInfo] = [ KwargInfo('verbose', bool, default=False, since='0.62.0'), ] +# Cannot have a default value because we need to check that rust_crate_type and +# rust_abi are mutually exclusive. +RUST_CRATE_TYPE_KW: KwargInfo[T.Union[str, None]] = KwargInfo( + 'rust_crate_type', (str, NoneType), + since='0.42.0', + since_values={'proc-macro': '0.62.0'}, + deprecated='1.3.0', + deprecated_message='Use rust_abi or rust.proc_macro() instead.', + validator=in_set_validator({'bin', 'lib', 'rlib', 'dylib', 'cdylib', 'staticlib', 'proc-macro'})) + +RUST_ABI_KW: KwargInfo[T.Union[str, None]] = KwargInfo( + 'rust_abi', (str, NoneType), + since='1.3.0', + validator=in_set_validator({'rust', 'c'})) + # Applies to all build_target like classes _ALL_TARGET_KWS: T.List[KwargInfo] = [ OVERRIDE_OPTIONS_KW, @@ -506,6 +521,7 @@ _ALL_TARGET_KWS: T.List[KwargInfo] = [ # Applies to all build_target classes except jar _BUILD_TARGET_KWS: T.List[KwargInfo] = [ *_ALL_TARGET_KWS, + RUST_CRATE_TYPE_KW, ] def _validate_win_subsystem(value: T.Optional[str]) -> T.Optional[str]: @@ -575,6 +591,11 @@ EXECUTABLE_KWS = [ *_EXCLUSIVE_EXECUTABLE_KWS, ] +# Arguments exclusive to library types +_EXCLUSIVE_LIB_KWS: T.List[KwargInfo] = [ + RUST_ABI_KW, +] + # Arguments exclusive to StaticLibrary. These are separated to make integrating # them into build_target easier _EXCLUSIVE_STATIC_LIB_KWS: T.List[KwargInfo] = [] @@ -583,6 +604,7 @@ _EXCLUSIVE_STATIC_LIB_KWS: T.List[KwargInfo] = [] STATIC_LIB_KWS = [ *_BUILD_TARGET_KWS, *_EXCLUSIVE_STATIC_LIB_KWS, + *_EXCLUSIVE_LIB_KWS, ] # Arguments exclusive to SharedLibrary. These are separated to make integrating @@ -597,6 +619,7 @@ _EXCLUSIVE_SHARED_LIB_KWS: T.List[KwargInfo] = [ SHARED_LIB_KWS = [ *_BUILD_TARGET_KWS, *_EXCLUSIVE_SHARED_LIB_KWS, + *_EXCLUSIVE_LIB_KWS, ] # Arguments exclusive to SharedModule. These are separated to make integrating @@ -607,6 +630,7 @@ _EXCLUSIVE_SHARED_MOD_KWS: T.List[KwargInfo] = [] SHARED_MOD_KWS = [ *_BUILD_TARGET_KWS, *_EXCLUSIVE_SHARED_MOD_KWS, + *_EXCLUSIVE_LIB_KWS, ] # Arguments exclusive to JAR. These are separated to make integrating @@ -625,6 +649,7 @@ JAR_KWS = [ # Arguments used by both_library and library LIBRARY_KWS = [ *_BUILD_TARGET_KWS, + *_EXCLUSIVE_LIB_KWS, *_EXCLUSIVE_SHARED_LIB_KWS, *_EXCLUSIVE_SHARED_MOD_KWS, *_EXCLUSIVE_STATIC_LIB_KWS, diff --git a/test cases/rust/4 polyglot/meson.build b/test cases/rust/4 polyglot/meson.build index 3601d5e..60922fe 100644 --- a/test cases/rust/4 polyglot/meson.build +++ b/test cases/rust/4 polyglot/meson.build @@ -4,6 +4,51 @@ if host_machine.system() == 'darwin' error('MESON_SKIP_TEST: does not work right on macos, please fix!') endif -l = shared_library('stuff', 'stuff.rs', rust_crate_type: 'cdylib', install : true) -e = executable('prog', 'prog.c', link_with : l, install : true) -test('polyglottest', e) +cc = meson.get_compiler('c') + +# Test all combinations of crate and target types. +# - 'clib' gets translated to `rust_abi: 'c'` instead. +# - '' gets translated to no kwargs. +allowed_map = { + 'static_library': ['rlib', 'staticlib', 'lib', 'clib', ''], + 'shared_library': ['dylib', 'cdylib', 'lib', 'proc-macro', 'clib', ''], + 'both_libraries': ['lib', 'clib', ''], +} +foreach crate_type : ['lib', 'rlib', 'dylib', 'cdylib', 'staticlib', 'proc-macro', 'clib', '', 'invalid'] + foreach target_type, allowed : allowed_map + name = f'stuff_@crate_type@_@target_type@'.underscorify() + src = crate_type == 'proc-macro' ? 'proc.rs' : 'stuff.rs' + if crate_type not in allowed + # Note: in the both_libraries() case it is possible that the static part + # is still being built because the shared part raised an error but we + # don't rollback correctly. + testcase expect_error('(Crate type .* invalid for .*)|(.*must be one of.*not invalid)', how: 're') + build_target(name, src, + target_type: target_type, + rust_crate_type: crate_type, + install: true) + endtestcase + continue + endif + rust_kwargs = {} + if crate_type == 'clib' + rust_kwargs = {'rust_abi': 'c'} + elif crate_type != '' + rust_kwargs = {'rust_crate_type': crate_type} + endif + l = build_target(name, src, + target_type: target_type, + kwargs: rust_kwargs, + install: true) + if crate_type in ['cdylib', 'staticlib', 'clib'] + e = executable(f'prog-@name@', 'prog.c', + link_with: l, + rust_dependency_map: {name: 'stuff'}, + install: true) + test(f'polyglottest-@name@', e) + else + # FIXME: Verify that linking Rust ABI with C ABI executable raises an error. + # Currently it only fails at build time. + endif + endforeach +endforeach diff --git a/test cases/rust/4 polyglot/proc.rs b/test cases/rust/4 polyglot/proc.rs new file mode 100644 index 0000000..53935e4 --- /dev/null +++ b/test cases/rust/4 polyglot/proc.rs @@ -0,0 +1,7 @@ +extern crate proc_macro; +use proc_macro::TokenStream; + +#[proc_macro] +pub fn make_answer(_item: TokenStream) -> TokenStream { + "fn answer() -> u32 { 42 }".parse().unwrap() +} diff --git a/test cases/rust/4 polyglot/stuff.rs b/test cases/rust/4 polyglot/stuff.rs index ecf623c..30c3a36 100644 --- a/test cases/rust/4 polyglot/stuff.rs +++ b/test cases/rust/4 polyglot/stuff.rs @@ -1,5 +1,3 @@ -#![crate_name = "stuff"] - #[no_mangle] pub extern fn f() { println!("Hello from Rust!"); diff --git a/test cases/rust/4 polyglot/test.json b/test cases/rust/4 polyglot/test.json index a8837a1..d963ad8 100644 --- a/test cases/rust/4 polyglot/test.json +++ b/test cases/rust/4 polyglot/test.json @@ -1,10 +1,92 @@ { "installed": [ - {"type": "exe", "file": "usr/bin/prog"}, - {"type": "pdb", "file": "usr/bin/prog"}, - {"type": "file", "platform": "gcc", "file": "usr/lib/libstuff.so"}, - {"type": "file", "platform": "msvc", "file": "usr/bin/stuff.dll"}, - {"type": "file", "platform": "msvc", "file": "usr/lib/stuff.dll.lib"}, - {"type": "pdb", "file": "usr/bin/stuff"} + {"type": "exe", "file": "usr/bin/prog-stuff_clib_both_libraries"}, + {"type": "pdb", "file": "usr/bin/prog-stuff_clib_both_libraries"}, + {"type": "pdb", "file": "usr/bin/stuff_clib_both_libraries.pdb"}, + {"type": "file", "platform": "gcc", "file": "usr/lib/libstuff_clib_both_libraries.so"}, + {"type": "file", "platform": "msvc", "file": "usr/bin/stuff_clib_both_libraries.dll"}, + {"type": "file", "platform": "msvc", "file": "usr/lib/stuff_clib_both_libraries.dll.lib"}, + {"type": "file", "file": "usr/lib/libstuff_clib_both_libraries.a"}, + + {"type": "exe", "file": "usr/bin/prog-stuff_clib_shared_library"}, + {"type": "pdb", "file": "usr/bin/prog-stuff_clib_shared_library"}, + {"type": "pdb", "file": "usr/bin/stuff_clib_shared_library.pdb"}, + {"type": "file", "platform": "gcc", "file": "usr/lib/libstuff_clib_shared_library.so"}, + {"type": "file", "platform": "msvc", "file": "usr/bin/stuff_clib_shared_library.dll"}, + {"type": "file", "platform": "msvc", "file": "usr/lib/stuff_clib_shared_library.dll.lib"}, + + {"type": "exe", "file": "usr/bin/prog-stuff_clib_static_library"}, + {"type": "pdb", "file": "usr/bin/prog-stuff_clib_static_library"}, + {"type": "file", "file": "usr/lib/libstuff_clib_static_library.a"}, + + {"type": "exe", "file": "usr/bin/prog-stuff_cdylib_shared_library"}, + {"type": "pdb", "file": "usr/bin/prog-stuff_cdylib_shared_library"}, + {"type": "pdb", "file": "usr/bin/stuff_cdylib_shared_library.pdb"}, + {"type": "file", "platform": "gcc", "file": "usr/lib/libstuff_cdylib_shared_library.so"}, + {"type": "file", "platform": "msvc", "file": "usr/bin/stuff_cdylib_shared_library.dll"}, + {"type": "file", "platform": "msvc", "file": "usr/lib/stuff_cdylib_shared_library.dll.lib"}, + + {"type": "exe", "file": "usr/bin/prog-stuff_staticlib_static_library"}, + {"type": "pdb", "file": "usr/bin/prog-stuff_staticlib_static_library"}, + {"type": "file", "file": "usr/lib/libstuff_staticlib_static_library.a"}, + + {"type": "pdb", "file": "usr/bin/stuff__both_libraries.pdb"}, + {"type": "file", "platform": "gcc", "file": "usr/lib/libstuff__both_libraries.so"}, + {"type": "file", "platform": "gcc", "file": "usr/lib/libstuff__both_libraries.rlib"}, + {"type": "file", "platform": "msvc", "file": "usr/lib/libstuff__both_libraries.rlib"}, + {"type": "file", "platform": "msvc", "file": "usr/bin/stuff__both_libraries.dll"}, + {"type": "file", "platform": "msvc", "file": "usr/lib/stuff__both_libraries.dll.lib"}, + + {"type": "file", "platform": "gcc", "file": "usr/lib/libstuff__static_library.rlib"}, + {"type": "file", "platform": "msvc", "file": "usr/lib/libstuff__static_library.rlib"}, + + {"type": "pdb", "file": "usr/bin/stuff_proc_macro_shared_library.pdb"}, + {"type": "file", "platform": "gcc", "file": "usr/lib/libstuff_proc_macro_shared_library.so"}, + {"type": "file", "platform": "msvc", "file": "usr/bin/stuff_proc_macro_shared_library.dll"}, + {"type": "file", "platform": "msvc", "file": "usr/lib/stuff_proc_macro_shared_library.dll.lib"}, + + {"type": "pdb", "file": "usr/bin/stuff_lib_both_libraries.pdb"}, + {"type": "file", "platform": "gcc", "file": "usr/lib/libstuff_lib_both_libraries.rlib"}, + {"type": "file", "platform": "gcc", "file": "usr/lib/libstuff_lib_both_libraries.so"}, + {"type": "file", "platform": "msvc", "file": "usr/bin/stuff_lib_both_libraries.dll"}, + {"type": "file", "platform": "msvc", "file": "usr/lib/libstuff_lib_both_libraries.rlib"}, + {"type": "file", "platform": "msvc", "file": "usr/lib/stuff_lib_both_libraries.dll.lib"}, + + {"type": "file", "platform": "gcc", "file": "usr/lib/libstuff_rlib_static_library.rlib"}, + {"type": "file", "platform": "msvc", "file": "usr/lib/libstuff_rlib_static_library.rlib"}, + + {"type": "file", "platform": "gcc", "file": "usr/lib/libstuff_lib_static_library.rlib"}, + {"type": "file", "platform": "msvc", "file": "usr/lib/libstuff_lib_static_library.rlib"}, + + {"type": "pdb", "file": "usr/bin/stuff__shared_library.pdb"}, + {"type": "file", "platform": "gcc", "file": "usr/lib/libstuff__shared_library.so"}, + {"type": "file", "platform": "msvc", "file": "usr/bin/stuff__shared_library.dll"}, + {"type": "file", "platform": "msvc", "file": "usr/lib/stuff__shared_library.dll.lib"}, + + {"type": "pdb", "file": "usr/bin/stuff_lib_shared_library.pdb"}, + {"type": "file", "platform": "gcc", "file": "usr/lib/libstuff_lib_shared_library.so"}, + {"type": "file", "platform": "msvc", "file": "usr/bin/stuff_lib_shared_library.dll"}, + {"type": "file", "platform": "msvc", "file": "usr/lib/stuff_lib_shared_library.dll.lib"}, + + {"type": "pdb", "file": "usr/bin/stuff_dylib_shared_library.pdb"}, + {"type": "file", "platform": "gcc", "file": "usr/lib/libstuff_dylib_shared_library.so"}, + {"type": "file", "platform": "msvc", "file": "usr/lib/stuff_dylib_shared_library.dll.lib"}, + {"type": "file", "platform": "msvc", "file": "usr/bin/stuff_dylib_shared_library.dll"}, + + {"type": "pdb", "file": "usr/bin/stuff_cdylib_both_libraries.pdb"}, + {"type": "file", "platform": "gcc", "file": "usr/lib/libstuff_cdylib_both_libraries.so"}, + {"type": "file", "platform": "gcc", "file": "usr/lib/libstuff_cdylib_both_libraries.so"}, + {"type": "file", "platform": "msvc", "file": "usr/bin/stuff_cdylib_both_libraries.dll"}, + {"type": "file", "platform": "msvc", "file": "usr/lib/stuff_cdylib_both_libraries.dll.lib"}, + + {"type": "pdb", "file": "usr/bin/stuff_proc_macro_both_libraries.pdb"}, + {"type": "file", "platform": "gcc", "file": "usr/lib/libstuff_proc_macro_both_libraries.so"}, + {"type": "file", "platform": "msvc", "file": "usr/bin/stuff_proc_macro_both_libraries.dll"}, + {"type": "file", "platform": "msvc", "file": "usr/lib/stuff_proc_macro_both_libraries.dll.lib"}, + + {"type": "pdb", "file": "usr/bin/stuff_dylib_both_libraries.pdb"}, + {"type": "file", "platform": "gcc", "file": "usr/lib/libstuff_dylib_both_libraries.so"}, + {"type": "file", "platform": "msvc", "file": "usr/bin/stuff_dylib_both_libraries.dll"}, + {"type": "file", "platform": "msvc", "file": "usr/lib/stuff_dylib_both_libraries.dll.lib"} ] } |