blob: 5311f62c17029844d6a334fb4ad02fe0f8a74d3f [file] [log] [blame]
satayev95e9c5b2021-04-29 11:50:26 +01001// Copyright 2021 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package java
16
17import (
18 "android/soong/android"
satayev013485b2021-05-06 23:38:10 +010019 "android/soong/dexpreopt"
Colin Crossc33e5212021-05-25 18:16:02 -070020
satayev9366a052021-05-17 21:13:44 +010021 "github.com/google/blueprint"
satayev95e9c5b2021-04-29 11:50:26 +010022)
23
24func init() {
25 registerSystemserverClasspathBuildComponents(android.InitRegistrationContext)
26}
27
28func registerSystemserverClasspathBuildComponents(ctx android.RegistrationContext) {
satayev95e9c5b2021-04-29 11:50:26 +010029 ctx.RegisterModuleType("platform_systemserverclasspath", platformSystemServerClasspathFactory)
satayevaa86bac2021-05-13 19:01:52 +010030 ctx.RegisterModuleType("systemserverclasspath_fragment", systemServerClasspathFactory)
satayev95e9c5b2021-04-29 11:50:26 +010031}
32
33type platformSystemServerClasspathModule struct {
34 android.ModuleBase
35
36 ClasspathFragmentBase
37}
38
39func platformSystemServerClasspathFactory() android.Module {
40 m := &platformSystemServerClasspathModule{}
41 initClasspathFragment(m, SYSTEMSERVERCLASSPATH)
42 android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibCommon)
43 return m
44}
45
satayevaa86bac2021-05-13 19:01:52 +010046func (p *platformSystemServerClasspathModule) AndroidMkEntries() (entries []android.AndroidMkEntries) {
47 return p.classpathFragmentBase().androidMkEntries()
satayev95e9c5b2021-04-29 11:50:26 +010048}
49
satayevaa86bac2021-05-13 19:01:52 +010050func (p *platformSystemServerClasspathModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
satayevb3090502021-06-15 17:49:10 +010051 configuredJars := p.configuredJars(ctx)
52 classpathJars := configuredJarListToClasspathJars(ctx, configuredJars, p.classpathType)
53 p.classpathFragmentBase().generateClasspathProtoBuildActions(ctx, configuredJars, classpathJars)
satayev013485b2021-05-06 23:38:10 +010054}
55
satayev142ed272021-06-15 16:21:17 +010056func (p *platformSystemServerClasspathModule) configuredJars(ctx android.ModuleContext) android.ConfiguredJarList {
satayevb3090502021-06-15 17:49:10 +010057 // TODO(satayev): include any apex jars that don't populate their classpath proto config.
58 return dexpreopt.GetGlobalConfig(ctx).SystemServerJars
satayev95e9c5b2021-04-29 11:50:26 +010059}
satayevaa86bac2021-05-13 19:01:52 +010060
satayev333a1732021-05-17 21:35:26 +010061type SystemServerClasspathModule struct {
satayevaa86bac2021-05-13 19:01:52 +010062 android.ModuleBase
satayev333a1732021-05-17 21:35:26 +010063 android.ApexModuleBase
satayevaa86bac2021-05-13 19:01:52 +010064
65 ClasspathFragmentBase
satayev9366a052021-05-17 21:13:44 +010066
67 properties systemServerClasspathFragmentProperties
braleeb0c1f0c2021-06-07 22:49:13 +080068
69 // Collect the module directory for IDE info in java/jdeps.go.
70 modulePaths []string
satayev9366a052021-05-17 21:13:44 +010071}
72
satayev333a1732021-05-17 21:35:26 +010073func (s *SystemServerClasspathModule) ShouldSupportSdkVersion(ctx android.BaseModuleContext, sdkVersion android.ApiLevel) error {
74 return nil
75}
76
satayev9366a052021-05-17 21:13:44 +010077type systemServerClasspathFragmentProperties struct {
78 // The contents of this systemserverclasspath_fragment, could be either java_library, or java_sdk_library.
79 //
80 // The order of this list matters as it is the order that is used in the SYSTEMSERVERCLASSPATH.
81 Contents []string
satayevaa86bac2021-05-13 19:01:52 +010082}
83
84func systemServerClasspathFactory() android.Module {
satayev333a1732021-05-17 21:35:26 +010085 m := &SystemServerClasspathModule{}
satayev9366a052021-05-17 21:13:44 +010086 m.AddProperties(&m.properties)
satayev333a1732021-05-17 21:35:26 +010087 android.InitApexModule(m)
satayevaa86bac2021-05-13 19:01:52 +010088 initClasspathFragment(m, SYSTEMSERVERCLASSPATH)
89 android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibCommon)
90 return m
91}
92
satayev333a1732021-05-17 21:35:26 +010093func (s *SystemServerClasspathModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
satayev9366a052021-05-17 21:13:44 +010094 if len(s.properties.Contents) == 0 {
95 ctx.PropertyErrorf("contents", "empty contents are not allowed")
96 }
97
satayevb3090502021-06-15 17:49:10 +010098 configuredJars := s.configuredJars(ctx)
99 classpathJars := configuredJarListToClasspathJars(ctx, configuredJars, s.classpathType)
100 s.classpathFragmentBase().generateClasspathProtoBuildActions(ctx, configuredJars, classpathJars)
braleeb0c1f0c2021-06-07 22:49:13 +0800101
102 // Collect the module directory for IDE info in java/jdeps.go.
103 s.modulePaths = append(s.modulePaths, ctx.ModuleDir())
satayevaa86bac2021-05-13 19:01:52 +0100104}
105
satayev142ed272021-06-15 16:21:17 +0100106func (s *SystemServerClasspathModule) configuredJars(ctx android.ModuleContext) android.ConfiguredJarList {
satayev703c67a2021-05-20 21:33:41 +0100107 global := dexpreopt.GetGlobalConfig(ctx)
108
satayevd604b212021-07-21 14:23:52 +0100109 possibleUpdatableModules := gatherPossibleApexModuleNamesAndStems(ctx, s.properties.Contents, systemServerClasspathFragmentContentDepTag)
satayevd34eb0c2021-08-06 13:20:28 +0100110 jars, unknown := global.ApexSystemServerJars.Filter(possibleUpdatableModules)
111 // TODO(satayev): remove geotz ssc_fragment, since geotz is not part of SSCP anymore.
112 _, unknown = android.RemoveFromList("geotz", unknown)
113
114 // For non test apexes, make sure that all contents are actually declared in make.
115 if global.ApexSystemServerJars.Len() > 0 && len(unknown) > 0 {
116 ctx.ModuleErrorf("%s in contents must also be declared in PRODUCT_UPDATABLE_SYSTEM_SERVER_JARS", unknown)
117 }
118
119 return jars
satayevaa86bac2021-05-13 19:01:52 +0100120}
satayev9366a052021-05-17 21:13:44 +0100121
122type systemServerClasspathFragmentContentDependencyTag struct {
123 blueprint.BaseDependencyTag
124}
125
Colin Crossc33e5212021-05-25 18:16:02 -0700126// Contents of system server fragments in an apex are considered to be directly in the apex, as if
127// they were listed in java_libs.
128func (systemServerClasspathFragmentContentDependencyTag) CopyDirectlyInAnyApex() {}
129
130var _ android.CopyDirectlyInAnyApexTag = systemServerClasspathFragmentContentDepTag
131
satayev9366a052021-05-17 21:13:44 +0100132// The tag used for the dependency between the systemserverclasspath_fragment module and its contents.
133var systemServerClasspathFragmentContentDepTag = systemServerClasspathFragmentContentDependencyTag{}
134
135func IsSystemServerClasspathFragmentContentDepTag(tag blueprint.DependencyTag) bool {
136 return tag == systemServerClasspathFragmentContentDepTag
137}
138
satayev333a1732021-05-17 21:35:26 +0100139func (s *SystemServerClasspathModule) ComponentDepsMutator(ctx android.BottomUpMutatorContext) {
satayev9366a052021-05-17 21:13:44 +0100140 module := ctx.Module()
141
142 for _, name := range s.properties.Contents {
143 ctx.AddDependency(module, systemServerClasspathFragmentContentDepTag, name)
144 }
145}
braleeb0c1f0c2021-06-07 22:49:13 +0800146
147// Collect information for opening IDE project files in java/jdeps.go.
148func (s *SystemServerClasspathModule) IDEInfo(dpInfo *android.IdeInfo) {
149 dpInfo.Deps = append(dpInfo.Deps, s.properties.Contents...)
150 dpInfo.Paths = append(dpInfo.Paths, s.modulePaths...)
151}