Example #1
0
        public static int MainInner(String[] args)
        {
            var argv        = args.Where(arg => !arg.StartsWith("--") && !arg.Contains("=")).ToArray();
            var options     = args.Where(arg => arg.StartsWith("--")).Select(arg => arg.Substring(2).Split(new Char[] { ':' }, 2)).GroupBy(p => p[0]).ToDictionary(g => g.Key, g => g.Last().Skip(1).SingleOrDefault(), StringComparer.OrdinalIgnoreCase);
            var optionLists = args.Where(arg => arg.StartsWith("--")).Select(arg => arg.Substring(2).Split(new Char[] { ':' }, 2)).GroupBy(p => p[0]).ToDictionary(g => g.Key, g => g.Select(Value => Value.Skip(1).SingleOrDefault()).ToList(), StringComparer.OrdinalIgnoreCase);

            var Help = options.ContainsKey("help");

            if (Help)
            {
                DisplayInfo();
                return(0);
            }
            if (argv.Length == 1)
            {
                var RetypemakeScriptPath = argv[0].AsPath();
                RetypemakeScriptReader.Read(RetypemakeScriptPath);
            }
            else if (argv.Length != 0)
            {
                DisplayInfo();
                return(1);
            }

            foreach (var p in args.Where(arg => arg.Contains("=")).Select(arg => arg.Split('=')))
            {
                Environment.SetEnvironmentVariable(p[0], p[1]);
            }

            var Memory = new Shell.EnvironmentVariableMemory();
            var Simple = options.ContainsKey("simpleterm");
            var Quiet  = options.ContainsKey("quiet");

            if (Simple || Quiet)
            {
                Shell.UseSimpleTerminal();
            }
            var VariablesAndVariableItems = VariableCollection.GetVariableItems();
            var vc = new ConsoleVariableCollector(Memory, Quiet, VariablesAndVariableItems.Value);

            vc.Execute();

            Generation.Run(Memory, Quiet, VariablesAndVariableItems.Key);

            Console.WriteLine("TypeMake successful.");
            return(0);
        }
Example #2
0
        public ConsoleVariableCollector(Shell.EnvironmentVariableMemory Memory, bool Quiet, List <VariableItem> Items)
        {
            this.Memory = Memory;
            this.Quiet  = Quiet;
            var DuplicateVariableNames = Items.Select(i => i.VariableName).GroupBy(n => n).Where(g => g.Count() > 1).Select(g => g.Key).ToList();

            if (DuplicateVariableNames.Count > 0)
            {
                throw new ArgumentException("DuplicateVariableNames: " + String.Join(" ", DuplicateVariableNames));
            }
            var Dict = Items.ToDictionary(i => i.VariableName);

            foreach (var i in Items)
            {
                foreach (var d in i.DependentVariableNames)
                {
                    if (!Dict.ContainsKey(d))
                    {
                        throw new ArgumentException("NonexistDependency: " + i + " -> " + d);
                    }
                }
            }
            this.SortedItems = Items.PartialOrderBy(i => i.DependentVariableNames.Select(n => Dict[n])).ToList();
        }
