aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/backend/ninjabackend.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/backend/ninjabackend.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/backend/ninjabackend.py')
-rw-r--r--mesonbuild/backend/ninjabackend.py13
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())