public void Test_DuplicateTrailingBackSlash() { Assert.AreEqual(string.Empty, ArgumentUtils.DuplicateTrailingBackslash(string.Empty), "#1"); Assert.AreEqual("a", ArgumentUtils.DuplicateTrailingBackslash("a"), "#2"); Assert.AreEqual("a\\\\", ArgumentUtils.DuplicateTrailingBackslash("a\\"), "#3"); Assert.AreEqual("\"a\\\\\"", ArgumentUtils.DuplicateTrailingBackslash("\"a\\\""), "#4"); Assert.AreEqual("a\\\"", ArgumentUtils.DuplicateTrailingBackslash("a\\\""), "#5"); }
internal override string MapValue(string value) { if (IgnoreEmptyValue && String.IsNullOrEmpty(value)) { return(null); } if (Name == null) { return(ArgumentUtils.DuplicateTrailingBackslash(value)); } return(Name + ArgumentUtils.DuplicateTrailingBackslash(value)); }
/// <summary> /// Compiles the sources. /// </summary> protected override void ExecuteTask() { // ensure base directory is set, even if fileset was not initialized // from XML if (Sources.BaseDirectory == null) { Sources.BaseDirectory = new DirectoryInfo(Project.BaseDirectory); } if (IncludeDirs.BaseDirectory == null) { IncludeDirs.BaseDirectory = new DirectoryInfo(Project.BaseDirectory); } if (MetaDataIncludeDirs.BaseDirectory == null) { MetaDataIncludeDirs.BaseDirectory = new DirectoryInfo(Project.BaseDirectory); } if (ForcedUsingFiles.BaseDirectory == null) { ForcedUsingFiles.BaseDirectory = new DirectoryInfo(Project.BaseDirectory); } if (NeedsCompiling()) { Log(Level.Info, "Compiling {0} files to '{1}'.", _dirtySources.Count, OutputDir.FullName); // create temp response file to hold compiler options _responseFileName = Path.GetTempFileName(); StreamWriter writer = new StreamWriter(_responseFileName); try { // write basic switches writer.WriteLine("/c"); // compile only if (Options != null) { // write user defined options writer.WriteLine(Options); } if (ManagedExtensions) { // enables Managed Extensions for C++ writer.WriteLine("/clr"); } // write preprocesser define(s) foreach (Option define in Defines) { if (!define.IfDefined || define.UnlessDefined) { continue; } if (define.Value == null) { writer.WriteLine("/D " + QuoteArgumentValue(define.OptionName)); } else { writer.WriteLine("/D " + QuoteArgumentValue(define.OptionName + "=" + ArgumentUtils.DuplicateTrailingBackslash(define.Value))); } } // write preprocesser undefine(s) foreach (Option undefine in Undefines) { if (!undefine.IfDefined || undefine.UnlessDefined) { continue; } writer.WriteLine("/U " + QuoteArgumentValue(undefine.OptionName)); } // write user provided include directories foreach (string include in IncludeDirs.DirectoryNames) { writer.WriteLine("/I {0}", QuoteArgumentValue(include)); } // write directories that the compiler will search to resolve // file references passed to the #using directive foreach (string metaDataIncludeDir in MetaDataIncludeDirs.DirectoryNames) { writer.WriteLine("/AI {0}", QuoteArgumentValue(metaDataIncludeDir)); } // writes metadata files to reference in this compilation // as an alternative to passing a file name to #using in // source code foreach (string forcedUsingFile in ForcedUsingFiles.FileNames) { writer.WriteLine("/FU {0}", QuoteArgumentValue(forcedUsingFile)); } // program database file writer.WriteLine("/Fd{0}", QuoteArgumentValue(ProgramDatabaseFile)); // the object file or output directory writer.WriteLine("/Fo{0}", QuoteArgumentValue(ObjectFile)); // specify pch file, if user specified one if (PchFile != null) { writer.WriteLine("/Fp{0}", QuoteArgumentValue(PchFile)); switch (PchMode) { case PrecompiledHeaderMode.Use: writer.Write("/Yu"); break; case PrecompiledHeaderMode.Create: writer.Write("/Yc"); break; case PrecompiledHeaderMode.AutoCreate: writer.Write("/YX"); break; } if (PchThroughFile != null) { writer.WriteLine("{0}", QuoteArgumentValue(PchThroughFile)); } } // write each of the filenames foreach (string filename in _dirtySources) { writer.WriteLine(QuoteArgumentValue(filename)); } // tell compiler which character set to use switch (CharacterSet) { case CharacterSet.Unicode: writer.WriteLine("/D \"_UNICODE\""); writer.WriteLine("/D \"UNICODE\""); break; case CharacterSet.MultiByte: writer.WriteLine("/D \"_MBCS\""); break; } writer.Close(); if (Verbose) { // display response file contents Log(Level.Info, "Contents of {0}.", _responseFileName); StreamReader reader = File.OpenText(_responseFileName); Log(Level.Info, reader.ReadToEnd()); reader.Close(); } // suppresses display of the sign-on banner // (this has no effect in response file) this.Arguments.Add(new Argument("/nologo")); // call base class to do the actual work base.ExecuteTask(); } finally { // make sure we delete response file even if an exception is thrown writer.Close(); // make sure stream is closed or file cannot be deleted File.Delete(_responseFileName); _responseFileName = null; } } }