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