On Mon, Apr 27, 2015 at 11:14 AM, Paul Robinson < [email protected]> 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 > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
