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 #pragma once 17*e5eeaa8eSAndroid Build Coastguard Worker 18*e5eeaa8eSAndroid Build Coastguard Worker #include <set> 19*e5eeaa8eSAndroid Build Coastguard Worker #include <string> 20*e5eeaa8eSAndroid Build Coastguard Worker #include <vector> 21*e5eeaa8eSAndroid Build Coastguard Worker 22*e5eeaa8eSAndroid Build Coastguard Worker #include <android-base/result.h> 23*e5eeaa8eSAndroid Build Coastguard Worker 24*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/apex.h" 25*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/configwriter.h" 26*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/link.h" 27*e5eeaa8eSAndroid Build Coastguard Worker 28*e5eeaa8eSAndroid Build Coastguard Worker namespace android { 29*e5eeaa8eSAndroid Build Coastguard Worker namespace linkerconfig { 30*e5eeaa8eSAndroid Build Coastguard Worker namespace modules { 31*e5eeaa8eSAndroid Build Coastguard Worker 32*e5eeaa8eSAndroid Build Coastguard Worker struct ApexSource { 33*e5eeaa8eSAndroid Build Coastguard Worker std::string name; 34*e5eeaa8eSAndroid Build Coastguard Worker bool in_vendor; 35*e5eeaa8eSAndroid Build Coastguard Worker }; 36*e5eeaa8eSAndroid Build Coastguard Worker 37*e5eeaa8eSAndroid Build Coastguard Worker class Namespace { 38*e5eeaa8eSAndroid Build Coastguard Worker public: 39*e5eeaa8eSAndroid Build Coastguard Worker explicit Namespace(std::string name, bool is_isolated = false, 40*e5eeaa8eSAndroid Build Coastguard Worker bool is_visible = false) is_isolated_(is_isolated)41*e5eeaa8eSAndroid Build Coastguard Worker : is_isolated_(is_isolated), 42*e5eeaa8eSAndroid Build Coastguard Worker is_visible_(is_visible), 43*e5eeaa8eSAndroid Build Coastguard Worker name_(std::move(name)) { 44*e5eeaa8eSAndroid Build Coastguard Worker } 45*e5eeaa8eSAndroid Build Coastguard Worker 46*e5eeaa8eSAndroid Build Coastguard Worker Namespace(const Namespace& ns) = delete; 47*e5eeaa8eSAndroid Build Coastguard Worker Namespace(Namespace&& ns) = default; 48*e5eeaa8eSAndroid Build Coastguard Worker Namespace& operator=(Namespace&& ns) = default; 49*e5eeaa8eSAndroid Build Coastguard Worker 50*e5eeaa8eSAndroid Build Coastguard Worker // Add path to search path 51*e5eeaa8eSAndroid Build Coastguard Worker void AddSearchPath(const std::string& path); 52*e5eeaa8eSAndroid Build Coastguard Worker 53*e5eeaa8eSAndroid Build Coastguard Worker // Add path to permitted path 54*e5eeaa8eSAndroid Build Coastguard Worker void AddPermittedPath(const std::string& path); 55*e5eeaa8eSAndroid Build Coastguard Worker 56*e5eeaa8eSAndroid Build Coastguard Worker // Returns a link from this namespace to the given one. If one already exists 57*e5eeaa8eSAndroid Build Coastguard Worker // it is returned, otherwise one is created and pushed back to tail. 58*e5eeaa8eSAndroid Build Coastguard Worker Link& GetLink(const std::string& target_namespace); 59*e5eeaa8eSAndroid Build Coastguard Worker 60*e5eeaa8eSAndroid Build Coastguard Worker void WriteConfig(ConfigWriter& writer) const; 61*e5eeaa8eSAndroid Build Coastguard Worker void AddAllowedLib(const std::string& path); 62*e5eeaa8eSAndroid Build Coastguard Worker 63*e5eeaa8eSAndroid Build Coastguard Worker std::string GetName() const; 64*e5eeaa8eSAndroid Build Coastguard Worker SetVisible(bool visible)65*e5eeaa8eSAndroid Build Coastguard Worker void SetVisible(bool visible) { 66*e5eeaa8eSAndroid Build Coastguard Worker is_visible_ = visible; 67*e5eeaa8eSAndroid Build Coastguard Worker } IsVisible()68*e5eeaa8eSAndroid Build Coastguard Worker bool IsVisible() const { 69*e5eeaa8eSAndroid Build Coastguard Worker return is_visible_; 70*e5eeaa8eSAndroid Build Coastguard Worker } 71*e5eeaa8eSAndroid Build Coastguard Worker SetApexSource(ApexSource source)72*e5eeaa8eSAndroid Build Coastguard Worker void SetApexSource(ApexSource source) { 73*e5eeaa8eSAndroid Build Coastguard Worker apex_source_ = source; 74*e5eeaa8eSAndroid Build Coastguard Worker } 75*e5eeaa8eSAndroid Build Coastguard Worker GetApexSource()76*e5eeaa8eSAndroid Build Coastguard Worker const ApexSource& GetApexSource() const { 77*e5eeaa8eSAndroid Build Coastguard Worker return apex_source_; 78*e5eeaa8eSAndroid Build Coastguard Worker } 79*e5eeaa8eSAndroid Build Coastguard Worker 80*e5eeaa8eSAndroid Build Coastguard Worker // For test usage Links()81*e5eeaa8eSAndroid Build Coastguard Worker const std::vector<Link>& Links() const { 82*e5eeaa8eSAndroid Build Coastguard Worker return links_; 83*e5eeaa8eSAndroid Build Coastguard Worker } SearchPaths()84*e5eeaa8eSAndroid Build Coastguard Worker std::vector<std::string> SearchPaths() const { 85*e5eeaa8eSAndroid Build Coastguard Worker return search_paths_; 86*e5eeaa8eSAndroid Build Coastguard Worker } PermittedPaths()87*e5eeaa8eSAndroid Build Coastguard Worker std::vector<std::string> PermittedPaths() const { 88*e5eeaa8eSAndroid Build Coastguard Worker return permitted_paths_; 89*e5eeaa8eSAndroid Build Coastguard Worker } AsanSearchPaths()90*e5eeaa8eSAndroid Build Coastguard Worker std::vector<std::string> AsanSearchPaths() const { 91*e5eeaa8eSAndroid Build Coastguard Worker return asan_search_paths_; 92*e5eeaa8eSAndroid Build Coastguard Worker } AsanPermittedPaths()93*e5eeaa8eSAndroid Build Coastguard Worker std::vector<std::string> AsanPermittedPaths() const { 94*e5eeaa8eSAndroid Build Coastguard Worker return asan_permitted_paths_; 95*e5eeaa8eSAndroid Build Coastguard Worker } 96*e5eeaa8eSAndroid Build Coastguard Worker 97*e5eeaa8eSAndroid Build Coastguard Worker template <typename Vec> AddProvides(const Vec & list)98*e5eeaa8eSAndroid Build Coastguard Worker void AddProvides(const Vec& list) { 99*e5eeaa8eSAndroid Build Coastguard Worker provides_.insert(list.begin(), list.end()); 100*e5eeaa8eSAndroid Build Coastguard Worker } 101*e5eeaa8eSAndroid Build Coastguard Worker template <typename Vec> AddRequires(const Vec & list)102*e5eeaa8eSAndroid Build Coastguard Worker void AddRequires(const Vec& list) { 103*e5eeaa8eSAndroid Build Coastguard Worker requires_.insert(list.begin(), list.end()); 104*e5eeaa8eSAndroid Build Coastguard Worker } GetProvides()105*e5eeaa8eSAndroid Build Coastguard Worker const std::set<std::string>& GetProvides() const { 106*e5eeaa8eSAndroid Build Coastguard Worker return provides_; 107*e5eeaa8eSAndroid Build Coastguard Worker } GetRequires()108*e5eeaa8eSAndroid Build Coastguard Worker const std::set<std::string>& GetRequires() const { 109*e5eeaa8eSAndroid Build Coastguard Worker return requires_; 110*e5eeaa8eSAndroid Build Coastguard Worker } 111*e5eeaa8eSAndroid Build Coastguard Worker 112*e5eeaa8eSAndroid Build Coastguard Worker private: 113*e5eeaa8eSAndroid Build Coastguard Worker bool is_isolated_; 114*e5eeaa8eSAndroid Build Coastguard Worker bool is_visible_; 115*e5eeaa8eSAndroid Build Coastguard Worker std::string name_; 116*e5eeaa8eSAndroid Build Coastguard Worker std::vector<std::string> search_paths_; 117*e5eeaa8eSAndroid Build Coastguard Worker std::vector<std::string> permitted_paths_; 118*e5eeaa8eSAndroid Build Coastguard Worker std::vector<std::string> asan_search_paths_; 119*e5eeaa8eSAndroid Build Coastguard Worker std::vector<std::string> asan_permitted_paths_; 120*e5eeaa8eSAndroid Build Coastguard Worker std::vector<std::string> allowed_libs_; 121*e5eeaa8eSAndroid Build Coastguard Worker std::vector<Link> links_; 122*e5eeaa8eSAndroid Build Coastguard Worker std::set<std::string> provides_; 123*e5eeaa8eSAndroid Build Coastguard Worker std::set<std::string> requires_; 124*e5eeaa8eSAndroid Build Coastguard Worker // Verification context 125*e5eeaa8eSAndroid Build Coastguard Worker ApexSource apex_source_; 126*e5eeaa8eSAndroid Build Coastguard Worker 127*e5eeaa8eSAndroid Build Coastguard Worker void WritePathString(ConfigWriter& writer, const std::string& path_type, 128*e5eeaa8eSAndroid Build Coastguard Worker const std::vector<std::string>& path_list); 129*e5eeaa8eSAndroid Build Coastguard Worker bool RequiresAsanPath(const std::string& path); 130*e5eeaa8eSAndroid Build Coastguard Worker const std::string CreateAsanPath(const std::string& path); 131*e5eeaa8eSAndroid Build Coastguard Worker android::base::Result<void> VerifyContents() const; 132*e5eeaa8eSAndroid Build Coastguard Worker }; 133*e5eeaa8eSAndroid Build Coastguard Worker 134*e5eeaa8eSAndroid Build Coastguard Worker void InitializeWithApex(Namespace& ns, const ApexInfo& apex_info); 135*e5eeaa8eSAndroid Build Coastguard Worker } // namespace modules 136*e5eeaa8eSAndroid Build Coastguard Worker } // namespace linkerconfig 137*e5eeaa8eSAndroid Build Coastguard Worker } // namespace android 138