Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c4dae8eb authored by Ivan Lozano's avatar Ivan Lozano Committed by Gerrit Code Review
Browse files

Merge "rust: Prevent manually defined lib link flags."

parents 0d8c4975 45a9e319
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ package rust
import (
	"fmt"
	"path/filepath"
	"strings"

	"github.com/google/blueprint/proptools"

@@ -235,6 +236,25 @@ func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags) Flag
	if err != nil {
		ctx.PropertyErrorf("lints", err.Error())
	}

	// linkage-related flags are disallowed.
	for _, s := range compiler.Properties.Ld_flags {
		if strings.HasPrefix(s, "-Wl,-l") || strings.HasPrefix(s, "-Wl,-L") {
			ctx.PropertyErrorf("ld_flags", "'-Wl,-l' and '-Wl,-L' flags cannot be manually specified")
		}
	}
	for _, s := range compiler.Properties.Flags {
		if strings.HasPrefix(s, "-l") || strings.HasPrefix(s, "-L") {
			ctx.PropertyErrorf("flags", "'-l' and '-L' flags cannot be manually specified")
		}
		if strings.HasPrefix(s, "--extern") {
			ctx.PropertyErrorf("flags", "'--extern' flag cannot be manually specified")
		}
		if strings.HasPrefix(s, "-Clink-args=") || strings.HasPrefix(s, "-C link-args=") {
			ctx.PropertyErrorf("flags", "'-C link-args' flag cannot be manually specified")
		}
	}

	flags.RustFlags = append(flags.RustFlags, lintFlags)
	flags.RustFlags = append(flags.RustFlags, compiler.Properties.Flags...)
	flags.RustFlags = append(flags.RustFlags, compiler.cfgsToFlags()...)
+70 −0
Original line number Diff line number Diff line
@@ -208,3 +208,73 @@ func TestStdDeviceLinkage(t *testing.T) {
		t.Errorf("libstd is not linked dynamically for dylibs")
	}
}

// Ensure that manual link flags are disallowed.
func TestManualLinkageRejection(t *testing.T) {
	// rustc flags
	testRustError(t, ".* cannot be manually specified", `
		rust_binary {
			name: "foo",
			srcs: [
				"foo.rs",
			],
			flags: ["-lbar"],
		}
	`)
	testRustError(t, ".* cannot be manually specified", `
		rust_binary {
			name: "foo",
			srcs: [
				"foo.rs",
			],
			flags: ["--extern=foo"],
		}
	`)
	testRustError(t, ".* cannot be manually specified", `
		rust_binary {
			name: "foo",
			srcs: [
				"foo.rs",
			],
			flags: ["-Clink-args=foo"],
		}
	`)
	testRustError(t, ".* cannot be manually specified", `
		rust_binary {
			name: "foo",
			srcs: [
				"foo.rs",
			],
			flags: ["-C link-args=foo"],
		}
	`)
	testRustError(t, ".* cannot be manually specified", `
		rust_binary {
			name: "foo",
			srcs: [
				"foo.rs",
			],
			flags: ["-L foo/"],
		}
	`)

	// lld flags
	testRustError(t, ".* cannot be manually specified", `
		rust_binary {
			name: "foo",
			srcs: [
				"foo.rs",
			],
			ld_flags: ["-Wl,-L bar/"],
		}
	`)
	testRustError(t, ".* cannot be manually specified", `
		rust_binary {
			name: "foo",
			srcs: [
				"foo.rs",
			],
			ld_flags: ["-Wl,-lbar"],
		}
	`)
}