xref: /aosp_15_r20/build/soong/rust/compiler_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2019 The Android Open Source Project
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage rust
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"strings"
19*333d2b36SAndroid Build Coastguard Worker	"testing"
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
22*333d2b36SAndroid Build Coastguard Worker)
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Worker// Test that feature flags are being correctly generated.
25*333d2b36SAndroid Build Coastguard Workerfunc TestFeaturesToFlags(t *testing.T) {
26*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
27*333d2b36SAndroid Build Coastguard Worker		rust_library_host_dylib {
28*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
29*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
30*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
31*333d2b36SAndroid Build Coastguard Worker			features: [
32*333d2b36SAndroid Build Coastguard Worker				"fizz",
33*333d2b36SAndroid Build Coastguard Worker				"buzz"
34*333d2b36SAndroid Build Coastguard Worker			],
35*333d2b36SAndroid Build Coastguard Worker		}`)
36*333d2b36SAndroid Build Coastguard Worker
37*333d2b36SAndroid Build Coastguard Worker	libfooDylib := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_dylib").Rule("rustc")
38*333d2b36SAndroid Build Coastguard Worker
39*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libfooDylib.Args["rustcFlags"], "cfg 'feature=\"fizz\"'") ||
40*333d2b36SAndroid Build Coastguard Worker		!strings.Contains(libfooDylib.Args["rustcFlags"], "cfg 'feature=\"buzz\"'") {
41*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("missing fizz and buzz feature flags for libfoo dylib, rustcFlags: %#v", libfooDylib.Args["rustcFlags"])
42*333d2b36SAndroid Build Coastguard Worker	}
43*333d2b36SAndroid Build Coastguard Worker}
44*333d2b36SAndroid Build Coastguard Worker
45*333d2b36SAndroid Build Coastguard Worker// Test that cfgs flags are being correctly generated.
46*333d2b36SAndroid Build Coastguard Workerfunc TestCfgsToFlags(t *testing.T) {
47*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
48*333d2b36SAndroid Build Coastguard Worker		rust_library_host {
49*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
50*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
51*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
52*333d2b36SAndroid Build Coastguard Worker			cfgs: [
53*333d2b36SAndroid Build Coastguard Worker				"std",
54*333d2b36SAndroid Build Coastguard Worker				"cfg1=\"one\""
55*333d2b36SAndroid Build Coastguard Worker			],
56*333d2b36SAndroid Build Coastguard Worker		}`)
57*333d2b36SAndroid Build Coastguard Worker
58*333d2b36SAndroid Build Coastguard Worker	libfooDylib := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_dylib").Rule("rustc")
59*333d2b36SAndroid Build Coastguard Worker
60*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libfooDylib.Args["rustcFlags"], "cfg 'std'") ||
61*333d2b36SAndroid Build Coastguard Worker		!strings.Contains(libfooDylib.Args["rustcFlags"], "cfg 'cfg1=\"one\"'") {
62*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("missing std and cfg1 flags for libfoo dylib, rustcFlags: %#v", libfooDylib.Args["rustcFlags"])
63*333d2b36SAndroid Build Coastguard Worker	}
64*333d2b36SAndroid Build Coastguard Worker}
65*333d2b36SAndroid Build Coastguard Worker
66*333d2b36SAndroid Build Coastguard Workerfunc TestLtoFlag(t *testing.T) {
67*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
68*333d2b36SAndroid Build Coastguard Worker		rust_library_host {
69*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
70*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
71*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
72*333d2b36SAndroid Build Coastguard Worker			lto: {
73*333d2b36SAndroid Build Coastguard Worker				thin: false,
74*333d2b36SAndroid Build Coastguard Worker			}
75*333d2b36SAndroid Build Coastguard Worker		}
76*333d2b36SAndroid Build Coastguard Worker
77*333d2b36SAndroid Build Coastguard Worker		rust_library_host {
78*333d2b36SAndroid Build Coastguard Worker			name: "libfoo_lto",
79*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
80*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
81*333d2b36SAndroid Build Coastguard Worker		}
82*333d2b36SAndroid Build Coastguard Worker		`)
83*333d2b36SAndroid Build Coastguard Worker
84*333d2b36SAndroid Build Coastguard Worker	libfoo := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_dylib").Rule("rustc")
85*333d2b36SAndroid Build Coastguard Worker	libfooLto := ctx.ModuleForTests("libfoo_lto", "linux_glibc_x86_64_dylib").Rule("rustc")
86*333d2b36SAndroid Build Coastguard Worker
87*333d2b36SAndroid Build Coastguard Worker	if strings.Contains(libfoo.Args["rustcFlags"], "-C lto=thin") {
88*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("libfoo expected to disable lto -- rustcFlags: %#v", libfoo.Args["rustcFlags"])
89*333d2b36SAndroid Build Coastguard Worker	}
90*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libfooLto.Args["rustcFlags"], "-C lto=thin") {
91*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("libfoo expected to enable lto by default -- rustcFlags: %#v", libfooLto.Args["rustcFlags"])
92*333d2b36SAndroid Build Coastguard Worker	}
93*333d2b36SAndroid Build Coastguard Worker}
94*333d2b36SAndroid Build Coastguard Worker
95*333d2b36SAndroid Build Coastguard Worker// Test that we reject multiple source files.
96*333d2b36SAndroid Build Coastguard Workerfunc TestEnforceSingleSourceFile(t *testing.T) {
97*333d2b36SAndroid Build Coastguard Worker
98*333d2b36SAndroid Build Coastguard Worker	singleSrcError := "srcs can only contain one path for a rust file and source providers prefixed by \":\""
99*333d2b36SAndroid Build Coastguard Worker	prebuiltSingleSrcError := "prebuilt libraries can only have one entry in srcs"
100*333d2b36SAndroid Build Coastguard Worker
101*333d2b36SAndroid Build Coastguard Worker	// Test libraries
102*333d2b36SAndroid Build Coastguard Worker	testRustError(t, singleSrcError, `
103*333d2b36SAndroid Build Coastguard Worker		rust_library_host {
104*333d2b36SAndroid Build Coastguard Worker			name: "foo-bar-library",
105*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs", "src/bar.rs"],
106*333d2b36SAndroid Build Coastguard Worker		}`)
107*333d2b36SAndroid Build Coastguard Worker
108*333d2b36SAndroid Build Coastguard Worker	// Test binaries
109*333d2b36SAndroid Build Coastguard Worker	testRustError(t, singleSrcError, `
110*333d2b36SAndroid Build Coastguard Worker			rust_binary_host {
111*333d2b36SAndroid Build Coastguard Worker				name: "foo-bar-binary",
112*333d2b36SAndroid Build Coastguard Worker				srcs: ["foo.rs", "src/bar.rs"],
113*333d2b36SAndroid Build Coastguard Worker			}`)
114*333d2b36SAndroid Build Coastguard Worker
115*333d2b36SAndroid Build Coastguard Worker	// Test proc_macros
116*333d2b36SAndroid Build Coastguard Worker	testRustError(t, singleSrcError, `
117*333d2b36SAndroid Build Coastguard Worker		rust_proc_macro {
118*333d2b36SAndroid Build Coastguard Worker			name: "foo-bar-proc-macro",
119*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs", "src/bar.rs"],
120*333d2b36SAndroid Build Coastguard Worker		}`)
121*333d2b36SAndroid Build Coastguard Worker
122*333d2b36SAndroid Build Coastguard Worker	// Test prebuilts
123*333d2b36SAndroid Build Coastguard Worker	testRustError(t, prebuiltSingleSrcError, `
124*333d2b36SAndroid Build Coastguard Worker		rust_prebuilt_dylib {
125*333d2b36SAndroid Build Coastguard Worker			name: "foo-bar-prebuilt",
126*333d2b36SAndroid Build Coastguard Worker			srcs: ["liby.so", "libz.so"],
127*333d2b36SAndroid Build Coastguard Worker		  host_supported: true,
128*333d2b36SAndroid Build Coastguard Worker		}`)
129*333d2b36SAndroid Build Coastguard Worker}
130*333d2b36SAndroid Build Coastguard Worker
131*333d2b36SAndroid Build Coastguard Worker// Test that we reject _no_ source files.
132*333d2b36SAndroid Build Coastguard Workerfunc TestEnforceMissingSourceFiles(t *testing.T) {
133*333d2b36SAndroid Build Coastguard Worker
134*333d2b36SAndroid Build Coastguard Worker	singleSrcError := "srcs must not be empty"
135*333d2b36SAndroid Build Coastguard Worker
136*333d2b36SAndroid Build Coastguard Worker	// Test libraries
137*333d2b36SAndroid Build Coastguard Worker	testRustError(t, singleSrcError, `
138*333d2b36SAndroid Build Coastguard Worker		rust_library_host {
139*333d2b36SAndroid Build Coastguard Worker			name: "foo-bar-library",
140*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
141*333d2b36SAndroid Build Coastguard Worker		}`)
142*333d2b36SAndroid Build Coastguard Worker
143*333d2b36SAndroid Build Coastguard Worker	// Test binaries
144*333d2b36SAndroid Build Coastguard Worker	testRustError(t, singleSrcError, `
145*333d2b36SAndroid Build Coastguard Worker		rust_binary_host {
146*333d2b36SAndroid Build Coastguard Worker			name: "foo-bar-binary",
147*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
148*333d2b36SAndroid Build Coastguard Worker		}`)
149*333d2b36SAndroid Build Coastguard Worker
150*333d2b36SAndroid Build Coastguard Worker	// Test proc_macros
151*333d2b36SAndroid Build Coastguard Worker	testRustError(t, singleSrcError, `
152*333d2b36SAndroid Build Coastguard Worker		rust_proc_macro {
153*333d2b36SAndroid Build Coastguard Worker			name: "foo-bar-proc-macro",
154*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
155*333d2b36SAndroid Build Coastguard Worker		}`)
156*333d2b36SAndroid Build Coastguard Worker
157*333d2b36SAndroid Build Coastguard Worker	// Test prebuilts
158*333d2b36SAndroid Build Coastguard Worker	testRustError(t, singleSrcError, `
159*333d2b36SAndroid Build Coastguard Worker		rust_prebuilt_dylib {
160*333d2b36SAndroid Build Coastguard Worker			name: "foo-bar-prebuilt",
161*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
162*333d2b36SAndroid Build Coastguard Worker		  host_supported: true,
163*333d2b36SAndroid Build Coastguard Worker		}`)
164*333d2b36SAndroid Build Coastguard Worker}
165*333d2b36SAndroid Build Coastguard Worker
166*333d2b36SAndroid Build Coastguard Worker// Test environment vars for Cargo compat are set.
167*333d2b36SAndroid Build Coastguard Workerfunc TestCargoCompat(t *testing.T) {
168*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
169*333d2b36SAndroid Build Coastguard Worker		rust_binary {
170*333d2b36SAndroid Build Coastguard Worker			name: "fizz",
171*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
172*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
173*333d2b36SAndroid Build Coastguard Worker			cargo_env_compat: true,
174*333d2b36SAndroid Build Coastguard Worker			cargo_pkg_version: "1.0.0"
175*333d2b36SAndroid Build Coastguard Worker		}`)
176*333d2b36SAndroid Build Coastguard Worker
177*333d2b36SAndroid Build Coastguard Worker	fizz := ctx.ModuleForTests("fizz", "android_arm64_armv8-a").Rule("rustc")
178*333d2b36SAndroid Build Coastguard Worker
179*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(fizz.Args["envVars"], "CARGO_BIN_NAME=fizz") {
180*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("expected 'CARGO_BIN_NAME=fizz' in envVars, actual envVars: %#v", fizz.Args["envVars"])
181*333d2b36SAndroid Build Coastguard Worker	}
182*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(fizz.Args["envVars"], "CARGO_CRATE_NAME=foo") {
183*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("expected 'CARGO_CRATE_NAME=foo' in envVars, actual envVars: %#v", fizz.Args["envVars"])
184*333d2b36SAndroid Build Coastguard Worker	}
185*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(fizz.Args["envVars"], "CARGO_PKG_VERSION=1.0.0") {
186*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("expected 'CARGO_PKG_VERSION=1.0.0' in envVars, actual envVars: %#v", fizz.Args["envVars"])
187*333d2b36SAndroid Build Coastguard Worker	}
188*333d2b36SAndroid Build Coastguard Worker}
189*333d2b36SAndroid Build Coastguard Worker
190*333d2b36SAndroid Build Coastguard Workerfunc TestInstallDir(t *testing.T) {
191*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
192*333d2b36SAndroid Build Coastguard Worker		rust_library_dylib {
193*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
194*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
195*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
196*333d2b36SAndroid Build Coastguard Worker		}
197*333d2b36SAndroid Build Coastguard Worker		rust_binary {
198*333d2b36SAndroid Build Coastguard Worker			name: "fizzbuzz",
199*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
200*333d2b36SAndroid Build Coastguard Worker		}`)
201*333d2b36SAndroid Build Coastguard Worker
202*333d2b36SAndroid Build Coastguard Worker	install_path_lib64 := ctx.ModuleForTests("libfoo",
203*333d2b36SAndroid Build Coastguard Worker		"android_arm64_armv8-a_dylib").Module().(*Module).compiler.(*libraryDecorator).path.String()
204*333d2b36SAndroid Build Coastguard Worker	install_path_lib32 := ctx.ModuleForTests("libfoo",
205*333d2b36SAndroid Build Coastguard Worker		"android_arm_armv7-a-neon_dylib").Module().(*Module).compiler.(*libraryDecorator).path.String()
206*333d2b36SAndroid Build Coastguard Worker	install_path_bin := ctx.ModuleForTests("fizzbuzz",
207*333d2b36SAndroid Build Coastguard Worker		"android_arm64_armv8-a").Module().(*Module).compiler.(*binaryDecorator).path.String()
208*333d2b36SAndroid Build Coastguard Worker
209*333d2b36SAndroid Build Coastguard Worker	if !strings.HasSuffix(install_path_lib64, "system/lib64/libfoo.dylib.so") {
210*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("unexpected install path for 64-bit library: %#v", install_path_lib64)
211*333d2b36SAndroid Build Coastguard Worker	}
212*333d2b36SAndroid Build Coastguard Worker	if !strings.HasSuffix(install_path_lib32, "system/lib/libfoo.dylib.so") {
213*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("unexpected install path for 32-bit library: %#v", install_path_lib32)
214*333d2b36SAndroid Build Coastguard Worker	}
215*333d2b36SAndroid Build Coastguard Worker	if !strings.HasSuffix(install_path_bin, "system/bin/fizzbuzz") {
216*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("unexpected install path for binary: %#v", install_path_bin)
217*333d2b36SAndroid Build Coastguard Worker	}
218*333d2b36SAndroid Build Coastguard Worker}
219*333d2b36SAndroid Build Coastguard Worker
220*333d2b36SAndroid Build Coastguard Workerfunc TestLints(t *testing.T) {
221*333d2b36SAndroid Build Coastguard Worker
222*333d2b36SAndroid Build Coastguard Worker	bp := `
223*333d2b36SAndroid Build Coastguard Worker		// foo uses the default value of lints
224*333d2b36SAndroid Build Coastguard Worker		rust_library {
225*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
226*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
227*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
228*333d2b36SAndroid Build Coastguard Worker		}
229*333d2b36SAndroid Build Coastguard Worker		// bar forces the use of the "android" lint set
230*333d2b36SAndroid Build Coastguard Worker		rust_library {
231*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
232*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
233*333d2b36SAndroid Build Coastguard Worker			crate_name: "bar",
234*333d2b36SAndroid Build Coastguard Worker			lints: "android",
235*333d2b36SAndroid Build Coastguard Worker		}
236*333d2b36SAndroid Build Coastguard Worker		// foobar explicitly disable all lints
237*333d2b36SAndroid Build Coastguard Worker		rust_library {
238*333d2b36SAndroid Build Coastguard Worker			name: "libfoobar",
239*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
240*333d2b36SAndroid Build Coastguard Worker			crate_name: "foobar",
241*333d2b36SAndroid Build Coastguard Worker			lints: "none",
242*333d2b36SAndroid Build Coastguard Worker		}`
243*333d2b36SAndroid Build Coastguard Worker
244*333d2b36SAndroid Build Coastguard Worker	var lintTests = []struct {
245*333d2b36SAndroid Build Coastguard Worker		modulePath string
246*333d2b36SAndroid Build Coastguard Worker		fooFlags   string
247*333d2b36SAndroid Build Coastguard Worker	}{
248*333d2b36SAndroid Build Coastguard Worker		{"", "${config.RustDefaultLints}"},
249*333d2b36SAndroid Build Coastguard Worker		{"external/", "${config.RustAllowAllLints}"},
250*333d2b36SAndroid Build Coastguard Worker		{"hardware/", "${config.RustVendorLints}"},
251*333d2b36SAndroid Build Coastguard Worker	}
252*333d2b36SAndroid Build Coastguard Worker
253*333d2b36SAndroid Build Coastguard Worker	for _, tc := range lintTests {
254*333d2b36SAndroid Build Coastguard Worker		t.Run("path="+tc.modulePath, func(t *testing.T) {
255*333d2b36SAndroid Build Coastguard Worker
256*333d2b36SAndroid Build Coastguard Worker			result := android.GroupFixturePreparers(
257*333d2b36SAndroid Build Coastguard Worker				prepareForRustTest,
258*333d2b36SAndroid Build Coastguard Worker				// Test with the blueprint file in different directories.
259*333d2b36SAndroid Build Coastguard Worker				android.FixtureAddTextFile(tc.modulePath+"Android.bp", bp),
260*333d2b36SAndroid Build Coastguard Worker			).RunTest(t)
261*333d2b36SAndroid Build Coastguard Worker
262*333d2b36SAndroid Build Coastguard Worker			r := result.ModuleForTests("libfoo", "android_arm64_armv8-a_dylib").MaybeRule("rustc")
263*333d2b36SAndroid Build Coastguard Worker			android.AssertStringDoesContain(t, "libfoo flags", r.Args["rustcFlags"], tc.fooFlags)
264*333d2b36SAndroid Build Coastguard Worker
265*333d2b36SAndroid Build Coastguard Worker			r = result.ModuleForTests("libbar", "android_arm64_armv8-a_dylib").MaybeRule("rustc")
266*333d2b36SAndroid Build Coastguard Worker			android.AssertStringDoesContain(t, "libbar flags", r.Args["rustcFlags"], "${config.RustDefaultLints}")
267*333d2b36SAndroid Build Coastguard Worker
268*333d2b36SAndroid Build Coastguard Worker			r = result.ModuleForTests("libfoobar", "android_arm64_armv8-a_dylib").MaybeRule("rustc")
269*333d2b36SAndroid Build Coastguard Worker			android.AssertStringDoesContain(t, "libfoobar flags", r.Args["rustcFlags"], "${config.RustAllowAllLints}")
270*333d2b36SAndroid Build Coastguard Worker		})
271*333d2b36SAndroid Build Coastguard Worker	}
272*333d2b36SAndroid Build Coastguard Worker}
273*333d2b36SAndroid Build Coastguard Worker
274*333d2b36SAndroid Build Coastguard Worker// Test that devices are linking the stdlib dynamically
275*333d2b36SAndroid Build Coastguard Workerfunc TestStdDeviceLinkage(t *testing.T) {
276*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
277*333d2b36SAndroid Build Coastguard Worker		rust_binary {
278*333d2b36SAndroid Build Coastguard Worker			name: "fizz",
279*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
280*333d2b36SAndroid Build Coastguard Worker		}
281*333d2b36SAndroid Build Coastguard Worker		rust_library {
282*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
283*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
284*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
285*333d2b36SAndroid Build Coastguard Worker		}`)
286*333d2b36SAndroid Build Coastguard Worker	fizz := ctx.ModuleForTests("fizz", "android_arm64_armv8-a").Module().(*Module)
287*333d2b36SAndroid Build Coastguard Worker	fooRlib := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_rlib_dylib-std").Module().(*Module)
288*333d2b36SAndroid Build Coastguard Worker	fooDylib := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_dylib").Module().(*Module)
289*333d2b36SAndroid Build Coastguard Worker
290*333d2b36SAndroid Build Coastguard Worker	if !android.InList("libstd", fizz.Properties.AndroidMkDylibs) {
291*333d2b36SAndroid Build Coastguard Worker		t.Errorf("libstd is not linked dynamically for device binaries")
292*333d2b36SAndroid Build Coastguard Worker	}
293*333d2b36SAndroid Build Coastguard Worker	if !android.InList("libstd", fooRlib.Properties.AndroidMkDylibs) {
294*333d2b36SAndroid Build Coastguard Worker		t.Errorf("libstd is not linked dynamically for rlibs")
295*333d2b36SAndroid Build Coastguard Worker	}
296*333d2b36SAndroid Build Coastguard Worker	if !android.InList("libstd", fooDylib.Properties.AndroidMkDylibs) {
297*333d2b36SAndroid Build Coastguard Worker		t.Errorf("libstd is not linked dynamically for dylibs")
298*333d2b36SAndroid Build Coastguard Worker	}
299*333d2b36SAndroid Build Coastguard Worker}
300*333d2b36SAndroid Build Coastguard Worker
301*333d2b36SAndroid Build Coastguard Worker// Ensure that manual link flags are disallowed.
302*333d2b36SAndroid Build Coastguard Workerfunc TestManualLinkageRejection(t *testing.T) {
303*333d2b36SAndroid Build Coastguard Worker	// rustc flags
304*333d2b36SAndroid Build Coastguard Worker	testRustError(t, ".* cannot be manually specified", `
305*333d2b36SAndroid Build Coastguard Worker		rust_binary {
306*333d2b36SAndroid Build Coastguard Worker			name: "foo",
307*333d2b36SAndroid Build Coastguard Worker			srcs: [
308*333d2b36SAndroid Build Coastguard Worker				"foo.rs",
309*333d2b36SAndroid Build Coastguard Worker			],
310*333d2b36SAndroid Build Coastguard Worker			flags: ["-lbar"],
311*333d2b36SAndroid Build Coastguard Worker		}
312*333d2b36SAndroid Build Coastguard Worker	`)
313*333d2b36SAndroid Build Coastguard Worker	testRustError(t, ".* cannot be manually specified", `
314*333d2b36SAndroid Build Coastguard Worker		rust_binary {
315*333d2b36SAndroid Build Coastguard Worker			name: "foo",
316*333d2b36SAndroid Build Coastguard Worker			srcs: [
317*333d2b36SAndroid Build Coastguard Worker				"foo.rs",
318*333d2b36SAndroid Build Coastguard Worker			],
319*333d2b36SAndroid Build Coastguard Worker			flags: ["--extern=foo"],
320*333d2b36SAndroid Build Coastguard Worker		}
321*333d2b36SAndroid Build Coastguard Worker	`)
322*333d2b36SAndroid Build Coastguard Worker	testRustError(t, ".* cannot be manually specified", `
323*333d2b36SAndroid Build Coastguard Worker		rust_binary {
324*333d2b36SAndroid Build Coastguard Worker			name: "foo",
325*333d2b36SAndroid Build Coastguard Worker			srcs: [
326*333d2b36SAndroid Build Coastguard Worker				"foo.rs",
327*333d2b36SAndroid Build Coastguard Worker			],
328*333d2b36SAndroid Build Coastguard Worker			flags: ["-Clink-args=foo"],
329*333d2b36SAndroid Build Coastguard Worker		}
330*333d2b36SAndroid Build Coastguard Worker	`)
331*333d2b36SAndroid Build Coastguard Worker	testRustError(t, ".* cannot be manually specified", `
332*333d2b36SAndroid Build Coastguard Worker		rust_binary {
333*333d2b36SAndroid Build Coastguard Worker			name: "foo",
334*333d2b36SAndroid Build Coastguard Worker			srcs: [
335*333d2b36SAndroid Build Coastguard Worker				"foo.rs",
336*333d2b36SAndroid Build Coastguard Worker			],
337*333d2b36SAndroid Build Coastguard Worker			flags: ["-C link-args=foo"],
338*333d2b36SAndroid Build Coastguard Worker		}
339*333d2b36SAndroid Build Coastguard Worker	`)
340*333d2b36SAndroid Build Coastguard Worker	testRustError(t, ".* cannot be manually specified", `
341*333d2b36SAndroid Build Coastguard Worker		rust_binary {
342*333d2b36SAndroid Build Coastguard Worker			name: "foo",
343*333d2b36SAndroid Build Coastguard Worker			srcs: [
344*333d2b36SAndroid Build Coastguard Worker				"foo.rs",
345*333d2b36SAndroid Build Coastguard Worker			],
346*333d2b36SAndroid Build Coastguard Worker			flags: ["-L foo/"],
347*333d2b36SAndroid Build Coastguard Worker		}
348*333d2b36SAndroid Build Coastguard Worker	`)
349*333d2b36SAndroid Build Coastguard Worker
350*333d2b36SAndroid Build Coastguard Worker	// lld flags
351*333d2b36SAndroid Build Coastguard Worker	testRustError(t, ".* cannot be manually specified", `
352*333d2b36SAndroid Build Coastguard Worker		rust_binary {
353*333d2b36SAndroid Build Coastguard Worker			name: "foo",
354*333d2b36SAndroid Build Coastguard Worker			srcs: [
355*333d2b36SAndroid Build Coastguard Worker				"foo.rs",
356*333d2b36SAndroid Build Coastguard Worker			],
357*333d2b36SAndroid Build Coastguard Worker			ld_flags: ["-Wl,-L bar/"],
358*333d2b36SAndroid Build Coastguard Worker		}
359*333d2b36SAndroid Build Coastguard Worker	`)
360*333d2b36SAndroid Build Coastguard Worker	testRustError(t, ".* cannot be manually specified", `
361*333d2b36SAndroid Build Coastguard Worker		rust_binary {
362*333d2b36SAndroid Build Coastguard Worker			name: "foo",
363*333d2b36SAndroid Build Coastguard Worker			srcs: [
364*333d2b36SAndroid Build Coastguard Worker				"foo.rs",
365*333d2b36SAndroid Build Coastguard Worker			],
366*333d2b36SAndroid Build Coastguard Worker			ld_flags: ["-Wl,-lbar"],
367*333d2b36SAndroid Build Coastguard Worker		}
368*333d2b36SAndroid Build Coastguard Worker	`)
369*333d2b36SAndroid Build Coastguard Worker}
370