Example #3
0
        public static void Run(Shell.EnvironmentVariableMemory Memory, bool Quiet, Variables v)
        {
            BuildScript.GenerateRetypemakeScript(v.HostOperatingSystem, v.SourceDirectory, v.BuildDirectory, Memory, v.OverwriteRetypemakeScript);
            var r = v.g();

            var CppSortedProjectNames = r.SortedProjects.Where(p => (p.TargetType == Cpp.TargetType.Executable) || (p.TargetType == Cpp.TargetType.StaticLibrary) || (p.TargetType == Cpp.TargetType.DynamicLibrary) || (p.TargetType == Cpp.TargetType.DarwinApplication) || (p.TargetType == Cpp.TargetType.DarwinStaticFramework) || (p.TargetType == Cpp.TargetType.DarwinSharedFramework) || (p.TargetType == Cpp.TargetType.MacBundle)).Select(p => p.Name).ToList();
            var GradleProjectNames    = r.SortedProjects.Where(p => (p.TargetType == Cpp.TargetType.GradleApplication) || (p.TargetType == Cpp.TargetType.GradleLibrary)).Select(p => p.Name).ToList();

            if (v.TargetOperatingSystem == Cpp.OperatingSystemType.Windows)
            {
                BuildScript.GenerateBuildScriptWindows(v.Toolchain, v.BuildDirectory, r.SolutionName, v.TargetArchitecture, Cpp.ConfigurationType.Debug, v.MaxProcessCount, v.VSDir, v.VSVersion, v.Ninja, v.ForceRegenerate);
                BuildScript.GenerateBuildScriptWindows(v.Toolchain, v.BuildDirectory, r.SolutionName, v.TargetArchitecture, Cpp.ConfigurationType.Release, v.MaxProcessCount, v.VSDir, v.VSVersion, v.Ninja, v.ForceRegenerate);
                if (v.BuildNow)
                {
                    if (v.HostOperatingSystem == Cpp.OperatingSystemType.Windows)
                    {
                        using (var d = Shell.PushDirectory(v.BuildDirectory))
                        {
                            if (Shell.Execute($"build_{v.Configuration}.cmd") != 0)
                            {
                                throw new InvalidOperationException("ErrorInExecution: " + $"build_{v.Configuration}.cmd");
                            }
                        }
                    }
                    else
                    {
                        WriteLineError("Cross compiling to Windows is not supported.");
                    }
                }
            }
            else if (v.TargetOperatingSystem == Cpp.OperatingSystemType.Linux)
            {
                BuildScript.GenerateBuildScriptLinux(v.TargetOperatingSystemDistribution, v.Toolchain, v.HostOperatingSystem, v.BuildDirectory, v.Configuration, v.MaxProcessCount, v.Ninja, v.ForceRegenerate);
                if (v.BuildNow)
                {
                    using (var d = Shell.PushDirectory(v.BuildDirectory))
                    {
                        if (v.HostOperatingSystem == Cpp.OperatingSystemType.Windows)
                        {
                            if (Shell.Execute(@".\build.cmd") != 0)
                            {
                                throw new InvalidOperationException("ErrorInExecution: " + @".\build.cmd");
                            }
                        }
                        else if (v.HostOperatingSystem == Cpp.OperatingSystemType.Linux)
                        {
                            if (Shell.Execute("./build.sh") != 0)
                            {
                                throw new InvalidOperationException("ErrorInExecution: ./build.sh");
                            }
                        }
                        else
                        {
                            WriteLineError("Cross compiling to Linux is not supported.");
                        }
                    }
                }
            }
            else if (v.TargetOperatingSystem == Cpp.OperatingSystemType.MacOS)
            {
                if (v.Toolchain == Cpp.ToolchainType.XCode)
                {
                    BuildScript.GenerateBuildScriptXCode(v.HostOperatingSystem, v.BuildDirectory, v.Configuration, v.MaxProcessCount, CppSortedProjectNames, v.ForceRegenerate);
                }
                else
                {
                    BuildScript.GenerateBuildScriptLinux("Mac", v.Toolchain, v.HostOperatingSystem, v.BuildDirectory, v.Configuration, v.MaxProcessCount, v.Ninja, v.ForceRegenerate);
                }
                if (v.BuildNow)
                {
                    using (var d = Shell.PushDirectory(v.BuildDirectory))
                    {
                        if (v.HostOperatingSystem == Cpp.OperatingSystemType.MacOS)
                        {
                            if (Shell.Execute("./build.sh") != 0)
                            {
                                throw new InvalidOperationException("ErrorInExecution: ./build.sh");
                            }
                        }
                        else
                        {
                            WriteLineError("Cross compiling to Mac is not supported.");
                        }
                    }
                }
            }
            else if (v.TargetOperatingSystem == Cpp.OperatingSystemType.iOS)
            {
                BuildScript.GenerateBuildScriptXCode(v.HostOperatingSystem, v.BuildDirectory, v.Configuration, v.MaxProcessCount, CppSortedProjectNames, v.ForceRegenerate);
                if (v.BuildNow)
                {
                    using (var d = Shell.PushDirectory(v.BuildDirectory))
                    {
                        if (v.HostOperatingSystem == Cpp.OperatingSystemType.MacOS)
                        {
                            if (Shell.Execute("./build.sh") != 0)
                            {
                                throw new InvalidOperationException("ErrorInExecution: ./build.sh");
                            }
                        }
                        else
                        {
                            WriteLineError("Cross compiling to iOS is not supported.");
                        }
                    }
                }
            }
            else if (v.TargetOperatingSystem == Cpp.OperatingSystemType.Android)
            {
                if (v.Toolchain != Cpp.ToolchainType.Ninja)
                {
                    TextFile.WriteToFile(v.BuildDirectory / "gradle/local.properties", $"sdk.dir={v.AndroidSdk.ToString(PathStringStyle.Unix)}", new System.Text.UTF8Encoding(false), !v.ForceRegenerate);
                }
                BuildScript.GenerateBuildScriptAndroid(GradleProjectNames, v.Toolchain, v.HostOperatingSystem, v.BuildDirectory, v.TargetArchitecture, v.Configuration, v.MaxProcessCount, v.AndroidNdk, v.Ninja, 21, v.ForceRegenerate, v.EnableJava);
                if (v.BuildNow)
                {
                    using (var d = Shell.PushDirectory(v.BuildDirectory))
                    {
                        if (v.HostOperatingSystem == Cpp.OperatingSystemType.Windows)
                        {
                            if (Shell.Execute(@".\build.cmd") != 0)
                            {
                                throw new InvalidOperationException("ErrorInExecution: " + @".\build.cmd");
                            }
                        }
                        else if ((v.HostOperatingSystem == Cpp.OperatingSystemType.Linux) || (v.HostOperatingSystem == Cpp.OperatingSystemType.MacOS) || (v.HostOperatingSystem == Cpp.OperatingSystemType.Android))
                        {
                            if (Shell.Execute("./build.sh") != 0)
                            {
                                throw new InvalidOperationException("ErrorInExecution: ./build.sh");
                            }
                        }
                        else
                        {
                            WriteLineError("Cross compiling to Android is not supported.");
                        }
                    }
                }
            }
            else
            {
                throw new InvalidOperationException();
            }
        }
