summaryrefslogtreecommitdiff
path: root/test cases/rust
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2024-03-09 18:44:40 -0500
committerXavier Claessens <xclaesse@gmail.com>2024-10-24 11:00:10 -0400
commitafd89440aaf114c00652d799b8043d3d43fb807a (patch)
tree7c700f9d4fa9444c75a76ee874edb9f8f77ac994 /test cases/rust
parentc02e0b7b1e2499f3ae18d26e443e18043fff3046 (diff)
downloadmeson-afd89440aaf114c00652d799b8043d3d43fb807a.tar.gz
cargo: Fix feature resolution
Introduce a global Cargo interpreter state that keeps track of enabled features on each crate. Before generating AST of a Cargo subproject, it downloads every sub-subproject and resolves the set of features enabled on each of them recursively. When it later generates AST for one its dependencies, its set of features and dependencies is already determined.
Diffstat (limited to 'test cases/rust')
-rw-r--r--test cases/rust/22 cargo subproject/subprojects/bar-0.1-rs/Cargo.toml4
-rw-r--r--test cases/rust/22 cargo subproject/subprojects/common-0-rs.wrap2
-rw-r--r--test cases/rust/22 cargo subproject/subprojects/common-0-rs/Cargo.toml12
-rw-r--r--test cases/rust/22 cargo subproject/subprojects/common-0-rs/lib.rs4
-rw-r--r--test cases/rust/22 cargo subproject/subprojects/extra-dep-1-rs/Cargo.toml3
-rw-r--r--test cases/rust/22 cargo subproject/subprojects/extra-dep-1-rs/meson.build2
-rw-r--r--test cases/rust/22 cargo subproject/subprojects/foo-0-rs/Cargo.toml4
-rw-r--r--test cases/rust/22 cargo subproject/subprojects/foo-0-rs/lib.rs3
8 files changed, 32 insertions, 2 deletions
diff --git a/test cases/rust/22 cargo subproject/subprojects/bar-0.1-rs/Cargo.toml b/test cases/rust/22 cargo subproject/subprojects/bar-0.1-rs/Cargo.toml
index d60a5d8f1..c0f7ffd8d 100644
--- a/test cases/rust/22 cargo subproject/subprojects/bar-0.1-rs/Cargo.toml
+++ b/test cases/rust/22 cargo subproject/subprojects/bar-0.1-rs/Cargo.toml
@@ -8,6 +8,10 @@ version = "0.1"
optional = true
version = "1.0"
+[dependencies.common]
+version = "0.0.1"
+features = ["f2"]
+
[features]
default = ["f2"]
f1 = []
diff --git a/test cases/rust/22 cargo subproject/subprojects/common-0-rs.wrap b/test cases/rust/22 cargo subproject/subprojects/common-0-rs.wrap
new file mode 100644
index 000000000..99686e90e
--- /dev/null
+++ b/test cases/rust/22 cargo subproject/subprojects/common-0-rs.wrap
@@ -0,0 +1,2 @@
+[wrap-file]
+method = cargo
diff --git a/test cases/rust/22 cargo subproject/subprojects/common-0-rs/Cargo.toml b/test cases/rust/22 cargo subproject/subprojects/common-0-rs/Cargo.toml
new file mode 100644
index 000000000..b22e1accf
--- /dev/null
+++ b/test cases/rust/22 cargo subproject/subprojects/common-0-rs/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+name = "common"
+version = "0.0.1"
+edition = "2021"
+
+[lib]
+crate-type = ["rlib"]
+path = "lib.rs"
+
+[features]
+f1 = []
+f2 = []
diff --git a/test cases/rust/22 cargo subproject/subprojects/common-0-rs/lib.rs b/test cases/rust/22 cargo subproject/subprojects/common-0-rs/lib.rs
new file mode 100644
index 000000000..a7adf8f62
--- /dev/null
+++ b/test cases/rust/22 cargo subproject/subprojects/common-0-rs/lib.rs
@@ -0,0 +1,4 @@
+#[cfg(all(feature = "f1", feature = "f2"))]
+pub fn common_func() -> i32 {
+ 0
+}
diff --git a/test cases/rust/22 cargo subproject/subprojects/extra-dep-1-rs/Cargo.toml b/test cases/rust/22 cargo subproject/subprojects/extra-dep-1-rs/Cargo.toml
new file mode 100644
index 000000000..4b6fa5777
--- /dev/null
+++ b/test cases/rust/22 cargo subproject/subprojects/extra-dep-1-rs/Cargo.toml
@@ -0,0 +1,3 @@
+[package]
+name = "extra-deps"
+version = "1.0"
diff --git a/test cases/rust/22 cargo subproject/subprojects/extra-dep-1-rs/meson.build b/test cases/rust/22 cargo subproject/subprojects/extra-dep-1-rs/meson.build
index 40d109b2d..b5ca43951 100644
--- a/test cases/rust/22 cargo subproject/subprojects/extra-dep-1-rs/meson.build
+++ b/test cases/rust/22 cargo subproject/subprojects/extra-dep-1-rs/meson.build
@@ -1,7 +1,5 @@
project('extra dep', 'c', version: '1.0')
-assert(get_option('feature-default') == true)
-
l = static_library('extra-dep', 'lib.c')
d = declare_dependency(link_with: l,
variables: {
diff --git a/test cases/rust/22 cargo subproject/subprojects/foo-0-rs/Cargo.toml b/test cases/rust/22 cargo subproject/subprojects/foo-0-rs/Cargo.toml
index 0f0225d06..858efa4dd 100644
--- a/test cases/rust/22 cargo subproject/subprojects/foo-0-rs/Cargo.toml
+++ b/test cases/rust/22 cargo subproject/subprojects/foo-0-rs/Cargo.toml
@@ -20,6 +20,10 @@ version = "1.0"
[dependencies]
mybar = { version = "0.1", package = "bar", default-features = false }
+[dependencies.common]
+version = "0.0.1"
+features = ["f1"]
+
[features]
default = ["f1"]
f1 = ["f2", "f3"]
diff --git a/test cases/rust/22 cargo subproject/subprojects/foo-0-rs/lib.rs b/test cases/rust/22 cargo subproject/subprojects/foo-0-rs/lib.rs
index 1c8cbc9d3..a1a976a80 100644
--- a/test cases/rust/22 cargo subproject/subprojects/foo-0-rs/lib.rs
+++ b/test cases/rust/22 cargo subproject/subprojects/foo-0-rs/lib.rs
@@ -1,3 +1,5 @@
+extern crate common;
+
extern "C" {
fn extra_func() -> i32;
}
@@ -5,6 +7,7 @@ extern "C" {
#[cfg(feature = "foo")]
#[no_mangle]
pub extern "C" fn rust_func() -> i32 {
+ assert!(common::common_func() == 0);
let v: i32;
unsafe {
v = extra_func();