@@ -751,24 +751,40 @@ namespace {
751751llvm::cl::OptionCategory cat (" cpp-rule-preprocessor options" );
752752
753753llvm::cl::opt<std::string>
754- SrcFile ( " file " ,
755- llvm::cl::desc (" Path to a rule's src.c or src.cpp. ir_src.json is "
756- " written next to it " ),
757- llvm::cl::value_desc(" src.c|src.cpp " ), llvm::cl::Required,
758- llvm::cl::cat(cat));
754+ SrcDir ( " dir " ,
755+ llvm::cl::desc (" Path to a rule directory containing src.c and/or "
756+ " src.cpp. ir_src.json is written into this dir. " ),
757+ llvm::cl::value_desc(" rule-dir " ), llvm::cl::Required,
758+ llvm::cl::cat(cat));
759759
760760} // namespace
761761
762762int main (int argc, char *argv[]) {
763763 llvm::cl::HideUnrelatedOptions (cat);
764764 llvm::cl::ParseCommandLineOptions (argc, argv);
765765
766- fs::path src = SrcFile.getValue ();
767- llvm::errs () << " Preprocessing " << src.string () << ' \n ' ;
766+ fs::path dir = SrcDir.getValue ();
768767 llvm::json::Object root;
769- cpp2rust::Extract (src, root);
768+ for (const char *name : {" src.c" , " src.cpp" }) {
769+ auto path = dir / name;
770+ if (!fs::exists (path)) {
771+ continue ;
772+ }
773+ llvm::errs () << " Preprocessing " << path.string () << ' \n ' ;
774+ llvm::json::Object file_root;
775+ cpp2rust::Extract (path, file_root);
776+ for (auto &[k, v] : file_root) {
777+ if (root.find (k) != root.end ()) {
778+ llvm::errs () << " ERROR: rule name " << k.str ()
779+ << " defined in multiple files in " << dir.string ()
780+ << ' \n ' ;
781+ return EXIT_FAILURE;
782+ }
783+ root[k] = std::move (v);
784+ }
785+ }
770786
771- auto out_path = src. parent_path () / " ir_src.json" ;
787+ auto out_path = dir / " ir_src.json" ;
772788 std::error_code ec;
773789 llvm::raw_fd_ostream out (out_path.string (), ec);
774790 if (ec) {
0 commit comments