Example #4
0
 public static void GenerateRetypemakeScript(Cpp.OperatingSystemType HostOperatingSystem, PathString SourceDirectory, PathString BuildDirectory, Shell.EnvironmentVariableMemory Memory, bool OverwriteRetypemakeScript)
 {
     if (HostOperatingSystem == Cpp.OperatingSystemType.Windows)
     {
         var Lines = new List <String>();
         Lines.Add("@echo off");
         Lines.Add("");
         Lines.Add("setlocal");
         Lines.Add("if \"%SUB_NO_PAUSE_SYMBOL%\"==\"1\" set NO_PAUSE_SYMBOL=1");
         Lines.Add("if /I \"%COMSPEC%\" == %CMDCMDLINE% set NO_PAUSE_SYMBOL=1");
         Lines.Add("set SUB_NO_PAUSE_SYMBOL=1");
         Lines.Add("call :main");
         Lines.Add("set EXIT_CODE=%ERRORLEVEL%");
         Lines.Add("if not \"%NO_PAUSE_SYMBOL%\"==\"1\" pause");
         Lines.Add("exit /b %EXIT_CODE%");
         Lines.Add("");
         Lines.Add(":main");
         foreach (var p in Memory.Variables)
         {
             if (p.Key == "BuildDirectory")
             {
                 Lines.Add("set BuildDirectory=%~dp0");
             }
             else
             {
                 if (Memory.VariableSelections.ContainsKey(p.Key))
                 {
                     Lines.Add($":: {String.Join("|", Memory.VariableSelections[p.Key])}");
                 }
                 if (Memory.VariableMultipleSelections.ContainsKey(p.Key))
                 {
                     Lines.Add($":: {String.Join(" ", Memory.VariableMultipleSelections[p.Key])}");
                 }
                 Lines.Add($"set " + Shell.EscapeArgumentForShell(p.Key + "=" + p.Value, Shell.ShellArgumentStyle.CMD));
             }
         }
         Lines.Add("pushd \"%SourceDirectory%\" || exit /b 1");
         Lines.Add("call .\\typemake.cmd %* || exit /b 1 & popd & exit /b 0"); //all commands after typemake need to be in one line; or it may cause trouble when the file is changed by typemake
         Lines.Add("");
         var RetypemakePath = BuildDirectory / "retypemake.cmd";
         if (OverwriteRetypemakeScript || !File.Exists(RetypemakePath))
         {
             TextFile.WriteToFile(RetypemakePath, String.Join("\r\n", Lines), System.Text.Encoding.Default, false);
         }
         else
         {
             WriteLineError("Retypemake script exists, script generation skipped.");
         }
     }
     else
     {
         var Lines = new List <String>();
         Lines.Add("#!/bin/bash");
         Lines.Add("set -e");
         foreach (var p in Memory.Variables)
         {
             if (p.Key == "BuildDirectory")
             {
                 Lines.Add("export BuildDirectory=$(cd `dirname \"$0\"`; pwd)");
             }
             else
             {
                 if (Memory.VariableSelections.ContainsKey(p.Key))
                 {
                     Lines.Add($"# {String.Join("|", Memory.VariableSelections[p.Key])}");
                 }
                 if (Memory.VariableMultipleSelections.ContainsKey(p.Key))
                 {
                     Lines.Add($"# {String.Join(" ", Memory.VariableMultipleSelections[p.Key])}");
                 }
                 Lines.Add($"export {p.Key}={Shell.EscapeArgumentForShell(p.Value, Shell.ShellArgumentStyle.Bash)}");
             }
         }
         Lines.Add("pushd \"${SourceDirectory}\"");
         Lines.Add("./typemake.sh \"$@\"; popd; exit"); //all commands after typemake need to be in one line; or it may cause trouble when the file is changed by typemake
         Lines.Add("");
         var RetypemakePath = BuildDirectory / "retypemake.sh";
         if (OverwriteRetypemakeScript || !File.Exists(RetypemakePath))
         {
             TextFile.WriteToFile(RetypemakePath, String.Join("\n", Lines), new System.Text.UTF8Encoding(false), false);
             if (Shell.Execute("chmod", "+x", RetypemakePath) != 0)
             {
                 throw new InvalidOperationException("ErrorInExecution: chmod");
             }
         }
         else
         {
             WriteLineError("Retypemake script exists, script generation skipped.");
         }
     }
 }