diff --git a/android/module.go b/android/module.go
index 46a04d0..0e608d7 100644
--- a/android/module.go
+++ b/android/module.go
@@ -23,7 +23,6 @@
 	"android/soong/glob"
 
 	"github.com/google/blueprint"
-	"github.com/google/blueprint/proptools"
 )
 
 var (
@@ -90,7 +89,6 @@
 	GenerateAndroidBuildActions(ModuleContext)
 
 	base() *ModuleBase
-	Disable()
 	Enabled() bool
 	Target() Target
 	InstallInData() bool
@@ -294,10 +292,6 @@
 			a.hostAndDeviceProperties.Device_supported
 }
 
-func (a *ModuleBase) Disable() {
-	a.commonProperties.Enabled = proptools.BoolPtr(false)
-}
-
 func (a *ModuleBase) Enabled() bool {
 	if a.commonProperties.Enabled == nil {
 		return a.Os().Class != HostCross
diff --git a/cc/cc.go b/cc/cc.go
index 8206912..dd9a831 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -451,7 +451,6 @@
 }
 
 type ModuleContextIntf interface {
-	module() *Module
 	static() bool
 	staticBinary() bool
 	clang() bool
@@ -599,10 +598,6 @@
 	ctx BaseModuleContext
 }
 
-func (ctx *moduleContextImpl) module() *Module {
-	return ctx.mod
-}
-
 func (ctx *moduleContextImpl) clang() bool {
 	return ctx.mod.clang(ctx.ctx)
 }
@@ -866,16 +861,16 @@
 	actx.AddVariationDependencies([]blueprint.Variation{{"link", "shared"}}, lateSharedDepTag,
 		deps.LateSharedLibs...)
 
-	actx.AddDependency(ctx.module(), genSourceDepTag, deps.GeneratedSources...)
-	actx.AddDependency(ctx.module(), genHeaderDepTag, deps.GeneratedHeaders...)
+	actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
+	actx.AddDependency(c, genHeaderDepTag, deps.GeneratedHeaders...)
 
-	actx.AddDependency(ctx.module(), objDepTag, deps.ObjFiles...)
+	actx.AddDependency(c, objDepTag, deps.ObjFiles...)
 
 	if deps.CrtBegin != "" {
-		actx.AddDependency(ctx.module(), crtBeginDepTag, deps.CrtBegin)
+		actx.AddDependency(c, crtBeginDepTag, deps.CrtBegin)
 	}
 	if deps.CrtEnd != "" {
-		actx.AddDependency(ctx.module(), crtEndDepTag, deps.CrtEnd)
+		actx.AddDependency(c, crtEndDepTag, deps.CrtEnd)
 	}
 }
 
@@ -1554,21 +1549,6 @@
 
 var _ linker = (*libraryLinker)(nil)
 
-func (library *libraryLinker) begin(ctx BaseModuleContext) {
-	library.baseLinker.begin(ctx)
-	if library.static() {
-		if library.Properties.Static.Enabled != nil &&
-		 !*library.Properties.Static.Enabled {
-			ctx.module().Disable()
-		}
-	} else {
-		if library.Properties.Shared.Enabled != nil &&
-		 !*library.Properties.Shared.Enabled {
-			ctx.module().Disable()
-		}
-	}
-}
-
 func (library *libraryLinker) props() []interface{} {
 	props := library.baseLinker.props()
 	return append(props,
@@ -1743,11 +1723,13 @@
 }
 
 func (library *libraryLinker) buildStatic() bool {
-	return library.dynamicProperties.BuildStatic
+	return library.dynamicProperties.BuildStatic &&
+		(library.Properties.Static.Enabled == nil || *library.Properties.Static.Enabled)
 }
 
 func (library *libraryLinker) buildShared() bool {
-	return library.dynamicProperties.BuildShared
+	return library.dynamicProperties.BuildShared &&
+		(library.Properties.Shared.Enabled == nil || *library.Properties.Shared.Enabled)
 }
 
 func (library *libraryLinker) getWholeStaticMissingDeps() []string {
