internal static void GetSharpmakeIncludesFromLine( string line, FileInfo sourceFilePath, int lineNumber, ref List <string> includes ) { Match match = s_includeRegex.Match(line); for (; match.Success; match = match.NextMatch()) { string includeFilename = match.Groups["INCLUDE"].ToString(); string resolvedIncludeFilename = ""; if (!Path.IsPathRooted(includeFilename)) { resolvedIncludeFilename = Util.PathGetAbsolute(sourceFilePath.DirectoryName, includeFilename); } else { resolvedIncludeFilename = includeFilename; } if (!Util.FileExists(resolvedIncludeFilename)) { resolvedIncludeFilename = Util.GetCapitalizedPath(resolvedIncludeFilename); } if (!Util.FileExists(resolvedIncludeFilename)) { throw new Error("\t" + sourceFilePath.FullName + "(" + lineNumber + "): error: Sharpmake.Include file not found {0}", includeFilename); } includes.Add(resolvedIncludeFilename); } }
private string MatchIncludeInParentPath(string filePath, string initialDirectory, IncludeType includeMatchType) { string matchPath = Path.Combine(initialDirectory, filePath); bool matchPathExists = Util.FileExists(matchPath); if (matchPathExists && includeMatchType == IncludeType.NearestMatchInParentPath) { return(matchPath); } // backtrace one level in the path string matchResult = null; DirectoryInfo info = Directory.GetParent(initialDirectory); if (info != null) { string parentPath = info.FullName; if (!parentPath.Equals(initialDirectory)) { matchResult = MatchIncludeInParentPath(filePath, parentPath, includeMatchType); } } if (matchPathExists && matchResult == null) { return(matchPath); } return(matchResult); }
public override void ParseParameter(string[] parameters, FileInfo sourceFilePath, int lineNumber, IAssemblerContext context) { string includeFilename = parameters[0]; IncludeType matchType = IncludeType.Relative; if (parameters.Length > 1) { string incType = parameters[1].Replace("Sharpmake.", ""); incType = incType.Replace("IncludeType.", ""); if (!Enum.TryParse <IncludeType>(incType, out matchType)) { throw new Error("\t" + sourceFilePath.FullName + "(" + lineNumber + "): error: Sharpmake.Include invalid include type used ({0})", parameters[1]); } } string includeAbsolutePath = Path.IsPathRooted(includeFilename) ? includeFilename : null; if (Util.IsPathWithWildcards(includeFilename)) { if (matchType != IncludeType.Relative) { throw new Error("\t" + sourceFilePath.FullName + "(" + lineNumber + "): error: Sharpmake.Include with non-relative match types, wildcards are not supported ({0})", includeFilename); } includeAbsolutePath = includeAbsolutePath ?? Path.Combine(sourceFilePath.DirectoryName, includeFilename); context.AddSourceFiles(Util.DirectoryGetFilesWithWildcards(includeAbsolutePath)); } else { includeAbsolutePath = includeAbsolutePath ?? Util.PathGetAbsolute(sourceFilePath.DirectoryName, includeFilename); if (matchType == IncludeType.Relative) { if (!Util.FileExists(includeAbsolutePath)) { includeAbsolutePath = Util.GetCapitalizedPath(includeAbsolutePath); } } else { string matchIncludeInParentPath = MatchIncludeInParentPath(includeFilename, sourceFilePath.DirectoryName, matchType); if (matchIncludeInParentPath == null) { throw new Error("\t" + sourceFilePath.FullName + "(" + lineNumber + "): error: Sharpmake.Include file not found '{0}'[{1}]. Search started from '{2}'", includeFilename, matchType, sourceFilePath.DirectoryName); } includeAbsolutePath = Util.GetCapitalizedPath(matchIncludeInParentPath); } if (!Util.FileExists(includeAbsolutePath)) { throw new Error("\t" + sourceFilePath.FullName + "(" + lineNumber + "): error: Sharpmake.Include file not found {0}", includeFilename); } context.AddSourceFile(includeAbsolutePath); } }
protected void FixupPrecompiledHeaderOptions(IGenerationContext context) { var options = context.Options; var cmdLineOptions = context.CommandLineOptions; var conf = context.Configuration; if (options["UsePrecompiledHeader"] == "NotUsing") { options["UsePrecompiledHeader"] = FileGeneratorUtilities.RemoveLineTag; } else { Strings pathsToConsider = new Strings(context.ProjectSourceCapitalized); pathsToConsider.AddRange(context.Project.AdditionalSourceRootPaths); pathsToConsider.AddRange(GetIncludePaths(context)); string pchFileSourceRelative = context.Options["PrecompiledHeaderThrough"]; string pchFileVcxprojRelative = null; bool foundPchInclude = false; foreach (var includePath in pathsToConsider) { var pchFile = Util.PathGetAbsolute(includePath, pchFileSourceRelative); if (conf.Project.ResolvedSourceFiles.Contains(pchFile)) { pchFileVcxprojRelative = Util.PathGetRelative(context.ProjectDirectory, pchFile, true); foundPchInclude = true; break; } } if (!foundPchInclude) { foreach (var includePath in pathsToConsider) { var pchFile = Util.PathGetAbsolute(includePath, pchFileSourceRelative); if (Util.FileExists(pchFile)) { pchFileVcxprojRelative = Util.PathGetRelative(context.ProjectDirectory, pchFile, true); foundPchInclude = true; break; } } } if (!foundPchInclude) { throw new Error($"Sharpmake couldn't locate the PCH '{pchFileSourceRelative}' in {conf}"); } context.Options["PrecompiledHeaderThrough"] = pchFileVcxprojRelative; } }
public override void ParseParameter(string[] parameters, FileInfo sourceFilePath, int lineNumber, IAssemblerContext context) { string includeFilename = parameters[0]; string includeAbsolutePath; if (Path.IsPathRooted(includeFilename)) { includeAbsolutePath = includeFilename; } else if (Util.IsPathWithWildcards(includeFilename)) { includeAbsolutePath = Path.Combine(sourceFilePath.DirectoryName, includeFilename); } else { includeAbsolutePath = Util.PathGetAbsolute(sourceFilePath.DirectoryName, includeFilename); } IAssemblyInfo assemblyInfo; if (s_assemblies.TryGetValue(includeAbsolutePath, out assemblyInfo)) { if (assemblyInfo == null) { throw new Error($"Circular Sharpmake.Package dependency on {includeFilename}"); } context.AddReference(assemblyInfo); return; } s_assemblies[includeAbsolutePath] = null; string[] files; if (Util.IsPathWithWildcards(includeFilename)) { files = Util.DirectoryGetFilesWithWildcards(includeAbsolutePath); } else { if (!Util.FileExists(includeAbsolutePath)) { includeAbsolutePath = Util.GetCapitalizedPath(includeAbsolutePath); } if (!Util.FileExists(includeAbsolutePath)) { throw new Error("\t" + sourceFilePath.FullName + "(" + lineNumber + "): error: Sharpmake.Package file not found {0}", includeFilename); } files = new string[] { includeAbsolutePath }; } assemblyInfo = context.BuildLoadAndAddReferenceToSharpmakeFilesAssembly(files); s_assemblies[includeAbsolutePath] = assemblyInfo; }
public override void ParseParameter(string[] parameters, FileInfo sourceFilePath, int lineNumber, IAssemblerContext context) { string reference = parameters[0]; if (Util.IsPathWithWildcards(reference)) { string referenceAbsolutePath = Path.IsPathRooted(reference) ? reference : null; referenceAbsolutePath = referenceAbsolutePath ?? Path.Combine(sourceFilePath.DirectoryName, reference); context.AddReferences(Util.DirectoryGetFilesWithWildcards(referenceAbsolutePath)); } else { bool foundReference = false; foundReference = Assembler.DefaultReferences.Any( defaultReference => FileSystemStringComparer.StaticCompare(defaultReference, reference) == 0 ); if (!foundReference) { foreach (string candidateReferenceLocation in EnumerateReferencePathCandidates(sourceFilePath, reference)) { if (Util.FileExists(candidateReferenceLocation)) { context.AddReference(candidateReferenceLocation); foundReference = true; break; } } } else if (Builder.Instance.Diagnostics) { Util.LogWrite("{0}({1}): Warning: Reference '{2}' is redundant and can be removed since it is in the default reference list.", sourceFilePath.FullName, lineNumber, reference); } if (!foundReference) { throw new Error( "\t{0}({1}): error: Sharpmake.Reference file not found: {2}{3}Those paths were evaluated as candidates:{3} - {4}", sourceFilePath.FullName, lineNumber, reference, Environment.NewLine, string.Join(Environment.NewLine + " - ", EnumerateReferencePathCandidates(sourceFilePath, reference)) ); } } }
internal static void GetSharpmakeReferencesFromLine( string line, FileInfo sourceFilePath, int lineNumber, ref List <string> references ) { Match match = s_referenceRegex.Match(line); for (; match.Success; match = match.NextMatch()) { string referenceRelativePath = match.Groups["REFERENCE"].ToString(); string referencePath = ""; // Try next to the source file that reference it (if relative path) if (!Path.IsPathRooted(referenceRelativePath)) { referencePath = Util.PathGetAbsolute(sourceFilePath.DirectoryName, referenceRelativePath); } if (!Util.FileExists(referencePath)) { // Try next to the Sharpmake binary referencePath = Util.PathGetAbsolute(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), referenceRelativePath); if (!File.Exists(referencePath)) { // Try in the current working directory referencePath = Util.PathGetAbsolute(Directory.GetCurrentDirectory(), referenceRelativePath); if (!File.Exists(referencePath)) { // Try using .net framework locations referencePath = GetAssemblyDllPath(referenceRelativePath); if (referencePath == null) { throw new Error("\t" + sourceFilePath.FullName + "(" + lineNumber + "): error: Sharpmake.Reference file not found: {0}", referenceRelativePath); } } } } references.Add(referencePath); } }
public override void ParseParameter(string[] parameters, FileInfo sourceFilePath, int lineNumber, IAssemblerContext context) { string reference = parameters[0]; if (Util.IsPathWithWildcards(reference)) { string referenceAbsolutePath = Path.IsPathRooted(reference) ? reference : null; referenceAbsolutePath = referenceAbsolutePath ?? Path.Combine(sourceFilePath.DirectoryName, reference); context.AddReferences(Util.DirectoryGetFilesWithWildcards(referenceAbsolutePath)); } else { bool foundReference = false; foreach (string candidateReferenceLocation in EnumerateReferencePathCandidates(sourceFilePath, reference)) { if (Util.FileExists(candidateReferenceLocation)) { context.AddReference(candidateReferenceLocation); foundReference = true; break; } } if (!foundReference) { throw new Error( "\t{0}({1}): error: Sharpmake.Reference file not found: {2}{3}Those paths were evaluated as candidates:{3} - {4}", sourceFilePath.FullName, lineNumber, reference, Environment.NewLine, string.Join(Environment.NewLine + " - ", EnumerateReferencePathCandidates(sourceFilePath, reference)) ); } } }