| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file Copyright.txt or https://cmake.org/licensing for details. */ |
| |
| #include <fstream> |
| #include <iostream> |
| #include <string> |
| |
| #include "third_party/def_parser/def_parser.h" |
| |
| static const char* ws = " \t\n\r\f\v"; |
| |
| inline void trim(std::string *str) { |
| // Remove prefixing spaces |
| str->erase(0, str->find_first_not_of(ws)); |
| // Remove suffixing spaces |
| str->erase(str->find_last_not_of(ws) + 1); |
| } |
| |
| int main(int argc, char* argv[]) { |
| if (argc < 4) { |
| std::cerr << "Usage: output_def_file dllname [objfile ...] [input_deffile ...] [@paramfile ...]\n"; |
| std::cerr << "output_deffile: the output DEF file\n"; |
| std::cerr << "\n"; |
| std::cerr << "dllname: the DLL name this DEF file is used for, if dllname is not empty\n"; |
| std::cerr << " string (eg. ""), def_parser writes an 'LIBRARY <dllname>' entry\n"; |
| std::cerr << " into DEF file.\n"; |
| std::cerr << "\n"; |
| std::cerr << "objfile: a object file, def_parser parses this file to find symbols,\n"; |
| std::cerr << " then merges them into final result.\n"; |
| std::cerr << " Can apppear multiple times.\n"; |
| std::cerr << "\n"; |
| std::cerr << "input_deffile: an existing def file, def_parser merges all symbols in this file.\n"; |
| std::cerr << " Can appear multiple times.\n"; |
| std::cerr << "\n"; |
| std::cerr << "@paramfile: a parameter file that can contain objfile and input_deffile.\n"; |
| std::cerr << " Can appear multiple time.\n"; |
| return 1; |
| } |
| |
| std::wstring filenameW = AsAbsoluteWindowsPath(argv[1]); |
| FILE* fout = _wfopen(filenameW.c_str(), L"w+"); |
| if (!fout) { |
| std::cerr << "Could not open output .def file: " << argv[1] << "\n"; |
| return 1; |
| } |
| |
| DefParser deffile; |
| |
| deffile.SetDLLName(argv[2]); |
| |
| for (int i = 3; i < argc; i++) { |
| // If the argument starts with @, then treat it as a parameter file. |
| if (argv[i][0] == '@') { |
| filenameW = AsAbsoluteWindowsPath(argv[i] + 1); |
| std::ifstream paramfile(filenameW.c_str(), std::ios::in | std::ios::binary); |
| if (!paramfile) { |
| std::cerr << "Could not open parameter file: " << argv[i] << "\n"; |
| return 1; |
| } |
| std::string file; |
| while (std::getline(paramfile, file)) { |
| trim(&file); |
| if (!deffile.AddFile(file)) { |
| return 1; |
| } |
| } |
| } else { |
| std::string file(argv[i]); |
| trim(&file); |
| if (!deffile.AddFile(argv[i])) { |
| return 1; |
| } |
| } |
| } |
| |
| deffile.WriteFile(fout); |
| fclose(fout); |
| return 0; |
| } |