Flag an error on empty rust module srcs

It's an error if a rust module's srcs is empty. Prior to this change
the output was a panic that complains loudly about a slice error and
nothing else. This change doesn't stop the panic, but at least adds
a bit of context so devs who make a simple mistake can more easily
fix it.

Test: SOONG_GEN_RUST_PROJECT=1 m nothing
Change-Id: Id7d8465d533413c3000699661222a53a7c8678f3
This commit is contained in:
Seth Moore 2021-10-13 15:32:18 -07:00
parent 2649c7913a
commit 3afac0b36f
2 changed files with 39 additions and 0 deletions

View file

@ -449,6 +449,10 @@ func (compiler *baseCompiler) relativeInstallPath() string {
// Returns the Path for the main source file along with Paths for generated source files from modules listed in srcs. // Returns the Path for the main source file along with Paths for generated source files from modules listed in srcs.
func srcPathFromModuleSrcs(ctx ModuleContext, srcs []string) (android.Path, android.Paths) { func srcPathFromModuleSrcs(ctx ModuleContext, srcs []string) (android.Path, android.Paths) {
if len(srcs) == 0 {
ctx.PropertyErrorf("srcs", "srcs must not be empty")
}
// The srcs can contain strings with prefix ":". // The srcs can contain strings with prefix ":".
// They are dependent modules of this module, with android.SourceDepTag. // They are dependent modules of this module, with android.SourceDepTag.
// They are not the main source file compiled by rustc. // They are not the main source file compiled by rustc.

View file

@ -98,6 +98,41 @@ func TestEnforceSingleSourceFile(t *testing.T) {
}`) }`)
} }
// Test that we reject _no_ source files.
func TestEnforceMissingSourceFiles(t *testing.T) {
singleSrcError := "srcs must not be empty"
// Test libraries
testRustError(t, singleSrcError, `
rust_library_host {
name: "foo-bar-library",
crate_name: "foo",
}`)
// Test binaries
testRustError(t, singleSrcError, `
rust_binary_host {
name: "foo-bar-binary",
crate_name: "foo",
}`)
// Test proc_macros
testRustError(t, singleSrcError, `
rust_proc_macro {
name: "foo-bar-proc-macro",
crate_name: "foo",
}`)
// Test prebuilts
testRustError(t, singleSrcError, `
rust_prebuilt_dylib {
name: "foo-bar-prebuilt",
crate_name: "foo",
host_supported: true,
}`)
}
// Test environment vars for Cargo compat are set. // Test environment vars for Cargo compat are set.
func TestCargoCompat(t *testing.T) { func TestCargoCompat(t *testing.T) {
ctx := testRust(t, ` ctx := testRust(t, `