rust: Refactor cfg and feature flag calculation

Move the cfg and feature flag calculation out of compilerFlags so that
it's a separate step.

The previous arrangement resulted in overridden compilerFlags which
must to set any additional cfgs/features before calling the base.
This is a bit confusing and undocumented behavior, so instead break
it out into a separate call that can itself be overriden.

Bug: N/A
Test: Soong tests pass
Change-Id: I28e4f707b3b3ca6eb621b7613c3737817f877bb8
This commit is contained in:
Ivan Lozano
2021-09-23 11:50:33 -04:00
parent 1b15345ac9
commit 67eada34db
3 changed files with 36 additions and 10 deletions

View File

@@ -231,6 +231,7 @@ func (compiler *baseCompiler) cfgsToFlags() []string {
for _, cfg := range compiler.Properties.Cfgs { for _, cfg := range compiler.Properties.Cfgs {
flags = append(flags, "--cfg '"+cfg+"'") flags = append(flags, "--cfg '"+cfg+"'")
} }
return flags return flags
} }
@@ -239,6 +240,24 @@ func (compiler *baseCompiler) featuresToFlags() []string {
for _, feature := range compiler.Properties.Features { for _, feature := range compiler.Properties.Features {
flags = append(flags, "--cfg 'feature=\""+feature+"\"'") flags = append(flags, "--cfg 'feature=\""+feature+"\"'")
} }
return flags
}
func (compiler *baseCompiler) featureFlags(ctx ModuleContext, flags Flags) Flags {
flags.RustFlags = append(flags.RustFlags, compiler.featuresToFlags()...)
flags.RustdocFlags = append(flags.RustdocFlags, compiler.featuresToFlags()...)
return flags
}
func (compiler *baseCompiler) cfgFlags(ctx ModuleContext, flags Flags) Flags {
if ctx.RustModule().UseVndk() {
compiler.Properties.Cfgs = append(compiler.Properties.Cfgs, "android_vndk")
}
flags.RustFlags = append(flags.RustFlags, compiler.cfgsToFlags()...)
flags.RustdocFlags = append(flags.RustdocFlags, compiler.cfgsToFlags()...)
return flags return flags
} }
@@ -269,10 +288,6 @@ func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags) Flag
flags.RustFlags = append(flags.RustFlags, lintFlags) flags.RustFlags = append(flags.RustFlags, lintFlags)
flags.RustFlags = append(flags.RustFlags, compiler.Properties.Flags...) flags.RustFlags = append(flags.RustFlags, compiler.Properties.Flags...)
flags.RustFlags = append(flags.RustFlags, compiler.cfgsToFlags()...)
flags.RustFlags = append(flags.RustFlags, compiler.featuresToFlags()...)
flags.RustdocFlags = append(flags.RustdocFlags, compiler.cfgsToFlags()...)
flags.RustdocFlags = append(flags.RustdocFlags, compiler.featuresToFlags()...)
flags.RustFlags = append(flags.RustFlags, "--edition="+compiler.edition()) flags.RustFlags = append(flags.RustFlags, "--edition="+compiler.edition())
flags.RustdocFlags = append(flags.RustdocFlags, "--edition="+compiler.edition()) flags.RustdocFlags = append(flags.RustdocFlags, "--edition="+compiler.edition())
flags.LinkFlags = append(flags.LinkFlags, compiler.Properties.Ld_flags...) flags.LinkFlags = append(flags.LinkFlags, compiler.Properties.Ld_flags...)
@@ -296,10 +311,6 @@ func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags) Flag
flags.LinkFlags = append(flags.LinkFlags, "-Wl,-rpath,"+rpathPrefix+"../"+rpath) flags.LinkFlags = append(flags.LinkFlags, "-Wl,-rpath,"+rpathPrefix+"../"+rpath)
} }
if ctx.RustModule().UseVndk() {
flags.RustFlags = append(flags.RustFlags, "--cfg 'android_vndk'")
}
return flags return flags
} }

View File

@@ -430,15 +430,25 @@ func (library *libraryDecorator) sharedLibFilename(ctx ModuleContext) string {
return library.getStem(ctx) + ctx.toolchain().SharedLibSuffix() return library.getStem(ctx) + ctx.toolchain().SharedLibSuffix()
} }
func (library *libraryDecorator) compilerFlags(ctx ModuleContext, flags Flags) Flags { func (library *libraryDecorator) cfgFlags(ctx ModuleContext, flags Flags) Flags {
flags.RustFlags = append(flags.RustFlags, "-C metadata="+ctx.ModuleName()) flags = library.baseCompiler.cfgFlags(ctx, flags)
if library.dylib() { if library.dylib() {
// We need to add a dependency on std in order to link crates as dylibs. // We need to add a dependency on std in order to link crates as dylibs.
// The hack to add this dependency is guarded by the following cfg so // The hack to add this dependency is guarded by the following cfg so
// that we don't force a dependency when it isn't needed. // that we don't force a dependency when it isn't needed.
library.baseCompiler.Properties.Cfgs = append(library.baseCompiler.Properties.Cfgs, "android_dylib") library.baseCompiler.Properties.Cfgs = append(library.baseCompiler.Properties.Cfgs, "android_dylib")
} }
flags.RustFlags = append(flags.RustFlags, library.baseCompiler.cfgsToFlags()...)
flags.RustdocFlags = append(flags.RustdocFlags, library.baseCompiler.cfgsToFlags()...)
return flags
}
func (library *libraryDecorator) compilerFlags(ctx ModuleContext, flags Flags) Flags {
flags = library.baseCompiler.compilerFlags(ctx, flags) flags = library.baseCompiler.compilerFlags(ctx, flags)
flags.RustFlags = append(flags.RustFlags, "-C metadata="+ctx.ModuleName())
if library.shared() || library.static() { if library.shared() || library.static() {
library.includeDirs = append(library.includeDirs, android.PathsForModuleSrc(ctx, library.Properties.Include_dirs)...) library.includeDirs = append(library.includeDirs, android.PathsForModuleSrc(ctx, library.Properties.Include_dirs)...)
} }

View File

@@ -436,6 +436,8 @@ type RustLibrary struct {
type compiler interface { type compiler interface {
initialize(ctx ModuleContext) initialize(ctx ModuleContext)
compilerFlags(ctx ModuleContext, flags Flags) Flags compilerFlags(ctx ModuleContext, flags Flags) Flags
cfgFlags(ctx ModuleContext, flags Flags) Flags
featureFlags(ctx ModuleContext, flags Flags) Flags
compilerProps() []interface{} compilerProps() []interface{}
compile(ctx ModuleContext, flags Flags, deps PathDeps) android.Path compile(ctx ModuleContext, flags Flags, deps PathDeps) android.Path
compilerDeps(ctx DepsContext, deps Deps) Deps compilerDeps(ctx DepsContext, deps Deps) Deps
@@ -847,8 +849,11 @@ func (mod *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Toolchain: toolchain, Toolchain: toolchain,
} }
// Calculate rustc flags
if mod.compiler != nil { if mod.compiler != nil {
flags = mod.compiler.compilerFlags(ctx, flags) flags = mod.compiler.compilerFlags(ctx, flags)
flags = mod.compiler.cfgFlags(ctx, flags)
flags = mod.compiler.featureFlags(ctx, flags)
} }
if mod.coverage != nil { if mod.coverage != nil {
flags, deps = mod.coverage.flags(ctx, flags, deps) flags, deps = mod.coverage.flags(ctx, flags, deps)