aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2023-04-21 16:21:48 -0400
committerXavier Claessens <xclaesse@gmail.com>2023-09-19 13:54:49 -0400
commit10dcd87d002f6f36b1f60371dc807b8d9959d97b (patch)
tree676b5597a7accdd4e2853d7c53f3453535dc5727
parent8ccdb881374084ddb90ef259539cfd3bb748c904 (diff)
downloadmeson-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.md11
-rw-r--r--docs/yaml/functions/_build_target_base.yaml5
-rw-r--r--docs/yaml/functions/library.yaml11
-rw-r--r--docs/yaml/functions/shared_library.yaml8
-rw-r--r--docs/yaml/functions/shared_module.yaml8
-rw-r--r--docs/yaml/functions/static_library.yaml8
-rw-r--r--mesonbuild/backend/ninjabackend.py11
-rw-r--r--mesonbuild/build.py78
-rw-r--r--mesonbuild/interpreter/type_checking.py25
-rw-r--r--test cases/rust/4 polyglot/meson.build51
-rw-r--r--test cases/rust/4 polyglot/proc.rs7
-rw-r--r--test cases/rust/4 polyglot/stuff.rs2
-rw-r--r--test cases/rust/4 polyglot/test.json94
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"}
]
}