Esempio n. 1
0
        public static void TestAddStringIntError()
        {
            OrderableStrings strings = new OrderableStrings
            {
                "A",
                { "Y", -1 }
            };

            strings.Add("W", -4);
            strings.Add("A", -4);
            strings.Add("E", 1);
            strings.Add("B", 0);

            Assert.Throws <Sharpmake.Error>(() => strings.Add("Y", -2));
        }
Esempio n. 2
0
        public static void TestAddString()
        {
            OrderableStrings strings = new OrderableStrings
            {
                "A",
                "Y"
            };

            strings.Add("W");
            strings.Add("E");
            strings.Add("A");

            Assert.AreEqual(4, strings.Count);
            Assert.AreEqual("A,Y,W,E", strings.ToString());
        }
Esempio n. 3
0
        public static void TestStableSortWithNoOrder()
        {
            OrderableStrings strings = new OrderableStrings();

            strings.Add("b");
            strings.Add("c");
            strings.Add("a");
            strings.Add("d");

            strings.StableSort();

            // Verify order is the expected one
            Assert.AreEqual(strings[0], "b");
            Assert.AreEqual(strings[1], "c");
            Assert.AreEqual(strings[2], "a");
            Assert.AreEqual(strings[3], "d");
        }
Esempio n. 4
0
        public static void TestAddStringInt()
        {
            OrderableStrings strings = new OrderableStrings
            {
                "A",
                { "Y", -1 }
            };

            strings.Add("W", -4);
            strings.Add("A", -4);
            strings.Add("E", 1);
            strings.Add("B", 0);

            Assert.AreEqual("A,Y,W,E,B", strings.ToString());

            Assert.AreEqual(-4, strings.GetOrderNumber(0));
            Assert.AreEqual(-4, strings.GetOrderNumber(2));
            Assert.AreEqual(1, strings.GetOrderNumber(3));
            Assert.AreEqual(0, strings.GetOrderNumber(4));
        }
Esempio n. 5
0
        private OrderableStrings GetDependenciesOutputFilesProjectRelative(Project.Configuration conf, FileInfo projectFileInfo)
        {
            // Build list of dependencies output files relative to project file.
            OrderableStrings dependencyFiles = new OrderableStrings();

            foreach (Project.Configuration dependencyConf in conf.ResolvedDependencies)
            {
                var outputFileProjectRelative = Path.Combine(GetOutputDirectory(dependencyConf, projectFileInfo), FormatOutputFileName(dependencyConf));
                dependencyFiles.Add(outputFileProjectRelative, dependencyConf.TargetFileOrderNumber);
            }
            dependencyFiles.Sort();

            return(dependencyFiles);
        }
Esempio n. 6
0
        public static void TestStableSortWithOrder()
        {
            OrderableStrings strings = new OrderableStrings();

            strings.Add("b");
            strings.Add("c", 1);
            strings.Add("a");
            strings.Add("d", -1);
            strings.Add("e");
            strings.Add("g", 2);
            strings.Add("f", -2);

            strings.StableSort();

            // Verify order is the expected one
            Assert.AreEqual(strings[0], "f");
            Assert.AreEqual(strings[1], "d");
            Assert.AreEqual(strings[2], "b");
            Assert.AreEqual(strings[3], "a");
            Assert.AreEqual(strings[4], "e");
            Assert.AreEqual(strings[5], "c");
            Assert.AreEqual(strings[6], "g");
        }
Esempio n. 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
            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);
        }