xref: /aosp_15_r20/system/linkerconfig/modules/include/linkerconfig/namespace.h (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 #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