diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2021-01-05 15:55:02 -0800 |
---|---|---|
committer | Dylan Baker <dylan@pnwbakers.com> | 2021-01-19 10:14:10 -0800 |
commit | bff0b415250b4f4f7cd750b60e6c01daaa61af15 (patch) | |
tree | ddd28d1a95975bb95d9a4fe9161dac62f7fab155 /mesonbuild/backend/ninjabackend.py | |
parent | 3ae115b57ad7f8eca09c03f5bd6bf65604dcaf59 (diff) | |
download | meson-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/backend/ninjabackend.py')
-rw-r--r-- | mesonbuild/backend/ninjabackend.py | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index d3350bb..9f2e649 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -45,7 +45,7 @@ from ..mesonlib import ( ) from ..mesonlib import get_compiler_for_source, has_path_sep, OptionKey from .backends import CleanTrees -from ..build import InvalidArguments +from ..build import GeneratedList, InvalidArguments from ..interpreter import Interpreter if T.TYPE_CHECKING: @@ -1581,12 +1581,23 @@ int dummy; args = rustc.compiler_args() # Compiler args for compiling this target args += compilers.get_base_compile_args(base_proxy, rustc) + self.generate_generator_list_rules(target) main_rust_file = None for i in target.get_sources(): if not rustc.can_compile(i): raise InvalidArguments('Rust target {} contains a non-rust source file.'.format(target.get_basename())) if main_rust_file is None: main_rust_file = i.rel_to_builddir(self.build_to_src) + for g in target.get_generated_sources(): + for i in g.get_outputs(): + if not rustc.can_compile(i): + raise InvalidArguments('Rust target {} contains a non-rust source file.'.format(target.get_basename())) + if isinstance(g, GeneratedList): + fname = os.path.join(self.get_target_private_dir(target), i) + else: + fname = i + if main_rust_file is None: + main_rust_file = fname 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()) |