blob: 5bd25cd51ec883bab05b949ab11bfd61eb9704f1 [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) {
satayev8fab6f82021-05-07 00:10:33 +010051 classpathJars := configuredJarListToClasspathJars(ctx, p.ClasspathFragmentToConfiguredJarList(ctx), p.classpathType)
52 p.classpathFragmentBase().generateClasspathProtoBuildActions(ctx, classpathJars)
satayev013485b2021-05-06 23:38:10 +010053}
54
satayevaa86bac2021-05-13 19:01:52 +010055func (p *platformSystemServerClasspathModule) ClasspathFragmentToConfiguredJarList(ctx android.ModuleContext) android.ConfiguredJarList {
satayev8fab6f82021-05-07 00:10:33 +010056 global := dexpreopt.GetGlobalConfig(ctx)
satayev703c67a2021-05-20 21:33:41 +010057 return global.SystemServerJars
satayev95e9c5b2021-04-29 11:50:26 +010058}
satayevaa86bac2021-05-13 19:01:52 +010059
satayev333a1732021-05-17 21:35:26 +010060type SystemServerClasspathModule struct {
satayevaa86bac2021-05-13 19:01:52 +010061 android.ModuleBase
satayev333a1732021-05-17 21:35:26 +010062 android.ApexModuleBase
satayevaa86bac2021-05-13 19:01:52 +010063
64 ClasspathFragmentBase
satayev9366a052021-05-17 21:13:44 +010065
66 properties systemServerClasspathFragmentProperties
braleeb0c1f0c2021-06-07 22:49:13 +080067
68 // Collect the module directory for IDE info in java/jdeps.go.
69 modulePaths []string
satayev9366a052021-05-17 21:13:44 +010070}
71
satayev333a1732021-05-17 21:35:26 +010072func (s *SystemServerClasspathModule) ShouldSupportSdkVersion(ctx android.BaseModuleContext, sdkVersion android.ApiLevel) error {
73 return nil
74}
75
satayev9366a052021-05-17 21:13:44 +010076type systemServerClasspathFragmentProperties struct {
77 // The contents of this systemserverclasspath_fragment, could be either java_library, or java_sdk_library.
78 //
79 // The order of this list matters as it is the order that is used in the SYSTEMSERVERCLASSPATH.
80 Contents []string
satayevaa86bac2021-05-13 19:01:52 +010081}
82
83func systemServerClasspathFactory() android.Module {
satayev333a1732021-05-17 21:35:26 +010084 m := &SystemServerClasspathModule{}
satayev9366a052021-05-17 21:13:44 +010085 m.AddProperties(&m.properties)
satayev333a1732021-05-17 21:35:26 +010086 android.InitApexModule(m)
satayevaa86bac2021-05-13 19:01:52 +010087 initClasspathFragment(m, SYSTEMSERVERCLASSPATH)
88 android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibCommon)
89 return m
90}
91
satayev333a1732021-05-17 21:35:26 +010092func (s *SystemServerClasspathModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
satayev9366a052021-05-17 21:13:44 +010093 if len(s.properties.Contents) == 0 {
94 ctx.PropertyErrorf("contents", "empty contents are not allowed")
95 }
96
satayev8fab6f82021-05-07 00:10:33 +010097 classpathJars := configuredJarListToClasspathJars(ctx, s.ClasspathFragmentToConfiguredJarList(ctx), s.classpathType)
98 s.classpathFragmentBase().generateClasspathProtoBuildActions(ctx, classpathJars)
braleeb0c1f0c2021-06-07 22:49:13 +080099
100 // Collect the module directory for IDE info in java/jdeps.go.
101 s.modulePaths = append(s.modulePaths, ctx.ModuleDir())
satayevaa86bac2021-05-13 19:01:52 +0100102}
103
satayev333a1732021-05-17 21:35:26 +0100104func (s *SystemServerClasspathModule) ClasspathFragmentToConfiguredJarList(ctx android.ModuleContext) android.ConfiguredJarList {
satayev703c67a2021-05-20 21:33:41 +0100105 global := dexpreopt.GetGlobalConfig(ctx)
106
satayev1c564cc2021-05-25 19:50:30 +0100107 // Convert content names to their appropriate stems, in case a test library is overriding an actual boot jar
108 var stems []string
109 for _, name := range s.properties.Contents {
110 dep := ctx.GetDirectDepWithTag(name, systemServerClasspathFragmentContentDepTag)
111 if m, ok := dep.(ModuleWithStem); ok {
112 stems = append(stems, m.Stem())
113 } else {
114 ctx.PropertyErrorf("contents", "%v is not a ModuleWithStem", name)
115 }
116 }
117
satayev703c67a2021-05-20 21:33:41 +0100118 // Only create configs for updatable boot jars. Non-updatable system server jars must be part of the
119 // platform_systemserverclasspath's classpath proto config to guarantee that they come before any
120 // updatable jars at runtime.
satayev1c564cc2021-05-25 19:50:30 +0100121 return global.UpdatableSystemServerJars.Filter(stems)
satayevaa86bac2021-05-13 19:01:52 +0100122}
satayev9366a052021-05-17 21:13:44 +0100123
124type systemServerClasspathFragmentContentDependencyTag struct {
125 blueprint.BaseDependencyTag
126}
127
Colin Crossc33e5212021-05-25 18:16:02 -0700128// Contents of system server fragments in an apex are considered to be directly in the apex, as if
129// they were listed in java_libs.
130func (systemServerClasspathFragmentContentDependencyTag) CopyDirectlyInAnyApex() {}
131
132var _ android.CopyDirectlyInAnyApexTag = systemServerClasspathFragmentContentDepTag
133
satayev9366a052021-05-17 21:13:44 +0100134// The tag used for the dependency between the systemserverclasspath_fragment module and its contents.
135var systemServerClasspathFragmentContentDepTag = systemServerClasspathFragmentContentDependencyTag{}
136
137func IsSystemServerClasspathFragmentContentDepTag(tag blueprint.DependencyTag) bool {
138 return tag == systemServerClasspathFragmentContentDepTag
139}
140
satayev333a1732021-05-17 21:35:26 +0100141func (s *SystemServerClasspathModule) ComponentDepsMutator(ctx android.BottomUpMutatorContext) {
satayev9366a052021-05-17 21:13:44 +0100142 module := ctx.Module()
143
144 for _, name := range s.properties.Contents {
145 ctx.AddDependency(module, systemServerClasspathFragmentContentDepTag, name)
146 }
147}
braleeb0c1f0c2021-06-07 22:49:13 +0800148
149// Collect information for opening IDE project files in java/jdeps.go.
150func (s *SystemServerClasspathModule) IDEInfo(dpInfo *android.IdeInfo) {
151 dpInfo.Deps = append(dpInfo.Deps, s.properties.Contents...)
152 dpInfo.Paths = append(dpInfo.Paths, s.modulePaths...)
153}