xref: /aosp_15_r20/system/linkerconfig/modules/include/linkerconfig/link.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 <string>
19*e5eeaa8eSAndroid Build Coastguard Worker #include <utility>
20*e5eeaa8eSAndroid Build Coastguard Worker #include <vector>
21*e5eeaa8eSAndroid Build Coastguard Worker 
22*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/configwriter.h"
23*e5eeaa8eSAndroid Build Coastguard Worker 
24*e5eeaa8eSAndroid Build Coastguard Worker namespace android {
25*e5eeaa8eSAndroid Build Coastguard Worker namespace linkerconfig {
26*e5eeaa8eSAndroid Build Coastguard Worker namespace modules {
27*e5eeaa8eSAndroid Build Coastguard Worker class Link {
28*e5eeaa8eSAndroid Build Coastguard Worker  public:
Link(std::string origin_namespace,std::string target_namespace)29*e5eeaa8eSAndroid Build Coastguard Worker   Link(std::string origin_namespace, std::string target_namespace)
30*e5eeaa8eSAndroid Build Coastguard Worker       : origin_namespace_(std::move(origin_namespace)),
31*e5eeaa8eSAndroid Build Coastguard Worker         target_namespace_(std::move(target_namespace)) {
32*e5eeaa8eSAndroid Build Coastguard Worker   }
33*e5eeaa8eSAndroid Build Coastguard Worker   Link(const Link&) = delete;
34*e5eeaa8eSAndroid Build Coastguard Worker   Link& operator=(const Link&) = delete;
35*e5eeaa8eSAndroid Build Coastguard Worker   Link(Link&&) = default;
36*e5eeaa8eSAndroid Build Coastguard Worker   Link& operator=(Link&&) = default;
37*e5eeaa8eSAndroid Build Coastguard Worker 
38*e5eeaa8eSAndroid Build Coastguard Worker   template <typename... Args>
39*e5eeaa8eSAndroid Build Coastguard Worker   void AddSharedLib(const std::string& lib_name, Args&&... lib_names);
40*e5eeaa8eSAndroid Build Coastguard Worker   void AddSharedLib(const std::vector<std::string>& lib_names);
41*e5eeaa8eSAndroid Build Coastguard Worker   void AllowAllSharedLibs();
42*e5eeaa8eSAndroid Build Coastguard Worker   void WriteConfig(ConfigWriter& writer) const;
43*e5eeaa8eSAndroid Build Coastguard Worker 
IsAllSharedLibsAllowed()44*e5eeaa8eSAndroid Build Coastguard Worker   bool IsAllSharedLibsAllowed() const {
45*e5eeaa8eSAndroid Build Coastguard Worker     return allow_all_shared_libs_;
46*e5eeaa8eSAndroid Build Coastguard Worker   }
47*e5eeaa8eSAndroid Build Coastguard Worker 
48*e5eeaa8eSAndroid Build Coastguard Worker   // accessors
Empty()49*e5eeaa8eSAndroid Build Coastguard Worker   bool Empty() const {
50*e5eeaa8eSAndroid Build Coastguard Worker     return !allow_all_shared_libs_ && shared_libs_.empty();
51*e5eeaa8eSAndroid Build Coastguard Worker   }
GetSharedLibs()52*e5eeaa8eSAndroid Build Coastguard Worker   std::vector<std::string> GetSharedLibs() const {
53*e5eeaa8eSAndroid Build Coastguard Worker     return shared_libs_;
54*e5eeaa8eSAndroid Build Coastguard Worker   }
To()55*e5eeaa8eSAndroid Build Coastguard Worker   std::string To() const {
56*e5eeaa8eSAndroid Build Coastguard Worker     return target_namespace_;
57*e5eeaa8eSAndroid Build Coastguard Worker   }
58*e5eeaa8eSAndroid Build Coastguard Worker 
59*e5eeaa8eSAndroid Build Coastguard Worker  private:
60*e5eeaa8eSAndroid Build Coastguard Worker   std::string origin_namespace_;
61*e5eeaa8eSAndroid Build Coastguard Worker   std::string target_namespace_;
62*e5eeaa8eSAndroid Build Coastguard Worker   std::vector<std::string> shared_libs_;
63*e5eeaa8eSAndroid Build Coastguard Worker   bool allow_all_shared_libs_ = false;
64*e5eeaa8eSAndroid Build Coastguard Worker };
65*e5eeaa8eSAndroid Build Coastguard Worker 
66*e5eeaa8eSAndroid Build Coastguard Worker template <typename... Args>
AddSharedLib(const std::string & lib_name,Args &&...lib_names)67*e5eeaa8eSAndroid Build Coastguard Worker void Link::AddSharedLib(const std::string& lib_name, Args&&... lib_names) {
68*e5eeaa8eSAndroid Build Coastguard Worker   if (!allow_all_shared_libs_) {
69*e5eeaa8eSAndroid Build Coastguard Worker     shared_libs_.push_back(lib_name);
70*e5eeaa8eSAndroid Build Coastguard Worker     if constexpr (sizeof...(Args) > 0) {
71*e5eeaa8eSAndroid Build Coastguard Worker       AddSharedLib(std::forward<Args>(lib_names)...);
72*e5eeaa8eSAndroid Build Coastguard Worker     }
73*e5eeaa8eSAndroid Build Coastguard Worker   }
74*e5eeaa8eSAndroid Build Coastguard Worker }
75*e5eeaa8eSAndroid Build Coastguard Worker }  // namespace modules
76*e5eeaa8eSAndroid Build Coastguard Worker }  // namespace linkerconfig
77*e5eeaa8eSAndroid Build Coastguard Worker }  // namespace android
78