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