diff options
author | 2019-01-09 23:04:25 -0800 | |
---|---|---|
committer | 2019-01-10 07:09:35 +0000 | |
commit | 98fd57460f718dbc06faeb6a029574e6f2a028b6 (patch) | |
tree | 8b2a20eb3b33738c1235e808cd6359effd3b2be3 /java/sdk.go | |
parent | fb6d78120233e5aff492fa827c27ba87354fc9e8 (diff) |
Use latest SDK version for current in PDK builds
PDK builds need to use the latest SDK version instead of "current"
to match the behavior of Make.
Bug: 118634643
Test: sdk_test.go
Change-Id: Ice10d0ccb4066f27ce5839fc96a4026510057121
Diffstat (limited to 'java/sdk.go')
-rw-r--r-- | java/sdk.go | 78 |
1 files changed, 62 insertions, 16 deletions
diff --git a/java/sdk.go b/java/sdk.go index cd128d13e..988610f5b 100644 --- a/java/sdk.go +++ b/java/sdk.go @@ -19,10 +19,17 @@ import ( "android/soong/java/config" "fmt" "path/filepath" + "sort" "strconv" "strings" ) +func init() { + android.RegisterPreSingletonType("sdk", sdkSingletonFactory) +} + +const sdkSingletonKey = "sdkSingletonKey" + type sdkContext interface { // sdkVersion eturns the sdk_version property of the current module, or an empty string if it is not set. sdkVersion() string @@ -67,28 +74,22 @@ func sdkVersionToNumberAsString(ctx android.BaseContext, v string) (string, erro func decodeSdkDep(ctx android.BaseContext, sdkContext sdkContext) sdkDep { v := sdkContext.sdkVersion() + // For PDK builds, use the latest SDK version instead of "current" + if ctx.Config().IsPdkBuild() && (v == "" || v == "current") { + sdkVersions := ctx.Config().Get(sdkSingletonKey).([]int) + latestSdkVersion := 0 + if len(sdkVersions) > 0 { + latestSdkVersion = sdkVersions[len(sdkVersions)-1] + } + v = strconv.Itoa(latestSdkVersion) + } + i, err := sdkVersionToNumber(ctx, v) if err != nil { ctx.PropertyErrorf("sdk_version", "%s", err) return sdkDep{} } - // Ensures that the specificed system SDK version is one of BOARD_SYSTEMSDK_VERSIONS (for vendor apks) - // or PRODUCT_SYSTEMSDK_VERSIONS (for other apks or when BOARD_SYSTEMSDK_VERSIONS is not set) - if strings.HasPrefix(v, "system_") && i != android.FutureApiLevel { - allowed_versions := ctx.DeviceConfig().PlatformSystemSdkVersions() - if ctx.DeviceSpecific() || ctx.SocSpecific() { - if len(ctx.DeviceConfig().SystemSdkVersions()) > 0 { - allowed_versions = ctx.DeviceConfig().SystemSdkVersions() - } - } - version := strings.TrimPrefix(v, "system_") - if len(allowed_versions) > 0 && !android.InList(version, allowed_versions) { - ctx.PropertyErrorf("sdk_version", "incompatible sdk version %q. System SDK version should be one of %q", - v, allowed_versions) - } - } - toPrebuilt := func(sdk string) sdkDep { var api, v string if strings.Contains(sdk, "_") { @@ -148,6 +149,22 @@ func decodeSdkDep(ctx android.BaseContext, sdkContext sdkContext) sdkDep { return ret } + // Ensures that the specificed system SDK version is one of BOARD_SYSTEMSDK_VERSIONS (for vendor apks) + // or PRODUCT_SYSTEMSDK_VERSIONS (for other apks or when BOARD_SYSTEMSDK_VERSIONS is not set) + if strings.HasPrefix(v, "system_") && i != android.FutureApiLevel { + allowed_versions := ctx.DeviceConfig().PlatformSystemSdkVersions() + if ctx.DeviceSpecific() || ctx.SocSpecific() { + if len(ctx.DeviceConfig().SystemSdkVersions()) > 0 { + allowed_versions = ctx.DeviceConfig().SystemSdkVersions() + } + } + version := strings.TrimPrefix(v, "system_") + if len(allowed_versions) > 0 && !android.InList(version, allowed_versions) { + ctx.PropertyErrorf("sdk_version", "incompatible sdk version %q. System SDK version should be one of %q", + v, allowed_versions) + } + } + if ctx.Config().UnbundledBuildPrebuiltSdks() && v != "" { return toPrebuilt(v) } @@ -170,3 +187,32 @@ func decodeSdkDep(ctx android.BaseContext, sdkContext sdkContext) sdkDep { return toPrebuilt(v) } } + +func sdkSingletonFactory() android.Singleton { + return sdkSingleton{} +} + +type sdkSingleton struct{} + +func (sdkSingleton) GenerateBuildActions(ctx android.SingletonContext) { + sdkJars, err := ctx.GlobWithDeps("prebuilts/sdk/*/public/android.jar", nil) + if err != nil { + ctx.Errorf("failed to glob prebuilts/sdk/*/public/android.jar: %s", err.Error()) + } + + var sdkVersions []int + for _, sdkJar := range sdkJars { + dir := filepath.Base(filepath.Dir(filepath.Dir(sdkJar))) + v, err := strconv.Atoi(dir) + if scerr, ok := err.(*strconv.NumError); ok && scerr.Err == strconv.ErrSyntax { + continue + } else if err != nil { + ctx.Errorf("invalid sdk jar %q, %s, %v", sdkJar, err.Error()) + } + sdkVersions = append(sdkVersions, v) + } + + sort.Ints(sdkVersions) + + ctx.Config().Once(sdkSingletonKey, func() interface{} { return sdkVersions }) +} |