From 9c7aaf839025e58b25d1bb37afb2c11d36985dcb Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 11 Sep 2023 11:59:27 +0200 Subject: Add --dep-file option In particular, this now allows writing the dependency information to stdout by specifying `-` as this option's value. --- xsd/xsd/cxx/options.cli | 14 ++++++++-- xsd/xsd/cxx/tree/generator.cxx | 47 +++++++++++++++++++++----------- xsd/xsd/pregenerated/xsd/cxx/options.cxx | 12 ++++++-- xsd/xsd/pregenerated/xsd/cxx/options.hxx | 8 ++++++ xsd/xsd/pregenerated/xsd/cxx/options.ixx | 12 ++++++++ 5 files changed, 72 insertions(+), 21 deletions(-) (limited to 'xsd/xsd') diff --git a/xsd/xsd/cxx/options.cli b/xsd/xsd/cxx/options.cli index 1eb1b61..1be7607 100644 --- a/xsd/xsd/cxx/options.cli +++ b/xsd/xsd/cxx/options.cli @@ -500,7 +500,7 @@ namespace CXX generated files on the main schema file as well as all the schema files that it includes/imports, transitively. This dependency file is then normally included into the main \cb{makefile} to implement - automatic dependency tracking. + automatic dependency tracking. See also the \cb{--dep-*} options. Note also that automatic dependency generation is not supported in the file-per-type mode (\cb{--file-per-type}). In this case, all @@ -536,8 +536,16 @@ namespace CXX NarrowString --dep-suffix = ".d" { "", - "Use the provided instead of the default \cb{.d} to - construct the name of the dependency file." + "Use instead of the default \cb{.d} to construct the name of + the dependency file. See also \cb{--dep-file}." + }; + + NarrowString --dep-file + { + "", + "Use as the generated dependency file path instead of deriving + it from the input file name. Write the dependency information to + \cb{stdout} if is \cb{-}. See also \cb{--dep-regex}." }; NarrowString --dep-regex diff --git a/xsd/xsd/cxx/tree/generator.cxx b/xsd/xsd/cxx/tree/generator.cxx index d3e4db2..9782b4d 100644 --- a/xsd/xsd/cxx/tree/generator.cxx +++ b/xsd/xsd/cxx/tree/generator.cxx @@ -54,6 +54,8 @@ using namespace XSDFrontend::SemanticGraph; // // +typedef std::wostream WideOutputStream; + typedef std::wifstream WideInputFileStream; typedef std::wofstream WideOutputFileStream; @@ -344,9 +346,13 @@ namespace CXX ? "#^(.+?)(\\.[^./\\\\]+)?$#$1" + fwd_suffix + "#" : ops.fwd_regex ()); - Regex dep_expr (ops.dep_regex ().empty () - ? "#^(.+?)(\\.[^./\\\\]+)?$#$1" + dep_suffix + "#" - : ops.dep_regex ()); + // @@ This will blow up if --dep-file value contains backslashes (e.g., + // it's a Windows path). + // + Regex dep_expr ( + ops.dep_regex_specified () ? ops.dep_regex () : + ops.dep_file_specified () ? "#.+#" + ops.dep_file () + "#" : + "#^(.+?)(\\.[^./\\\\]+)?$#$1" + dep_suffix + "#"); if (header && !hxx_expr.match (name)) { @@ -396,7 +402,7 @@ namespace CXX Path hxx_path (hxx_name); Path ixx_path (ixx_name); Path fwd_path (fwd_name); - Path dep_path (dep_name); + Path dep_path (dep_name != "-" ? dep_name : NarrowString ()); Paths cxx_paths; if (source) @@ -457,10 +463,11 @@ namespace CXX if (!out_dir.empty ()) { - hxx_path = out_dir / hxx_path; - ixx_path = out_dir / ixx_path; - fwd_path = out_dir / fwd_path; - dep_path = out_dir / dep_path; + if (!hxx_path.empty ()) hxx_path = out_dir / hxx_path; + if (!ixx_path.empty ()) ixx_path = out_dir / ixx_path; + if (!fwd_path.empty ()) fwd_path = out_dir / fwd_path; + if (!dep_path.empty () && + !dep_path.absolute ()) dep_path = out_dir / dep_path; for (Paths::iterator i (cxx_paths.begin ()); i != cxx_paths.end (); ++i) @@ -472,25 +479,32 @@ namespace CXX WideOutputFileStream hxx; WideOutputFileStream ixx; WideOutputFileStream fwd; - WideOutputFileStream dep; + WideOutputFileStream depf; // See dep below. WideOutputFileStreams cxx; // DEP // if (gen_dep) { - dep.open (dep_path.string ().c_str (), ios_base::out); - - if (!dep.is_open ()) + if (!dep_path.empty ()) { - wcerr << dep_path << ": error: unable to open in write mode" << endl; - throw Failed (); + depf.open (dep_path.string ().c_str (), ios_base::out); + + if (!depf.is_open ()) + { + wcerr << dep_path << ": error: unable to open in write mode" + << endl; + throw Failed (); + } + + unlinks.add (dep_path); } - unlinks.add (dep_path); // Note: not adding to file_list. } + WideOutputStream& dep (gen_dep && !dep_path.empty () ? depf : wcout); + // FWD // if (forward) @@ -683,7 +697,8 @@ namespace CXX i != cxx_paths.end (); ++i) target += " \\\n" + i->string (); - target += " \\\n" + dep_path.string (); + if (!dep_path.empty ()) + target += " \\\n" + dep_path.string (); } dep << target.c_str () << ':'; diff --git a/xsd/xsd/pregenerated/xsd/cxx/options.cxx b/xsd/xsd/pregenerated/xsd/cxx/options.cxx index 4d4fa23..9eea3a9 100644 --- a/xsd/xsd/pregenerated/xsd/cxx/options.cxx +++ b/xsd/xsd/pregenerated/xsd/cxx/options.cxx @@ -361,6 +361,8 @@ namespace CXX dep_target_specified_ (false), dep_suffix_ (".d"), dep_suffix_specified_ (false), + dep_file_ (), + dep_file_specified_ (false), dep_regex_ (), dep_regex_specified_ (false) { @@ -527,8 +529,11 @@ namespace CXX os << "--dep-target Change the target of the dependency rule." << ::std::endl; - os << "--dep-suffix Use the provided instead of the default" << ::std::endl - << " .d to construct the name of the dependency file." << ::std::endl; + os << "--dep-suffix Use instead of the default .d to" << ::std::endl + << " construct the name of the dependency file." << ::std::endl; + + os << "--dep-file Use as the generated dependency file path" << ::std::endl + << " instead of deriving it from the input file name." << ::std::endl; os << "--dep-regex Use the provided expression to construct the name" << ::std::endl << " of the dependency file." << ::std::endl; @@ -696,6 +701,9 @@ namespace CXX _cli_options_map_["--dep-suffix"] = &::cli::thunk< options, NarrowString, &options::dep_suffix_, &options::dep_suffix_specified_ >; + _cli_options_map_["--dep-file"] = + &::cli::thunk< options, NarrowString, &options::dep_file_, + &options::dep_file_specified_ >; _cli_options_map_["--dep-regex"] = &::cli::thunk< options, NarrowString, &options::dep_regex_, &options::dep_regex_specified_ >; diff --git a/xsd/xsd/pregenerated/xsd/cxx/options.hxx b/xsd/xsd/pregenerated/xsd/cxx/options.hxx index b01027a..085aa4c 100644 --- a/xsd/xsd/pregenerated/xsd/cxx/options.hxx +++ b/xsd/xsd/pregenerated/xsd/cxx/options.hxx @@ -313,6 +313,12 @@ namespace CXX dep_suffix_specified () const; const NarrowString& + dep_file () const; + + bool + dep_file_specified () const; + + const NarrowString& dep_regex () const; bool @@ -428,6 +434,8 @@ namespace CXX bool dep_target_specified_; NarrowString dep_suffix_; bool dep_suffix_specified_; + NarrowString dep_file_; + bool dep_file_specified_; NarrowString dep_regex_; bool dep_regex_specified_; }; diff --git a/xsd/xsd/pregenerated/xsd/cxx/options.ixx b/xsd/xsd/pregenerated/xsd/cxx/options.ixx index e8ba2fb..8266e31 100644 --- a/xsd/xsd/pregenerated/xsd/cxx/options.ixx +++ b/xsd/xsd/pregenerated/xsd/cxx/options.ixx @@ -585,6 +585,18 @@ namespace CXX } inline const NarrowString& options:: + dep_file () const + { + return this->dep_file_; + } + + inline bool options:: + dep_file_specified () const + { + return this->dep_file_specified_; + } + + inline const NarrowString& options:: dep_regex () const { return this->dep_regex_; -- cgit v1.1