xref: /aosp_15_r20/system/linkerconfig/contents/context/context.cc (revision e5eeaa8e05bc25a862c0c861bda7c8a6bfb42dad)
1*e5eeaa8eSAndroid Build Coastguard Worker /*
2*e5eeaa8eSAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*e5eeaa8eSAndroid Build Coastguard Worker  *
4*e5eeaa8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*e5eeaa8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*e5eeaa8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*e5eeaa8eSAndroid Build Coastguard Worker  *
8*e5eeaa8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*e5eeaa8eSAndroid Build Coastguard Worker  *
10*e5eeaa8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*e5eeaa8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*e5eeaa8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e5eeaa8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*e5eeaa8eSAndroid Build Coastguard Worker  * limitations under the License.
15*e5eeaa8eSAndroid Build Coastguard Worker  */
16*e5eeaa8eSAndroid Build Coastguard Worker 
17*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/context.h"
18*e5eeaa8eSAndroid Build Coastguard Worker 
19*e5eeaa8eSAndroid Build Coastguard Worker #include <android-base/strings.h>
20*e5eeaa8eSAndroid Build Coastguard Worker 
21*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/environment.h"
22*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/log.h"
23*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/namespacebuilder.h"
24*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/variables.h"
25*e5eeaa8eSAndroid Build Coastguard Worker 
26*e5eeaa8eSAndroid Build Coastguard Worker using android::base::StartsWith;
27*e5eeaa8eSAndroid Build Coastguard Worker using android::linkerconfig::modules::ApexInfo;
28*e5eeaa8eSAndroid Build Coastguard Worker using android::linkerconfig::modules::Namespace;
29*e5eeaa8eSAndroid Build Coastguard Worker 
30*e5eeaa8eSAndroid Build Coastguard Worker namespace android {
31*e5eeaa8eSAndroid Build Coastguard Worker namespace linkerconfig {
32*e5eeaa8eSAndroid Build Coastguard Worker namespace contents {
33*e5eeaa8eSAndroid Build Coastguard Worker 
IsSystemSection() const34*e5eeaa8eSAndroid Build Coastguard Worker bool Context::IsSystemSection() const {
35*e5eeaa8eSAndroid Build Coastguard Worker   return current_section_ == SectionType::System;
36*e5eeaa8eSAndroid Build Coastguard Worker }
37*e5eeaa8eSAndroid Build Coastguard Worker 
IsVendorSection() const38*e5eeaa8eSAndroid Build Coastguard Worker bool Context::IsVendorSection() const {
39*e5eeaa8eSAndroid Build Coastguard Worker   return current_section_ == SectionType::Vendor;
40*e5eeaa8eSAndroid Build Coastguard Worker }
41*e5eeaa8eSAndroid Build Coastguard Worker 
IsProductSection() const42*e5eeaa8eSAndroid Build Coastguard Worker bool Context::IsProductSection() const {
43*e5eeaa8eSAndroid Build Coastguard Worker   return current_section_ == SectionType::Product;
44*e5eeaa8eSAndroid Build Coastguard Worker }
45*e5eeaa8eSAndroid Build Coastguard Worker 
IsUnrestrictedSection() const46*e5eeaa8eSAndroid Build Coastguard Worker bool Context::IsUnrestrictedSection() const {
47*e5eeaa8eSAndroid Build Coastguard Worker   return current_section_ == SectionType::Unrestricted;
48*e5eeaa8eSAndroid Build Coastguard Worker }
49*e5eeaa8eSAndroid Build Coastguard Worker 
IsDefaultConfig() const50*e5eeaa8eSAndroid Build Coastguard Worker bool Context::IsDefaultConfig() const {
51*e5eeaa8eSAndroid Build Coastguard Worker   return current_linkerconfig_type_ == LinkerConfigType::Default;
52*e5eeaa8eSAndroid Build Coastguard Worker }
53*e5eeaa8eSAndroid Build Coastguard Worker 
IsLegacyConfig() const54*e5eeaa8eSAndroid Build Coastguard Worker bool Context::IsLegacyConfig() const {
55*e5eeaa8eSAndroid Build Coastguard Worker   return current_linkerconfig_type_ == LinkerConfigType::Legacy;
56*e5eeaa8eSAndroid Build Coastguard Worker }
57*e5eeaa8eSAndroid Build Coastguard Worker 
IsRecoveryConfig() const58*e5eeaa8eSAndroid Build Coastguard Worker bool Context::IsRecoveryConfig() const {
59*e5eeaa8eSAndroid Build Coastguard Worker   return current_linkerconfig_type_ == LinkerConfigType::Recovery;
60*e5eeaa8eSAndroid Build Coastguard Worker }
61*e5eeaa8eSAndroid Build Coastguard Worker 
IsApexBinaryConfig() const62*e5eeaa8eSAndroid Build Coastguard Worker bool Context::IsApexBinaryConfig() const {
63*e5eeaa8eSAndroid Build Coastguard Worker   return current_linkerconfig_type_ == LinkerConfigType::ApexBinary;
64*e5eeaa8eSAndroid Build Coastguard Worker }
65*e5eeaa8eSAndroid Build Coastguard Worker 
GetCurrentApex() const66*e5eeaa8eSAndroid Build Coastguard Worker const ApexInfo& Context::GetCurrentApex() const {
67*e5eeaa8eSAndroid Build Coastguard Worker   CHECK(current_apex_ != nullptr) << "only valid when IsApexBinaryConfig()";
68*e5eeaa8eSAndroid Build Coastguard Worker   return *current_apex_;
69*e5eeaa8eSAndroid Build Coastguard Worker }
70*e5eeaa8eSAndroid Build Coastguard Worker 
SetCurrentSection(SectionType section_type)71*e5eeaa8eSAndroid Build Coastguard Worker void Context::SetCurrentSection(SectionType section_type) {
72*e5eeaa8eSAndroid Build Coastguard Worker   current_section_ = section_type;
73*e5eeaa8eSAndroid Build Coastguard Worker }
74*e5eeaa8eSAndroid Build Coastguard Worker 
GetSystemNamespaceName() const75*e5eeaa8eSAndroid Build Coastguard Worker std::string Context::GetSystemNamespaceName() const {
76*e5eeaa8eSAndroid Build Coastguard Worker   return IsSystemSection() || IsUnrestrictedSection() ? "default" : "system";
77*e5eeaa8eSAndroid Build Coastguard Worker }
78*e5eeaa8eSAndroid Build Coastguard Worker 
SetCurrentLinkerConfigType(LinkerConfigType config_type)79*e5eeaa8eSAndroid Build Coastguard Worker void Context::SetCurrentLinkerConfigType(LinkerConfigType config_type) {
80*e5eeaa8eSAndroid Build Coastguard Worker   current_linkerconfig_type_ = config_type;
81*e5eeaa8eSAndroid Build Coastguard Worker }
82*e5eeaa8eSAndroid Build Coastguard Worker 
SetCurrentApex(const ApexInfo * apex)83*e5eeaa8eSAndroid Build Coastguard Worker void Context::SetCurrentApex(const ApexInfo* apex) {
84*e5eeaa8eSAndroid Build Coastguard Worker   current_apex_ = apex;
85*e5eeaa8eSAndroid Build Coastguard Worker }
86*e5eeaa8eSAndroid Build Coastguard Worker 
IsVndkAvailable() const87*e5eeaa8eSAndroid Build Coastguard Worker bool Context::IsVndkAvailable() const {
88*e5eeaa8eSAndroid Build Coastguard Worker   for (auto& apex : GetApexModules()) {
89*e5eeaa8eSAndroid Build Coastguard Worker     if (StartsWith(apex.name, "com.android.vndk.")) {
90*e5eeaa8eSAndroid Build Coastguard Worker       return true;
91*e5eeaa8eSAndroid Build Coastguard Worker     }
92*e5eeaa8eSAndroid Build Coastguard Worker   }
93*e5eeaa8eSAndroid Build Coastguard Worker   return false;
94*e5eeaa8eSAndroid Build Coastguard Worker }
95*e5eeaa8eSAndroid Build Coastguard Worker 
Var(const std::string & name)96*e5eeaa8eSAndroid Build Coastguard Worker std::string Var(const std::string& name) {
97*e5eeaa8eSAndroid Build Coastguard Worker   auto val = modules::Variables::GetValue(name);
98*e5eeaa8eSAndroid Build Coastguard Worker   if (val.has_value()) {
99*e5eeaa8eSAndroid Build Coastguard Worker     return *val;
100*e5eeaa8eSAndroid Build Coastguard Worker   }
101*e5eeaa8eSAndroid Build Coastguard Worker   CHECK(!"undefined var") << name << " is not defined";
102*e5eeaa8eSAndroid Build Coastguard Worker   return "";
103*e5eeaa8eSAndroid Build Coastguard Worker }
104*e5eeaa8eSAndroid Build Coastguard Worker 
Var(const std::string & name,const std::string & default_value)105*e5eeaa8eSAndroid Build Coastguard Worker std::string Var(const std::string& name, const std::string& default_value) {
106*e5eeaa8eSAndroid Build Coastguard Worker   auto val = modules::Variables::GetValue(name);
107*e5eeaa8eSAndroid Build Coastguard Worker   if (val.has_value()) {
108*e5eeaa8eSAndroid Build Coastguard Worker     return *val;
109*e5eeaa8eSAndroid Build Coastguard Worker   }
110*e5eeaa8eSAndroid Build Coastguard Worker   return default_value;
111*e5eeaa8eSAndroid Build Coastguard Worker }
112*e5eeaa8eSAndroid Build Coastguard Worker 
IsSectionVndkEnabled() const113*e5eeaa8eSAndroid Build Coastguard Worker bool Context::IsSectionVndkEnabled() const {
114*e5eeaa8eSAndroid Build Coastguard Worker   if (!IsVndkAvailable()) {
115*e5eeaa8eSAndroid Build Coastguard Worker     return false;
116*e5eeaa8eSAndroid Build Coastguard Worker   }
117*e5eeaa8eSAndroid Build Coastguard Worker   if (IsVendorSection()) {
118*e5eeaa8eSAndroid Build Coastguard Worker     return android::linkerconfig::modules::IsVendorVndkVersionDefined();
119*e5eeaa8eSAndroid Build Coastguard Worker   }
120*e5eeaa8eSAndroid Build Coastguard Worker   if (IsProductSection()) {
121*e5eeaa8eSAndroid Build Coastguard Worker     return android::linkerconfig::modules::IsProductVndkVersionDefined();
122*e5eeaa8eSAndroid Build Coastguard Worker   }
123*e5eeaa8eSAndroid Build Coastguard Worker   if (IsApexBinaryConfig()) {
124*e5eeaa8eSAndroid Build Coastguard Worker     // section for non-system APEX (aka Vendor APEX)
125*e5eeaa8eSAndroid Build Coastguard Worker     // can be seen as vndk-enabled because the apex either bundles
126*e5eeaa8eSAndroid Build Coastguard Worker     // with vndk libs in it or relies on VNDK from "vndk" namespace
127*e5eeaa8eSAndroid Build Coastguard Worker     // if the partition is VNDK enabled
128*e5eeaa8eSAndroid Build Coastguard Worker     if (GetCurrentApex().InVendor()) {
129*e5eeaa8eSAndroid Build Coastguard Worker       return android::linkerconfig::modules::IsVendorVndkVersionDefined();
130*e5eeaa8eSAndroid Build Coastguard Worker     }
131*e5eeaa8eSAndroid Build Coastguard Worker 
132*e5eeaa8eSAndroid Build Coastguard Worker     if (GetCurrentApex().InProduct()) {
133*e5eeaa8eSAndroid Build Coastguard Worker       return android::linkerconfig::modules::IsProductVndkVersionDefined();
134*e5eeaa8eSAndroid Build Coastguard Worker     }
135*e5eeaa8eSAndroid Build Coastguard Worker 
136*e5eeaa8eSAndroid Build Coastguard Worker     return false;
137*e5eeaa8eSAndroid Build Coastguard Worker   }
138*e5eeaa8eSAndroid Build Coastguard Worker   return false;
139*e5eeaa8eSAndroid Build Coastguard Worker }
140*e5eeaa8eSAndroid Build Coastguard Worker 
141*e5eeaa8eSAndroid Build Coastguard Worker }  // namespace contents
142*e5eeaa8eSAndroid Build Coastguard Worker }  // namespace linkerconfig
143*e5eeaa8eSAndroid Build Coastguard Worker }  // namespace android
144