blob: ba6f2142c9d745db3bcafc41ccde74ca2ccc9f65 [file] [log] [blame]
Colin Cross1f7f3bd2016-07-27 10:12:38 -07001// Copyright (C) 2016 The Android Open Source Project
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 art
16
17// This file implements the "codegen" property to apply different properties based on the currently
18// selected codegen arches, which defaults to all arches on the host and the primary and secondary
19// arches on the device.
20
21import (
22 "android/soong/android"
23 "sort"
24 "strings"
Colin Cross6e95dd52016-09-12 15:37:10 -070025
26 "github.com/google/blueprint"
Colin Cross1f7f3bd2016-07-27 10:12:38 -070027)
28
Colin Cross6e95dd52016-09-12 15:37:10 -070029func codegen(ctx android.LoadHookContext, c *codegenProperties, library bool) {
Colin Cross1f7f3bd2016-07-27 10:12:38 -070030 var hostArches, deviceArches []string
31
32 e := envDefault(ctx, "ART_HOST_CODEGEN_ARCHS", "")
33 if e == "" {
34 hostArches = supportedArches
35 } else {
36 hostArches = strings.Split(e, " ")
37 }
38
39 e = envDefault(ctx, "ART_TARGET_CODEGEN_ARCHS", "")
40 if e == "" {
41 deviceArches = defaultDeviceCodegenArches(ctx)
42 } else {
43 deviceArches = strings.Split(e, " ")
44 }
45
Colin Cross6e95dd52016-09-12 15:37:10 -070046 addCodegenArchProperties := func(host bool, archName string) {
47 type props struct {
48 Target struct {
49 Android *CodegenCommonArchProperties
50 Host *CodegenCommonArchProperties
51 }
Colin Cross1f7f3bd2016-07-27 10:12:38 -070052 }
Colin Cross1f7f3bd2016-07-27 10:12:38 -070053
Colin Cross6e95dd52016-09-12 15:37:10 -070054 type libraryProps struct {
55 Target struct {
56 Android *CodegenLibraryArchProperties
57 Host *CodegenLibraryArchProperties
58 }
59 }
60
61 var arch *codegenArchProperties
62 switch archName {
Colin Cross1f7f3bd2016-07-27 10:12:38 -070063 case "arm":
Colin Cross6e95dd52016-09-12 15:37:10 -070064 arch = &c.Codegen.Arm
Colin Cross1f7f3bd2016-07-27 10:12:38 -070065 case "arm64":
Colin Cross6e95dd52016-09-12 15:37:10 -070066 arch = &c.Codegen.Arm64
Colin Cross1f7f3bd2016-07-27 10:12:38 -070067 case "mips":
Colin Cross6e95dd52016-09-12 15:37:10 -070068 arch = &c.Codegen.Mips
Colin Cross1f7f3bd2016-07-27 10:12:38 -070069 case "mips64":
Colin Cross6e95dd52016-09-12 15:37:10 -070070 arch = &c.Codegen.Mips64
Colin Cross1f7f3bd2016-07-27 10:12:38 -070071 case "x86":
Colin Cross6e95dd52016-09-12 15:37:10 -070072 arch = &c.Codegen.X86
Colin Cross1f7f3bd2016-07-27 10:12:38 -070073 case "x86_64":
Colin Cross6e95dd52016-09-12 15:37:10 -070074 arch = &c.Codegen.X86_64
Colin Cross1f7f3bd2016-07-27 10:12:38 -070075 default:
Colin Cross6e95dd52016-09-12 15:37:10 -070076 ctx.ModuleErrorf("Unknown codegen architecture %q", archName)
Colin Cross1f7f3bd2016-07-27 10:12:38 -070077 return
78 }
Colin Cross6e95dd52016-09-12 15:37:10 -070079
80 p := &props{}
81 l := &libraryProps{}
82 if host {
83 p.Target.Host = &arch.CodegenCommonArchProperties
84 l.Target.Host = &arch.CodegenLibraryArchProperties
85 } else {
86 p.Target.Android = &arch.CodegenCommonArchProperties
87 l.Target.Android = &arch.CodegenLibraryArchProperties
88 }
89
Colin Cross1f7f3bd2016-07-27 10:12:38 -070090 ctx.AppendProperties(p)
Colin Cross6e95dd52016-09-12 15:37:10 -070091 if library {
92 ctx.AppendProperties(l)
93 }
Colin Cross1f7f3bd2016-07-27 10:12:38 -070094 }
95
Colin Cross6e95dd52016-09-12 15:37:10 -070096 for _, arch := range deviceArches {
97 addCodegenArchProperties(false, arch)
Colin Cross1f7f3bd2016-07-27 10:12:38 -070098 if ctx.Failed() {
99 return
100 }
101 }
102
Colin Cross6e95dd52016-09-12 15:37:10 -0700103 for _, arch := range hostArches {
104 addCodegenArchProperties(true, arch)
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700105 if ctx.Failed() {
106 return
107 }
108 }
109}
110
Colin Cross6e95dd52016-09-12 15:37:10 -0700111type CodegenCommonArchProperties struct {
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700112 Srcs []string
113 Cflags []string
Colin Cross6e95dd52016-09-12 15:37:10 -0700114}
115
116type CodegenLibraryArchProperties struct {
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700117 Static struct {
118 Whole_static_libs []string
119 }
120 Shared struct {
121 Shared_libs []string
122 }
123}
124
Colin Cross6e95dd52016-09-12 15:37:10 -0700125type codegenArchProperties struct {
126 CodegenCommonArchProperties
127 CodegenLibraryArchProperties
128}
129
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700130type codegenProperties struct {
131 Codegen struct {
132 Arm, Arm64, Mips, Mips64, X86, X86_64 codegenArchProperties
133 }
134}
135
136type codegenCustomizer struct {
Colin Cross6e95dd52016-09-12 15:37:10 -0700137 library bool
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700138 codegenProperties codegenProperties
139}
140
Colin Cross6e511782016-09-13 13:41:03 -0700141func defaultDeviceCodegenArches(ctx android.LoadHookContext) []string {
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700142 arches := make(map[string]bool)
143 for _, a := range ctx.DeviceConfig().Arches() {
Nicolas Geoffraye52ac152016-09-09 15:48:19 +0100144 s := a.ArchType.String()
145 arches[s] = true
146 if s == "arm64" {
147 arches["arm"] = true
148 } else if s == "mips64" {
149 arches["mips"] = true
150 } else if s == "x86_64" {
151 arches["x86"] = true
152 }
Colin Cross1f7f3bd2016-07-27 10:12:38 -0700153 }
154 ret := make([]string, 0, len(arches))
155 for a := range arches {
156 ret = append(ret, a)
157 }
158 sort.Strings(ret)
159 return ret
160}
Colin Cross6e95dd52016-09-12 15:37:10 -0700161
162func installCodegenCustomizer(module blueprint.Module, props []interface{}, library bool) []interface{} {
163 c := &codegenProperties{}
164 android.AddLoadHook(module, func(ctx android.LoadHookContext) { codegen(ctx, c, library) })
165 props = append(props, c)
166
167 return props
168}