コード例 #1
0
        private Options.ExplicitOptions GenerateOptions(AndroidPackageProject project, string projectPath, Project.Configuration conf)
        {
            Options.ExplicitOptions options = new Options.ExplicitOptions();

            options["OutputFile"] = FileGeneratorUtilities.RemoveLineTag;
            if (_Project.AppLibType != null)
            {
                Project.Configuration appLibConf = conf.ConfigurationDependencies.FirstOrDefault(confDep => (confDep.Project.GetType() == _Project.AppLibType));
                if (appLibConf != null)
                {
                    // The lib name to first load from an AndroidActivity must be a dynamic library.
                    if (appLibConf.Output != Project.Configuration.OutputType.Dll)
                    {
                        throw new Error("Cannot use configuration \"{0}\" as app lib for package configuration \"{1}\". Output type must be set to dynamic library.", appLibConf, conf);
                    }

                    options["OutputFile"] = appLibConf.TargetFileFullName;
                }
                else
                {
                    throw new Error("Missing dependency of type \"{0}\" in configuration \"{1}\" dependencies.", _Project.AppLibType.ToNiceTypeName(), conf);
                }
            }

            //Options.Vc.General.UseDebugLibraries.
            //    Disable                                 WarnAsError="false"
            //    Enable                                  WarnAsError="true"                              /WX
            SelectOption
            (
                Options.Option(Options.Vc.General.UseDebugLibraries.Disabled, () => { options["UseDebugLibraries"] = "false"; }),
                Options.Option(Options.Vc.General.UseDebugLibraries.Enabled, () => { options["UseDebugLibraries"] = "true"; })
            );

            SelectOption
            (
                Options.Option(Options.Android.General.AndroidAPILevel.Default, () => { options["AndroidAPILevel"] = FileGeneratorUtilities.RemoveLineTag; }),
                Options.Option(Options.Android.General.AndroidAPILevel.Android19, () => { options["AndroidAPILevel"] = "android-19"; }),
                Options.Option(Options.Android.General.AndroidAPILevel.Android21, () => { options["AndroidAPILevel"] = "android-21"; }),
                Options.Option(Options.Android.General.AndroidAPILevel.Android22, () => { options["AndroidAPILevel"] = "android-22"; }),
                Options.Option(Options.Android.General.AndroidAPILevel.Android23, () => { options["AndroidAPILevel"] = "android-23"; }),
                Options.Option(Options.Android.General.AndroidAPILevel.Android24, () => { options["AndroidAPILevel"] = "android-24"; })
            );

            //OutputDirectory
            //    The debugger need a rooted path to work properly.
            //    So we root the relative output directory to $(ProjectDir) to work around this limitation.
            //    Hopefully in a futur version of the cross platform tools will be able to remove this hack.
            string outputDirectoryRelative = Util.PathGetRelative(projectPath, conf.TargetPath);

            options["OutputDirectory"] = outputDirectoryRelative;

            //IntermediateDirectory
            string intermediateDirectoryRelative = Util.PathGetRelative(projectPath, conf.IntermediatePath);

            options["IntermediateDirectory"] = intermediateDirectoryRelative;

            return(options);
        }
コード例 #2
0
 public CompileCommandGenerationContext(Builder builder, Project project, Project.Configuration config)
 {
     Builder                     = builder;
     Project                     = project;
     ProjectDirectory            = config.ProjectPath;
     ProjectDirectoryCapitalized = Util.GetCapitalizedPath(ProjectDirectory);
     ProjectSourceCapitalized    = Util.GetCapitalizedPath(project.SourceRootPath);
     Configuration               = config;
     Options                     = new Options.ExplicitOptions();
     CommandLineOptions          = new Dictionary <string, string>();
 }
