Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
            }
        }
Exemplo n.º 4
0
        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;
            }
        }
Exemplo n.º 5
0
        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;
        }
Exemplo n.º 6
0
        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))
                              );
                }
            }
        }
Exemplo n.º 7
0
        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);
            }
        }
Exemplo n.º 8
0
        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))
                              );
                }
            }
        }