Home | History | Annotate | Download | only in build
      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 
     15 package 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 
     21 import (
     22 	"android/soong/android"
     23 	"sort"
     24 	"strings"
     25 
     26 	"github.com/google/blueprint"
     27 )
     28 
     29 func codegen(ctx android.LoadHookContext, c *codegenProperties, library bool) {
     30 	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 
     46 	addCodegenArchProperties := func(host bool, archName string) {
     47 		type props struct {
     48 			Target struct {
     49 				Android *CodegenCommonArchProperties
     50 				Host    *CodegenCommonArchProperties
     51 			}
     52 		}
     53 
     54 		type libraryProps struct {
     55 			Target struct {
     56 				Android *CodegenLibraryArchProperties
     57 				Host    *CodegenLibraryArchProperties
     58 			}
     59 		}
     60 
     61 		var arch *codegenArchProperties
     62 		switch archName {
     63 		case "arm":
     64 			arch = &c.Codegen.Arm
     65 		case "arm64":
     66 			arch = &c.Codegen.Arm64
     67 		case "mips":
     68 			arch = &c.Codegen.Mips
     69 		case "mips64":
     70 			arch = &c.Codegen.Mips64
     71 		case "x86":
     72 			arch = &c.Codegen.X86
     73 		case "x86_64":
     74 			arch = &c.Codegen.X86_64
     75 		default:
     76 			ctx.ModuleErrorf("Unknown codegen architecture %q", archName)
     77 			return
     78 		}
     79 
     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 
     90 		ctx.AppendProperties(p)
     91 		if library {
     92 			ctx.AppendProperties(l)
     93 		}
     94 	}
     95 
     96 	for _, arch := range deviceArches {
     97 		addCodegenArchProperties(false, arch)
     98 		if ctx.Failed() {
     99 			return
    100 		}
    101 	}
    102 
    103 	for _, arch := range hostArches {
    104 		addCodegenArchProperties(true, arch)
    105 		if ctx.Failed() {
    106 			return
    107 		}
    108 	}
    109 }
    110 
    111 type CodegenCommonArchProperties struct {
    112 	Srcs   []string
    113 	Cflags []string
    114 }
    115 
    116 type CodegenLibraryArchProperties struct {
    117 	Static struct {
    118 		Whole_static_libs []string
    119 	}
    120 	Shared struct {
    121 		Shared_libs []string
    122 	}
    123 }
    124 
    125 type codegenArchProperties struct {
    126 	CodegenCommonArchProperties
    127 	CodegenLibraryArchProperties
    128 }
    129 
    130 type codegenProperties struct {
    131 	Codegen struct {
    132 		Arm, Arm64, Mips, Mips64, X86, X86_64 codegenArchProperties
    133 	}
    134 }
    135 
    136 type codegenCustomizer struct {
    137 	library           bool
    138 	codegenProperties codegenProperties
    139 }
    140 
    141 func defaultDeviceCodegenArches(ctx android.LoadHookContext) []string {
    142 	arches := make(map[string]bool)
    143 	for _, a := range ctx.DeviceConfig().Arches() {
    144 		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 		}
    153 	}
    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 }
    161 
    162 func 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 }
    169