blob: 71e0cd8ce7bbb922b5617c9ff5907d3503975ee4 [file] [log] [blame]
Paul Duffin25ce04b2020-01-16 11:47:25 +00001// Copyright 2020 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 cc
16
17import (
18 "path/filepath"
19
20 "android/soong/android"
Martin Stjernholm10566a02020-03-24 01:19:52 +000021
Paul Duffin25ce04b2020-01-16 11:47:25 +000022 "github.com/google/blueprint"
Martin Stjernholm7130fab2020-05-28 22:58:01 +010023 "github.com/google/blueprint/proptools"
Paul Duffin25ce04b2020-01-16 11:47:25 +000024)
25
26func init() {
27 android.RegisterSdkMemberType(ccBinarySdkMemberType)
28}
29
30var ccBinarySdkMemberType = &binarySdkMemberType{
31 SdkMemberTypeBase: android.SdkMemberTypeBase{
Martin Stjernholmcaa47d72020-07-11 04:52:24 +010032 PropertyName: "native_binaries",
33 HostOsDependent: true,
Paul Duffin25ce04b2020-01-16 11:47:25 +000034 },
35}
36
37type binarySdkMemberType struct {
38 android.SdkMemberTypeBase
39}
40
Paul Duffin296701e2021-07-14 10:29:36 +010041func (mt *binarySdkMemberType) AddDependencies(ctx android.SdkDependencyContext, dependencyTag blueprint.DependencyTag, names []string) {
42 targets := ctx.MultiTargets()
Colin Cross3146c5c2020-09-30 15:34:40 -070043 for _, bin := range names {
Paul Duffin25ce04b2020-01-16 11:47:25 +000044 for _, target := range targets {
Colin Cross42507332020-08-21 16:15:23 -070045 variations := target.Variations()
Paul Duffin296701e2021-07-14 10:29:36 +010046 if ctx.Device() {
Colin Cross42507332020-08-21 16:15:23 -070047 variations = append(variations,
Colin Cross3146c5c2020-09-30 15:34:40 -070048 blueprint.Variation{Mutator: "image", Variation: android.CoreVariation})
Colin Cross42507332020-08-21 16:15:23 -070049 }
Paul Duffin296701e2021-07-14 10:29:36 +010050 ctx.AddFarVariationDependencies(variations, dependencyTag, bin)
Paul Duffin25ce04b2020-01-16 11:47:25 +000051 }
52 }
53}
54
55func (mt *binarySdkMemberType) IsInstance(module android.Module) bool {
56 // Check the module to see if it can be used with this module type.
57 if m, ok := module.(*Module); ok {
58 for _, allowableMemberType := range m.sdkMemberTypes {
59 if allowableMemberType == mt {
60 return true
61 }
62 }
63 }
64
65 return false
66}
67
Paul Duffin3a4eb502020-03-19 16:11:18 +000068func (mt *binarySdkMemberType) AddPrebuiltModule(ctx android.SdkMemberContext, member android.SdkMember) android.BpModule {
Martin Stjernholm7130fab2020-05-28 22:58:01 +010069 pbm := ctx.SnapshotBuilder().AddPrebuiltModule(member, "cc_prebuilt_binary")
70
71 ccModule := member.Variants()[0].(*Module)
72
73 if stl := ccModule.stl.Properties.Stl; stl != nil {
74 pbm.AddProperty("stl", proptools.String(stl))
75 }
76
77 return pbm
Paul Duffin88f2fbe2020-02-27 16:00:53 +000078}
Paul Duffin13ad94f2020-02-19 16:19:27 +000079
Paul Duffin88f2fbe2020-02-27 16:00:53 +000080func (mt *binarySdkMemberType) CreateVariantPropertiesStruct() android.SdkMemberProperties {
81 return &nativeBinaryInfoProperties{}
Paul Duffin25ce04b2020-01-16 11:47:25 +000082}
83
84const (
85 nativeBinaryDir = "bin"
86)
87
88// path to the native binary. Relative to <sdk_root>/<api_dir>
89func nativeBinaryPathFor(lib nativeBinaryInfoProperties) string {
Paul Duffina04c1072020-03-02 10:16:35 +000090 return filepath.Join(lib.OsPrefix(), lib.archType,
Paul Duffin25ce04b2020-01-16 11:47:25 +000091 nativeBinaryDir, lib.outputFile.Base())
92}
93
94// nativeBinaryInfoProperties represents properties of a native binary
95//
96// The exported (capitalized) fields will be examined and may be changed during common value extraction.
97// The unexported fields will be left untouched.
98type nativeBinaryInfoProperties struct {
Paul Duffin88f2fbe2020-02-27 16:00:53 +000099 android.SdkMemberPropertiesBase
Paul Duffin25ce04b2020-01-16 11:47:25 +0000100
101 // archType is not exported as if set (to a non default value) it is always arch specific.
102 // This is "" for common properties.
103 archType string
104
105 // outputFile is not exported as it is always arch specific.
106 outputFile android.Path
Paul Duffin13f02712020-03-06 12:30:43 +0000107
108 // The set of shared libraries
109 //
110 // This field is exported as its contents may not be arch specific.
111 SharedLibs []string
112
113 // The set of system shared libraries
114 //
115 // This field is exported as its contents may not be arch specific.
116 SystemSharedLibs []string
Martin Stjernholm7130fab2020-05-28 22:58:01 +0100117
118 // Arch specific flags.
119 StaticExecutable bool
120 Nocrt bool
Paul Duffin25ce04b2020-01-16 11:47:25 +0000121}
122
Paul Duffin3a4eb502020-03-19 16:11:18 +0000123func (p *nativeBinaryInfoProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) {
Paul Duffin88f2fbe2020-02-27 16:00:53 +0000124 ccModule := variant.(*Module)
125
126 p.archType = ccModule.Target().Arch.ArchType.String()
Paul Duffin712993c2020-05-05 14:11:57 +0100127 p.outputFile = getRequiredMemberOutputFile(ctx, ccModule)
Paul Duffin13f02712020-03-06 12:30:43 +0000128
Martin Stjernholm7130fab2020-05-28 22:58:01 +0100129 binaryLinker := ccModule.linker.(*binaryDecorator)
130 p.StaticExecutable = binaryLinker.static()
131 p.Nocrt = Bool(binaryLinker.baseLinker.Properties.Nocrt)
132
Paul Duffin13f02712020-03-06 12:30:43 +0000133 if ccModule.linker != nil {
134 specifiedDeps := specifiedDeps{}
135 specifiedDeps = ccModule.linker.linkerSpecifiedDeps(specifiedDeps)
136
137 p.SharedLibs = specifiedDeps.sharedLibs
138 p.SystemSharedLibs = specifiedDeps.systemSharedLibs
139 }
Paul Duffin88f2fbe2020-02-27 16:00:53 +0000140}
141
Paul Duffin3a4eb502020-03-19 16:11:18 +0000142func (p *nativeBinaryInfoProperties) AddToPropertySet(ctx android.SdkMemberContext, propertySet android.BpPropertySet) {
Paul Duffin3a4eb502020-03-19 16:11:18 +0000143 builder := ctx.SnapshotBuilder()
Paul Duffin88f2fbe2020-02-27 16:00:53 +0000144 if p.outputFile != nil {
145 propertySet.AddProperty("srcs", []string{nativeBinaryPathFor(*p)})
146
147 builder.CopyToSnapshot(p.outputFile, nativeBinaryPathFor(*p))
148 }
Paul Duffin13f02712020-03-06 12:30:43 +0000149
150 if len(p.SharedLibs) > 0 {
151 propertySet.AddPropertyWithTag("shared_libs", p.SharedLibs, builder.SdkMemberReferencePropertyTag(false))
152 }
153
Martin Stjernholm10566a02020-03-24 01:19:52 +0000154 // SystemSharedLibs needs to be propagated if it's a list, even if it's empty,
155 // so check for non-nil instead of nonzero length.
156 if p.SystemSharedLibs != nil {
Paul Duffin13f02712020-03-06 12:30:43 +0000157 propertySet.AddPropertyWithTag("system_shared_libs", p.SystemSharedLibs, builder.SdkMemberReferencePropertyTag(false))
158 }
Martin Stjernholm7130fab2020-05-28 22:58:01 +0100159
160 if p.StaticExecutable {
161 propertySet.AddProperty("static_executable", p.StaticExecutable)
162 }
163 if p.Nocrt {
164 propertySet.AddProperty("nocrt", p.Nocrt)
165 }
Paul Duffin25ce04b2020-01-16 11:47:25 +0000166}