aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/build.py
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2021-01-05 15:55:02 -0800
committerDylan Baker <dylan@pnwbakers.com>2021-01-19 10:14:10 -0800
commitbff0b415250b4f4f7cd750b60e6c01daaa61af15 (patch)
treeddd28d1a95975bb95d9a4fe9161dac62f7fab155 /mesonbuild/build.py
parent3ae115b57ad7f8eca09c03f5bd6bf65604dcaf59 (diff)
downloadmeson-bff0b415250b4f4f7cd750b60e6c01daaa61af15.zip
meson-bff0b415250b4f4f7cd750b60e6c01daaa61af15.tar.gz
meson-bff0b415250b4f4f7cd750b60e6c01daaa61af15.tar.bz2
rust: Accept generated sources for main.rs
There are still caveats here. Rust/cargo handles generated sources by writing out all targets of a single repo into a single output directory, setting a path to that via a build-time environment variable, and then include those files via a set of functions and macros. Meson's build layout is naturally different, and ninja makes working with environment variables at compile time difficult. Fixes #8157
Diffstat (limited to 'mesonbuild/build.py')
-rw-r--r--mesonbuild/build.py23
1 files changed, 16 insertions, 7 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
index fa7c140..13783d1 100644
--- a/mesonbuild/build.py
+++ b/mesonbuild/build.py
@@ -569,7 +569,7 @@ class BuildTarget(Target):
unity_opt = environment.coredata.get_option(OptionKey('unity'))
self.is_unity = unity_opt == 'on' or (unity_opt == 'subprojects' and subproject != '')
self.environment = environment
- self.sources = []
+ self.sources: T.List[File] = []
self.compilers = OrderedDict() # type: OrderedDict[str, Compiler]
self.objects = []
self.external_deps = []
@@ -588,7 +588,7 @@ class BuildTarget(Target):
self.need_install = False
self.pch = {}
self.extra_args: T.Dict[str, T.List['FileOrString']] = {}
- self.generated = []
+ self.generated: T.Sequence[T.Union[GeneratedList, CustomTarget, CustomTargetIndex]] = []
self.d_features = {}
self.pic = False
self.pie = False
@@ -1414,7 +1414,14 @@ You probably should put it in link_with instead.''')
def uses_rust(self) -> bool:
"""Is this target a rust target."""
- return self.sources and self.sources[0].fname.endswith('.rs')
+ if self.sources:
+ first_file = self.sources[0]
+ if first_file.fname.endswith('.rs'):
+ return True
+ elif self.generated:
+ if self.generated[0].get_outputs()[0].endswith('.rs'):
+ return True
+ return False
def get_using_msvc(self):
'''
@@ -1434,11 +1441,13 @@ You probably should put it in link_with instead.''')
2. If the target contains only objects, process_compilers guesses and
picks the first compiler that smells right.
'''
- compiler, _ = self.get_clink_dynamic_linker_and_stdlibs()
+ # Rustc can use msvc style linkers
+ if self.uses_rust():
+ compiler = self.environment.coredata.compilers[self.for_machine]['rust']
+ else:
+ compiler, _ = self.get_clink_dynamic_linker_and_stdlibs()
# Mixing many languages with MSVC is not supported yet so ignore stdlibs.
- if compiler and compiler.get_linker_id() in {'link', 'lld-link', 'xilink', 'optlink'}:
- return True
- return False
+ return compiler and compiler.get_linker_id() in {'link', 'lld-link', 'xilink', 'optlink'}
def check_module_linking(self):
'''