public BuildScript Analyse(Autobuilder builder, bool auto) { builder.Log(Severity.Info, "Attempting to locate build script"); var extensions = builder.Actions.IsWindows() ? winExtensions : linuxExtensions; var scripts = buildScripts.SelectMany(s => extensions.Select(e => s + e)); var scriptPath = builder.Paths.Where(p => scripts.Any(p.Item1.ToLower().EndsWith)).OrderBy(p => p.Item2).Select(p => p.Item1).FirstOrDefault(); if (scriptPath == null) { return(BuildScript.Failure); } var chmod = new CommandBuilder(builder.Actions); chmod.RunCommand("/bin/chmod", $"u+x {scriptPath}"); var chmodScript = builder.Actions.IsWindows() ? BuildScript.Success : BuildScript.Try(chmod.Script); var dir = Path.GetDirectoryName(scriptPath); // A specific .NET Core version may be required return(chmodScript & DotNetRule.WithDotNet(builder, dotNet => { var command = new CommandBuilder(builder.Actions, dir, dotNet?.Environment); // A specific Visual Studio version may be required var vsTools = MsBuildRule.GetVcVarsBatFile(builder); if (vsTools != null) { command.CallBatFile(vsTools.Path); } command.IndexCommand(builder.Odasa, scriptPath); return command.Script; })); }
BuildScript GetCSharpBuildScript() { /// <summary> /// A script that checks that the C# extractor has been executed. /// </summary> BuildScript CheckExtractorRun(bool warnOnFailure) => BuildScript.Create(actions => { if (actions.FileExists(Extractor.GetCSharpLogPath())) { return(0); } if (warnOnFailure) { Log(Severity.Error, "No C# code detected during build."); } return(1); }); var attempt = BuildScript.Failure; switch (GetCSharpBuildStrategy()) { case CSharpBuildStrategy.CustomBuildCommand: attempt = new BuildCommandRule().Analyse(this) & CheckExtractorRun(true); break; case CSharpBuildStrategy.Buildless: // No need to check that the extractor has been executed in buildless mode attempt = new StandaloneBuildRule().Analyse(this); break; case CSharpBuildStrategy.MSBuild: attempt = new MsBuildRule().Analyse(this) & CheckExtractorRun(true); break; case CSharpBuildStrategy.DotNet: attempt = new DotNetRule().Analyse(this) & CheckExtractorRun(true); break; case CSharpBuildStrategy.Auto: var cleanTrapFolder = BuildScript.DeleteDirectory(Actions.GetEnvironmentVariable("TRAP_FOLDER")); var cleanSourceArchive = BuildScript.DeleteDirectory(Actions.GetEnvironmentVariable("SOURCE_ARCHIVE")); var cleanExtractorLog = BuildScript.DeleteFile(Extractor.GetCSharpLogPath()); var attemptExtractorCleanup = BuildScript.Try(cleanTrapFolder) & BuildScript.Try(cleanSourceArchive) & BuildScript.Try(cleanExtractorLog); /// <summary> /// Execute script `s` and check that the C# extractor has been executed. /// If either fails, attempt to cleanup any artifacts produced by the extractor, /// and exit with code 1, in order to proceed to the next attempt. /// </summary> BuildScript IntermediateAttempt(BuildScript s) => (s & CheckExtractorRun(false)) | (attemptExtractorCleanup & BuildScript.Failure); attempt = // First try .NET Core IntermediateAttempt(new DotNetRule().Analyse(this)) | // Then MSBuild (() => IntermediateAttempt(new MsBuildRule().Analyse(this))) | // And finally look for a script that might be a build script (() => new BuildCommandAutoRule().Analyse(this) & CheckExtractorRun(true)) | // All attempts failed: print message AutobuildFailure(); break; } return (attempt & (() => new AspBuildRule().Analyse(this)) & (() => new XmlBuildRule().Analyse(this))); }