blob: 337de55b392afe9e53a907b5c9223d7b8a3a61ea [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
41func (mt *binarySdkMemberType) AddDependencies(mctx android.BottomUpMutatorContext, dependencyTag blueprint.DependencyTag, names []string) {
42 targets := mctx.MultiTargets()
43 for _, lib := range names {
44 for _, target := range targets {
45 name, version := StubsLibNameAndVersion(lib)
46 if version == "" {
47 version = LatestStubsVersionFor(mctx.Config(), name)
48 }
49 mctx.AddFarVariationDependencies(append(target.Variations(), []blueprint.Variation{
50 {Mutator: "version", Variation: version},
51 }...), dependencyTag, name)
52 }
53 }
54}
55
56func (mt *binarySdkMemberType) IsInstance(module android.Module) bool {
57 // Check the module to see if it can be used with this module type.
58 if m, ok := module.(*Module); ok {
59 for _, allowableMemberType := range m.sdkMemberTypes {
60 if allowableMemberType == mt {
61 return true
62 }
63 }
64 }
65
66 return false
67}
68
Paul Duffin3a4eb502020-03-19 16:11:18 +000069func (mt *binarySdkMemberType) AddPrebuiltModule(ctx android.SdkMemberContext, member android.SdkMember) android.BpModule {
Martin Stjernholm7130fab2020-05-28 22:58:01 +010070 pbm := ctx.SnapshotBuilder().AddPrebuiltModule(member, "cc_prebuilt_binary")
71
72 ccModule := member.Variants()[0].(*Module)
73
74 if stl := ccModule.stl.Properties.Stl; stl != nil {
75 pbm.AddProperty("stl", proptools.String(stl))
76 }
77
78 return pbm
Paul Duffin88f2fbe2020-02-27 16:00:53 +000079}
Paul Duffin13ad94f2020-02-19 16:19:27 +000080
Paul Duffin88f2fbe2020-02-27 16:00:53 +000081func (mt *binarySdkMemberType) CreateVariantPropertiesStruct() android.SdkMemberProperties {
82 return &nativeBinaryInfoProperties{}
Paul Duffin25ce04b2020-01-16 11:47:25 +000083}
84
85const (
86 nativeBinaryDir = "bin"
87)
88
89// path to the native binary. Relative to <sdk_root>/<api_dir>
90func nativeBinaryPathFor(lib nativeBinaryInfoProperties) string {
Paul Duffina04c1072020-03-02 10:16:35 +000091 return filepath.Join(lib.OsPrefix(), lib.archType,
Paul Duffin25ce04b2020-01-16 11:47:25 +000092 nativeBinaryDir, lib.outputFile.Base())
93}
94
95// nativeBinaryInfoProperties represents properties of a native binary
96//
97// The exported (capitalized) fields will be examined and may be changed during common value extraction.
98// The unexported fields will be left untouched.
99type nativeBinaryInfoProperties struct {
Paul Duffin88f2fbe2020-02-27 16:00:53 +0000100 android.SdkMemberPropertiesBase
Paul Duffin25ce04b2020-01-16 11:47:25 +0000101
102 // archType is not exported as if set (to a non default value) it is always arch specific.
103 // This is "" for common properties.
104 archType string
105
106 // outputFile is not exported as it is always arch specific.
107 outputFile android.Path
Paul Duffin13f02712020-03-06 12:30:43 +0000108
109 // The set of shared libraries
110 //
111 // This field is exported as its contents may not be arch specific.
112 SharedLibs []string
113
114 // The set of system shared libraries
115 //
116 // This field is exported as its contents may not be arch specific.
117 SystemSharedLibs []string
Martin Stjernholm7130fab2020-05-28 22:58:01 +0100118
119 // Arch specific flags.
120 StaticExecutable bool
121 Nocrt bool
Paul Duffin25ce04b2020-01-16 11:47:25 +0000122}
123
Paul Duffin3a4eb502020-03-19 16:11:18 +0000124func (p *nativeBinaryInfoProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) {
Paul Duffin88f2fbe2020-02-27 16:00:53 +0000125 ccModule := variant.(*Module)
126
127 p.archType = ccModule.Target().Arch.ArchType.String()
Paul Duffin712993c2020-05-05 14:11:57 +0100128 p.outputFile = getRequiredMemberOutputFile(ctx, ccModule)
Paul Duffin13f02712020-03-06 12:30:43 +0000129
Martin Stjernholm7130fab2020-05-28 22:58:01 +0100130 binaryLinker := ccModule.linker.(*binaryDecorator)
131 p.StaticExecutable = binaryLinker.static()
132 p.Nocrt = Bool(binaryLinker.baseLinker.Properties.Nocrt)
133
Paul Duffin13f02712020-03-06 12:30:43 +0000134 if ccModule.linker != nil {
135 specifiedDeps := specifiedDeps{}
136 specifiedDeps = ccModule.linker.linkerSpecifiedDeps(specifiedDeps)
137
138 p.SharedLibs = specifiedDeps.sharedLibs
139 p.SystemSharedLibs = specifiedDeps.systemSharedLibs
140 }
Paul Duffin88f2fbe2020-02-27 16:00:53 +0000141}
142
Paul Duffin3a4eb502020-03-19 16:11:18 +0000143func (p *nativeBinaryInfoProperties) AddToPropertySet(ctx android.SdkMemberContext, propertySet android.BpPropertySet) {
Paul Duffin3a4eb502020-03-19 16:11:18 +0000144 builder := ctx.SnapshotBuilder()
Paul Duffin88f2fbe2020-02-27 16:00:53 +0000145 if p.outputFile != nil {
146 propertySet.AddProperty("srcs", []string{nativeBinaryPathFor(*p)})
147
148 builder.CopyToSnapshot(p.outputFile, nativeBinaryPathFor(*p))
149 }
Paul Duffin13f02712020-03-06 12:30:43 +0000150
151 if len(p.SharedLibs) > 0 {
152 propertySet.AddPropertyWithTag("shared_libs", p.SharedLibs, builder.SdkMemberReferencePropertyTag(false))
153 }
154
Martin Stjernholm10566a02020-03-24 01:19:52 +0000155 // SystemSharedLibs needs to be propagated if it's a list, even if it's empty,
156 // so check for non-nil instead of nonzero length.
157 if p.SystemSharedLibs != nil {
Paul Duffin13f02712020-03-06 12:30:43 +0000158 propertySet.AddPropertyWithTag("system_shared_libs", p.SystemSharedLibs, builder.SdkMemberReferencePropertyTag(false))
159 }
Martin Stjernholm7130fab2020-05-28 22:58:01 +0100160
161 if p.StaticExecutable {
162 propertySet.AddProperty("static_executable", p.StaticExecutable)
163 }
164 if p.Nocrt {
165 propertySet.AddProperty("nocrt", p.Nocrt)
166 }
Paul Duffin25ce04b2020-01-16 11:47:25 +0000167}