blob: 5208424a4b0f155525620bddf1137b7ee046da9b [file] [log] [blame]
Christopher Wiley4427d862015-09-14 11:07:39 -07001/*
Christopher Wileyb1bbdf82016-04-21 11:43:45 -07002 * Copyright (C) 2015, The Android Open Source Project *
Christopher Wiley4427d862015-09-14 11:07:39 -07003 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
Steven Moreland9fccf582018-08-27 20:36:27 -070016#pragma once
Adam Lesinskiffa16862014-01-23 18:17:42 -080017
Jiyong Park8c380532018-08-30 14:55:26 +090018#include <set>
Adam Lesinskiffa16862014-01-23 18:17:42 -080019#include <string>
20#include <vector>
21
Jooyung Han74406c52021-11-06 06:17:36 +090022#include <android-base/result.h>
23
Jooyung Han888c5bc2020-12-22 17:28:47 +090024#include "diagnostics.h"
25
Christopher Wiley4427d862015-09-14 11:07:39 -070026namespace android {
27namespace aidl {
Adam Lesinskiffa16862014-01-23 18:17:42 -080028
Jiyong Park8c380532018-08-30 14:55:26 +090029using std::set;
Jiyong Park1d2df7d2018-07-23 15:22:50 +090030using std::string;
31using std::vector;
32
Jiyong Park223274e2021-09-24 14:14:12 +090033// The oldest SDK version that is supported for each backend. For non-Java backends, these are the
Jooyung Hand11f9f52021-11-04 11:34:57 +090034// platform SDK version where the support for the backend was added. For Java backend, this is 1.
35// TODO(b/205065703) switch back to DEFAULT_SDK_VERSION_JAVA = 23
36constexpr uint32_t DEFAULT_SDK_VERSION_JAVA = 1;
Jiyong Park223274e2021-09-24 14:14:12 +090037constexpr uint32_t DEFAULT_SDK_VERSION_CPP = 23;
38constexpr uint32_t DEFAULT_SDK_VERSION_NDK = 29;
39constexpr uint32_t DEFAULT_SDK_VERSION_RUST = 31;
40
Jooyung Han6edc7ec2021-12-23 11:57:49 +090041constexpr uint32_t SDK_VERSION_current = 10000;
Steven Moreland4de616b2022-04-15 22:51:07 +000042constexpr uint32_t SDK_VERSION_Tiramisu = 33;
Jooyung Han6edc7ec2021-12-23 11:57:49 +090043
Steven Morelandaad0e4b2022-02-04 18:52:44 +000044constexpr uint32_t JAVA_PROPAGATE_VERSION = SDK_VERSION_Tiramisu;
45
Jiyong Park6f77e0c2018-07-28 16:55:44 +090046// A simple wrapper around ostringstream. This is just to make Options class
47// copiable by the implicit copy constructor. If ostingstream is not wrapped,
48// the implcit copy constructor is not generated because ostringstream isn't
49// copiable. This class makes the field copiable by having a copy constructor
50// that does not copy the underlying stream.
51class ErrorMessage {
52 public:
53 ErrorMessage() = default;
54 ErrorMessage(const ErrorMessage&) {}
55 std::ostringstream stream_;
Jiyong Parke1d02682018-08-01 12:18:02 +090056
57 template <typename T>
58 ErrorMessage& operator<<(T& t) {
59 stream_ << t;
Jiyong Park6f77e0c2018-07-28 16:55:44 +090060 return *this;
61 }
Jiyong Parke1d02682018-08-01 12:18:02 +090062
63 template <typename T>
64 ErrorMessage& operator<<(const T& t) {
65 stream_ << t;
Jiyong Park6f77e0c2018-07-28 16:55:44 +090066 return *this;
67 }
Jiyong Parke1d02682018-08-01 12:18:02 +090068
69 // for "<< endl"
Jiyong Park6f77e0c2018-07-28 16:55:44 +090070 ErrorMessage& operator<<(std::ostream& (*f)(std::ostream&)) {
71 f(stream_);
72 return *this;
73 }
74};
75
Jooyung Han808a2a02020-12-28 16:46:54 +090076// Handles warning-related options (e.g. -W, -w, ...)
Jooyung Han888c5bc2020-12-22 17:28:47 +090077class WarningOptions {
78 public:
79 std::vector<const char*> Parse(int argc, const char* const argv[], ErrorMessage& error_message);
Jooyung Han808a2a02020-12-28 16:46:54 +090080 DiagnosticMapping GetDiagnosticMapping() const;
Jooyung Han888c5bc2020-12-22 17:28:47 +090081
82 private:
83 bool as_errors_ = false; // -Werror
84 bool enable_all_ = false; // -Weverything
85 bool disable_all_ = false; // -w
86 std::set<std::string> enabled_; // -Wfoo
87 std::set<std::string> disabled_; // -Wno-foo
88 std::set<std::string> no_errors_; // -Wno-error=foo
Jooyung Han888c5bc2020-12-22 17:28:47 +090089};
90
Jiyong Park74595c12018-07-23 15:22:50 +090091class Options final {
Steven Morelandda0654f2018-07-17 12:24:38 -070092 public:
Andrei Homescub62afd92020-05-11 19:24:59 -070093 enum class Language { UNSPECIFIED, JAVA, CPP, NDK, RUST };
Steven Morelandda0654f2018-07-17 12:24:38 -070094
Steven Moreland481f5932021-08-09 17:31:05 -070095 enum class Task { HELP, COMPILE, PREPROCESS, DUMP_API, CHECK_API, DUMP_MAPPINGS };
Steven Morelandda0654f2018-07-17 12:24:38 -070096
Jooyung Hanb8a97772021-01-19 01:27:38 +090097 enum class CheckApiLevel { COMPATIBLE, EQUAL };
98
Steven Morelanda57d0a62019-07-30 09:41:14 -070099 enum class Stability { UNSPECIFIED, VINTF };
100 bool StabilityFromString(const std::string& stability, Stability* out_stability);
101
Jiyong Park74595c12018-07-23 15:22:50 +0900102 Options(int argc, const char* const argv[], Language default_lang = Language::UNSPECIFIED);
Steven Morelandda0654f2018-07-17 12:24:38 -0700103
Jooyung Han8e3b72c2021-05-22 02:54:37 +0900104 Options PlusImportDir(const std::string& import_dir) const {
105 Options copy(*this);
106 copy.import_dirs_.insert(import_dir);
107 return copy;
108 }
109
Jiyong Park6f77e0c2018-07-28 16:55:44 +0900110 static Options From(const string& cmdline);
111
112 static Options From(const vector<string>& args);
113
Steven Moreland6cee3482018-07-18 14:39:58 -0700114 // Contain no references to unstructured data types (such as a parcelable that is
115 // implemented in Java). These interfaces aren't inherently stable but they have the
116 // capacity to be stabilized.
117 bool IsStructured() const { return structured_; }
118
Steven Morelanda57d0a62019-07-30 09:41:14 -0700119 Stability GetStability() const { return stability_; }
120
Jiyong Park223274e2021-09-24 14:14:12 +0900121 uint32_t GetMinSdkVersion() const { return min_sdk_version_; }
122
Jiyong Park74595c12018-07-23 15:22:50 +0900123 Language TargetLanguage() const { return language_; }
Steven Morelandc26d8142018-09-17 14:25:33 -0700124 bool IsCppOutput() const { return language_ == Language::CPP || language_ == Language::NDK; }
Steven Morelandda0654f2018-07-17 12:24:38 -0700125
Jiyong Park74595c12018-07-23 15:22:50 +0900126 Task GetTask() const { return task_; }
Steven Morelandda0654f2018-07-17 12:24:38 -0700127
Jooyung Hanb8a97772021-01-19 01:27:38 +0900128 CheckApiLevel GetCheckApiLevel() const { return check_api_level_; }
129
Jiyong Park8c380532018-08-30 14:55:26 +0900130 const set<string>& ImportDirs() const { return import_dirs_; }
Jiyong Park3c35e392018-08-30 13:10:30 +0900131
Jiyong Park74595c12018-07-23 15:22:50 +0900132 const vector<string>& PreprocessedFiles() const { return preprocessed_files_; }
Adam Lesinskiffa16862014-01-23 18:17:42 -0800133
Jiyong Park74595c12018-07-23 15:22:50 +0900134 string DependencyFile() const {
Jiyong Park74595c12018-07-23 15:22:50 +0900135 return dependency_file_;
136 }
Christopher Wiley4427d862015-09-14 11:07:39 -0700137
Jiyong Park74595c12018-07-23 15:22:50 +0900138 bool AutoDepFile() const { return auto_dep_file_; }
Christopher Wileyef4132c2015-11-05 15:47:40 -0800139
Steven Moreland46931082022-02-04 18:24:18 +0000140 bool GenRpc() const { return gen_rpc_; }
141
Jiyong Park74595c12018-07-23 15:22:50 +0900142 bool GenTraces() const { return gen_traces_; }
Steven Morelandda0654f2018-07-17 12:24:38 -0700143
Jiyong Park74595c12018-07-23 15:22:50 +0900144 bool GenTransactionNames() const { return gen_transaction_names_; }
Christopher Wiley4427d862015-09-14 11:07:39 -0700145
Jiyong Park74595c12018-07-23 15:22:50 +0900146 bool DependencyFileNinja() const { return dependency_file_ninja_; }
147
148 const vector<string>& InputFiles() const { return input_files_; }
149
150 // Path to the output file. This is used only when there is only one
151 // output file for the invocation. When there are multiple outputs
152 // (e.g. compile multiple AIDL files), output files are created under
153 // OutputDir().
154 const string& OutputFile() const { return output_file_; }
155
156 // Path to the directory where output file(s) will be generated under.
157 const string& OutputDir() const { return output_dir_; }
158
159 // Path to the directory where header file(s) will be generated under.
160 // Only used when TargetLanguage() == Language::CPP
161 const string& OutputHeaderDir() const { return output_header_dir_; }
162
163 bool FailOnParcelable() const { return fail_on_parcelable_; }
164
Jiyong Park309668e2018-07-28 16:55:44 +0900165 int Version() const { return version_; }
166
Paul Trautrimb77048c2020-01-21 16:39:32 +0900167 string Hash() const { return hash_; }
168
Jiyong Parkce50e262018-10-29 09:54:20 +0900169 bool GenLog() const { return gen_log_; }
170
Jooyung Han252657e2021-02-27 02:51:39 +0900171 bool DumpNoLicense() const { return dump_no_license_; }
172
Jiyong Park6f77e0c2018-07-28 16:55:44 +0900173 bool Ok() const { return error_message_.stream_.str().empty(); }
Jiyong Park74595c12018-07-23 15:22:50 +0900174
Jiyong Park6f77e0c2018-07-28 16:55:44 +0900175 string GetErrorMessage() const { return error_message_.stream_.str(); }
Jiyong Park74595c12018-07-23 15:22:50 +0900176
177 string GetUsage() const;
Andreas Gampee9c816e2018-03-14 09:05:48 -0700178
Andrei Onea8714b022019-02-01 18:55:54 +0000179 bool GenApiMapping() const { return task_ == Task::DUMP_MAPPINGS; }
180
Jooyung Han808a2a02020-12-28 16:46:54 +0900181 DiagnosticMapping GetDiagnosticMapping() const { return warning_options_.GetDiagnosticMapping(); }
Jooyung Han888c5bc2020-12-22 17:28:47 +0900182
Steven Morelandda0654f2018-07-17 12:24:38 -0700183 // The following are for testability, but cannot be influenced on the command line.
Andreas Gampee9c816e2018-03-14 09:05:48 -0700184 // Threshold of interface methods to enable outlining of onTransact cases.
185 size_t onTransact_outline_threshold_{275u};
186 // Number of cases to _not_ outline, if outlining is enabled.
187 size_t onTransact_non_outline_count_{275u};
188
Christopher Wiley4427d862015-09-14 11:07:39 -0700189 private:
Jiyong Park74595c12018-07-23 15:22:50 +0900190 Options() = default;
Christopher Wiley4427d862015-09-14 11:07:39 -0700191
Jiyong Park74595c12018-07-23 15:22:50 +0900192 const string myname_;
193 Language language_ = Language::UNSPECIFIED;
194 Task task_ = Task::COMPILE;
Jooyung Hanb8a97772021-01-19 01:27:38 +0900195 CheckApiLevel check_api_level_ = CheckApiLevel::COMPATIBLE;
Jiyong Park8c380532018-08-30 14:55:26 +0900196 set<string> import_dirs_;
Jiyong Park74595c12018-07-23 15:22:50 +0900197 vector<string> preprocessed_files_;
198 string dependency_file_;
Steven Moreland46931082022-02-04 18:24:18 +0000199 bool gen_rpc_ = false;
Jiyong Park74595c12018-07-23 15:22:50 +0900200 bool gen_traces_ = false;
201 bool gen_transaction_names_ = false;
202 bool dependency_file_ninja_ = false;
Steven Morelanda57d0a62019-07-30 09:41:14 -0700203 bool structured_ = false;
204 Stability stability_ = Stability::UNSPECIFIED;
Jiyong Park223274e2021-09-24 14:14:12 +0900205 uint32_t min_sdk_version_ = 0; // invalid version
Jiyong Park74595c12018-07-23 15:22:50 +0900206 string output_dir_;
207 string output_header_dir_;
208 bool fail_on_parcelable_ = false;
209 bool auto_dep_file_ = false;
210 vector<string> input_files_;
211 string output_file_;
Jiyong Park309668e2018-07-28 16:55:44 +0900212 int version_ = 0;
Paul Trautrimb77048c2020-01-21 16:39:32 +0900213 string hash_ = "";
Jiyong Parkce50e262018-10-29 09:54:20 +0900214 bool gen_log_ = false;
Jooyung Han252657e2021-02-27 02:51:39 +0900215 bool dump_no_license_ = false;
Jiyong Park6f77e0c2018-07-28 16:55:44 +0900216 ErrorMessage error_message_;
Jooyung Han888c5bc2020-12-22 17:28:47 +0900217 WarningOptions warning_options_;
Adam Lesinskiffa16862014-01-23 18:17:42 -0800218};
219
Jooyung Han9435e9a2021-01-06 10:16:31 +0900220std::string to_string(Options::Language language);
Jooyung Han74406c52021-11-06 06:17:36 +0900221android::base::Result<uint32_t> MinSdkVersionFromString(const std::string& str);
Jooyung Han9435e9a2021-01-06 10:16:31 +0900222
Christopher Wiley4427d862015-09-14 11:07:39 -0700223} // namespace aidl
Steven Morelandf4c64df2019-07-29 19:54:04 -0700224} // namespace android