1// 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" 25) 26 27func codegen(ctx android.LoadHookContext, c *codegenProperties, library bool) { 28 var hostArches, deviceArches []string 29 30 e := envDefault(ctx, "ART_HOST_CODEGEN_ARCHS", "") 31 if e == "" { 32 hostArches = supportedArches 33 } else { 34 hostArches = strings.Split(e, " ") 35 } 36 37 e = envDefault(ctx, "ART_TARGET_CODEGEN_ARCHS", "") 38 if e == "" { 39 deviceArches = defaultDeviceCodegenArches(ctx) 40 } else { 41 deviceArches = strings.Split(e, " ") 42 } 43 44 addCodegenArchProperties := func(host bool, archName string) { 45 type props struct { 46 Target struct { 47 Android *CodegenCommonArchProperties 48 Host *CodegenCommonArchProperties 49 } 50 } 51 52 type libraryProps struct { 53 Target struct { 54 Android *CodegenLibraryArchProperties 55 Host *CodegenLibraryArchProperties 56 } 57 } 58 59 var arch *codegenArchProperties 60 switch archName { 61 case "arm": 62 arch = &c.Codegen.Arm 63 case "arm64": 64 arch = &c.Codegen.Arm64 65 case "mips": 66 arch = &c.Codegen.Mips 67 case "mips64": 68 arch = &c.Codegen.Mips64 69 case "x86": 70 arch = &c.Codegen.X86 71 case "x86_64": 72 arch = &c.Codegen.X86_64 73 default: 74 ctx.ModuleErrorf("Unknown codegen architecture %q", archName) 75 return 76 } 77 78 p := &props{} 79 l := &libraryProps{} 80 if host { 81 p.Target.Host = &arch.CodegenCommonArchProperties 82 l.Target.Host = &arch.CodegenLibraryArchProperties 83 } else { 84 p.Target.Android = &arch.CodegenCommonArchProperties 85 l.Target.Android = &arch.CodegenLibraryArchProperties 86 } 87 88 ctx.AppendProperties(p) 89 if library { 90 ctx.AppendProperties(l) 91 } 92 } 93 94 for _, arch := range deviceArches { 95 addCodegenArchProperties(false, arch) 96 if ctx.Failed() { 97 return 98 } 99 } 100 101 for _, arch := range hostArches { 102 addCodegenArchProperties(true, arch) 103 if ctx.Failed() { 104 return 105 } 106 } 107} 108 109type CodegenCommonArchProperties struct { 110 Srcs []string 111 Cflags []string 112 Cppflags []string 113} 114 115type CodegenLibraryArchProperties struct { 116 Static struct { 117 Whole_static_libs []string 118 } 119 Shared struct { 120 Shared_libs []string 121 } 122} 123 124type codegenArchProperties struct { 125 CodegenCommonArchProperties 126 CodegenLibraryArchProperties 127} 128 129type codegenProperties struct { 130 Codegen struct { 131 Arm, Arm64, Mips, Mips64, X86, X86_64 codegenArchProperties 132 } 133} 134 135type codegenCustomizer struct { 136 library bool 137 codegenProperties codegenProperties 138} 139 140func defaultDeviceCodegenArches(ctx android.LoadHookContext) []string { 141 arches := make(map[string]bool) 142 for _, a := range ctx.DeviceConfig().Arches() { 143 s := a.ArchType.String() 144 arches[s] = true 145 if s == "arm64" { 146 arches["arm"] = true 147 } else if s == "mips64" { 148 arches["mips"] = true 149 } else if s == "x86_64" { 150 arches["x86"] = true 151 } 152 } 153 ret := make([]string, 0, len(arches)) 154 for a := range arches { 155 ret = append(ret, a) 156 } 157 sort.Strings(ret) 158 return ret 159} 160 161func installCodegenCustomizer(module android.Module, library bool) { 162 c := &codegenProperties{} 163 android.AddLoadHook(module, func(ctx android.LoadHookContext) { codegen(ctx, c, library) }) 164 module.AddProperties(c) 165} 166