| // Copyright 2024 The Bazel Authors. All rights reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include <fstream> |
| |
| #include "tools/cpp/modules_tools/generate-modmap/generate-modmap.h" |
| |
| int main(int argc, char *argv[]) { |
| if (argc != 5) { |
| std::cerr << "Usage: generate-modmap <ddi-file> <cpp20modules-info-file> " |
| "<output> <compiler>" |
| << std::endl; |
| std::exit(1); |
| } |
| |
| // Retrieve the values of the flags |
| std::string ddi_filename = argv[1]; |
| std::string info_filename = argv[2]; |
| std::string output = argv[3]; |
| std::string compiler = argv[4]; |
| |
| std::ifstream info_stream(info_filename); |
| if (!info_stream.is_open()) { |
| std::cerr << "ERROR: Failed to open the file " << info_filename |
| << std::endl; |
| std::exit(1); |
| } |
| std::ifstream ddi_stream(ddi_filename); |
| if (!ddi_stream.is_open()) { |
| std::cerr << "ERROR: Failed to open the file " << ddi_filename << std::endl; |
| std::exit(1); |
| } |
| auto dep = parse_ddi(ddi_stream); |
| auto info = parse_info(info_stream); |
| auto modmap = process(dep, info); |
| |
| std::string modmap_filename = output; |
| std::string modmap_dot_input_filename = modmap_filename + ".input"; |
| std::ofstream modmap_file_stream(modmap_filename); |
| std::ofstream modmap_file_dot_input_stream(modmap_dot_input_filename); |
| if (!modmap_file_stream.is_open()) { |
| std::cerr << "ERROR: Failed to open the file " << modmap_filename |
| << std::endl; |
| std::exit(1); |
| } |
| if (!modmap_file_dot_input_stream.is_open()) { |
| std::cerr << "ERROR: Failed to open the file " << modmap_dot_input_filename |
| << std::endl; |
| std::exit(1); |
| } |
| std::optional<ModmapItem> generated; |
| if (dep.gen_bmi) { |
| ModmapItem item; |
| item.name = dep.name; |
| item.path = info.modules[dep.name]; |
| generated = item; |
| } |
| write_modmap(modmap_file_stream, modmap_file_dot_input_stream, modmap, |
| compiler, generated); |
| modmap_file_stream.close(); |
| modmap_file_dot_input_stream.close(); |
| |
| return 0; |
| } |