r235903 - Support generating NMake/Jom-style depfiles.

Sean Silva chisophugis at gmail.com
Mon Apr 27 12:24:57 PDT 2015


On Mon, Apr 27, 2015 at 11:14 AM, Paul Robinson <
paul_robinson at playstation.sony.com> wrote:

> Author: probinson
> Date: Mon Apr 27 13:14:32 2015
> New Revision: 235903
>
> URL: http://llvm.org/viewvc/llvm-project?rev=235903&view=rev
> Log:
> Support generating NMake/Jom-style depfiles.
>
> NMake is a Make-like builder that comes with Microsoft Visual Studio.
> Jom (https://wiki.qt.io/Jom) is an NMake-compatible build tool.
> Dependency files for NMake/Jom need to use double-quotes to wrap
> filespecs containing special characters, instead of the backslash
> escapes that GNU Make wants.
>
> Adds the -MV option, which specifies to use double-quotes as needed
> instead of backslash escapes when writing the dependency file.
>
> Differential Revision: http://reviews.llvm.org/D9260
>
> Modified:
>     cfe/trunk/docs/UsersManual.rst
>     cfe/trunk/include/clang/Driver/Options.td
>     cfe/trunk/include/clang/Frontend/DependencyOutputOptions.h
>     cfe/trunk/lib/Driver/Tools.cpp
>     cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>     cfe/trunk/lib/Frontend/DependencyFile.cpp
>     cfe/trunk/test/Frontend/dependency-gen-escaping.c
>
> Modified: cfe/trunk/docs/UsersManual.rst
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/UsersManual.rst?rev=235903&r1=235902&r2=235903&view=diff
>
> ==============================================================================
> --- cfe/trunk/docs/UsersManual.rst (original)
> +++ cfe/trunk/docs/UsersManual.rst Mon Apr 27 13:14:32 2015
> @@ -589,6 +589,25 @@ Current limitations
>     translated from debug annotations. That translation can be lossy,
>     which results in some remarks having no location information.
>
> +Other Options
> +-------------
> +Clang options that that don't fit neatly into other categories.
> +
> +.. option:: -MV
> +
> +  When emitting a dependency file, use formatting conventions appropriate
> +  for NMake or Jom. Ignored unless another option causes Clang to emit a
> +  dependency file.
> +
> +When Clang emits a dependency file (e.g., you supplied the -M option)
> +most filenames can be written to the file without any special formatting.
> +Different Make tools will treat different sets of characters as "special"
> +and use different conventions for telling the Make tool that the character
> +is actually part of the filename. Normally Clang uses backslash to
> "escape"
> +a special character, which is the convention used by GNU Make. The -MV
> +option tells Clang to put double-quotes around the entire filename, which
> +is the convention used by NMake and Jom.
> +
>
>  Language and Target-Independent Features
>  ========================================
>
> Modified: cfe/trunk/include/clang/Driver/Options.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=235903&r1=235902&r2=235903&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Driver/Options.td (original)
> +++ cfe/trunk/include/clang/Driver/Options.td Mon Apr 27 13:14:32 2015
> @@ -250,6 +250,8 @@ def MQ : JoinedOrSeparate<["-"], "MQ">,
>      HelpText<"Specify name of main file output to quote in depfile">;
>  def MT : JoinedOrSeparate<["-"], "MT">, Group<M_Group>,
> Flags<[CC1Option]>,
>      HelpText<"Specify name of main file output in depfile">;
> +def MV : Flag<["-"], "MV">, Group<M_Group>, Flags<[CC1Option]>,
> +    HelpText<"Use NMake/Jom format for the depfile">;
>  def Mach : Flag<["-"], "Mach">;
>  def O0 : Flag<["-"], "O0">, Group<O_Group>, Flags<[CC1Option]>;
>  def O4 : Flag<["-"], "O4">, Group<O_Group>, Flags<[CC1Option]>;
>
> Modified: cfe/trunk/include/clang/Frontend/DependencyOutputOptions.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/DependencyOutputOptions.h?rev=235903&r1=235902&r2=235903&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/DependencyOutputOptions.h (original)
> +++ cfe/trunk/include/clang/Frontend/DependencyOutputOptions.h Mon Apr 27
> 13:14:32 2015
> @@ -15,6 +15,9 @@
>
>  namespace clang {
>
> +/// DependencyOutputFormat - Format for the compiler dependency file.
> +enum class DependencyOutputFormat { Make, NMake };
> +
>  /// DependencyOutputOptions - Options for controlling the compiler
> dependency
>  /// file generation.
>  class DependencyOutputOptions {
> @@ -27,7 +30,10 @@ public:
>    unsigned AddMissingHeaderDeps : 1; ///< Add missing headers to
> dependency list
>    unsigned PrintShowIncludes : 1; ///< Print cl.exe style /showIncludes
> info.
>    unsigned IncludeModuleFiles : 1; ///< Include module file dependencies.
> -
> +
> +  /// The format for the dependency file.
> +  DependencyOutputFormat OutputFormat;
> +
>    /// The file to write dependency output to.
>    std::string OutputFile;
>
> @@ -55,6 +61,7 @@ public:
>      AddMissingHeaderDeps = 0;
>      PrintShowIncludes = 0;
>      IncludeModuleFiles = 0;
> +    OutputFormat = DependencyOutputFormat::Make;
>    }
>  };
>
>
> Modified: cfe/trunk/lib/Driver/Tools.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=235903&r1=235902&r2=235903&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Driver/Tools.cpp (original)
> +++ cfe/trunk/lib/Driver/Tools.cpp Mon Apr 27 13:14:32 2015
> @@ -338,6 +338,7 @@ void Clang::AddPreprocessingOptions(Comp
>    }
>
>    Args.AddLastArg(CmdArgs, options::OPT_MP);
> +  Args.AddLastArg(CmdArgs, options::OPT_MV);
>
>    // Convert all -MQ <target> args to -MT <quoted target>
>    for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
>
> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=235903&r1=235902&r2=235903&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Mon Apr 27 13:14:32 2015
> @@ -661,6 +661,8 @@ static void ParseDependencyOutputArgs(De
>    Opts.DOTOutputFile = Args.getLastArgValue(OPT_dependency_dot);
>    Opts.ModuleDependencyOutputDir =
>        Args.getLastArgValue(OPT_module_dependency_dir);
> +  if (Args.hasArg(OPT_MV))
> +    Opts.OutputFormat = DependencyOutputFormat::NMake;
>  }
>
>  bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,
>
> Modified: cfe/trunk/lib/Frontend/DependencyFile.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/DependencyFile.cpp?rev=235903&r1=235902&r2=235903&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Frontend/DependencyFile.cpp (original)
> +++ cfe/trunk/lib/Frontend/DependencyFile.cpp Mon Apr 27 13:14:32 2015
> @@ -150,6 +150,8 @@ class DFGImpl : public PPCallbacks {
>    bool AddMissingHeaderDeps;
>    bool SeenMissingHeader;
>    bool IncludeModuleFiles;
> +  DependencyOutputFormat OutputFormat;
> +
>  private:
>    bool FileMatchesDepCriteria(const char *Filename,
>                                SrcMgr::CharacteristicKind FileType);
> @@ -162,7 +164,8 @@ public:
>        PhonyTarget(Opts.UsePhonyTargets),
>        AddMissingHeaderDeps(Opts.AddMissingHeaderDeps),
>        SeenMissingHeader(false),
> -      IncludeModuleFiles(Opts.IncludeModuleFiles) {}
> +      IncludeModuleFiles(Opts.IncludeModuleFiles),
> +      OutputFormat(Opts.OutputFormat) {}
>
>    void FileChanged(SourceLocation Loc, FileChangeReason Reason,
>                     SrcMgr::CharacteristicKind FileType,
> @@ -290,8 +293,23 @@ void DFGImpl::AddFilename(StringRef File
>  }
>
>  /// PrintFilename - GCC escapes spaces, # and $, but apparently not ' or
> " or
> -/// other scary characters.
> -static void PrintFilename(raw_ostream &OS, StringRef Filename) {
> +/// other scary characters. NMake/Jom has a different set of scary
> characters,
> +/// but wraps filespecs in double-quotes to avoid misinterpreting them;
> +/// https://msdn.microsoft.com/en-us/library/dd9y37ha.aspx for NMake
> info,
> +///
> https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
> +/// for Windows file-naming info.
> +static void PrintFilename(raw_ostream &OS, StringRef Filename,
> +                          DependencyOutputFormat OutputFormat) {
> +  if (OutputFormat == DependencyOutputFormat::NMake) {
> +    // Add quotes if needed. These are the characters listed as "special"
> to
> +    // NMake, that are legal in a Windows filespec, and that could cause
> +    // misinterpretation of the dependency string.
> +    if (Filename.find_first_of(" #${}^!") != StringRef::npos)
> +      OS << '\"' << Filename << '\"';
> +    else
> +      OS << Filename;
> +    return;
> +  }
>    for (unsigned i = 0, e = Filename.size(); i != e; ++i) {
>      if (Filename[i] == ' ' || Filename[i] == '#')
>        OS << '\\';
> @@ -354,7 +372,7 @@ void DFGImpl::OutputDependencyFile() {
>        Columns = 2;
>      }
>      OS << ' ';
> -    PrintFilename(OS, *I);
> +    PrintFilename(OS, *I, OutputFormat);
>      Columns += N + 1;
>    }
>    OS << '\n';
> @@ -365,7 +383,7 @@ void DFGImpl::OutputDependencyFile() {
>      for (std::vector<std::string>::iterator I = Files.begin() + 1,
>             E = Files.end(); I != E; ++I) {
>        OS << '\n';
> -      PrintFilename(OS, *I);
> +      PrintFilename(OS, *I, OutputFormat);
>        OS << ":\n";
>      }
>    }
>
> Modified: cfe/trunk/test/Frontend/dependency-gen-escaping.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/dependency-gen-escaping.c?rev=235903&r1=235902&r2=235903&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Frontend/dependency-gen-escaping.c (original)
> +++ cfe/trunk/test/Frontend/dependency-gen-escaping.c Mon Apr 27 13:14:32
> 2015
> @@ -4,13 +4,22 @@
>  // RUN: echo > '%t.dir/    .h'
>  // RUN: echo > '%t.dir/$$.h'
>  // RUN: echo > '%t.dir/##.h'
> +// RUN: echo > '%t.dir/normal.h'
>  // RUN: cd %t.dir
>  // RUN: %clang -MD -MF - %s -fsyntax-only -I. | FileCheck
> -strict-whitespace %s
> +// RUN: %clang -MD -MF - -MV %s -fsyntax-only -I. | FileCheck
> -strict-whitespace %s --check-prefix=QUOTE
>
>  // CHECK: \ \ \ \ .h
>  // CHECK: $$$$.h
>  // CHECK: \#\#.h
> +// QUOTE: "    .h"
> +// QUOTE: "$$.h"
> +// QUOTE: "##.h"
> +// QUOTE-NOT: "
> +// QUOTE: normal.h
> +// QUOTE-NOT: "
>
>  #include "    .h"
>  #include "$$.h"
>  #include "##.h"
> +#include "normal.h"
>

Did you mean to update this to --check-prefix=NMAKE or something like that
when you changed from a `bool Quote` to using the enum?

-- Sean Silva


>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150427/5eb16d7d/attachment.html>


More information about the cfe-commits mailing list