コード例 #3
0
        private void Generate(
            AndroidPackageProject project,
            List <Project.Configuration> unsortedConfigurations,
            string projectPath,
            string projectFile,
            List <string> generatedFiles,
            List <string> skipFiles)
        {
            // Need to sort by name and platform
            List <Project.Configuration> configurations = new List <Project.Configuration>();

            configurations.AddRange(unsortedConfigurations.OrderBy(conf => conf.Name + conf.Platform));

            // validate that 2 conf name in the same project don't have the same name
            Dictionary <string, Project.Configuration> configurationNameMapping = new Dictionary <string, Project.Configuration>();
            string projectName = null;

            foreach (Project.Configuration conf in configurations)
            {
                if (projectName == null)
                {
                    projectName = conf.ProjectName;
                }
                else if (projectName != conf.ProjectName)
                {
                    throw new Error("Project configurations in the same project files must be the same: {0} != {1} in {2}", projectName, conf.ProjectName, projectFile);
                }

                Project.Configuration otherConf;

                string projectUniqueName = conf.Name + Util.GetPlatformString(conf.Platform, conf.Project);
                if (configurationNameMapping.TryGetValue(projectUniqueName, out otherConf))
                {
                    var differBy = Util.MakeDifferenceString(conf, otherConf);
                    throw new Error(
                              "Project {0} ({5} in {6}) have 2 configurations with the same name: \"{1}\" for {2} and {3}"
                              + Environment.NewLine + "Nb: ps3 and win32 cannot have same conf name: {4}",
                              project.Name, conf.Name, otherConf.Target, conf.Target, differBy, projectFile, projectPath);
                }

                configurationNameMapping[projectUniqueName] = conf;

                // set generator information
                switch (conf.Platform)
                {
                case Platform.android:
                    conf.GeneratorSetGeneratedInformation("elf", "elf", "so", "pdb");
                    break;

                default:
                    break;
                }
            }

            Resolver resolver = new Resolver();

            _ProjectDirectoryCapitalized = Util.GetCapitalizedPath(projectPath);
            //_ProjectSourceCapitalized = Util.GetCapitalizedPath(project.SourceRootPath);
            _Project = project;
            _ProjectConfigurationList = configurations;

            MemoryStream memoryStream = new MemoryStream();
            StreamWriter writer       = new StreamWriter(memoryStream);

            // xml begin header
            DevEnvRange devEnvRange = new DevEnvRange(unsortedConfigurations);

            using (resolver.NewScopedParameter("toolsVersion", devEnvRange.MinDevEnv.GetVisualProjectToolsVersionString()))
            {
                Write(Template.Project.ProjectBegin, writer, resolver);
            }

            Write(Template.Project.ProjectBeginConfigurationDescription, writer, resolver);
            // xml header contain description of each target
            foreach (Project.Configuration conf in _ProjectConfigurationList)
            {
                using (resolver.NewScopedParameter("platformName", Util.GetPlatformString(conf.Platform, conf.Project)))
                    using (resolver.NewScopedParameter("conf", conf))
                    {
                        Write(Template.Project.ProjectConfigurationDescription, writer, resolver);
                    }
            }
            Write(Template.Project.ProjectEndConfigurationDescription, writer, resolver);

            // xml end header
            var firstConf = _ProjectConfigurationList.First();

            using (resolver.NewScopedParameter("projectName", projectName))
                using (resolver.NewScopedParameter("guid", firstConf.ProjectGuid))
                    using (resolver.NewScopedParameter("toolsVersion", devEnvRange.MinDevEnv.GetVisualProjectToolsVersionString()))
                    {
                        Write(Template.Project.ProjectDescription, writer, resolver);
                    }

            // generate all configuration options once...
            Dictionary <Project.Configuration, Options.ExplicitOptions> options = new Dictionary <Project.Configuration, Options.ExplicitOptions>();

            foreach (Project.Configuration conf in _ProjectConfigurationList)
            {
                _ProjectConfiguration = conf;
                Options.ExplicitOptions option = GenerateOptions(project, projectPath, conf);
                _ProjectConfiguration = null;
                options.Add(conf, option);
            }

            // configuration general
            foreach (Project.Configuration conf in _ProjectConfigurationList)
            {
                using (resolver.NewScopedParameter("platformName", Util.GetPlatformString(conf.Platform, conf.Project)))
                    using (resolver.NewScopedParameter("conf", conf))
                        using (resolver.NewScopedParameter("options", options[conf]))
                        {
                            Write(Template.Project.ProjectConfigurationsGeneral, writer, resolver);
                        }
            }

            // .props files
            Write(Template.Project.ProjectAfterConfigurationsGeneral, writer, resolver);
            Write(Template.Project.ProjectAfterImportedProps, writer, resolver);

            string androidPackageDirectory = project.AntBuildRootDirectory;

            // configuration ItemDefinitionGroup
            foreach (Project.Configuration conf in _ProjectConfigurationList)
            {
                using (resolver.NewScopedParameter("platformName", Util.GetPlatformString(conf.Platform, conf.Project)))
                    using (resolver.NewScopedParameter("conf", conf))
                        using (resolver.NewScopedParameter("options", options[conf]))
                            using (resolver.NewScopedParameter("androidPackageDirectory", androidPackageDirectory))
                            {
                                Write(Template.Project.ProjectConfigurationBeginItemDefinition, writer, resolver);
                                {
                                    Write(Template.Project.AntPackage, writer, resolver);
                                }
                                Write(Template.Project.ProjectConfigurationEndItemDefinition, writer, resolver);
                            }
            }

            GenerateFilesSection(project, writer, resolver, projectPath, projectFile, generatedFiles, skipFiles);

            GenerateProjectReferences(configurations, resolver, writer, options);

            // .targets
            Write(Template.Project.ProjectTargets, writer, resolver);

            Write(Template.Project.ProjectEnd, writer, resolver);

            // Write the project file
            writer.Flush();

            // remove all line that contain RemoveLineTag
            MemoryStream cleanMemoryStream = Util.RemoveLineTags(memoryStream, FileGeneratorUtilities.RemoveLineTag);

            FileInfo projectFileInfo = new FileInfo(Path.Combine(projectPath, projectFile + ProjectExtension));

            if (_Builder.Context.WriteGeneratedFile(project.GetType(), projectFileInfo, cleanMemoryStream))
            {
                generatedFiles.Add(projectFileInfo.FullName);
            }
            else
            {
                skipFiles.Add(projectFileInfo.FullName);
            }

            writer.Close();

            _Project = null;
        }
