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 Workerbool 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 Workerbool 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 Workerbool 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 Workerbool 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 Workerbool 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 Workerbool 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 Workerbool 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 Workerbool 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 Workerconst 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 Workervoid 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 Workerstd::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 Workervoid 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 Workervoid 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 Workerbool 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 Workerstd::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 Workerstd::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 Workerbool 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