コード例 #4
0
        private Options.ExplicitOptions GenerateOptions(Project.Configuration conf, FileInfo projectFileInfo)
        {
            Options.ExplicitOptions options = new Options.ExplicitOptions();

            // CompilerToUse
            SelectOption(conf,
                         Options.Option(Options.Makefile.General.PlatformToolset.Gcc, () => { options["CompilerToUse"] = "g++"; }),
                         Options.Option(Options.Makefile.General.PlatformToolset.Clang, () => { options["CompilerToUse"] = "clang++"; })
                         );

            // IntermediateDirectory
            options["IntermediateDirectory"] = PathMakeUnix(Util.PathGetRelative(projectFileInfo.DirectoryName, conf.IntermediatePath));

            // OutputDirectory
            string outputDirectory = PathMakeUnix(GetOutputDirectory(conf, projectFileInfo));

            options["OutputDirectory"] = outputDirectory;

            #region Compiler

            // Defines
            var defines = new Strings();
            if (conf.DefaultOption == Options.DefaultTarget.Debug)
            {
                defines.Add("_DEBUG");
            }
            else // Release
            {
                defines.Add("NDEBUG");
            }

            foreach (string define in conf.Defines)
            {
                if (!string.IsNullOrWhiteSpace(define))
                {
                    defines.Add(define.Replace(@"""", @"\"""));
                }
            }
            defines.InsertPrefixSuffix(@"-D """, @"""");
            options["Defines"] = defines.JoinStrings(" ");

            // Includes
            OrderableStrings includePaths = new OrderableStrings();
            includePaths.AddRange(Util.PathGetRelative(projectFileInfo.DirectoryName, Util.PathGetCapitalized(conf.IncludePrivatePaths)));
            includePaths.AddRange(Util.PathGetRelative(projectFileInfo.DirectoryName, Util.PathGetCapitalized(conf.IncludePaths)));
            includePaths.AddRange(Util.PathGetRelative(projectFileInfo.DirectoryName, Util.PathGetCapitalized(conf.DependenciesIncludePaths)));
            PathMakeUnix(includePaths);
            includePaths.InsertPrefix("-I");
            includePaths.Sort();
            options["Includes"] = includePaths.JoinStrings(" ");

            if (conf.ForcedIncludes.Count > 0)
            {
                OrderableStrings relativeForceIncludes = new OrderableStrings(Util.PathGetRelative(projectFileInfo.DirectoryName, conf.ForcedIncludes));
                PathMakeUnix(relativeForceIncludes);
                relativeForceIncludes.InsertPrefix("-include ");
                relativeForceIncludes.Sort();
                options["Includes"] += " " + relativeForceIncludes.JoinStrings(" ");
            }

            // CFLAGS
            {
                StringBuilder cflags = new StringBuilder();

                // ExtraWarnings
                SelectOption(conf,
                             Options.Option(Options.Makefile.Compiler.ExtraWarnings.Enable, () => { cflags.Append("-Wextra "); }),
                             Options.Option(Options.Makefile.Compiler.ExtraWarnings.Disable, () => { })
                             );

                // GenerateDebugInformation
                SelectOption(conf,
                             Options.Option(Options.Makefile.Compiler.GenerateDebugInformation.Enable, () => { cflags.Append("-g "); }),
                             Options.Option(Options.Makefile.Compiler.GenerateDebugInformation.Disable, () => { })
                             );

                // OptimizationLevel
                SelectOption(conf,
                             Options.Option(Options.Makefile.Compiler.OptimizationLevel.Disable, () => { }),
                             Options.Option(Options.Makefile.Compiler.OptimizationLevel.Standard, () => { cflags.Append("-O1 "); }),
                             Options.Option(Options.Makefile.Compiler.OptimizationLevel.Full, () => { cflags.Append("-O2 "); }),
                             Options.Option(Options.Makefile.Compiler.OptimizationLevel.FullWithInlining, () => { cflags.Append("-O3 "); }),
                             Options.Option(Options.Makefile.Compiler.OptimizationLevel.ForSize, () => { cflags.Append("-Os "); })
                             );

                // Warnings
                SelectOption(conf,
                             Options.Option(Options.Makefile.Compiler.Warnings.NormalWarnings, () => { }),
                             Options.Option(Options.Makefile.Compiler.Warnings.MoreWarnings, () => { cflags.Append("-Wall "); }),
                             Options.Option(Options.Makefile.Compiler.Warnings.Disable, () => { cflags.Append("-w "); })
                             );

                // WarningsAsErrors
                SelectOption(conf,
                             Options.Option(Options.Makefile.Compiler.TreatWarningsAsErrors.Enable, () => { cflags.Append("-Werror "); }),
                             Options.Option(Options.Makefile.Compiler.TreatWarningsAsErrors.Disable, () => { })
                             );

                // AdditionalCompilerOptions
                cflags.Append(conf.AdditionalCompilerOptions.JoinStrings(" "));

                options["CFLAGS"] = cflags.ToString();
            }

            // CXXFLAGS
            {
                StringBuilder cxxflags = new StringBuilder();

                // CppLanguageStandard
                SelectOption(conf,
                             Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Default, () => { cxxflags.Append(""); }),
                             Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp98, () => { cxxflags.Append("-std=c++98 "); }),
                             Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp11, () => { cxxflags.Append("-std=c++11 "); }),
                             Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp14, () => { cxxflags.Append("-std=c++14 "); }),
                             Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp17, () => { cxxflags.Append("-std=c++17 "); }),
                             Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp2a, () => { cxxflags.Append("-std=c++2a "); }),
                             Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp98, () => { cxxflags.Append("-std=gnu++98 "); }),
                             Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp11, () => { cxxflags.Append("-std=gnu++11 "); }),
                             Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp14, () => { cxxflags.Append("-std=gnu++14 "); }),
                             Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp17, () => { cxxflags.Append("-std=gnu++17 "); }),
                             Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp2a, () => { cxxflags.Append("-std=gnu++2a "); })
                             );

                // Exceptions
                SelectOption(conf,
                             Options.Option(Options.Makefile.Compiler.Exceptions.Enable, () => { cxxflags.Append("-fexceptions "); }),
                             Options.Option(Options.Makefile.Compiler.Exceptions.Disable, () => { cxxflags.Append("-fno-exceptions "); })
                             );

                // RTTI
                SelectOption(conf,
                             Options.Option(Options.Makefile.Compiler.Rtti.Enable, () => { cxxflags.Append("-frtti "); }),
                             Options.Option(Options.Makefile.Compiler.Rtti.Disable, () => { cxxflags.Append("-fno-rtti "); })
                             );

                options["CXXFLAGS"] = cxxflags.ToString();
            }

            #endregion

            #region Linker

            // OutputFile
            options["OutputFile"] = conf.TargetFileFullNameWithExtension.Replace(" ", @"\ ");

            // LibraryFiles
            options["LibraryFiles"] = GenerateLibraryReferences(conf.LibraryFiles, conf);

            // LibraryPaths
            OrderableStrings libraryPaths = new OrderableStrings();
            libraryPaths.AddRange(Util.PathGetRelative(projectFileInfo.DirectoryName, conf.LibraryPaths));
            libraryPaths.AddRange(Util.PathGetRelative(projectFileInfo.DirectoryName, conf.DependenciesOtherLibraryPaths));
            libraryPaths.AddRange(Util.PathGetRelative(projectFileInfo.DirectoryName, conf.DependenciesBuiltTargetsLibraryPaths));
            PathMakeUnix(libraryPaths);
            libraryPaths.InsertPrefix("-L");
            libraryPaths.Sort();
            options["LibraryPaths"] = libraryPaths.JoinStrings(" ");

            // Dependencies
            var deps = new OrderableStrings();
            foreach (Project.Configuration depConf in conf.ResolvedDependencies)
            {
                switch (depConf.Output)
                {
                case Project.Configuration.OutputType.None:
                    continue;

                case Project.Configuration.OutputType.Lib:
                case Project.Configuration.OutputType.DotNetClassLibrary:
                    deps.Add(Path.Combine(depConf.TargetLibraryPath, depConf.TargetFileFullNameWithExtension), depConf.TargetFileOrderNumber);
                    break;

                case Project.Configuration.OutputType.Dll:
                default:
                    deps.Add(Path.Combine(depConf.TargetPath, depConf.TargetFileFullNameWithExtension), depConf.TargetFileOrderNumber);
                    break;
                }
            }
            var depsRelative = Util.PathGetRelative(projectFileInfo.DirectoryName, deps);
            PathMakeUnix(depsRelative);
            depsRelative.Sort();
            options["LDDEPS"] = depsRelative.JoinStrings(" ");

            // DependenciesLibraryFiles
            options["DependenciesLibraryFiles"] = GenerateLibraryReferences(conf.DependenciesOtherLibraryFiles, conf, depsRelative);


            // LinkCommand
            if (conf.Output == Project.Configuration.OutputType.Lib)
            {
                options["LinkCommand"] = Template.Project.LinkCommandLib;
            }
            else if (conf.Output == Project.Configuration.OutputType.Dll)
            {
                options["LinkCommand"] = Template.Project.LinkCommandDll;
            }
            else
            {
                options["LinkCommand"] = Template.Project.LinkCommandExe;
            }

            if (conf.AdditionalLibrarianOptions.Any())
            {
                throw new NotImplementedException(nameof(conf.AdditionalLibrarianOptions) + " not supported with Makefile generator");
            }

            string linkerAdditionalOptions = conf.AdditionalLinkerOptions.JoinStrings(" ");
            options["AdditionalLinkerOptions"] = linkerAdditionalOptions;

            // this is supported in both gcc and clang
            SelectOption(conf,
                         Options.Option(Options.Makefile.Linker.LibGroup.Enable, () => { options["LibsStartGroup"] = " -Wl,--start-group "; options["LibsEndGroup"] = " -Wl,--end-group "; }),
                         Options.Option(Options.Makefile.Linker.LibGroup.Disable, () => { options["LibsStartGroup"] = string.Empty; options["LibsEndGroup"] = string.Empty; })
                         );

            #endregion

            return(options);
        }
コード例 #5
0
        private string GenerateProject(
            Builder builder,
            Project project,
            List <Project.Configuration> unsortedConfigurations,
            FileInfo projectFileInfo,
            out bool updated)
        {
            // Need to sort by name and platform
            List <Project.Configuration> configurations = new List <Project.Configuration>();

            configurations.AddRange(unsortedConfigurations.OrderBy(conf => conf.Name + conf.Platform));

            // Build source files list.
            List <ProjectFile> sourceFiles = GetSourceFiles(project, configurations, projectFileInfo);

            // Generate options.
            Dictionary <Project.Configuration, Options.ExplicitOptions> options = new Dictionary <Project.Configuration, Options.ExplicitOptions>();

            foreach (Project.Configuration conf in configurations)
            {
                Options.ExplicitOptions option = GenerateOptions(conf, projectFileInfo);
                options.Add(conf, option);
            }

            var fileGenerator = new FileGenerator();

            {
                fileGenerator.Write(Template.Project.Header);

                // Configurations variables.
                foreach (Project.Configuration conf in configurations)
                {
                    string precompHeader        = "";
                    string precompHeaderOut     = "";
                    string precompIntermediate  = "";
                    string precompCommand       = "";
                    string precompPreBuildCmds  = "";
                    string precompPreLinkCmds   = "";
                    string precompPostBuildCmds = "";


                    if (!string.IsNullOrEmpty(conf.PrecompHeader))
                    {
                        // Support pch files in sub folders
                        var pchFile = PathMakeUnix(conf.PrecompHeader);
                        // Don't make additional subfolder in temp directory
                        var pchObj   = Path.GetFileName(conf.PrecompHeader);
                        var fileName = Path.Combine(PathMakeUnix(project.SourceRootPath), pchFile);
                        precompHeader       = PathMakeUnix(Util.PathGetRelative(projectFileInfo.DirectoryName, fileName, true));
                        precompHeaderOut    = $"$(OBJDIR)/{pchObj}";
                        precompIntermediate = $"$(OBJDIR)/{pchObj}.gch";
                        precompCommand      = "-include $(PCHOUT)";
                    }

                    if (conf.EventPreBuild.Any())
                    {
                        precompPreBuildCmds = conf.EventPreBuild.Aggregate((curr, next) => $"{curr} && {next}");
                    }
                    if (conf.EventPreLink.Any())
                    {
                        precompPreLinkCmds = conf.EventPreLink.Aggregate((curr, next) => $"{curr} && {next}");
                    }
                    if (conf.EventPostBuild.Any())
                    {
                        precompPostBuildCmds = conf.EventPostBuild.Aggregate((curr, next) => $"{curr} && {next}");
                    }

                    using (fileGenerator.Declare("name", conf.Name.ToLower()))
                        using (fileGenerator.Declare("options", options[conf]))
                            using (fileGenerator.Declare("precompHeader", precompHeader))
                                using (fileGenerator.Declare("precompHeaderOut", precompHeaderOut))
                                    using (fileGenerator.Declare("precompIntermediate", precompIntermediate))
                                        using (fileGenerator.Declare("precompCommand", precompCommand))
                                            using (fileGenerator.Declare("precompPreBuildCmds", precompPreBuildCmds))
                                                using (fileGenerator.Declare("precompPreLinkCmds", precompPreLinkCmds))
                                                    using (fileGenerator.Declare("precompPostBuildCmds", precompPostBuildCmds))
                                                    {
                                                        fileGenerator.Write(Template.Project.ProjectConfigurationVariables);
                                                    }
                }

                // Objects variables
                foreach (Project.Configuration conf in configurations)
                {
                    using (fileGenerator.Declare("name", conf.Name.ToLower()))
                    {
                        fileGenerator.Write(Template.Project.ObjectsVariableBegin);
                        foreach (ProjectFile file in sourceFiles)
                        {
                            // Excluded source files are written to the makefile but are commented out.
                            // This support the use case where you have a huge unit tests suite that take too long to compile.
                            // In this case, you just exclude all unit tests from the build and manually uncomment only the unit tests you want to build.
                            using (fileGenerator.Declare("excludeChar", conf.ResolvedSourceFilesBuildExclude.Contains(file.FileName) ? "#" : ""))
                                using (fileGenerator.Declare("objectFile", file.GetObjectFileName()))
                                {
                                    fileGenerator.Write(Template.Project.ObjectsVariableElement);
                                }
                        }
                        fileGenerator.Write(Template.Project.ObjectsVariableEnd);
                    }
                }

                // General rules
                using (fileGenerator.Declare("projectName", project.Name))
                {
                    fileGenerator.Write(Template.Project.ProjectRulesGeneral);
                }

                // Source file rules
                // Since we write excluded source files commented. Here we write rules for all files
                // in case one of the commented out object file is manually uncomment.
                foreach (ProjectFile file in sourceFiles)
                {
                    using (fileGenerator.Declare("objectFile", file.GetObjectFileName()))
                        using (fileGenerator.Declare("sourceFile", PathMakeUnix(file.FileNameProjectRelative)))
                        {
                            if (file.FileExtensionLower == ".c")
                            {
                                fileGenerator.Write(Template.Project.ObjectRuleC);
                            }
                            else
                            {
                                fileGenerator.Write(Template.Project.ObjectRuleCxx);
                            }
                        }
                }

                fileGenerator.Write(Template.Project.Footer);

                // Write the project file
                updated = builder.Context.WriteGeneratedFile(project.GetType(), projectFileInfo, fileGenerator.ToMemoryStream());
            }

            return(projectFileInfo.FullName);
        }
コード例 #6
0
ファイル: Makefile.cs プロジェクト: xubingyue/Sharpmake
        private string GenerateProject(
            Builder builder,
            Project project,
            List <Project.Configuration> unsortedConfigurations,
            FileInfo projectFileInfo,
            out bool updated)
        {
            // Need to sort by name and platform
            List <Project.Configuration> configurations = new List <Project.Configuration>();

            configurations.AddRange(unsortedConfigurations.OrderBy(conf => conf.Name + conf.Platform));

            // Build source files list.
            List <ProjectFile> sourceFiles = GetSourceFiles(project, configurations, projectFileInfo);

            // Generate options.
            Dictionary <Project.Configuration, Options.ExplicitOptions> options = new Dictionary <Project.Configuration, Options.ExplicitOptions>();

            foreach (Project.Configuration conf in configurations)
            {
                Options.ExplicitOptions option = GenerateOptions(conf, projectFileInfo);
                options.Add(conf, option);
            }

            var fileGenerator = new FileGenerator();

            {
                fileGenerator.Write(Template.Project.Header);

                // Configurations variables.
                foreach (Project.Configuration conf in configurations)
                {
                    using (fileGenerator.Declare("name", conf.Name.ToLower()))
                        using (fileGenerator.Declare("options", options[conf]))
                        {
                            fileGenerator.Write(Template.Project.ProjectConfigurationVariables);
                        }
                }

                // Objects variables
                foreach (Project.Configuration conf in configurations)
                {
                    using (fileGenerator.Declare("name", conf.Name.ToLower()))
                    {
                        fileGenerator.Write(Template.Project.ObjectsVariableBegin);
                        foreach (ProjectFile file in sourceFiles)
                        {
                            // Excluded source files are written to the makefile but are commented out.
                            // This support the use case where you have a huge unit tests suite that take too long to compile.
                            // In this case, you just exclude all unit tests from the build and manually uncomment only the unit tests you want to build.
                            using (fileGenerator.Declare("excludeChar", conf.ResolvedSourceFilesBuildExclude.Contains(file.FileName) ? "#" : ""))
                                using (fileGenerator.Declare("objectFile", file.FileNameWithoutExtension + ObjectExtension))
                                {
                                    fileGenerator.Write(Template.Project.ObjectsVariableElement);
                                }
                        }
                        fileGenerator.Write(Template.Project.ObjectsVariableEnd);
                    }
                }

                // General rules
                using (fileGenerator.Declare("projectName", project.Name))
                {
                    fileGenerator.Write(Template.Project.ProjectRulesGeneral);
                }

                // Source file rules
                // Since we write excluded source files commented. Here we write rules for all files
                // in case one of the commented out object file is manually uncomment.
                foreach (ProjectFile file in GetSourceFiles(project, configurations, projectFileInfo))
                {
                    using (fileGenerator.Declare("objectFile", file.FileNameWithoutExtension + ObjectExtension))
                        using (fileGenerator.Declare("sourceFile", PathMakeUnix(file.FileNameProjectRelative)))
                        {
                            if (file.FileExtensionLower == ".c")
                            {
                                fileGenerator.Write(Template.Project.ObjectRuleC);
                            }
                            else
                            {
                                fileGenerator.Write(Template.Project.ObjectRuleCxx);
                            }
                        }
                }

                fileGenerator.Write(Template.Project.Footer);

                // Write the project file
                updated = builder.Context.WriteGeneratedFile(project.GetType(), projectFileInfo, fileGenerator.ToMemoryStream());
            }

            return(projectFileInfo.FullName);
        }
コード例 #7
0
        private Options.ExplicitOptions GenerateOptions(Project.Configuration conf, FileInfo projectFileInfo)
        {
            Options.ExplicitOptions options = new Options.ExplicitOptions();

            // CompilerToUse
            SelectOption(conf,
                         Options.Option(Options.Makefile.General.PlatformToolset.Gcc, () => { options["CompilerToUse"] = "g++"; }),
                         Options.Option(Options.Makefile.General.PlatformToolset.Clang, () => { options["CompilerToUse"] = "clang++"; })
                         );

            // IntermediateDirectory
            options["IntermediateDirectory"] = PathMakeUnix(Util.PathGetRelative(projectFileInfo.DirectoryName, conf.IntermediatePath));

            // OutputDirectory
            options["OutputDirectory"] = PathMakeUnix(GetOutputDirectory(conf, projectFileInfo));

            #region Compiler

            // Defines
            Strings defines = new Strings();
            defines.AddRange(conf.Defines);
            defines.InsertPrefix("-D");
            options["Defines"] = defines.JoinStrings(" ");

            // Includes
            OrderableStrings includePaths = new OrderableStrings();
            includePaths.AddRange(Util.PathGetRelative(projectFileInfo.DirectoryName, conf.IncludePrivatePaths));
            includePaths.AddRange(Util.PathGetRelative(projectFileInfo.DirectoryName, conf.IncludePaths));
            includePaths.AddRange(Util.PathGetRelative(projectFileInfo.DirectoryName, conf.DependenciesIncludePaths));
            PathMakeUnix(includePaths);
            includePaths.InsertPrefix("-I");
            options["Includes"] = includePaths.JoinStrings(" ");

            // CFLAGS
            {
                StringBuilder cflags = new StringBuilder();

                // CppLanguageStandard
                SelectOption(conf,
                             Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp11, () => { cflags.Append("-std=c++11 "); }),
                             Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp98, () => { cflags.Append("-std=c++98 "); }),
                             Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp11, () => { cflags.Append("-std=gnu++11 "); }),
                             Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp98, () => { cflags.Append("-std=gnu++98 "); }),
                             Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Default, () => { cflags.Append(""); })
                             );

                // ExtraWarnings
                SelectOption(conf,
                             Options.Option(Options.Makefile.Compiler.ExtraWarnings.Enable, () => { cflags.Append("-Wextra "); }),
                             Options.Option(Options.Makefile.Compiler.ExtraWarnings.Disable, () => { cflags.Append(""); })
                             );

                // GenerateDebugInformation
                SelectOption(conf,
                             Options.Option(Options.Makefile.Compiler.GenerateDebugInformation.Enable, () => { cflags.Append("-g "); }),
                             Options.Option(Options.Makefile.Compiler.GenerateDebugInformation.Disable, () => { cflags.Append(""); })
                             );

                // OptimizationLevel
                SelectOption(conf,
                             Options.Option(Options.Makefile.Compiler.OptimizationLevel.Disable, () => { cflags.Append(""); }),
                             Options.Option(Options.Makefile.Compiler.OptimizationLevel.Standard, () => { cflags.Append("-O1 "); }),
                             Options.Option(Options.Makefile.Compiler.OptimizationLevel.Full, () => { cflags.Append("-O2 "); }),
                             Options.Option(Options.Makefile.Compiler.OptimizationLevel.FullWithInlining, () => { cflags.Append("-O3 "); }),
                             Options.Option(Options.Makefile.Compiler.OptimizationLevel.ForSize, () => { cflags.Append("-Os "); })
                             );

                // Warnings
                SelectOption(conf,
                             Options.Option(Options.Makefile.Compiler.Warnings.NormalWarnings, () => { cflags.Append(""); }),
                             Options.Option(Options.Makefile.Compiler.Warnings.MoreWarnings, () => { cflags.Append("-Wall "); }),
                             Options.Option(Options.Makefile.Compiler.Warnings.Disable, () => { cflags.Append("-w "); })
                             );

                // WarningsAsErrors
                SelectOption(conf,
                             Options.Option(Options.Makefile.Compiler.TreatWarningsAsErrors.Enable, () => { cflags.Append("-Werror "); }),
                             Options.Option(Options.Makefile.Compiler.TreatWarningsAsErrors.Disable, () => { cflags.Append(""); })
                             );

                // AdditionalCompilerOptions
                cflags.Append(conf.AdditionalCompilerOptions.JoinStrings(" "));

                options["CFLAGS"] = cflags.ToString();
            }

            // CXXFLAGS
            {
                StringBuilder cxxflags = new StringBuilder();

                // Exceptions
                SelectOption(conf,
                             Options.Option(Options.Makefile.Compiler.Exceptions.Enable, () => { cxxflags.Append("-fexceptions "); }),
                             Options.Option(Options.Makefile.Compiler.Exceptions.Disable, () => { cxxflags.Append("-fno-exceptions "); })
                             );

                // RTTI
                SelectOption(conf,
                             Options.Option(Options.Makefile.Compiler.Rtti.Enable, () => { cxxflags.Append("-frtti "); }),
                             Options.Option(Options.Makefile.Compiler.Rtti.Disable, () => { cxxflags.Append("-fno-rtti "); })
                             );

                options["CXXFLAGS"] = cxxflags.ToString();
            }

            #endregion

            #region Linker

            // OutputFile
            options["OutputFile"] = FormatOutputFileName(conf);

            // DependenciesLibraryFiles
            OrderableStrings dependenciesLibraryFiles = GetDependenciesOutputFilesProjectRelative(conf, projectFileInfo);
            PathMakeUnix(dependenciesLibraryFiles);
            options["DependenciesLibraryFiles"] = dependenciesLibraryFiles.JoinStrings(" ");

            // LibraryFiles
            OrderableStrings libraryFiles = new OrderableStrings();
            libraryFiles.AddRange(conf.LibraryFiles);
            libraryFiles.InsertPrefix("-l");
            options["LibraryFiles"] = libraryFiles.JoinStrings(" ");

            // LibraryPaths
            OrderableStrings libraryPaths = new OrderableStrings();
            libraryPaths.AddRange(Util.PathGetRelative(projectFileInfo.DirectoryName, conf.LibraryPaths));
            PathMakeUnix(libraryPaths);
            libraryPaths.InsertPrefix("-L");
            options["LibraryPaths"] = libraryPaths.JoinStrings(" ");

            // LinkCommand
            if (conf.Output == Project.Configuration.OutputType.Lib)
            {
                options["LinkCommand"] = Template.Project.LinkCommandLib;
            }
            else
            {
                options["LinkCommand"] = Template.Project.LinkCommandExe;
            }

            #endregion

            return(options);
        }