working on build scripts
This commit is contained in:
parent
f273ea4f7d
commit
d524732bbb
111 changed files with 3052 additions and 1989 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -1,5 +1,8 @@
|
|||
### Repo-specific things ###
|
||||
|
||||
# Test results
|
||||
*-testResults.xml
|
||||
|
||||
# NuGet keeps dropping
|
||||
Library/
|
||||
|
||||
|
|
|
@ -50,6 +50,11 @@ EndProject
|
|||
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "dotnet-projectmodel-server.Tests", "test\dotnet-projectmodel-server.Tests\dotnet-projectmodel-server.Tests.xproj", "{11C77123-E4DA-499F-8900-80C88C2C69F2}"
|
||||
EndProject
|
||||
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.DotNet.Files", "src\Microsoft.DotNet.Files\Microsoft.DotNet.Files.xproj", "{D521DD9F-0614-4929-93B4-D8FA5682C174}"
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripts", "scripts", "{88278B81-7649-45DC-8A6A-D3A645C5AFC3}"
|
||||
EndProject
|
||||
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "dotnet-cli-build", "scripts\dotnet-cli-build\dotnet-cli-build.xproj", "{D7B9695D-23EB-4EA8-B8AB-707A0092E1D5}"
|
||||
EndProject
|
||||
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.DotNet.Cli.Build.Framework", "scripts\Microsoft.DotNet.Cli.Build.Framework\Microsoft.DotNet.Cli.Build.Framework.xproj", "{49BEB486-AB5A-4416-91EA-8CD34ABB0C9D}"
|
||||
EndProject
|
||||
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "dotnet-compile.UnitTests", "test\dotnet-compile.UnitTests\dotnet-compile.UnitTests.xproj", "{920B71D8-62DA-4F5E-8A26-926C113F1D97}"
|
||||
EndProject
|
||||
|
@ -443,6 +448,70 @@ Global
|
|||
{947DD232-8D9B-4B78-9C6A-94F807D22222}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
|
||||
{947DD232-8D9B-4B78-9C6A-94F807D22222}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
|
||||
{947DD232-8D9B-4B78-9C6A-94F807D22222}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
|
||||
{09C52F96-EFDD-4448-95EC-6D362DD60BAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{09C52F96-EFDD-4448-95EC-6D362DD60BAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{09C52F96-EFDD-4448-95EC-6D362DD60BAA}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{09C52F96-EFDD-4448-95EC-6D362DD60BAA}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{09C52F96-EFDD-4448-95EC-6D362DD60BAA}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{09C52F96-EFDD-4448-95EC-6D362DD60BAA}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
|
||||
{09C52F96-EFDD-4448-95EC-6D362DD60BAA}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
|
||||
{09C52F96-EFDD-4448-95EC-6D362DD60BAA}.MinSizeRel|x64.Build.0 = Debug|Any CPU
|
||||
{09C52F96-EFDD-4448-95EC-6D362DD60BAA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{09C52F96-EFDD-4448-95EC-6D362DD60BAA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{09C52F96-EFDD-4448-95EC-6D362DD60BAA}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{09C52F96-EFDD-4448-95EC-6D362DD60BAA}.Release|x64.Build.0 = Release|Any CPU
|
||||
{09C52F96-EFDD-4448-95EC-6D362DD60BAA}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{09C52F96-EFDD-4448-95EC-6D362DD60BAA}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
|
||||
{09C52F96-EFDD-4448-95EC-6D362DD60BAA}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
|
||||
{09C52F96-EFDD-4448-95EC-6D362DD60BAA}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
|
||||
{44E7D1AC-DCF1-4A18-9C22-F09E6BB302B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{44E7D1AC-DCF1-4A18-9C22-F09E6BB302B5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{44E7D1AC-DCF1-4A18-9C22-F09E6BB302B5}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{44E7D1AC-DCF1-4A18-9C22-F09E6BB302B5}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{44E7D1AC-DCF1-4A18-9C22-F09E6BB302B5}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{44E7D1AC-DCF1-4A18-9C22-F09E6BB302B5}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
|
||||
{44E7D1AC-DCF1-4A18-9C22-F09E6BB302B5}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
|
||||
{44E7D1AC-DCF1-4A18-9C22-F09E6BB302B5}.MinSizeRel|x64.Build.0 = Debug|Any CPU
|
||||
{44E7D1AC-DCF1-4A18-9C22-F09E6BB302B5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{44E7D1AC-DCF1-4A18-9C22-F09E6BB302B5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{44E7D1AC-DCF1-4A18-9C22-F09E6BB302B5}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{44E7D1AC-DCF1-4A18-9C22-F09E6BB302B5}.Release|x64.Build.0 = Release|Any CPU
|
||||
{44E7D1AC-DCF1-4A18-9C22-F09E6BB302B5}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{44E7D1AC-DCF1-4A18-9C22-F09E6BB302B5}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
|
||||
{44E7D1AC-DCF1-4A18-9C22-F09E6BB302B5}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
|
||||
{44E7D1AC-DCF1-4A18-9C22-F09E6BB302B5}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
|
||||
{D7B9695D-23EB-4EA8-B8AB-707A0092E1D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{D7B9695D-23EB-4EA8-B8AB-707A0092E1D5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{D7B9695D-23EB-4EA8-B8AB-707A0092E1D5}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{D7B9695D-23EB-4EA8-B8AB-707A0092E1D5}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{D7B9695D-23EB-4EA8-B8AB-707A0092E1D5}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{D7B9695D-23EB-4EA8-B8AB-707A0092E1D5}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
|
||||
{D7B9695D-23EB-4EA8-B8AB-707A0092E1D5}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
|
||||
{D7B9695D-23EB-4EA8-B8AB-707A0092E1D5}.MinSizeRel|x64.Build.0 = Debug|Any CPU
|
||||
{D7B9695D-23EB-4EA8-B8AB-707A0092E1D5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{D7B9695D-23EB-4EA8-B8AB-707A0092E1D5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{D7B9695D-23EB-4EA8-B8AB-707A0092E1D5}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{D7B9695D-23EB-4EA8-B8AB-707A0092E1D5}.Release|x64.Build.0 = Release|Any CPU
|
||||
{D7B9695D-23EB-4EA8-B8AB-707A0092E1D5}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{D7B9695D-23EB-4EA8-B8AB-707A0092E1D5}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
|
||||
{D7B9695D-23EB-4EA8-B8AB-707A0092E1D5}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
|
||||
{D7B9695D-23EB-4EA8-B8AB-707A0092E1D5}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
|
||||
{49BEB486-AB5A-4416-91EA-8CD34ABB0C9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{49BEB486-AB5A-4416-91EA-8CD34ABB0C9D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{49BEB486-AB5A-4416-91EA-8CD34ABB0C9D}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{49BEB486-AB5A-4416-91EA-8CD34ABB0C9D}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{49BEB486-AB5A-4416-91EA-8CD34ABB0C9D}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{49BEB486-AB5A-4416-91EA-8CD34ABB0C9D}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
|
||||
{49BEB486-AB5A-4416-91EA-8CD34ABB0C9D}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
|
||||
{49BEB486-AB5A-4416-91EA-8CD34ABB0C9D}.MinSizeRel|x64.Build.0 = Debug|Any CPU
|
||||
{49BEB486-AB5A-4416-91EA-8CD34ABB0C9D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{49BEB486-AB5A-4416-91EA-8CD34ABB0C9D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{49BEB486-AB5A-4416-91EA-8CD34ABB0C9D}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{49BEB486-AB5A-4416-91EA-8CD34ABB0C9D}.Release|x64.Build.0 = Release|Any CPU
|
||||
{49BEB486-AB5A-4416-91EA-8CD34ABB0C9D}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{49BEB486-AB5A-4416-91EA-8CD34ABB0C9D}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
|
||||
{49BEB486-AB5A-4416-91EA-8CD34ABB0C9D}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
|
||||
{49BEB486-AB5A-4416-91EA-8CD34ABB0C9D}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
@ -472,5 +541,9 @@ Global
|
|||
{0138CB8F-4AA9-4029-A21E-C07C30F425BA} = {713CBFBB-5392-438D-B766-A9A585EF1BB8}
|
||||
{947DD232-8D9B-4B78-9C6A-94F807D2DD58} = {713CBFBB-5392-438D-B766-A9A585EF1BB8}
|
||||
{947DD232-8D9B-4B78-9C6A-94F807D22222} = {713CBFBB-5392-438D-B766-A9A585EF1BB8}
|
||||
{09C52F96-EFDD-4448-95EC-6D362DD60BAA} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
|
||||
{44E7D1AC-DCF1-4A18-9C22-F09E6BB302B5} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
|
||||
{D7B9695D-23EB-4EA8-B8AB-707A0092E1D5} = {88278B81-7649-45DC-8A6A-D3A645C5AFC3}
|
||||
{49BEB486-AB5A-4416-91EA-8CD34ABB0C9D} = {88278B81-7649-45DC-8A6A-D3A645C5AFC3}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
|
7
branchinfo.txt
Normal file
7
branchinfo.txt
Normal file
|
@ -0,0 +1,7 @@
|
|||
# This is a file containing environment variables specific to this branch
|
||||
# Any line that is not blank and does not start with '#' is interpreted as a variable to set
|
||||
# Each line is expected to be in the format "[Name]=[Value]".
|
||||
MAJOR_VERSION=1
|
||||
MINOR_VERSION=0
|
||||
PATCH_VERSION=0
|
||||
RELEASE_SUFFIX=beta
|
|
@ -6,4 +6,4 @@ REM Licensed under the MIT license. See LICENSE file in the project root for ful
|
|||
REM Crossgen Workaround
|
||||
set ComPlus_ReadyToRun=0
|
||||
|
||||
powershell -NoProfile -NoLogo -Command "%~dp0scripts\build\build.ps1 %*; exit $LastExitCode;"
|
||||
powershell -NoProfile -NoLogo -Command "%~dp0scripts\run-build.ps1 %*; exit $LastExitCode;"
|
||||
|
|
23
build.sh
23
build.sh
|
@ -16,26 +16,9 @@ while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symli
|
|||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
source "$DIR/scripts/common/_common.sh"
|
||||
source "$REPOROOT/scripts/build/process-args.sh"
|
||||
|
||||
# splitting build from package is required to work around dotnet/coreclr#2215
|
||||
# once that is fixed, we should remove the NOPACKAGE flag and do the full build either in
|
||||
# or out of docker.
|
||||
# Check if we need to build in docker
|
||||
if [ ! -z "$BUILD_IN_DOCKER" ]; then
|
||||
export BUILD_COMMAND=". /opt/code/scripts/build/process-args.sh $@ ; . /opt/code/scripts/build/build.sh"
|
||||
$REPOROOT/scripts/docker/dockerbuild.sh
|
||||
$DIR/scripts/dockerbuild.sh "$@"
|
||||
else
|
||||
$REPOROOT/scripts/build/build.sh
|
||||
fi
|
||||
|
||||
if [ ! -z "$NOPACKAGE" ]; then
|
||||
header "Skipping packaging"
|
||||
else
|
||||
if [ ! -z "$PACKAGE_IN_DOCKER" ]; then
|
||||
export BUILD_COMMAND="/opt/code/scripts/package/package.sh"
|
||||
$REPOROOT/scripts/docker/dockerbuild.sh
|
||||
else
|
||||
$REPOROOT/scripts/package/package.sh
|
||||
fi
|
||||
$DIR/scripts/run-build.sh "$@"
|
||||
fi
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
// Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build.Framework
|
||||
{
|
||||
public static class AnsiColorExtensions
|
||||
{
|
||||
public static string Black(this string text)
|
||||
{
|
||||
return "\x1B[30m" + text + "\x1B[39m";
|
||||
}
|
||||
|
||||
public static string Red(this string text)
|
||||
{
|
||||
return "\x1B[31m" + text + "\x1B[39m";
|
||||
}
|
||||
public static string Green(this string text)
|
||||
{
|
||||
return "\x1B[32m" + text + "\x1B[39m";
|
||||
}
|
||||
|
||||
public static string Yellow(this string text)
|
||||
{
|
||||
return "\x1B[33m" + text + "\x1B[39m";
|
||||
}
|
||||
|
||||
public static string Blue(this string text)
|
||||
{
|
||||
return "\x1B[34m" + text + "\x1B[39m";
|
||||
}
|
||||
|
||||
public static string Magenta(this string text)
|
||||
{
|
||||
return "\x1B[35m" + text + "\x1B[39m";
|
||||
}
|
||||
|
||||
public static string Cyan(this string text)
|
||||
{
|
||||
return "\x1B[36m" + text + "\x1B[39m";
|
||||
}
|
||||
|
||||
public static string White(this string text)
|
||||
{
|
||||
return "\x1B[37m" + text + "\x1B[39m";
|
||||
}
|
||||
|
||||
public static string Bold(this string text)
|
||||
{
|
||||
return "\x1B[1m" + text + "\x1B[22m";
|
||||
}
|
||||
}
|
||||
}
|
143
scripts/Microsoft.DotNet.Cli.Build.Framework/AnsiConsole.cs
Normal file
143
scripts/Microsoft.DotNet.Cli.Build.Framework/AnsiConsole.cs
Normal file
|
@ -0,0 +1,143 @@
|
|||
// Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build.Framework
|
||||
{
|
||||
public class AnsiConsole
|
||||
{
|
||||
private AnsiConsole(TextWriter writer, bool useConsoleColor)
|
||||
{
|
||||
Writer = writer;
|
||||
|
||||
_useConsoleColor = useConsoleColor;
|
||||
if (_useConsoleColor)
|
||||
{
|
||||
OriginalForegroundColor = Console.ForegroundColor;
|
||||
}
|
||||
}
|
||||
|
||||
private int _boldRecursion;
|
||||
private bool _useConsoleColor;
|
||||
|
||||
public static AnsiConsole GetOutput(bool useConsoleColor)
|
||||
{
|
||||
return new AnsiConsole(Console.Out, useConsoleColor);
|
||||
}
|
||||
|
||||
public static AnsiConsole GetError(bool useConsoleColor)
|
||||
{
|
||||
return new AnsiConsole(Console.Error, useConsoleColor);
|
||||
}
|
||||
|
||||
public TextWriter Writer { get; }
|
||||
|
||||
public ConsoleColor OriginalForegroundColor { get; }
|
||||
|
||||
private void SetColor(ConsoleColor color)
|
||||
{
|
||||
Console.ForegroundColor = (ConsoleColor)(((int)Console.ForegroundColor & 0x08) | ((int)color & 0x07));
|
||||
}
|
||||
|
||||
private void SetBold(bool bold)
|
||||
{
|
||||
_boldRecursion += bold ? 1 : -1;
|
||||
if (_boldRecursion > 1 || (_boldRecursion == 1 && !bold))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Console.ForegroundColor = (ConsoleColor)((int)Console.ForegroundColor ^ 0x08);
|
||||
}
|
||||
|
||||
public void WriteLine(string message)
|
||||
{
|
||||
if (!_useConsoleColor)
|
||||
{
|
||||
Writer.WriteLine(message);
|
||||
return;
|
||||
}
|
||||
|
||||
var escapeScan = 0;
|
||||
for (;;)
|
||||
{
|
||||
var escapeIndex = message.IndexOf("\x1b[", escapeScan);
|
||||
if (escapeIndex == -1)
|
||||
{
|
||||
var text = message.Substring(escapeScan);
|
||||
Writer.Write(text);
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
var startIndex = escapeIndex + 2;
|
||||
var endIndex = startIndex;
|
||||
while (endIndex != message.Length &&
|
||||
message[endIndex] >= 0x20 &&
|
||||
message[endIndex] <= 0x3f)
|
||||
{
|
||||
endIndex += 1;
|
||||
}
|
||||
|
||||
var text = message.Substring(escapeScan, escapeIndex - escapeScan);
|
||||
Writer.Write(text);
|
||||
if (endIndex == message.Length)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
switch (message[endIndex])
|
||||
{
|
||||
case 'm':
|
||||
int value;
|
||||
if (int.TryParse(message.Substring(startIndex, endIndex - startIndex), out value))
|
||||
{
|
||||
switch (value)
|
||||
{
|
||||
case 1:
|
||||
SetBold(true);
|
||||
break;
|
||||
case 22:
|
||||
SetBold(false);
|
||||
break;
|
||||
case 30:
|
||||
SetColor(ConsoleColor.Black);
|
||||
break;
|
||||
case 31:
|
||||
SetColor(ConsoleColor.Red);
|
||||
break;
|
||||
case 32:
|
||||
SetColor(ConsoleColor.Green);
|
||||
break;
|
||||
case 33:
|
||||
SetColor(ConsoleColor.Yellow);
|
||||
break;
|
||||
case 34:
|
||||
SetColor(ConsoleColor.Blue);
|
||||
break;
|
||||
case 35:
|
||||
SetColor(ConsoleColor.Magenta);
|
||||
break;
|
||||
case 36:
|
||||
SetColor(ConsoleColor.Cyan);
|
||||
break;
|
||||
case 37:
|
||||
SetColor(ConsoleColor.Gray);
|
||||
break;
|
||||
case 39:
|
||||
SetColor(OriginalForegroundColor);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
escapeScan = endIndex + 1;
|
||||
}
|
||||
}
|
||||
Writer.WriteLine();
|
||||
}
|
||||
}
|
||||
}
|
206
scripts/Microsoft.DotNet.Cli.Build.Framework/ArgumentEscaper.cs
Normal file
206
scripts/Microsoft.DotNet.Cli.Build.Framework/ArgumentEscaper.cs
Normal file
|
@ -0,0 +1,206 @@
|
|||
// Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build.Framework
|
||||
{
|
||||
public static class ArgumentEscaper
|
||||
{
|
||||
/// <summary>
|
||||
/// Undo the processing which took place to create string[] args in Main,
|
||||
/// so that the next process will receive the same string[] args
|
||||
///
|
||||
/// See here for more info:
|
||||
/// http://blogs.msdn.com/b/twistylittlepassagesallalike/archive/2011/04/23/everyone-quotes-arguments-the-wrong-way.aspx
|
||||
/// </summary>
|
||||
/// <param name="args"></param>
|
||||
/// <returns></returns>
|
||||
public static string EscapeAndConcatenateArgArrayForProcessStart(IEnumerable<string> args)
|
||||
{
|
||||
return string.Join(" ", EscapeArgArray(args));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Undo the processing which took place to create string[] args in Main,
|
||||
/// so that the next process will receive the same string[] args
|
||||
///
|
||||
/// See here for more info:
|
||||
/// http://blogs.msdn.com/b/twistylittlepassagesallalike/archive/2011/04/23/everyone-quotes-arguments-the-wrong-way.aspx
|
||||
/// </summary>
|
||||
/// <param name="args"></param>
|
||||
/// <returns></returns>
|
||||
public static string EscapeAndConcatenateArgArrayForCmdProcessStart(IEnumerable<string> args)
|
||||
{
|
||||
return string.Join(" ", EscapeArgArrayForCmd(args));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Undo the processing which took place to create string[] args in Main,
|
||||
/// so that the next process will receive the same string[] args
|
||||
///
|
||||
/// See here for more info:
|
||||
/// http://blogs.msdn.com/b/twistylittlepassagesallalike/archive/2011/04/23/everyone-quotes-arguments-the-wrong-way.aspx
|
||||
/// </summary>
|
||||
/// <param name="args"></param>
|
||||
/// <returns></returns>
|
||||
private static IEnumerable<string> EscapeArgArray(IEnumerable<string> args)
|
||||
{
|
||||
var escapedArgs = new List<string>();
|
||||
|
||||
foreach (var arg in args)
|
||||
{
|
||||
escapedArgs.Add(EscapeArg(arg));
|
||||
}
|
||||
|
||||
return escapedArgs;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This prefixes every character with the '^' character to force cmd to
|
||||
/// interpret the argument string literally. An alternative option would
|
||||
/// be to do this only for cmd metacharacters.
|
||||
///
|
||||
/// See here for more info:
|
||||
/// http://blogs.msdn.com/b/twistylittlepassagesallalike/archive/2011/04/23/everyone-quotes-arguments-the-wrong-way.aspx
|
||||
/// </summary>
|
||||
/// <param name="args"></param>
|
||||
/// <returns></returns>
|
||||
private static IEnumerable<string> EscapeArgArrayForCmd(IEnumerable<string> arguments)
|
||||
{
|
||||
var escapedArgs = new List<string>();
|
||||
|
||||
foreach (var arg in arguments)
|
||||
{
|
||||
escapedArgs.Add(EscapeArgForCmd(arg));
|
||||
}
|
||||
|
||||
return escapedArgs;
|
||||
}
|
||||
|
||||
private static string EscapeArg(string arg)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
|
||||
var quoted = ShouldSurroundWithQuotes(arg);
|
||||
if (quoted) sb.Append("\"");
|
||||
|
||||
for (int i = 0; i < arg.Length; ++i)
|
||||
{
|
||||
var backslashCount = 0;
|
||||
|
||||
// Consume All Backslashes
|
||||
while (i < arg.Length && arg[i] == '\\')
|
||||
{
|
||||
backslashCount++;
|
||||
i++;
|
||||
}
|
||||
|
||||
// Escape any backslashes at the end of the arg
|
||||
// This ensures the outside quote is interpreted as
|
||||
// an argument delimiter
|
||||
if (i == arg.Length)
|
||||
{
|
||||
sb.Append('\\', 2 * backslashCount);
|
||||
}
|
||||
|
||||
// Escape any preceding backslashes and the quote
|
||||
else if (arg[i] == '"')
|
||||
{
|
||||
sb.Append('\\', (2 * backslashCount) + 1);
|
||||
sb.Append('"');
|
||||
}
|
||||
|
||||
// Output any consumed backslashes and the character
|
||||
else
|
||||
{
|
||||
sb.Append('\\', backslashCount);
|
||||
sb.Append(arg[i]);
|
||||
}
|
||||
}
|
||||
|
||||
if (quoted) sb.Append("\"");
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Prepare as single argument to
|
||||
/// roundtrip properly through cmd.
|
||||
///
|
||||
/// This prefixes every character with the '^' character to force cmd to
|
||||
/// interpret the argument string literally. An alternative option would
|
||||
/// be to do this only for cmd metacharacters.
|
||||
///
|
||||
/// See here for more info:
|
||||
/// http://blogs.msdn.com/b/twistylittlepassagesallalike/archive/2011/04/23/everyone-quotes-arguments-the-wrong-way.aspx
|
||||
/// </summary>
|
||||
/// <param name="args"></param>
|
||||
/// <returns></returns>
|
||||
private static string EscapeArgForCmd(string argument)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
|
||||
var quoted = ShouldSurroundWithQuotes(argument);
|
||||
|
||||
if (quoted) sb.Append("^\"");
|
||||
|
||||
foreach (var character in argument)
|
||||
{
|
||||
|
||||
if (character == '"')
|
||||
{
|
||||
|
||||
sb.Append('^');
|
||||
sb.Append('"');
|
||||
sb.Append('^');
|
||||
sb.Append(character);
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.Append("^");
|
||||
sb.Append(character);
|
||||
}
|
||||
}
|
||||
|
||||
if (quoted) sb.Append("^\"");
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Prepare as single argument to
|
||||
/// roundtrip properly through cmd.
|
||||
///
|
||||
/// This prefixes every character with the '^' character to force cmd to
|
||||
/// interpret the argument string literally. An alternative option would
|
||||
/// be to do this only for cmd metacharacters.
|
||||
///
|
||||
/// See here for more info:
|
||||
/// http://blogs.msdn.com/b/twistylittlepassagesallalike/archive/2011/04/23/everyone-quotes-arguments-the-wrong-way.aspx
|
||||
/// </summary>
|
||||
/// <param name="args"></param>
|
||||
/// <returns></returns>
|
||||
internal static bool ShouldSurroundWithQuotes(string argument)
|
||||
{
|
||||
// Don't quote already quoted strings
|
||||
if (argument.StartsWith("\"", StringComparison.Ordinal) &&
|
||||
argument.EndsWith("\"", StringComparison.Ordinal))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Only quote if whitespace exists in the string
|
||||
if (argument.Contains(" ") || argument.Contains("\t") || argument.Contains("\n"))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
132
scripts/Microsoft.DotNet.Cli.Build.Framework/BuildContext.cs
Normal file
132
scripts/Microsoft.DotNet.Cli.Build.Framework/BuildContext.cs
Normal file
|
@ -0,0 +1,132 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build.Framework
|
||||
{
|
||||
public class BuildContext
|
||||
{
|
||||
private IDictionary<string, BuildTargetResult> _completedTargets = new Dictionary<string, BuildTargetResult>(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
public static readonly string DefaultTarget = "Default";
|
||||
|
||||
private int _maxTargetLen;
|
||||
private Stack<string> _targetStack = new Stack<string>();
|
||||
|
||||
public IDictionary<string, BuildTarget> Targets { get; }
|
||||
|
||||
public IDictionary<string, object> Properties = new Dictionary<string, object>();
|
||||
|
||||
public string BuildDirectory { get; }
|
||||
|
||||
public object this[string name]
|
||||
{
|
||||
get { return Properties.ContainsKey(name) ? Properties[name] : null; }
|
||||
set { Properties[name] = value; }
|
||||
}
|
||||
|
||||
public BuildContext(IDictionary<string, BuildTarget> targets, string buildDirectory)
|
||||
{
|
||||
Targets = targets;
|
||||
BuildDirectory = buildDirectory;
|
||||
_maxTargetLen = targets.Values.Select(t => t.Name.Length).Max();
|
||||
}
|
||||
|
||||
public BuildTargetResult RunTarget(string name) => RunTarget(name, force: false);
|
||||
|
||||
public BuildTargetResult RunTarget(string name, bool force)
|
||||
{
|
||||
BuildTarget target;
|
||||
if (!Targets.TryGetValue(name, out target))
|
||||
{
|
||||
Reporter.Verbose.WriteLine($"Skipping undefined target: {name}");
|
||||
}
|
||||
|
||||
// Check if it's been completed
|
||||
BuildTargetResult result;
|
||||
if (!force && _completedTargets.TryGetValue(name, out result))
|
||||
{
|
||||
Reporter.Verbose.WriteLine($"Skipping completed target: {target.Name}");
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
// It hasn't, or we're forcing, so run it
|
||||
result = ExecTarget(target);
|
||||
_completedTargets[target.Name] = result;
|
||||
return result;
|
||||
}
|
||||
|
||||
public void Verbose(string message)
|
||||
{
|
||||
Reporter.Output.WriteLine("trace".White() + $": {message}");
|
||||
}
|
||||
|
||||
public void Info(string message)
|
||||
{
|
||||
Reporter.Output.WriteLine("info ".Green() + $": {message}");
|
||||
}
|
||||
|
||||
public void Warn(string message)
|
||||
{
|
||||
Reporter.Output.WriteLine("warn ".Yellow() + $": {message}");
|
||||
}
|
||||
|
||||
public void Error(string message)
|
||||
{
|
||||
Reporter.Error.WriteLine("error".Red().Bold() + $": {message}");
|
||||
}
|
||||
|
||||
private BuildTargetResult ExecTarget(BuildTarget target)
|
||||
{
|
||||
var sectionName = $"{target.Name.PadRight(_maxTargetLen + 2).Yellow()} ({target.Source.White()})";
|
||||
BuildReporter.BeginSection("TARGET", sectionName);
|
||||
|
||||
BuildTargetResult result;
|
||||
|
||||
// Run the dependencies
|
||||
var dependencyResults = new Dictionary<string, BuildTargetResult>();
|
||||
var failedDependencyResult = RunDependencies(target, dependencyResults);
|
||||
if (failedDependencyResult != null)
|
||||
{
|
||||
result = failedDependencyResult;
|
||||
}
|
||||
else if (target.Body != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
result = target.Body(new BuildTargetContext(this, target, dependencyResults));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
result = new BuildTargetResult(target, success: false, exception: ex);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
result = new BuildTargetResult(target, success: true);
|
||||
}
|
||||
BuildReporter.EndSection("TARGET", sectionName, result.Success);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private BuildTargetResult RunDependencies(BuildTarget target, Dictionary<string, BuildTargetResult> dependencyResults)
|
||||
{
|
||||
BuildTargetResult result = null;
|
||||
foreach (var dependency in target.Dependencies)
|
||||
{
|
||||
result = RunTarget(dependency);
|
||||
dependencyResults[dependency] = result;
|
||||
|
||||
if (!result.Success)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
using System;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build.Framework
|
||||
{
|
||||
public class BuildFailureException : Exception
|
||||
{
|
||||
public BuildTarget Target { get; }
|
||||
|
||||
public BuildFailureException()
|
||||
{
|
||||
}
|
||||
|
||||
public BuildFailureException(BuildTarget target) : base($"The '{target.Name}' target failed")
|
||||
{
|
||||
Target = target;
|
||||
}
|
||||
|
||||
public BuildFailureException(BuildTarget target, Exception innerException) : base($"The '{target.Name}' target failed", innerException)
|
||||
{
|
||||
Target = target;
|
||||
}
|
||||
|
||||
public BuildFailureException(string message) : base(message)
|
||||
{
|
||||
}
|
||||
|
||||
public BuildFailureException(string message, BuildTarget target) : base(message)
|
||||
{
|
||||
Target = target;
|
||||
}
|
||||
|
||||
public BuildFailureException(string message, Exception innerException) : base(message, innerException)
|
||||
{
|
||||
}
|
||||
|
||||
public BuildFailureException(string message, Exception innerException, BuildTarget target) : base(message, innerException)
|
||||
{
|
||||
Target = target;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
42
scripts/Microsoft.DotNet.Cli.Build.Framework/BuildHelpers.cs
Normal file
42
scripts/Microsoft.DotNet.Cli.Build.Framework/BuildHelpers.cs
Normal file
|
@ -0,0 +1,42 @@
|
|||
using System.Collections.Generic;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build.Framework
|
||||
{
|
||||
public static class BuildHelpers
|
||||
{
|
||||
public static int ExecInSilent(string workingDirectory, string command, params string[] args) => ExecInSilent(workingDirectory, command, (IEnumerable<string>)args);
|
||||
public static int ExecInSilent(string workingDirectory, string command, IEnumerable<string> args) => ExecCore(command, args, workingDirectory, silent: true);
|
||||
|
||||
public static int ExecIn(string workingDirectory, string command, params string[] args) => ExecIn(workingDirectory, command, (IEnumerable<string>)args);
|
||||
public static int ExecIn(string workingDirectory, string command, IEnumerable<string> args) => ExecCore(command, args, workingDirectory, silent: false);
|
||||
|
||||
public static int ExecSilent(string command, params string[] args) => ExecSilent(command, (IEnumerable<string>)args);
|
||||
public static int ExecSilent(string command, IEnumerable<string> args) => ExecCore(command, args, workingDirectory: null, silent: true);
|
||||
|
||||
public static int Exec(string command, params string[] args) => Exec(command, (IEnumerable<string>)args);
|
||||
public static int Exec(string command, IEnumerable<string> args) => ExecCore(command, args, workingDirectory: null, silent: false);
|
||||
|
||||
public static Command Cmd(string command, params string[] args) => Cmd(command, (IEnumerable<string>)args);
|
||||
public static Command Cmd(string command, IEnumerable<string> args)
|
||||
{
|
||||
return Command.Create(command, args);
|
||||
}
|
||||
|
||||
internal static int ExecCore(string command, IEnumerable<string> args, string workingDirectory, bool silent)
|
||||
{
|
||||
var cmd = Cmd(command, args);
|
||||
if(!string.IsNullOrEmpty(workingDirectory))
|
||||
{
|
||||
cmd.WorkingDirectory(workingDirectory);
|
||||
}
|
||||
if(silent)
|
||||
{
|
||||
cmd.CaptureStdErr().CaptureStdOut();
|
||||
}
|
||||
var result = cmd.Execute();
|
||||
|
||||
result.EnsureSuccessful();
|
||||
return result.ExitCode;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
using System;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build.Framework
|
||||
{
|
||||
public static class BuildReporter
|
||||
{
|
||||
public static void BeginSection(string type, string name)
|
||||
{
|
||||
Reporter.Output.WriteLine($"[{type.PadRight(10)} >]".Green() + $" [....] [{DateTime.Now:O}]".Blue() + $" {name}");
|
||||
}
|
||||
|
||||
public static void EndSection(string type, string name, bool success)
|
||||
{
|
||||
var header = $"[{type.PadRight(10)} <]";
|
||||
if(success)
|
||||
{
|
||||
header = header.Green();
|
||||
}
|
||||
else
|
||||
{
|
||||
header = header.Red();
|
||||
}
|
||||
var successString = success ? " OK " : "FAIL";
|
||||
Reporter.Output.WriteLine(header + $" [{successString}] [{DateTime.Now:O}]".Blue() + $" {name}");
|
||||
}
|
||||
}
|
||||
}
|
148
scripts/Microsoft.DotNet.Cli.Build.Framework/BuildSetup.cs
Normal file
148
scripts/Microsoft.DotNet.Cli.Build.Framework/BuildSetup.cs
Normal file
|
@ -0,0 +1,148 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build.Framework
|
||||
{
|
||||
public class BuildSetup
|
||||
{
|
||||
private Dictionary<string, BuildTarget> _targets = new Dictionary<string, BuildTarget>();
|
||||
|
||||
public IList<TargetOverride> _overrides = new List<TargetOverride>();
|
||||
|
||||
public string ProductName { get; }
|
||||
|
||||
public BuildSetup(string productName)
|
||||
{
|
||||
ProductName = productName;
|
||||
}
|
||||
|
||||
public static BuildSetup Create(string productName)
|
||||
{
|
||||
return new BuildSetup(productName);
|
||||
}
|
||||
|
||||
public BuildSetup UseTargets(IEnumerable<BuildTarget> targets)
|
||||
{
|
||||
foreach (var target in targets)
|
||||
{
|
||||
BuildTarget previousTarget;
|
||||
if (_targets.TryGetValue(target.Name, out previousTarget))
|
||||
{
|
||||
_overrides.Add(new TargetOverride(target.Name, previousTarget.Source, target.Source));
|
||||
}
|
||||
_targets[target.Name] = target;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public BuildSetup UseAllTargetsFromAssembly<T>()
|
||||
{
|
||||
var asm = typeof(T).GetTypeInfo().Assembly;
|
||||
return UseTargets(asm.GetExportedTypes().SelectMany(t => CollectTargets(t)));
|
||||
}
|
||||
|
||||
public BuildSetup UseTargetsFrom<T>()
|
||||
{
|
||||
return UseTargets(CollectTargets(typeof(T)));
|
||||
}
|
||||
|
||||
public int Run(string[] args)
|
||||
{
|
||||
DebugHelper.HandleDebugSwitch(ref args);
|
||||
|
||||
var targets = new[] { BuildContext.DefaultTarget };
|
||||
if(args.Length > 0)
|
||||
{
|
||||
targets = args;
|
||||
}
|
||||
|
||||
Reporter.Output.WriteBanner($"Building {ProductName}");
|
||||
|
||||
if (_overrides.Any())
|
||||
{
|
||||
foreach (var targetOverride in _overrides)
|
||||
{
|
||||
Reporter.Verbose.WriteLine($"Target {targetOverride.Name} from {targetOverride.OriginalSource} was overridden in {targetOverride.OverrideSource}".Black());
|
||||
}
|
||||
}
|
||||
|
||||
var context = new BuildContext(_targets, Directory.GetCurrentDirectory());
|
||||
BuildTargetResult result = null;
|
||||
try
|
||||
{
|
||||
foreach (var target in targets)
|
||||
{
|
||||
result = context.RunTarget(target);
|
||||
if(!result.Success)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Reporter.Error.WriteLine(ex.ToString().Red());
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(result != null && !result.Success)
|
||||
{
|
||||
Reporter.Error.WriteLine($"Build failed: {result.ErrorMessage}".Red());
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
Reporter.Output.WriteLine("Build succeeded".Green());
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
private static IEnumerable<BuildTarget> CollectTargets(Type typ)
|
||||
{
|
||||
return from m in typ.GetMethods()
|
||||
let attr = m.GetCustomAttribute<TargetAttribute>()
|
||||
where attr != null
|
||||
select CreateTarget(m, attr);
|
||||
}
|
||||
|
||||
private static BuildTarget CreateTarget(MethodInfo m, TargetAttribute attr)
|
||||
{
|
||||
return new BuildTarget(
|
||||
attr.Name ?? m.Name,
|
||||
$"{m.DeclaringType.FullName}.{m.Name}",
|
||||
attr.Dependencies,
|
||||
(Func<BuildTargetContext, BuildTargetResult>)m.CreateDelegate(typeof(Func<BuildTargetContext, BuildTargetResult>)));
|
||||
}
|
||||
|
||||
private string GenerateSourceString(string file, int? line, string member)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(file) && line != null)
|
||||
{
|
||||
return $"{file}:{line}";
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(member))
|
||||
{
|
||||
return member;
|
||||
}
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
public class TargetOverride
|
||||
{
|
||||
public string Name { get; }
|
||||
public string OriginalSource { get; }
|
||||
public string OverrideSource { get; }
|
||||
|
||||
public TargetOverride(string name, string originalSource, string overrideSource)
|
||||
{
|
||||
Name = name;
|
||||
OriginalSource = originalSource;
|
||||
OverrideSource = overrideSource;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
24
scripts/Microsoft.DotNet.Cli.Build.Framework/BuildTarget.cs
Normal file
24
scripts/Microsoft.DotNet.Cli.Build.Framework/BuildTarget.cs
Normal file
|
@ -0,0 +1,24 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build.Framework
|
||||
{
|
||||
public class BuildTarget
|
||||
{
|
||||
public string Name { get; }
|
||||
public string Source { get; }
|
||||
public IEnumerable<string> Dependencies { get; }
|
||||
public Func<BuildTargetContext, BuildTargetResult> Body { get; }
|
||||
|
||||
public BuildTarget(string name, string source) : this(name, source, Enumerable.Empty<string>(), null) { }
|
||||
public BuildTarget(string name, string source, IEnumerable<string> dependencies) : this(name, source, dependencies, null) { }
|
||||
public BuildTarget(string name, string source, IEnumerable<string> dependencies, Func<BuildTargetContext, BuildTargetResult> body)
|
||||
{
|
||||
Name = name;
|
||||
Source = source;
|
||||
Dependencies = dependencies;
|
||||
Body = body;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build.Framework
|
||||
{
|
||||
public class BuildTargetContext
|
||||
{
|
||||
private IDictionary<string, BuildTargetResult> _dependencyResults;
|
||||
|
||||
public BuildContext BuildContext { get; }
|
||||
public BuildTarget Target { get; }
|
||||
|
||||
public BuildTargetContext(BuildContext buildContext, BuildTarget target, IDictionary<string, BuildTargetResult> dependencyResults)
|
||||
{
|
||||
BuildContext = buildContext;
|
||||
Target = target;
|
||||
_dependencyResults = dependencyResults;
|
||||
}
|
||||
|
||||
public BuildTargetResult Success()
|
||||
{
|
||||
return new BuildTargetResult(Target, success: true);
|
||||
}
|
||||
|
||||
public BuildTargetResult Failed() => Failed(errorMessage: string.Empty);
|
||||
|
||||
public BuildTargetResult Failed(string errorMessage)
|
||||
{
|
||||
return new BuildTargetResult(Target, success: false, errorMessage: errorMessage);
|
||||
}
|
||||
|
||||
public void Info(string message) => BuildContext.Info(message);
|
||||
public void Warn(string message) => BuildContext.Warn(message);
|
||||
public void Error(string message) => BuildContext.Error(message);
|
||||
public void Verbose(string message) => BuildContext.Verbose(message);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
using System;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build.Framework
|
||||
{
|
||||
public class BuildTargetResult
|
||||
{
|
||||
public BuildTarget Target { get; }
|
||||
public bool Success { get; }
|
||||
public string ErrorMessage { get; }
|
||||
public Exception Exception { get; }
|
||||
|
||||
public BuildTargetResult(BuildTarget target, bool success) : this(target, success, errorMessage: string.Empty) { }
|
||||
|
||||
public BuildTargetResult(BuildTarget target, bool success, Exception exception) : this(target, success, exception.ToString())
|
||||
{
|
||||
Exception = exception;
|
||||
}
|
||||
|
||||
public BuildTargetResult(BuildTarget target, bool success, string errorMessage)
|
||||
{
|
||||
Target = target;
|
||||
Success = success;
|
||||
ErrorMessage = errorMessage;
|
||||
}
|
||||
|
||||
public void EnsureSuccessful()
|
||||
{
|
||||
if(!Success)
|
||||
{
|
||||
if(string.IsNullOrEmpty(ErrorMessage))
|
||||
{
|
||||
throw new BuildFailureException(Target, Exception);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new BuildFailureException(ErrorMessage, Exception, Target);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
327
scripts/Microsoft.DotNet.Cli.Build.Framework/Command.cs
Normal file
327
scripts/Microsoft.DotNet.Cli.Build.Framework/Command.cs
Normal file
|
@ -0,0 +1,327 @@
|
|||
// Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build.Framework
|
||||
{
|
||||
public class Command
|
||||
{
|
||||
private Process _process;
|
||||
|
||||
private StringWriter _stdOutCapture;
|
||||
private StringWriter _stdErrCapture;
|
||||
|
||||
private Action<string> _stdOutForward;
|
||||
private Action<string> _stdErrForward;
|
||||
|
||||
private Action<string> _stdOutHandler;
|
||||
private Action<string> _stdErrHandler;
|
||||
|
||||
private bool _running = false;
|
||||
|
||||
private Command(string executable, string args)
|
||||
{
|
||||
// Set the things we need
|
||||
var psi = new ProcessStartInfo()
|
||||
{
|
||||
FileName = executable,
|
||||
Arguments = args
|
||||
};
|
||||
|
||||
_process = new Process()
|
||||
{
|
||||
StartInfo = psi
|
||||
};
|
||||
}
|
||||
|
||||
public static Command Create(string executable, params string[] args)
|
||||
{
|
||||
return Create(executable, ArgumentEscaper.EscapeAndConcatenateArgArrayForProcessStart(args));
|
||||
}
|
||||
|
||||
public static Command Create(string executable, IEnumerable<string> args)
|
||||
{
|
||||
return Create(executable, ArgumentEscaper.EscapeAndConcatenateArgArrayForProcessStart(args));
|
||||
}
|
||||
|
||||
public static Command Create(string executable, string args)
|
||||
{
|
||||
ResolveExecutablePath(ref executable, ref args);
|
||||
|
||||
return new Command(executable, args);
|
||||
}
|
||||
|
||||
private static void ResolveExecutablePath(ref string executable, ref string args)
|
||||
{
|
||||
foreach (string suffix in Constants.RunnableSuffixes)
|
||||
{
|
||||
var fullExecutable = Path.GetFullPath(Path.Combine(
|
||||
AppContext.BaseDirectory, executable + suffix));
|
||||
|
||||
if (File.Exists(fullExecutable))
|
||||
{
|
||||
executable = fullExecutable;
|
||||
|
||||
// In priority order we've found the best runnable extension, so break.
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// On Windows, we want to avoid using "cmd" if possible (it mangles the colors, and a bunch of other things)
|
||||
// So, do a quick path search to see if we can just directly invoke it
|
||||
var useCmd = ShouldUseCmd(executable);
|
||||
|
||||
if (useCmd)
|
||||
{
|
||||
var comSpec = System.Environment.GetEnvironmentVariable("ComSpec");
|
||||
|
||||
// cmd doesn't like "foo.exe ", so we need to ensure that if
|
||||
// args is empty, we just run "foo.exe"
|
||||
if (!string.IsNullOrEmpty(args))
|
||||
{
|
||||
executable = (executable + " " + args).Replace("\"", "\\\"");
|
||||
}
|
||||
args = $"/C \"{executable}\"";
|
||||
executable = comSpec;
|
||||
}
|
||||
}
|
||||
|
||||
private static bool ShouldUseCmd(string executable)
|
||||
{
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
var extension = Path.GetExtension(executable);
|
||||
if (!string.IsNullOrEmpty(extension))
|
||||
{
|
||||
return !string.Equals(extension, ".exe", StringComparison.Ordinal);
|
||||
}
|
||||
else if (executable.Contains(Path.DirectorySeparatorChar))
|
||||
{
|
||||
// It's a relative path without an extension
|
||||
if (File.Exists(executable + ".exe"))
|
||||
{
|
||||
// It refers to an exe!
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Search the path to see if we can find it
|
||||
foreach (var path in System.Environment.GetEnvironmentVariable("PATH").Split(Path.PathSeparator))
|
||||
{
|
||||
var candidate = Path.Combine(path, executable + ".exe");
|
||||
if (File.Exists(candidate))
|
||||
{
|
||||
// We found an exe!
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// It's a non-exe :(
|
||||
return true;
|
||||
}
|
||||
|
||||
// Non-windows never uses cmd
|
||||
return false;
|
||||
}
|
||||
|
||||
public Command Environment(IDictionary<string, string> env)
|
||||
{
|
||||
foreach(var item in env)
|
||||
{
|
||||
_process.StartInfo.Environment[item.Key] = item.Value;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public CommandResult Execute()
|
||||
{
|
||||
ThrowIfRunning();
|
||||
_running = true;
|
||||
|
||||
if (_process.StartInfo.RedirectStandardOutput)
|
||||
{
|
||||
_process.OutputDataReceived += (sender, args) =>
|
||||
{
|
||||
ProcessData(args.Data, _stdOutCapture, _stdOutForward, _stdOutHandler);
|
||||
};
|
||||
}
|
||||
|
||||
if (_process.StartInfo.RedirectStandardError)
|
||||
{
|
||||
_process.ErrorDataReceived += (sender, args) =>
|
||||
{
|
||||
ProcessData(args.Data, _stdErrCapture, _stdErrForward, _stdErrHandler);
|
||||
};
|
||||
}
|
||||
|
||||
_process.EnableRaisingEvents = true;
|
||||
|
||||
var sw = Stopwatch.StartNew();
|
||||
BuildReporter.BeginSection("EXEC", FormatProcessInfo(_process.StartInfo));
|
||||
|
||||
_process.Start();
|
||||
|
||||
if (_process.StartInfo.RedirectStandardOutput)
|
||||
{
|
||||
_process.BeginOutputReadLine();
|
||||
}
|
||||
|
||||
if (_process.StartInfo.RedirectStandardError)
|
||||
{
|
||||
_process.BeginErrorReadLine();
|
||||
}
|
||||
|
||||
_process.WaitForExit();
|
||||
|
||||
var exitCode = _process.ExitCode;
|
||||
|
||||
var message = $"{FormatProcessInfo(_process.StartInfo)} exited with {exitCode}";
|
||||
if (exitCode == 0)
|
||||
{
|
||||
BuildReporter.EndSection("EXEC", message.Green(), success: true);
|
||||
}
|
||||
else
|
||||
{
|
||||
BuildReporter.EndSection("EXEC", message.Red().Bold(), success: false);
|
||||
}
|
||||
|
||||
return new CommandResult(
|
||||
_process.StartInfo,
|
||||
exitCode,
|
||||
_stdOutCapture?.GetStringBuilder()?.ToString(),
|
||||
_stdErrCapture?.GetStringBuilder()?.ToString());
|
||||
}
|
||||
|
||||
public Command WorkingDirectory(string projectDirectory)
|
||||
{
|
||||
_process.StartInfo.WorkingDirectory = projectDirectory;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Command EnvironmentVariable(string name, string value)
|
||||
{
|
||||
_process.StartInfo.Environment[name] = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Command CaptureStdOut()
|
||||
{
|
||||
ThrowIfRunning();
|
||||
_process.StartInfo.RedirectStandardOutput = true;
|
||||
_stdOutCapture = new StringWriter();
|
||||
return this;
|
||||
}
|
||||
|
||||
public Command CaptureStdErr()
|
||||
{
|
||||
ThrowIfRunning();
|
||||
_process.StartInfo.RedirectStandardError = true;
|
||||
_stdErrCapture = new StringWriter();
|
||||
return this;
|
||||
}
|
||||
|
||||
public Command ForwardStdOut(TextWriter to = null)
|
||||
{
|
||||
ThrowIfRunning();
|
||||
_process.StartInfo.RedirectStandardOutput = true;
|
||||
if (to == null)
|
||||
{
|
||||
_stdOutForward = Reporter.Output.WriteLine;
|
||||
}
|
||||
else
|
||||
{
|
||||
_stdOutForward = to.WriteLine;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public Command ForwardStdErr(TextWriter to = null)
|
||||
{
|
||||
ThrowIfRunning();
|
||||
_process.StartInfo.RedirectStandardError = true;
|
||||
if (to == null)
|
||||
{
|
||||
_stdErrForward = Reporter.Error.WriteLine;
|
||||
}
|
||||
else
|
||||
{
|
||||
_stdErrForward = to.WriteLine;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public Command OnOutputLine(Action<string> handler)
|
||||
{
|
||||
ThrowIfRunning();
|
||||
_process.StartInfo.RedirectStandardOutput = true;
|
||||
if (_stdOutHandler != null)
|
||||
{
|
||||
throw new InvalidOperationException("Already handling stdout!");
|
||||
}
|
||||
_stdOutHandler = handler;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Command OnErrorLine(Action<string> handler)
|
||||
{
|
||||
ThrowIfRunning();
|
||||
_process.StartInfo.RedirectStandardError = true;
|
||||
if (_stdErrHandler != null)
|
||||
{
|
||||
throw new InvalidOperationException("Already handling stderr!");
|
||||
}
|
||||
_stdErrHandler = handler;
|
||||
return this;
|
||||
}
|
||||
|
||||
private string FormatProcessInfo(ProcessStartInfo info)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(info.Arguments))
|
||||
{
|
||||
return info.FileName;
|
||||
}
|
||||
|
||||
return info.FileName + " " + info.Arguments;
|
||||
}
|
||||
|
||||
private void ThrowIfRunning([CallerMemberName] string memberName = null)
|
||||
{
|
||||
if (_running)
|
||||
{
|
||||
throw new InvalidOperationException($"Unable to invoke {memberName} after the command has been run");
|
||||
}
|
||||
}
|
||||
|
||||
private void ProcessData(string data, StringWriter capture, Action<string> forward, Action<string> handler)
|
||||
{
|
||||
if (data == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (capture != null)
|
||||
{
|
||||
capture.WriteLine(data);
|
||||
}
|
||||
|
||||
if (forward != null)
|
||||
{
|
||||
forward(data);
|
||||
}
|
||||
|
||||
if (handler != null)
|
||||
{
|
||||
handler(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
// Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build.Framework
|
||||
{
|
||||
public struct CommandResult
|
||||
{
|
||||
public static readonly CommandResult Empty = new CommandResult();
|
||||
|
||||
public ProcessStartInfo StartInfo { get; }
|
||||
public int ExitCode { get; }
|
||||
public string StdOut { get; }
|
||||
public string StdErr { get; }
|
||||
|
||||
public CommandResult(ProcessStartInfo startInfo, int exitCode, string stdOut, string stdErr)
|
||||
{
|
||||
StartInfo = startInfo;
|
||||
ExitCode = exitCode;
|
||||
StdOut = stdOut;
|
||||
StdErr = stdErr;
|
||||
}
|
||||
|
||||
public void EnsureSuccessful()
|
||||
{
|
||||
if(ExitCode != 0)
|
||||
{
|
||||
throw new BuildFailureException($"Command failed with exit code {ExitCode}: {StartInfo.FileName} {StartInfo.Arguments}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
23
scripts/Microsoft.DotNet.Cli.Build.Framework/Constants.cs
Normal file
23
scripts/Microsoft.DotNet.Cli.Build.Framework/Constants.cs
Normal file
|
@ -0,0 +1,23 @@
|
|||
// Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build.Framework
|
||||
{
|
||||
public static class Constants
|
||||
{
|
||||
//public static readonly string ProjectFileName = "project.json";
|
||||
public static readonly string ExeSuffix = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ".exe" : string.Empty;
|
||||
|
||||
// Priority order of runnable suffixes to look for and run
|
||||
public static readonly string[] RunnableSuffixes = RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
|
||||
? new string[] { ".exe", ".cmd", ".bat" }
|
||||
: new string[] { string.Empty };
|
||||
|
||||
public static readonly string DynamicLibPrefix = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "" : "lib";
|
||||
|
||||
public static readonly string DynamicLibSuffix = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ".dll" :
|
||||
RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? ".dylib" : ".so";
|
||||
}
|
||||
}
|
29
scripts/Microsoft.DotNet.Cli.Build.Framework/DebugHelper.cs
Normal file
29
scripts/Microsoft.DotNet.Cli.Build.Framework/DebugHelper.cs
Normal file
|
@ -0,0 +1,29 @@
|
|||
// Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build.Framework
|
||||
{
|
||||
public static class DebugHelper
|
||||
{
|
||||
[Conditional("DEBUG")]
|
||||
public static void HandleDebugSwitch(ref string[] args)
|
||||
{
|
||||
if (args.Length > 0 && string.Equals("--debug", args[0], StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
args = args.Skip(1).ToArray();
|
||||
WaitForDebugger();
|
||||
}
|
||||
}
|
||||
|
||||
private static void WaitForDebugger()
|
||||
{
|
||||
Console.WriteLine("Waiting for debugger to attach. Press ENTER to continue");
|
||||
Console.WriteLine($"Process ID: {Process.GetCurrentProcess().Id}");
|
||||
Console.ReadLine();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
|
||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>49beb486-ab5a-4416-91ea-8cd34abb0c9d</ProjectGuid>
|
||||
<RootNamespace>Microsoft.DotNet.Cli.Build.Framework</RootNamespace>
|
||||
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">..\..\artifacts\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
|
||||
<OutputPath Condition="'$(OutputPath)'=='' ">..\..\artifacts\bin\$(MSBuildProjectName)\</OutputPath>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||
</Project>
|
65
scripts/Microsoft.DotNet.Cli.Build.Framework/Reporter.cs
Normal file
65
scripts/Microsoft.DotNet.Cli.Build.Framework/Reporter.cs
Normal file
|
@ -0,0 +1,65 @@
|
|||
// Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build.Framework
|
||||
{
|
||||
// Stupid-simple console manager
|
||||
internal class Reporter
|
||||
{
|
||||
private static readonly Reporter Null = new Reporter(console: null);
|
||||
private static object _lock = new object();
|
||||
|
||||
private readonly AnsiConsole _console;
|
||||
|
||||
private Reporter(AnsiConsole console)
|
||||
{
|
||||
_console = console;
|
||||
}
|
||||
|
||||
public static Reporter Output { get; } = Create(AnsiConsole.GetOutput);
|
||||
public static Reporter Error { get; } = Create(AnsiConsole.GetOutput);
|
||||
public static Reporter Verbose { get; } = Create(AnsiConsole.GetOutput);
|
||||
|
||||
public static Reporter Create(Func<bool, AnsiConsole> getter)
|
||||
{
|
||||
var stripColors = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ||
|
||||
string.Equals(Environment.GetEnvironmentVariable("NO_COLOR"), "1");
|
||||
return new Reporter(getter(stripColors));
|
||||
}
|
||||
|
||||
public void WriteLine(string message)
|
||||
{
|
||||
lock (_lock)
|
||||
{
|
||||
_console?.WriteLine(message);
|
||||
}
|
||||
}
|
||||
|
||||
public void WriteLine()
|
||||
{
|
||||
lock (_lock)
|
||||
{
|
||||
_console?.Writer?.WriteLine();
|
||||
}
|
||||
}
|
||||
|
||||
public void Write(string message)
|
||||
{
|
||||
lock (_lock)
|
||||
{
|
||||
_console?.Writer?.Write(message);
|
||||
}
|
||||
}
|
||||
|
||||
public void WriteBanner(string content)
|
||||
{
|
||||
string border = new string('*', content.Length + 6);
|
||||
WriteLine($@"{border}
|
||||
* {content} *
|
||||
{border}".Green());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build.Framework
|
||||
{
|
||||
public static class StandardGoals
|
||||
{
|
||||
public static BuildSetup UseStandardGoals(this BuildSetup self)
|
||||
{
|
||||
return self.UseTargets(new[]
|
||||
{
|
||||
new BuildTarget("Default", "Standard Goals", new [] { "Prepare", "Compile", "Test", "Publish" }),
|
||||
new BuildTarget("Prepare", "Standard Goals"),
|
||||
new BuildTarget("Compile", "Standard Goals"),
|
||||
new BuildTarget("Test", "Standard Goals"),
|
||||
new BuildTarget("Publish", "Standard Goals")
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build.Framework
|
||||
{
|
||||
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
|
||||
public class TargetAttribute : Attribute
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public IEnumerable<string> Dependencies { get; }
|
||||
|
||||
public TargetAttribute()
|
||||
{
|
||||
Dependencies = Enumerable.Empty<string>();
|
||||
}
|
||||
|
||||
// Attributes can only use constants, so a comma-separated string is better :)
|
||||
public TargetAttribute(params string[] dependencies)
|
||||
{
|
||||
Dependencies = dependencies;
|
||||
}
|
||||
}
|
||||
}
|
12
scripts/Microsoft.DotNet.Cli.Build.Framework/project.json
Normal file
12
scripts/Microsoft.DotNet.Cli.Build.Framework/project.json
Normal file
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"version": "1.0.0-*",
|
||||
|
||||
"dependencies": {
|
||||
"NETStandard.Library": "1.0.0-rc2-23811",
|
||||
"System.Diagnostics.Process": "4.1.0-rc2-23811"
|
||||
},
|
||||
|
||||
"frameworks": {
|
||||
"dnxcore50": { }
|
||||
}
|
||||
}
|
|
@ -1,53 +0,0 @@
|
|||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
param(
|
||||
[string]$Configuration="Debug",
|
||||
[switch]$Offline,
|
||||
[switch]$NoPackage)
|
||||
|
||||
$ErrorActionPreference="Stop"
|
||||
|
||||
. "$PSScriptRoot\..\common\_common.ps1"
|
||||
|
||||
. "$RepoRoot\scripts\build\generate-version.ps1"
|
||||
|
||||
_ "$RepoRoot\scripts\clean\clear-nuget-cache.ps1"
|
||||
|
||||
header "Building dotnet tools version $($env:DOTNET_CLI_VERSION) - $Configuration"
|
||||
header "Checking Pre-Reqs"
|
||||
|
||||
_ "$RepoRoot\scripts\test\check-prereqs.ps1"
|
||||
|
||||
header "Restoring Tools and Packages"
|
||||
|
||||
if ($Offline){
|
||||
info "Skipping Tools and Packages dowlnoad: Offline build"
|
||||
}
|
||||
else {
|
||||
_ "$RepoRoot\scripts\obtain\install-tools.ps1"
|
||||
}
|
||||
|
||||
_ "$RepoRoot\scripts\build\restore-packages.ps1"
|
||||
|
||||
header "Compiling"
|
||||
_ "$RepoRoot\scripts\compile\compile.ps1" @("$Configuration")
|
||||
|
||||
header "Setting Stage2 as PATH and DOTNET_TOOLS"
|
||||
setPathAndHome "$Stage2Dir"
|
||||
|
||||
header "Testing"
|
||||
_ "$RepoRoot\scripts\test\test.ps1"
|
||||
|
||||
header "Validating Dependencies"
|
||||
_ "$RepoRoot\scripts\test\validate-dependencies.ps1"
|
||||
|
||||
if ($NoPackage){
|
||||
info "Skipping Packaging"
|
||||
exit 0
|
||||
}
|
||||
else {
|
||||
_ "$RepoRoot\scripts\package\package.ps1"
|
||||
}
|
|
@ -1,59 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
# Set OFFLINE environment variable to build offline
|
||||
|
||||
set -e
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
source "$DIR/../common/_common.sh"
|
||||
|
||||
source "$REPOROOT/scripts/build/generate-version.sh"
|
||||
|
||||
"$REPOROOT/scripts/clean/clear-nuget-cache.sh"
|
||||
|
||||
header "Building dotnet tools version $DOTNET_CLI_VERSION - $CONFIGURATION"
|
||||
header "Checking Pre-Reqs"
|
||||
|
||||
$REPOROOT/scripts/test/check-prereqs.sh
|
||||
|
||||
header "Adjusting file descriptors limit, if necessary"
|
||||
# Increases the file descriptors limit for this bash. It prevents an issue we were hitting during restore
|
||||
FILE_DESCRIPTOR_LIMIT=$( ulimit -n )
|
||||
if [ $FILE_DESCRIPTOR_LIMIT -lt 1024 ]
|
||||
then
|
||||
info "Increasing file description limit to 1024"
|
||||
ulimit -n 1024
|
||||
fi
|
||||
|
||||
header "Restoring Tools and Packages"
|
||||
|
||||
if [ ! -z "$OFFLINE" ]; then
|
||||
info "Skipping Tools and Package Download: Offline build"
|
||||
else
|
||||
$REPOROOT/scripts/obtain/install-tools.sh
|
||||
fi
|
||||
|
||||
$REPOROOT/scripts/build/restore-packages.sh
|
||||
|
||||
header "Compiling"
|
||||
$REPOROOT/scripts/compile/compile.sh
|
||||
|
||||
header "Setting Stage2 as PATH, DOTNET_HOME, and DOTNET_TOOLS"
|
||||
export DOTNET_HOME=$STAGE2_DIR && export DOTNET_TOOLS=$STAGE2DIR && export PATH=$STAGE2_DIR/bin:$PATH
|
||||
|
||||
header "Testing"
|
||||
$REPOROOT/scripts/test/test.sh
|
||||
|
||||
header "Validating Dependencies"
|
||||
$REPOROOT/scripts/test/validate-dependencies.sh
|
|
@ -1,19 +0,0 @@
|
|||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
param(
|
||||
[Parameter(Mandatory=$true)][string]$RepoRoot,
|
||||
[Parameter(Mandatory=$true)][string]$OutputDir)
|
||||
|
||||
$appdepBinDir = "$OutputDir\bin\appdepsdk"
|
||||
|
||||
If (Test-Path $appdepBinDir){
|
||||
rmdir -Force -Rec $appdepBinDir
|
||||
}
|
||||
|
||||
mkdir -Force "$appdepBinDir"
|
||||
|
||||
ls "$env:NUGET_PACKAGES\toolchain.win7-x64.Microsoft.DotNet.AppDep\1.0.5-prerelease-00001\*" | foreach {
|
||||
copy -Rec $_ "$appdepBinDir"
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
source "$DIR/../common/_common.sh"
|
||||
|
||||
# Always recalculate the RID because the package always uses a specific RID, regardless of OS X version or Linux distro.
|
||||
if [ "$OSNAME" == "osx" ]; then
|
||||
RID=osx.10.10-x64
|
||||
elif [ "$OSNAME" == "ubuntu" ]; then
|
||||
RID=ubuntu.14.04-x64
|
||||
elif [ "$OSNAME" == "centos" ]; then
|
||||
RID=centos.7.1-x64
|
||||
else
|
||||
echo "Unknown OS: $OSNAME" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get Absolute Output Dir
|
||||
pushd $1
|
||||
OUTPUT_DIR="$(pwd)"
|
||||
popd
|
||||
|
||||
## App Deps ##
|
||||
APPDEP_SDK=$NUGET_PACKAGES/toolchain.$RID.Microsoft.DotNet.AppDep/1.0.5-prerelease-00001/
|
||||
mkdir -p $OUTPUT_DIR/appdepsdk
|
||||
cp -a $APPDEP_SDK/. $OUTPUT_DIR/appdepsdk
|
|
@ -1,16 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
UNAME=$(uname)
|
||||
echo "Platform: $UNAME"
|
||||
|
||||
if [ "$UNAME" = "Linux" ]; then
|
||||
DISTRO=$(cat /etc/os-release | grep "^ID=" | cut -d = -f 2 | sed s/\"//g)
|
||||
VERSION=$(cat /etc/os-release | grep "^VERSION_ID=" | cut -d = -f 2 | sed s/\"//g)
|
||||
echo "Distro: $DISTRO"
|
||||
echo "Version: $VERSION"
|
||||
echo "RID: $DISTRO.$VERSION-x64"
|
||||
else
|
||||
VERSION=$(sw_vers -productVersion)
|
||||
echo "OS: Mac OS X $VERSION"
|
||||
echo "RID: osx.$(echo $VERSION | cut -d . -f 1,2)-x64"
|
||||
fi
|
|
@ -1,19 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
# Managed code doesn't need 'x'
|
||||
find . -type f -name "*.dll" | xargs chmod 644
|
||||
find . -type f -name "*.exe" | xargs chmod 644
|
||||
|
||||
# Generally, dylibs and sos have 'x' (no idea if it's required ;))
|
||||
if [ "$(uname)" == "Darwin" ]; then
|
||||
find . -type f -name "*.dylib" | xargs chmod 755
|
||||
else
|
||||
find . -type f -name "*.so" | xargs chmod 755
|
||||
fi
|
||||
|
||||
# Executables (those without dots) are executable :)
|
||||
find . -type f ! -name "*.*" | xargs chmod 755
|
|
@ -1,65 +0,0 @@
|
|||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
. "$PSScriptRoot\..\common\_common.ps1"
|
||||
|
||||
# MSI versioning
|
||||
# Encode the CLI version to fit into the MSI versioning scheme - https://msdn.microsoft.com/en-us/library/windows/desktop/aa370859(v=vs.85).aspx
|
||||
# MSI versions are 3 part
|
||||
# major.minor.build
|
||||
# Size(bits) of each part 8 8 16
|
||||
# So we have 32 bits to encode the CLI version
|
||||
# Starting with most significant bit this how the CLI version is going to be encoded as MSI Version
|
||||
# CLI major -> 6 bits
|
||||
# CLI minor -> 6 bits
|
||||
# CLI patch -> 6 bits
|
||||
# CLI commitcount -> 14 bits
|
||||
function GetMSIVersionFromCLIVersion([uint32]$Major, [uint32]$Minor, [uint32]$Patch, [uint32]$CommitCount)
|
||||
{
|
||||
if($Major -ge 0x40)
|
||||
{
|
||||
throw [System.NotSupportedException] "Invalid Major version - $Major. Major version must be less than 64."
|
||||
}
|
||||
|
||||
if($Minor -ge 0x40)
|
||||
{
|
||||
throw [System.NotSupportedException] "Invalid Minor version - $Minor. Minor version must be less than 64."
|
||||
}
|
||||
|
||||
if($Patch -ge 0x40)
|
||||
{
|
||||
throw [System.NotSupportedException] "Invalid Patch version - $Patch. Patch version must be less than 64."
|
||||
}
|
||||
|
||||
if($CommitCount -ge 0x4000)
|
||||
{
|
||||
throw [System.NotSupportedException] "Invalid CommitCount version - $CommitCount. CommitCount version must be less than 16384."
|
||||
}
|
||||
|
||||
$Major = ($Major -shl 26)
|
||||
$Minor = ($Minor -shl 20)
|
||||
$Patch = ($Patch -shl 14)
|
||||
[System.UInt32]$MSIVersionNumber = ($Major -bor $Minor -bor $Patch -bor $CommitCount)
|
||||
|
||||
$MSIMajor = ($MSIVersionNumber -shr 24) -band 0xFF
|
||||
$MSIMinor = ($MSIVersionNumber -shr 16) -band 0xFF
|
||||
$MSIBuild = $MSIVersionNumber -band 0xFFFF
|
||||
$MSIVersion = "$MSIMajor.$MSIMinor.$MSIBuild"
|
||||
|
||||
return $MSIVersion
|
||||
}
|
||||
|
||||
$env:MajorVersion = 1
|
||||
$env:MinorVersion = 0
|
||||
$env:PatchVersion = 0
|
||||
|
||||
$CommitCount = [int32](git rev-list --count HEAD)
|
||||
$env:CommitCountVersion = ([string]$CommitCount).PadLeft(6, "0")
|
||||
|
||||
# Zero Padded Suffix for use with Nuget
|
||||
$env:VersionSuffix = "$env:ReleaseSuffix-$env:CommitCountVersion"
|
||||
|
||||
$env:DOTNET_CLI_VERSION = "$env:MajorVersion.$env:MinorVersion.$env:PatchVersion.$env:CommitCountVersion"
|
||||
$env:DOTNET_MSI_VERSION = GetMSIVersionFromCLIVersion $env:MajorVersion $env:MinorVersion $env:PatchVersion $CommitCount
|
|
@ -1,13 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
export MAJOR_VERSION=1
|
||||
export MINOR_VERSION=0
|
||||
export PATCH_VERSION=0
|
||||
|
||||
export COMMIT_COUNT_VERSION=$(printf "%06d" $(git rev-list --count HEAD))
|
||||
|
||||
export DOTNET_CLI_VERSION=$MAJOR_VERSION.$MINOR_VERSION.$PATCH_VERSION.$COMMIT_COUNT_VERSION
|
|
@ -1,24 +0,0 @@
|
|||
@echo off
|
||||
|
||||
REM Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
REM Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
set SRC=%1
|
||||
|
||||
set SRC=%SRC:/=\%
|
||||
|
||||
pushd %~dp0..\..
|
||||
set DST=%CD%\artifacts\win7-x64\stage2\bin
|
||||
popd
|
||||
|
||||
if not exist "%SRC%" goto end
|
||||
if not exist "%DST%" goto skip
|
||||
|
||||
xcopy /F /Y /I "%SRC%" "%DST%"
|
||||
|
||||
goto end
|
||||
|
||||
:skip
|
||||
echo The destination "%DST%" does not exist. This script is only designed to update a previous full build!
|
||||
|
||||
:end
|
|
@ -1,33 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
source "$DIR/../common/_common.sh"
|
||||
|
||||
echo "Copy From: $1"
|
||||
echo " To: $STAGE2_DIR/bin/"
|
||||
|
||||
src=${1//\\//}
|
||||
dst=$STAGE2_DIR/bin/
|
||||
|
||||
if [ ! -d "$dst" ]; then
|
||||
mkdir -p $dst
|
||||
fi
|
||||
|
||||
# Copy the files, if they exist
|
||||
if ls $src 1> /dev/null 2>&1; then
|
||||
cp $src $dst
|
||||
rc=$?; if [[ $rc != 0 ]]; then exit $rc; fi
|
||||
fi
|
|
@ -1,35 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
params=("$@")
|
||||
|
||||
for i in "${!params[@]}"
|
||||
do
|
||||
lowerI="$(echo ${params[$i]} | awk '{print tolower($0)}')"
|
||||
case $lowerI in
|
||||
"release" | "--release")
|
||||
export CONFIGURATION=Release
|
||||
;;
|
||||
"debug" | "--debug")
|
||||
export CONFIGURATION=Debug
|
||||
;;
|
||||
"offline" | "--offline")
|
||||
export OFFLINE=true
|
||||
;;
|
||||
"nopackage" | "--nopackage")
|
||||
export NOPACKAGE=true
|
||||
;;
|
||||
"--buildindocker-ubuntu")
|
||||
export BUILD_IN_DOCKER=true
|
||||
export DOCKER_OS=ubuntu
|
||||
;;
|
||||
"--buildindocker-centos")
|
||||
export BUILD_IN_DOCKER=true
|
||||
export DOCKER_OS=centos
|
||||
;;
|
||||
*)
|
||||
esac
|
||||
done
|
|
@ -1,18 +0,0 @@
|
|||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
. $PSScriptRoot\..\common\_common.ps1
|
||||
|
||||
# Restore packages
|
||||
# NOTE(anurse): I had to remove --quiet, because NuGet3 is too quiet when that's provided :(
|
||||
header "Restoring packages"
|
||||
|
||||
$StartPath = $env:PATH
|
||||
$env:PATH = "$env:DOTNET_INSTALL_DIR\cli\bin;$StartPath"
|
||||
|
||||
& dotnet restore "$RepoRoot\src" --runtime "$Rid"
|
||||
& dotnet restore "$RepoRoot\tools" --runtime "$Rid"
|
||||
|
||||
$env:PATH=$StartPath
|
|
@ -1,27 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
source "$DIR/../common/_common.sh"
|
||||
|
||||
export StartPath=$PATH
|
||||
export PATH=$DOTNET_INSTALL_DIR/bin:$PATH
|
||||
|
||||
header "Restoring packages"
|
||||
|
||||
dotnet restore "$REPOROOT/src" --runtime "$RID" $DISABLE_PARALLEL
|
||||
dotnet restore "$REPOROOT/tools" --runtime "$RID" $DISABLE_PARALLEL
|
||||
|
||||
export PATH=$StartPath
|
|
@ -4,7 +4,9 @@ REM Copyright (c) .NET Foundation and contributors. All rights reserved.
|
|||
REM Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
set CI_BUILD=1
|
||||
set CONFIGURATION=%1
|
||||
set VERBOSE=1
|
||||
|
||||
CALL %~dp0..\build.cmd %*
|
||||
CALL %~dp0..\build.cmd %2
|
||||
|
||||
exit /b %errorlevel%
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
set -e
|
||||
|
||||
export CI_BUILD=1
|
||||
export NO_COLOR=1
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
|
@ -16,7 +17,36 @@ while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symli
|
|||
done
|
||||
SCRIPT_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
source "$SCRIPT_DIR/common/_common.sh"
|
||||
while [[ $# > 0 ]]; do
|
||||
lowerI="$(echo $1 | awk '{print tolower($0)}')"
|
||||
case $lowerI in
|
||||
"release" | "--release")
|
||||
export CONFIGURATION=Release
|
||||
;;
|
||||
"debug" | "--debug")
|
||||
export CONFIGURATION=Debug
|
||||
;;
|
||||
"offline" | "--offline")
|
||||
export OFFLINE=true
|
||||
;;
|
||||
"nopackage" | "--nopackage")
|
||||
export NOPACKAGE=true
|
||||
;;
|
||||
"--buildindocker-ubuntu")
|
||||
export BUILD_IN_DOCKER=1
|
||||
export DOCKER_IMAGENAME=ubuntu
|
||||
;;
|
||||
"--buildindocker-centos")
|
||||
export BUILD_IN_DOCKER=1
|
||||
export DOCKER_IMAGENAME=centos
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
|
||||
shift
|
||||
done
|
||||
|
||||
# Tell install scripts to skip pre-req check since the CI has the pre-reqs but not ldconfig it seems
|
||||
# Also, install to a directory under the repo root since we don't have permission to work elsewhere
|
||||
|
@ -35,17 +65,15 @@ container_name=""
|
|||
|
||||
#Jenkins
|
||||
[ ! -z "$BUILD_TAG" ] && container_name="$BUILD_TAG"
|
||||
|
||||
#VSO
|
||||
[ ! -z "$BUILD_BUILDID" ] && container_name="$BUILD_BUILDID"
|
||||
|
||||
export DOTNET_BUILD_CONTAINER_NAME="$container_name"
|
||||
|
||||
## CentOS-based CI machines don't have docker, ditto OSX. So only build in docker if we're on Ubuntu
|
||||
#if [ "$(cat /etc/*-release | grep -cim1 ubuntu)" -eq 1 ]; then
|
||||
#export BUILD_IN_DOCKER=1
|
||||
#fi
|
||||
|
||||
if [[ "$OSNAME" == "ubuntu" ]]; then
|
||||
export PACKAGE_IN_DOCKER="true"
|
||||
unset BUILD_IN_DOCKER
|
||||
|
||||
$SCRIPT_DIR/../build.sh $@
|
||||
else
|
||||
$SCRIPT_DIR/../build.sh $@
|
||||
fi
|
||||
VERBOSE=1 $SCRIPT_DIR/../build.sh "$@"
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
# Set up the environment to be used for building with clang.
|
||||
if which "clang-3.5" > /dev/null 2>&1; then
|
||||
export CC="$(which clang-3.5)"
|
||||
export CXX="$(which clang++-3.5)"
|
||||
elif which "clang-3.6" > /dev/null 2>&1; then
|
||||
export CC="$(which clang-3.6)"
|
||||
export CXX="$(which clang++-3.6)"
|
||||
elif which clang > /dev/null 2>&1; then
|
||||
export CC="$(which clang)"
|
||||
export CXX="$(which clang++)"
|
||||
else
|
||||
error "Unable to find Clang Compiler"
|
||||
error "Install clang-3.5 or clang3.6"
|
||||
exit 1
|
||||
fi
|
|
@ -5,33 +5,26 @@
|
|||
|
||||
. $PSScriptRoot\_utility.ps1
|
||||
|
||||
$Skip_Crossgen = $false
|
||||
$Rid = "win7-x64"
|
||||
$Tfm = "dnxcore50"
|
||||
$RepoRoot = Resolve-Path "$PSScriptRoot\..\.."
|
||||
$OutputDir = "$RepoRoot\artifacts\$Rid"
|
||||
$Stage1Dir = "$OutputDir\stage1"
|
||||
$Stage1CompilationDir = "$OutputDir\stage1compilation"
|
||||
$Stage2Dir = "$OutputDir\stage2"
|
||||
$Stage2CompilationDir = "$OutputDir\stage2compilation"
|
||||
$HostDir = "$OutputDir\corehost"
|
||||
$PackageDir = "$RepoRoot\artifacts\packages\dnvm"
|
||||
$TestBinRoot = "$RepoRoot\artifacts\tests"
|
||||
$TestPackageDir = "$TestBinRoot\packages"
|
||||
# Copy things from environment variables that were sent by the build scripts
|
||||
$Rid = $env:Rid
|
||||
$Tfm = $env:Tfm
|
||||
$OutputDir = $env:OutputDir
|
||||
$Stage1Dir = $env:Stage1Dir
|
||||
$Stage1CompilationDir = $env:Stage1CompilationDir
|
||||
$Stage2Dir = $env:Stage2Dir
|
||||
$Stage2CompilationDir = $env:Stage2CompilationDir
|
||||
$HostDir = $env:HostDir
|
||||
$PackageDir = $env:PackageDir
|
||||
$TestBinRoot = $env:TestBinRoot
|
||||
$TestPackageDir = $env:TestPackageDir
|
||||
|
||||
$env:TEST_ROOT = "$OutputDir\tests"
|
||||
$env:TEST_ARTIFACTS = "$env:TEST_ROOT\artifacts"
|
||||
|
||||
$env:ReleaseSuffix = "beta"
|
||||
$env:Channel = "$env:ReleaseSuffix"
|
||||
$env:Channel = "$env:RELEASE_SUFFIX"
|
||||
|
||||
# Set reasonable defaults for unset variables
|
||||
setEnvIfDefault "DOTNET_INSTALL_DIR" "$RepoRoot\.dotnet_stage0\win7-x64"
|
||||
setEnvIfDefault "DOTNET_CLI_VERSION" "0.1.0.0"
|
||||
setEnvIfDefault "SKIP_CROSSGEN" "$Skip_Crossgen"
|
||||
setPathAndHomeIfDefault "$Stage2Dir"
|
||||
setVarIfDefault "Configuration" "Debug"
|
||||
|
||||
# Common Files which depend on above properties
|
||||
. $PSScriptRoot\_nuget.ps1
|
||||
. $PSScriptRoot\_configuration.ps1
|
|
@ -12,23 +12,11 @@ done
|
|||
COMMONDIR="$( cd -P "$( dirname "$COMMONSOURCE" )" && pwd )"
|
||||
|
||||
source "$COMMONDIR/_prettyprint.sh"
|
||||
source "$COMMONDIR/_rid.sh"
|
||||
|
||||
# TODO: Replace this with a dotnet generation
|
||||
export SKIP_CROSSGEN=false
|
||||
export TFM=dnxcore50
|
||||
export REPOROOT=$(cd $COMMONDIR/../.. && pwd)
|
||||
export OUTPUT_ROOT=$REPOROOT/artifacts/$RID
|
||||
export STAGE1_DIR=$OUTPUT_ROOT/stage1
|
||||
export STAGE2_DIR=$OUTPUT_ROOT/stage2
|
||||
export HOST_DIR=$OUTPUT_ROOT/corehost
|
||||
export TEST_BIN_ROOT="$REPOROOT/artifacts/tests"
|
||||
export TEST_PACKAGE_DIR="$TEST_BIN_ROOT/packages"
|
||||
|
||||
# Other variables are set by the outer build script
|
||||
export TEST_ROOT="$OUTPUT_ROOT/tests"
|
||||
export TEST_ARTIFACTS="$TEST_ROOT/artifacts"
|
||||
|
||||
export RELEASE_SUFFIX=beta
|
||||
export CHANNEL=$RELEASE_SUFFIX
|
||||
|
||||
[ -z "$DOTNET_INSTALL_DIR" ] && export DOTNET_INSTALL_DIR=$REPOROOT/.dotnet_stage0/$RID
|
||||
|
@ -36,10 +24,6 @@ export CHANNEL=$RELEASE_SUFFIX
|
|||
[ -z "$DOTNET_HOME" ] && export DOTNET_HOME=$STAGE2_DIR && export PATH=$STAGE2_DIR/bin:$PATH
|
||||
[ -z "$CONFIGURATION" ] && export CONFIGURATION=Debug
|
||||
|
||||
# Common Files which depend on above properties
|
||||
source "$COMMONDIR/_nuget.sh"
|
||||
source "$COMMONDIR/_configuration.sh"
|
||||
|
||||
#TODO this is a workaround for a nuget bug on ubuntu. Remove
|
||||
export DISABLE_PARALLEL=""
|
||||
[[ "$RID" =~ "ubuntu" ]] && export DISABLE_PARALLEL="--disable-parallel"
|
||||
|
|
|
@ -1,24 +0,0 @@
|
|||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
function loadTestProjectList()
|
||||
{
|
||||
return Import-CSV "$RepoRoot\scripts\configuration\testProjects.csv" -Header "ProjectName"
|
||||
}
|
||||
|
||||
function loadTestScriptList()
|
||||
{
|
||||
return Import-CSV "$RepoRoot\scripts\configuration\testScripts.csv" -Header "ProjectName"
|
||||
}
|
||||
|
||||
function loadTestPackageList()
|
||||
{
|
||||
return Import-CSV "$RepoRoot\scripts\configuration\testPackageProjects.csv" -Header "ProjectName"
|
||||
}
|
||||
|
||||
function loadBuildProjectList()
|
||||
{
|
||||
return Import-CSV "$RepoRoot\scripts\configuration\buildProjects.csv" -Header "ProjectName"
|
||||
}
|
|
@ -1,25 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
loadTestProjectList()
|
||||
{
|
||||
echo $(cat "$REPOROOT/scripts/configuration/testProjects.csv")
|
||||
}
|
||||
|
||||
loadTestScriptList()
|
||||
{
|
||||
echo $(cat "$REPOROOT/scripts/configuration/testScripts.csv")
|
||||
}
|
||||
|
||||
loadTestPackageList()
|
||||
{
|
||||
echo $(cat "$REPOROOT/scripts/configuration/testPackageProjects.csv")
|
||||
}
|
||||
|
||||
loadBuildProjectList()
|
||||
{
|
||||
echo $(cat "$REPOROOT/scripts/configuration/buildProjects.csv")
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
$env:NUGET_PACKAGES = (Join-Path $env:USERPROFILE ".nuget\packages")
|
||||
$env:DOTNET_PACKAGES = $env:NUGET_PACKAGES
|
||||
$env:DNX_PACKAGES = $env:NUGET_PACKAGES
|
||||
if(!(Test-Path $env:NUGET_PACKAGES)) {
|
||||
mkdir $env:NUGET_PACKAGES | Out-Null
|
||||
}
|
||||
|
||||
# default the package cache expiration to 1 week, in hours
|
||||
setEnvIfDefault "NUGET_PACKAGES_CACHE_TIME_LIMIT" (7 * 24)
|
|
@ -1,26 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
if [ ! -z "$CI_BUILD" ]; then
|
||||
# On CI, $HOME is redirected under the repo, which gets deleted after every build.
|
||||
# So make $NUGET_PACKAGES outside of the repo.
|
||||
NUGET_PACKAGES=$REPOROOT/../.nuget/packages
|
||||
else
|
||||
NUGET_PACKAGES=~/.nuget/packages
|
||||
fi
|
||||
|
||||
export NUGET_PACKAGES
|
||||
export DOTNET_PACKAGES=$NUGET_PACKAGES
|
||||
export DNX_PACKAGES=$NUGET_PACKAGES
|
||||
|
||||
if [ ! -d $NUGET_PACKAGES ]; then
|
||||
mkdir -p $NUGET_PACKAGES
|
||||
fi
|
||||
|
||||
if [ -z "$NUGET_PACKAGES_CACHE_TIME_LIMIT" ]; then
|
||||
# default the package cache expiration to 1 week, in hours
|
||||
export NUGET_PACKAGES_CACHE_TIME_LIMIT=$(( 7 * 24 ))
|
||||
fi
|
|
@ -1,37 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
export UNAME=$(uname)
|
||||
|
||||
if [ -z "$RID" ]; then
|
||||
if [ "$UNAME" == "Darwin" ]; then
|
||||
export OSNAME=osx
|
||||
if [ -n "$(sw_vers -productVersion | grep 10.10)" ]; then
|
||||
export RID=osx.10.10-x64
|
||||
elif [ -n "$(sw_vers -productVersion | grep 10.11)" ]; then
|
||||
export RID=osx.10.11-x64
|
||||
else
|
||||
error "unknown OS X: $(sw_vers -productVersion)" 1>&2
|
||||
fi
|
||||
elif [ "$UNAME" == "Linux" ]; then
|
||||
# Detect Distro
|
||||
if [ "$(cat /etc/*-release | grep -cim1 ubuntu)" -eq 1 ]; then
|
||||
export OSNAME=ubuntu
|
||||
export RID=ubuntu.14.04-x64
|
||||
elif [ "$(cat /etc/*-release | grep -cim1 centos)" -eq 1 ]; then
|
||||
export OSNAME=centos
|
||||
export RID=centos.7-x64
|
||||
else
|
||||
error "unknown Linux Distro" 1>&2
|
||||
fi
|
||||
else
|
||||
error "unknown OS: $UNAME" 1>&2
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$RID" ]; then
|
||||
exit 1
|
||||
fi
|
|
@ -1,46 +0,0 @@
|
|||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
. $PSScriptRoot\..\common\_common.ps1
|
||||
|
||||
header "Building corehost"
|
||||
pushd "$RepoRoot\src\corehost"
|
||||
try {
|
||||
if (!(Test-Path "cmake\$Rid")) {
|
||||
mkdir "cmake\$Rid" | Out-Null
|
||||
}
|
||||
cd "cmake\$Rid"
|
||||
cmake ..\.. -G "Visual Studio 14 2015 Win64"
|
||||
$pf = $env:ProgramFiles
|
||||
if (Test-Path "env:\ProgramFiles(x86)") {
|
||||
$pf = (cat "env:\ProgramFiles(x86)")
|
||||
}
|
||||
$BuildConfiguration = $Configuration
|
||||
if ($Configuration -eq "Release") {
|
||||
$BuildConfiguration = "RelWithDebInfo"
|
||||
}
|
||||
& "$pf\MSBuild\14.0\Bin\MSBuild.exe" ALL_BUILD.vcxproj /p:Configuration="$BuildConfiguration"
|
||||
if (!$?) {
|
||||
Write-Host "Command failed: $pf\MSBuild\14.0\Bin\MSBuild.exe" ALL_BUILD.vcxproj /p:Configuration="$BuildConfiguration"
|
||||
Exit 1
|
||||
}
|
||||
|
||||
if (!(Test-Path $HostDir)) {
|
||||
mkdir $HostDir | Out-Null
|
||||
}
|
||||
cp "$RepoRoot\src\corehost\cmake\$Rid\cli\$BuildConfiguration\corehost.exe" $HostDir
|
||||
cp "$RepoRoot\src\corehost\cmake\$Rid\cli\dll\$BuildConfiguration\hostpolicy.dll" $HostDir
|
||||
|
||||
if (Test-Path "$RepoRoot\src\corehost\cmake\$Rid\cli\$BuildConfiguration\corehost.pdb")
|
||||
{
|
||||
cp "$RepoRoot\src\corehost\cmake\$Rid\cli\$BuildConfiguration\corehost.pdb" $HostDir
|
||||
}
|
||||
if (Test-Path "$RepoRoot\src\corehost\cmake\$Rid\cli\dll\$BuildConfiguration\hostpolicy.pdb")
|
||||
{
|
||||
cp "$RepoRoot\src\corehost\cmake\$Rid\cli\dll\$BuildConfiguration\hostpolicy.pdb" $HostDir
|
||||
}
|
||||
} finally {
|
||||
popd
|
||||
}
|
|
@ -1,35 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
source "$DIR/../common/_common.sh"
|
||||
source "$DIR/../common/_clang.sh"
|
||||
|
||||
header "Building corehost"
|
||||
|
||||
pushd "$REPOROOT/src/corehost" 2>&1 >/dev/null
|
||||
[ -d "cmake/$RID" ] || mkdir -p "cmake/$RID"
|
||||
cd "cmake/$RID"
|
||||
cmake ../.. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE:STRING=$CONFIGURATION
|
||||
make
|
||||
|
||||
# Publish to artifacts
|
||||
[ -d "$HOST_DIR" ] || mkdir -p $HOST_DIR
|
||||
if [[ "$OSNAME" == "osx" ]]; then
|
||||
COREHOST_LIBNAME=libhostpolicy.dylib
|
||||
else
|
||||
COREHOST_LIBNAME=libhostpolicy.so
|
||||
fi
|
||||
cp "$REPOROOT/src/corehost/cmake/$RID/cli/corehost" $HOST_DIR
|
||||
cp "$REPOROOT/src/corehost/cmake/$RID/cli/dll/${COREHOST_LIBNAME}" $HOST_DIR
|
||||
popd 2>&1 >/dev/null
|
|
@ -1,14 +0,0 @@
|
|||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
. $PSScriptRoot\..\common\_common.ps1
|
||||
|
||||
header "Compiling stage1 dotnet using downloaded stage0 ..."
|
||||
$StartPath = $env:PATH
|
||||
$env:PATH = "$env:DOTNET_INSTALL_DIR\cli\bin;$StartPath"
|
||||
|
||||
_ "$RepoRoot\scripts\compile\compile-stage.ps1" @("$Tfm","$Rid","$Configuration","$Stage1Dir","$RepoRoot","$HostDir", "$Stage1CompilationDir")
|
||||
|
||||
$env:PATH=$StartPath
|
|
@ -1,26 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
source "$DIR/../common/_common.sh"
|
||||
|
||||
export StartPath=$PATH
|
||||
export PATH=$DOTNET_INSTALL_DIR/bin:$PATH
|
||||
|
||||
# Build Stage 1
|
||||
header "Building stage1 dotnet using downloaded stage0 ..."
|
||||
OUTPUT_DIR=$STAGE1_DIR $REPOROOT/scripts/compile/compile-stage.sh
|
||||
|
||||
export PATH=$StartPath
|
|
@ -1,27 +0,0 @@
|
|||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
. $PSScriptRoot\..\common\_common.ps1
|
||||
|
||||
header "Compiling stage2 dotnet using stage1 ..."
|
||||
$StartPath = $env:PATH
|
||||
$env:PATH = "$Stage1Dir\bin;$env:PATH"
|
||||
|
||||
# Compile
|
||||
_ "$RepoRoot\scripts\compile\compile-stage.ps1" @("$Tfm","$Rid","$Configuration","$Stage2Dir","$RepoRoot","$HostDir", "$Stage2CompilationDir")
|
||||
|
||||
|
||||
# Build the projects that we are going to ship as nuget packages
|
||||
. $REPOROOT\scripts\package\projectsToPack.ps1
|
||||
|
||||
$ProjectsToPack | ForEach-Object {
|
||||
dotnet build --build-base-path "$Stage2CompilationDir\forPackaging" --configuration "$Configuration" "$RepoRoot\src\$_"
|
||||
if (!$?) {
|
||||
Write-Host Command failed: dotnet build --native-subdirectory --build-base-path "$Stage2CompilationDir\forPackaging" --configuration "$Configuration" "$RepoRoot\src\$_"
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
$env:PATH=$StartPath
|
|
@ -1,29 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
source "$DIR/../common/_common.sh"
|
||||
|
||||
# Use stage1 tools
|
||||
export StartPath=$PATH
|
||||
export DOTNET_TOOLS=$STAGE1_DIR
|
||||
export PATH=$STAGE1_DIR/bin:$PATH
|
||||
|
||||
# Compile Stage 2
|
||||
header "Compiling stage2 dotnet using just-built stage1 ..."
|
||||
OUTPUT_DIR=$STAGE2_DIR $REPOROOT/scripts/compile/compile-stage.sh
|
||||
|
||||
export DOTNET_HOME=$STAGE2_DIR
|
||||
export DOTNET_TOOLS=$STAGE2_DIR
|
|
@ -1,84 +0,0 @@
|
|||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
param(
|
||||
[Parameter(Mandatory=$true)][string]$Tfm,
|
||||
[Parameter(Mandatory=$true)][string]$Rid,
|
||||
[Parameter(Mandatory=$true)][string]$Configuration,
|
||||
[Parameter(Mandatory=$true)][string]$StageOutputDir,
|
||||
[Parameter(Mandatory=$true)][string]$RepoRoot,
|
||||
[Parameter(Mandatory=$true)][string]$HostDir,
|
||||
[Parameter(Mandatory=$true)][string]$CompilationOutputDir)
|
||||
|
||||
$Projects = loadBuildProjectList
|
||||
|
||||
$BinariesForCoreHost = @(
|
||||
"csi"
|
||||
"csc"
|
||||
"vbc"
|
||||
)
|
||||
|
||||
$FilesToClean = @(
|
||||
"README.md"
|
||||
"Microsoft.DotNet.Runtime.exe"
|
||||
"Microsoft.DotNet.Runtime.dll"
|
||||
"Microsoft.DotNet.Runtime.deps"
|
||||
"Microsoft.DotNet.Runtime.pdb"
|
||||
)
|
||||
|
||||
$RuntimeOutputDir = "$StageOutputDir\runtime\coreclr"
|
||||
|
||||
# Publish each project
|
||||
$Projects | ForEach-Object {
|
||||
dotnet publish --native-subdirectory --framework "$Tfm" --runtime "$Rid" --output "$StageOutputDir\bin" --configuration "$Configuration" "$RepoRoot\src\$($_.ProjectName)"
|
||||
if (!$?) {
|
||||
Write-Host Command failed: dotnet publish --native-subdirectory --framework "$Tfm" --runtime "$Rid" --output "$StageOutputDir\bin" --configuration "$Configuration" "$RepoRoot\src\$($_.ProjectName)"
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
# Publish the runtime
|
||||
dotnet publish --framework "$Tfm" --runtime "$Rid" --output "$RuntimeOutputDir" --configuration "$Configuration" "$RepoRoot\src\Microsoft.DotNet.Runtime"
|
||||
if (!$?) {
|
||||
Write-Host Command failed: dotnet publish --framework "$Tfm" --runtime "$Rid" --output "$RuntimeOutputDir" --configuration "$Configuration" "$RepoRoot\src\Microsoft.DotNet.Runtime"
|
||||
Exit 1
|
||||
}
|
||||
|
||||
# Clean up bogus additional files
|
||||
$FilesToClean | ForEach-Object {
|
||||
$path = Join-Path $RuntimeOutputDir $_
|
||||
if (Test-Path $path) {
|
||||
del -for $path
|
||||
}
|
||||
}
|
||||
|
||||
# Copy the runtime app-local for the tools
|
||||
cp -rec "$RuntimeOutputDir\*" "$StageOutputDir\bin" -ErrorVariable capturedErrors -ErrorAction SilentlyContinue
|
||||
$capturedErrors | foreach-object {
|
||||
if ($_ -notmatch "already exists") {
|
||||
write-error $_
|
||||
Exit 1
|
||||
}
|
||||
}
|
||||
|
||||
# Deploy the CLR host to the output
|
||||
cp "$HostDir\corehost.exe" "$StageOutputDir\bin"
|
||||
cp "$HostDir\hostpolicy.dll" "$StageOutputDir\bin"
|
||||
|
||||
# corehostify externally-provided binaries (csc, vbc, etc.)
|
||||
$BinariesForCoreHost | ForEach-Object {
|
||||
mv $StageOutputDir\bin\$_.exe $StageOutputDir\bin\$_.dll -Force
|
||||
cp $StageOutputDir\bin\corehost.exe $StageOutputDir\bin\$_.exe -Force
|
||||
}
|
||||
|
||||
# Crossgen Roslyn
|
||||
if (-not (Test-Path "$StageOutputDir\bin\csc.ni.exe")) {
|
||||
_cmd "$RepoRoot\scripts\crossgen\crossgen_roslyn.cmd ""$StageOutputDir"""
|
||||
}
|
||||
|
||||
# Copy in AppDeps
|
||||
header "Acquiring Native App Dependencies"
|
||||
_ "$RepoRoot\scripts\build\build_appdeps.ps1" @("$RepoRoot", "$StageOutputDir")
|
||||
|
|
@ -1,103 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
source "$DIR/../common/_common.sh"
|
||||
|
||||
[ ! -z "$TFM" ] || die "Missing required environment variable TFM"
|
||||
[ ! -z "$RID" ] || die "Missing required environment variable RID"
|
||||
[ ! -z "$CONFIGURATION" ] || die "Missing required environment variable CONFIGURATION"
|
||||
[ ! -z "$OUTPUT_DIR" ] || die "Missing required environment variable OUTPUT_DIR"
|
||||
[ ! -z "$HOST_DIR" ] || die "Missing required environment variable HOST_DIR"
|
||||
|
||||
PROJECTS=$(loadBuildProjectList)
|
||||
|
||||
BINARIES_FOR_COREHOST=( \
|
||||
csi \
|
||||
csc \
|
||||
vbc \
|
||||
)
|
||||
|
||||
FILES_TO_CLEAN=( \
|
||||
README.md \
|
||||
Microsoft.DotNet.Runtime \
|
||||
Microsoft.DotNet.Runtime.dll \
|
||||
Microsoft.DotNet.Runtime.deps \
|
||||
Microsoft.DotNet.Runtime.pdb \
|
||||
)
|
||||
|
||||
RUNTIME_OUTPUT_DIR="$OUTPUT_DIR/runtime/coreclr"
|
||||
|
||||
for project in $PROJECTS
|
||||
do
|
||||
echo dotnet publish --native-subdirectory --framework "$TFM" --output "$OUTPUT_DIR/bin" --configuration "$CONFIGURATION" "$REPOROOT/src/$project"
|
||||
dotnet publish --native-subdirectory --framework "$TFM" --output "$OUTPUT_DIR/bin" --configuration "$CONFIGURATION" "$REPOROOT/src/$project"
|
||||
done
|
||||
|
||||
# Bring in the runtime
|
||||
dotnet publish --output "$RUNTIME_OUTPUT_DIR" --configuration "$CONFIGURATION" "$REPOROOT/src/Microsoft.DotNet.Runtime"
|
||||
|
||||
# Clean up bogus additional files
|
||||
for file in ${FILES_TO_CLEAN[@]}
|
||||
do
|
||||
[ -e "$RUNTIME_OUTPUT_DIR/$file" ] && rm "$RUNTIME_OUTPUT_DIR/$file"
|
||||
done
|
||||
|
||||
# Copy the runtime app-local for the tools
|
||||
cp -R $RUNTIME_OUTPUT_DIR/* $OUTPUT_DIR/bin
|
||||
|
||||
# Deploy CLR host to the output
|
||||
if [[ "$OSNAME" == "osx" ]]; then
|
||||
COREHOST_LIBNAME=libhostpolicy.dylib
|
||||
else
|
||||
COREHOST_LIBNAME=libhostpolicy.so
|
||||
fi
|
||||
cp "$HOST_DIR/corehost" "$OUTPUT_DIR/bin"
|
||||
cp "$HOST_DIR/${COREHOST_LIBNAME}" "$OUTPUT_DIR/bin"
|
||||
|
||||
# corehostify externally-provided binaries (csc, vbc, etc.)
|
||||
for binary in ${BINARIES_FOR_COREHOST[@]}
|
||||
do
|
||||
cp $OUTPUT_DIR/bin/corehost $OUTPUT_DIR/bin/$binary
|
||||
mv $OUTPUT_DIR/bin/${binary}.exe $OUTPUT_DIR/bin/${binary}.dll
|
||||
done
|
||||
|
||||
cd $OUTPUT_DIR
|
||||
|
||||
# Fix up permissions. Sometimes they get dropped with the wrong info
|
||||
find . -type f | xargs chmod 644
|
||||
$REPOROOT/scripts/build/fix-mode-flags.sh
|
||||
|
||||
if [ ! -f "$OUTPUT_DIR/bin/csc.ni.exe" ]; then
|
||||
$REPOROOT/scripts/crossgen/crossgen_roslyn.sh "$OUTPUT_DIR/bin"
|
||||
fi
|
||||
|
||||
# Make OUTPUT_DIR Folder Accessible
|
||||
chmod -R a+r $OUTPUT_DIR
|
||||
|
||||
# No compile native support in centos yet
|
||||
# https://github.com/dotnet/cli/issues/453
|
||||
if [ "$OSNAME" != "centos" ]; then
|
||||
# Copy in AppDeps
|
||||
if [ ! -d "$OUTPUT_DIR/bin/appdepsdk" ]; then
|
||||
header "Acquiring Native App Dependencies"
|
||||
DOTNET_HOME=$OUTPUT_DIR DOTNET_TOOLS=$OUTPUT_DIR $REPOROOT/scripts/build/build_appdeps.sh "$OUTPUT_DIR/bin"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Stamp the output with the commit metadata
|
||||
COMMIT=$(git rev-parse HEAD)
|
||||
echo $COMMIT > $OUTPUT_DIR/.version
|
||||
echo $DOTNET_CLI_VERSION >> $OUTPUT_DIR/.version
|
|
@ -1,28 +0,0 @@
|
|||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
param([string]$Configuration = "Debug")
|
||||
|
||||
$ErrorActionPreference="Stop"
|
||||
|
||||
. $PSScriptRoot\..\common\_common.ps1
|
||||
|
||||
# Capture PATH for later
|
||||
$StartPath = $env:PATH
|
||||
$StartDotNetHome = $env:DOTNET_HOME
|
||||
|
||||
try {
|
||||
_ "$RepoRoot\scripts\compile\compile-corehost.ps1"
|
||||
|
||||
_ "$RepoRoot\scripts\compile\compile-stage-1.ps1"
|
||||
|
||||
# Issue https://github.com/dotnet/cli/issues/1294
|
||||
_ "$RepoRoot\scripts\build\restore-packages.ps1"
|
||||
|
||||
_ "$RepoRoot\scripts\compile\compile-stage-2.ps1"
|
||||
} finally {
|
||||
$env:PATH = $StartPath
|
||||
$env:DOTNET_HOME = $StartDotNetHome
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
source "$DIR/../common/_common.sh"
|
||||
|
||||
$REPOROOT/scripts/compile/compile-corehost.sh
|
||||
|
||||
$REPOROOT/scripts/compile/compile-stage-1.sh
|
||||
|
||||
# Issue https://github.com/dotnet/cli/issues/1294
|
||||
$REPOROOT/scripts/build/restore-packages.sh
|
||||
|
||||
$REPOROOT/scripts/compile/compile-stage-2.sh
|
|
@ -1 +0,0 @@
|
|||
dotnet
|
|
|
@ -1,2 +0,0 @@
|
|||
dotnet-hello/v1/dotnet-hello
|
||||
dotnet-hello/v2/dotnet-hello
|
|
|
@ -1,8 +0,0 @@
|
|||
EndToEnd
|
||||
dotnet-publish.Tests
|
||||
dotnet-compile.Tests
|
||||
dotnet-compile.UnitTests
|
||||
dotnet-build.Tests
|
||||
Microsoft.DotNet.Cli.Utils.Tests
|
||||
Microsoft.DotNet.Compiler.Common.Tests
|
||||
ArgumentForwardingTests
|
|
|
@ -1 +0,0 @@
|
|||
package-command-test
|
|
|
@ -1,83 +0,0 @@
|
|||
REM Turn echo off off so we can echo with echo and the echoing
|
||||
REM (But seriously, this script has weird hangs and crashes sometimes so we want to know exactly which commands are failing)
|
||||
REM @echo off
|
||||
|
||||
REM Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
REM Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
if %SKIP_CROSSGEN% EQU 0 goto skip
|
||||
|
||||
echo Crossgenning Roslyn compiler ...
|
||||
|
||||
REM Get absolute path
|
||||
pushd %1
|
||||
set BIN_DIR=%CD%\bin
|
||||
popd
|
||||
|
||||
REM Replace with a robust method for finding the right crossgen.exe
|
||||
set CROSSGEN_UTIL=%NUGET_PACKAGES%\runtime.win7-x64.Microsoft.NETCore.Runtime.CoreCLR\1.0.1-rc2-23811\tools\crossgen.exe
|
||||
|
||||
REM Crossgen currently requires itself to be next to mscorlib
|
||||
copy %CROSSGEN_UTIL% /Y %BIN_DIR% > nul
|
||||
|
||||
pushd %BIN_DIR%
|
||||
|
||||
REM It must also be called mscorlib, not mscorlib.ni
|
||||
if exist mscorlib.ni.dll (
|
||||
copy /Y mscorlib.ni.dll mscorlib.dll > nul
|
||||
)
|
||||
|
||||
set READYTORUN=
|
||||
|
||||
echo Crossgenning System.Collections.Immutable
|
||||
crossgen /nologo %READYTORUN% /Platform_Assemblies_Paths %BIN_DIR% System.Collections.Immutable.dll >nul 2>nul
|
||||
if not %errorlevel% EQU 0 goto fail
|
||||
|
||||
echo Crossgenning System.Reflection.Metadata
|
||||
crossgen /nologo %READYTORUN% /Platform_Assemblies_Paths %BIN_DIR% System.Reflection.Metadata.dll >nul 2>nul
|
||||
if not %errorlevel% EQU 0 goto fail
|
||||
|
||||
echo Crossgenning Microsoft.CodeAnalysis
|
||||
crossgen /nologo %READYTORUN% /Platform_Assemblies_Paths %BIN_DIR% Microsoft.CodeAnalysis.dll >nul 2>nul
|
||||
if not %errorlevel% EQU 0 goto fail
|
||||
|
||||
echo Crossgenning Microsoft.CodeAnalysis.CSharp
|
||||
crossgen /nologo %READYTORUN% /Platform_Assemblies_Paths %BIN_DIR% Microsoft.CodeAnalysis.CSharp.dll >nul 2>nul
|
||||
if not %errorlevel% EQU 0 goto fail
|
||||
|
||||
echo Crossgenning Microsoft.CodeAnalysis.CSharp.Scripting
|
||||
crossgen /nologo %READYTORUN% /Platform_Assemblies_Paths %BIN_DIR% Microsoft.CodeAnalysis.CSharp.Scripting.dll >nul 2>nul
|
||||
if not %errorlevel% EQU 0 goto fail
|
||||
|
||||
echo Crossgenning Microsoft.CodeAnalysis.VisualBasic
|
||||
crossgen /nologo %READYTORUN% /Platform_Assemblies_Paths %BIN_DIR% Microsoft.CodeAnalysis.VisualBasic.dll >nul 2>nul
|
||||
if not %errorlevel% EQU 0 goto fail
|
||||
|
||||
echo Crossgenning csc
|
||||
crossgen /nologo %READYTORUN% /Platform_Assemblies_Paths %BIN_DIR% csc.dll >nul 2>nul
|
||||
if not %errorlevel% EQU 0 goto fail
|
||||
|
||||
echo Crossgenning csi
|
||||
crossgen /nologo %READYTORUN% /Platform_Assemblies_Paths %BIN_DIR% csi.dll >nul 2>nul
|
||||
if not %errorlevel% EQU 0 goto fail
|
||||
|
||||
echo Crossgenning vbc
|
||||
crossgen /nologo %READYTORUN% /Platform_Assemblies_Paths %BIN_DIR% vbc.dll >nul 2>nul
|
||||
if not %errorlevel% EQU 0 goto fail
|
||||
|
||||
popd
|
||||
|
||||
echo CrossGen Roslyn Finished
|
||||
|
||||
goto end
|
||||
|
||||
:fail
|
||||
popd
|
||||
echo Crossgen failed...
|
||||
exit /B 1
|
||||
|
||||
:skip
|
||||
echo Skipping Crossgen
|
||||
goto end
|
||||
|
||||
:end
|
|
@ -1,87 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
source "$DIR/../common/_common.sh"
|
||||
|
||||
if $SKIP_CROSSGEN ; then
|
||||
echo "Skipping Crossgen"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
|
||||
info "Crossgenning Roslyn compiler ..."
|
||||
|
||||
set -e
|
||||
|
||||
BIN_DIR="$( cd $1 && pwd )"
|
||||
|
||||
UNAME=`uname`
|
||||
|
||||
# Always recalculate the RID because the package always uses a specific RID, regardless of OS X version or Linux distro.
|
||||
if [ "$OSNAME" == "osx" ]; then
|
||||
RID=osx.10.10-x64
|
||||
elif [ "$OSNAME" == "ubuntu" ]; then
|
||||
RID=ubuntu.14.04-x64
|
||||
elif [ "$OSNAME" == "centos" ]; then
|
||||
RID=rhel.7-x64
|
||||
else
|
||||
echo "Unknown OS: $OSNAME" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
READYTORUN=""
|
||||
|
||||
# Replace with a robust method for finding the right crossgen.exe
|
||||
CROSSGEN_UTIL=$NUGET_PACKAGES/runtime.$RID.Microsoft.NETCore.Runtime.CoreCLR/1.0.1-rc2-23811/tools/crossgen
|
||||
|
||||
cd $BIN_DIR
|
||||
|
||||
# Crossgen currently requires itself to be next to mscorlib
|
||||
cp $CROSSGEN_UTIL $BIN_DIR
|
||||
chmod +x crossgen
|
||||
|
||||
./crossgen -nologo $READYTORUN -platform_assemblies_paths $BIN_DIR mscorlib.dll
|
||||
|
||||
info "Crossgenning System.Collections.Immutable"
|
||||
./crossgen -nologo $READYTORUN -platform_assemblies_paths $BIN_DIR System.Collections.Immutable.dll
|
||||
|
||||
info "Crossgenning System.Reflection.Metadata"
|
||||
./crossgen -nologo $READYTORUN -platform_assemblies_paths $BIN_DIR System.Reflection.Metadata.dll
|
||||
|
||||
info "Crossgenning Microsoft.CodeAnalysis"
|
||||
./crossgen -nologo $READYTORUN -platform_assemblies_paths $BIN_DIR Microsoft.CodeAnalysis.dll
|
||||
|
||||
info "Crossgenning Microsoft.CodeAnalysis.CSharp"
|
||||
./crossgen -nologo $READYTORUN -platform_assemblies_paths $BIN_DIR Microsoft.CodeAnalysis.CSharp.dll
|
||||
|
||||
info "Crossgenning Microsoft.CodeAnalysis.CSharp.Scripting"
|
||||
./crossgen -nologo $READYTORUN -platform_assemblies_paths $BIN_DIR Microsoft.CodeAnalysis.CSharp.Scripting.dll
|
||||
|
||||
info "Crossgenning Microsoft.CodeAnalysis.VisualBasic"
|
||||
./crossgen -nologo $READYTORUN -platform_assemblies_paths $BIN_DIR Microsoft.CodeAnalysis.VisualBasic.dll
|
||||
|
||||
info "Crossgenning csc"
|
||||
./crossgen -nologo $READYTORUN -platform_assemblies_paths $BIN_DIR csc.dll
|
||||
[ -e csc.ni.exe ] && [ ! -e csc.ni.dll ] && mv csc.ni.exe csc.ni.dll
|
||||
|
||||
info "Crossgenning csi"
|
||||
./crossgen -nologo $READYTORUN -platform_assemblies_paths $BIN_DIR csi.dll
|
||||
[ -e csi.ni.exe ] && [ ! -e csi.ni.dll ] && mv csi.ni.exe csi.ni.dll
|
||||
|
||||
info "Crossgenning vbc"
|
||||
./crossgen -nologo $READYTORUN -platform_assemblies_paths $BIN_DIR vbc.dll
|
||||
[ -e vbc.ni.exe ] && [ ! -e vbc.ni.dll ] && mv vbc.ni.exe vbc.ni.dll
|
||||
|
||||
info "CrossGen Roslyn Finished"
|
|
@ -1,48 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
source "$DIR/../common/_common.sh"
|
||||
|
||||
cd $REPOROOT
|
||||
|
||||
[ -z "$DOTNET_BUILD_CONTAINER_TAG" ] && DOTNET_BUILD_CONTAINER_TAG="dotnetcli-build"
|
||||
[ -z "$DOTNET_BUILD_CONTAINER_NAME" ] && DOTNET_BUILD_CONTAINER_NAME="dotnetcli-build-container"
|
||||
[ -z "$DOCKER_HOST_SHARE_DIR" ] && DOCKER_HOST_SHARE_DIR=$(pwd)
|
||||
[ -z "$DOCKER_OS" ] && DOCKER_OS=$OSNAME
|
||||
[ -z "$BUILD_COMMAND" ] && BUILD_COMMAND="/opt/code/scripts/build/build.sh"
|
||||
|
||||
# Build the docker container (will be fast if it is already built)
|
||||
header "Building Docker Container"
|
||||
docker build --build-arg USER_ID=$(id -u) -t $DOTNET_BUILD_CONTAINER_TAG scripts/docker/$DOCKER_OS
|
||||
|
||||
# Run the build in the container
|
||||
header "Launching build in Docker Container"
|
||||
info "Using code from: $DOCKER_HOST_SHARE_DIR"
|
||||
docker run -t --rm --sig-proxy=true \
|
||||
--name $DOTNET_BUILD_CONTAINER_NAME \
|
||||
-v $DOCKER_HOST_SHARE_DIR:/opt/code \
|
||||
-e DOTNET_CLI_VERSION \
|
||||
-e SASTOKEN \
|
||||
-e STORAGE_ACCOUNT \
|
||||
-e STORAGE_CONTAINER \
|
||||
-e CHANNEL \
|
||||
-e CONNECTION_STRING \
|
||||
-e REPO_ID \
|
||||
-e REPO_USER \
|
||||
-e REPO_PASS \
|
||||
-e REPO_SERVER \
|
||||
$DOTNET_BUILD_CONTAINER_TAG \
|
||||
bash -c "${BUILD_COMMAND}"
|
|
@ -1,26 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
source "$DIR/../_common.sh"
|
||||
|
||||
cd $REPOROOT
|
||||
|
||||
[ -z "$DOTNET_BUILD_CONTAINER_TAG" ] && DOTNET_BUILD_CONTAINER_TAG="dotnetcli-build"
|
||||
[ -z "$DOTNET_BUILD_CONTAINER_NAME" ] && DOTNET_BUILD_CONTAINER_NAME="dotnetcli-build-container"
|
||||
[ -z "$DOCKER_HOST_SHARE_DIR" ] && DOCKER_HOST_SHARE_DIR=$(pwd)
|
||||
|
||||
# Enter the container
|
||||
docker run -it --rm --sig-proxy=true \
|
||||
-v $DOCKER_HOST_SHARE_DIR:/opt/code \
|
||||
$DOTNET_BUILD_CONTAINER_TAG
|
|
@ -1,110 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
# Prerequisites:
|
||||
# Git Bash (http://www.git-scm.com/downloads)
|
||||
# Docker Toolbox (https://www.docker.com/docker-toolbox)
|
||||
# Ensure Hyper-V is disabled!
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
# This function is necessary to bypass POSIX Path Conversion in Git Bash
|
||||
# http://www.mingw.org/wiki/Posix_path_conversion
|
||||
_convert_path(){
|
||||
local path=$1
|
||||
path=$( echo "$path" | sed -r 's/[\/]+/\\/g')
|
||||
path=${path#\\}
|
||||
path=//$path
|
||||
|
||||
echo $path
|
||||
}
|
||||
|
||||
# Bypass Msys path conversion
|
||||
REPO_ROOT=$(readlink -f $DIR/../..)
|
||||
REPO_ROOT=$(_convert_path $REPO_ROOT)
|
||||
|
||||
VM_NAME="dotnet"
|
||||
VM_CODE_DIR="/home/docker/code"
|
||||
|
||||
RESULTS_DIR="$REPO_ROOT/artifacts"
|
||||
|
||||
execute(){
|
||||
check_prereqs
|
||||
|
||||
echo "Setting up VM..."
|
||||
create_or_start_vm
|
||||
|
||||
echo "Copying code from Host to VM"
|
||||
eval $(docker-machine env --shell bash $VM_NAME)
|
||||
copy_code_to_vm
|
||||
|
||||
echo "Running Build in Docker Container"
|
||||
run_build
|
||||
|
||||
echo "Copying Results from VM to Hosts..."
|
||||
copy_results_from_vm
|
||||
}
|
||||
|
||||
check_prereqs(){
|
||||
if ! which docker; then
|
||||
echo "Error: Install docker toolbox (https://www.docker.com/docker-toolbox)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! which docker-machine; then
|
||||
echo "Error: Install docker toolbox (https://www.docker.com/docker-toolbox)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
create_or_start_vm(){
|
||||
|
||||
if [[ $(docker-machine ls | grep $VM_NAME) == "" ]]; then
|
||||
docker-machine create -d virtualbox $VM_NAME
|
||||
else
|
||||
# This fails sometimes
|
||||
if ! docker-machine start $VM_NAME; then
|
||||
docker-machine rm -f $VM_NAME
|
||||
docker-machine create -d virtualbox $VM_NAME
|
||||
fi
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
copy_code_to_vm(){
|
||||
docker-machine ssh $VM_NAME "sudo rm -rf $VM_CODE_DIR"
|
||||
docker-machine scp -r $REPO_ROOT $VM_NAME:$VM_CODE_DIR >> /dev/null 2>&1
|
||||
}
|
||||
|
||||
|
||||
run_build(){
|
||||
# These are env variables for dockerbuild.sh
|
||||
export DOCKER_HOST_SHARE_DIR="$(_convert_path $VM_CODE_DIR)"
|
||||
export BUILD_COMMAND="//opt\\code\\build.sh"
|
||||
|
||||
$DIR/../dockerbuild.sh debian
|
||||
}
|
||||
|
||||
# This will duplicate the entire repo + any side effects from
|
||||
# the operations in the docker container
|
||||
copy_results_from_vm(){
|
||||
T_RESULTS_DIR=$( echo "$RESULTS_DIR" | sed -r 's/[\\]+/\//g')
|
||||
T_RESULTS_DIR=${T_RESULTS_DIR#/}
|
||||
|
||||
mkdir $T_RESULTS_DIR
|
||||
docker-machine ssh $VM_NAME "sudo chmod -R a+rx $VM_CODE_DIR"
|
||||
docker-machine scp -r $VM_NAME:$VM_CODE_DIR/artifacts $REPO_ROOT >> /dev/null 2>&1
|
||||
}
|
||||
|
||||
execute
|
||||
|
|
@ -1,8 +1,4 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
|
@ -12,16 +8,6 @@ while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symli
|
|||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
source "$DIR/../../common/_common.sh"
|
||||
|
||||
mkdir -p "$TEST_PACKAGE_DIR"
|
||||
|
||||
PROJECTS=$(loadTestPackageList)
|
||||
|
||||
for project in $PROJECTS
|
||||
do
|
||||
dotnet pack "$REPOROOT/TestAssets/TestPackages/$project" --output "$TEST_PACKAGE_DIR"
|
||||
done
|
||||
BUILD_COMMAND=/opt/code/scripts/run-build.sh $DIR/dockerrun.sh --non-interactive "$@"
|
102
scripts/dockerrun.sh
Executable file
102
scripts/dockerrun.sh
Executable file
|
@ -0,0 +1,102 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
cd "$DIR/.."
|
||||
|
||||
INTERACTIVE="-i"
|
||||
|
||||
while [[ $# > 0 ]]; do
|
||||
key=$1
|
||||
|
||||
case $key in
|
||||
--non-interactive)
|
||||
INTERACTIVE=
|
||||
;;
|
||||
-i|--image)
|
||||
DOCKER_IMAGENAME=$2
|
||||
shift
|
||||
;;
|
||||
-d|--dockerfile)
|
||||
DOCKERFILE=$2
|
||||
shift
|
||||
;;
|
||||
-h|-?|--help)
|
||||
echo "Usage: $0 [-d|--dockerfile <Dockerfile>] [-i|--image <ImageName>] <Command>"
|
||||
echo ""
|
||||
echo "Options:"
|
||||
echo " <Dockerfile> The path to the Dockerfile to use to create the build container"
|
||||
echo " <ImageName> The name of an existing Dockerfile folder under scripts/docker to use as the Dockerfile"
|
||||
echo " <Command> The command to run once inside the container (/opt/code is mapped to the repo root; defaults to nothing, which runs the default shell)"
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
break # the first non-switch we get ends parsing
|
||||
;;
|
||||
esac
|
||||
|
||||
shift
|
||||
done
|
||||
|
||||
if [ -z "$DOCKERFILE" ]; then
|
||||
if [ -z "$DOCKER_IMAGENAME" ]; then
|
||||
if [ "$(uname)" == "Darwin" ]; then
|
||||
echo "Defaulting to 'ubuntu' image for Darwin"
|
||||
export DOCKERFILE=scripts/docker/ubuntu
|
||||
elif [ "$(cat /etc/*-release | grep -cim1 ubuntu)" -eq 1 ]; then
|
||||
echo "Detected current OS as Ubuntu, using 'ubuntu' image"
|
||||
export DOCKERFILE=scripts/docker/ubuntu
|
||||
elif [ "$(cat /etc/*-release | grep -cim1 centos)" -eq 1 ]; then
|
||||
echo "Detected current OS as CentOS, using 'centos' image"
|
||||
export DOCKERFILE=scripts/docker/centos
|
||||
else
|
||||
echo "Unknown Linux Distro. Using 'ubuntu' image"
|
||||
export DOCKERFILE=scripts/docker/ubuntu
|
||||
fi
|
||||
else
|
||||
echo "Using requested image: $DOCKER_IMAGENAME"
|
||||
export DOCKERFILE="scripts/docker/$DOCKER_IMAGENAME"
|
||||
fi
|
||||
fi
|
||||
|
||||
[ -z "$DOTNET_BUILD_CONTAINER_TAG" ] && DOTNET_BUILD_CONTAINER_TAG="dotnetcli-build"
|
||||
[ -z "$DOTNET_BUILD_CONTAINER_NAME" ] && DOTNET_BUILD_CONTAINER_NAME="dotnetcli-build-container"
|
||||
[ -z "$DOCKER_HOST_SHARE_DIR" ] && DOCKER_HOST_SHARE_DIR=$(pwd)
|
||||
|
||||
# Build the docker container (will be fast if it is already built)
|
||||
echo "Building Docker Container using Dockerfile: $DOCKERFILE"
|
||||
docker build --build-arg USER_ID=$(id -u) -t $DOTNET_BUILD_CONTAINER_TAG $DOCKERFILE
|
||||
|
||||
# Run the build in the container
|
||||
echo "Launching build in Docker Container"
|
||||
echo "Running command: $BUILD_COMMAND"
|
||||
echo "Using code from: $DOCKER_HOST_SHARE_DIR"
|
||||
[ -z "$INTERACTIVE" ] || echo "Running Interactive"
|
||||
|
||||
docker run $INTERACTIVE -t --rm --sig-proxy=true \
|
||||
--name $DOTNET_BUILD_CONTAINER_NAME \
|
||||
-v $DOCKER_HOST_SHARE_DIR:/opt/code \
|
||||
-e SASTOKEN \
|
||||
-e STORAGE_ACCOUNT \
|
||||
-e STORAGE_CONTAINER \
|
||||
-e CHANNEL \
|
||||
-e CONNECTION_STRING \
|
||||
-e REPO_ID \
|
||||
-e REPO_USER \
|
||||
-e REPO_PASS \
|
||||
-e REPO_SERVER \
|
||||
-e DOTNET_BUILD_SKIP_CROSSGEN \
|
||||
$DOTNET_BUILD_CONTAINER_TAG \
|
||||
$BUILD_COMMAND "$@"
|
401
scripts/dotnet-cli-build/CompileTargets.cs
Normal file
401
scripts/dotnet-cli-build/CompileTargets.cs
Normal file
|
@ -0,0 +1,401 @@
|
|||
using Microsoft.DotNet.Cli.Build.Framework;
|
||||
using Microsoft.Extensions.PlatformAbstractions;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
using static Microsoft.DotNet.Cli.Build.FS;
|
||||
using static Microsoft.DotNet.Cli.Build.Framework.BuildHelpers;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build
|
||||
{
|
||||
public class CompileTargets
|
||||
{
|
||||
public static readonly string CoreCLRVersion = "1.0.1-rc2-23811";
|
||||
public static readonly string AppDepSdkVersion = "1.0.5-prerelease-00001";
|
||||
|
||||
public static readonly List<string> AssembliesToCrossGen = GetAssembliesToCrossGen();
|
||||
|
||||
public static readonly string[] BinariesForCoreHost = new[]
|
||||
{
|
||||
"csi",
|
||||
"csc",
|
||||
"vbc"
|
||||
};
|
||||
|
||||
public static readonly string[] ProjectsToPublish = new[]
|
||||
{
|
||||
"dotnet"
|
||||
};
|
||||
|
||||
public static readonly string[] FilesToClean = new[]
|
||||
{
|
||||
"README.md",
|
||||
"Microsoft.DotNet.Runtime.exe",
|
||||
"Microsoft.DotNet.Runtime.dll",
|
||||
"Microsoft.DotNet.Runtime.deps",
|
||||
"Microsoft.DotNet.Runtime.pdb"
|
||||
};
|
||||
|
||||
public static readonly string[] ProjectsToPack = new[]
|
||||
{
|
||||
"Microsoft.DotNet.Cli.Utils",
|
||||
"Microsoft.DotNet.ProjectModel",
|
||||
"Microsoft.DotNet.ProjectModel.Loader",
|
||||
"Microsoft.DotNet.ProjectModel.Workspaces",
|
||||
"Microsoft.Extensions.DependencyModel",
|
||||
"Microsoft.Extensions.Testing.Abstractions"
|
||||
};
|
||||
|
||||
[Target(nameof(PrepareTargets.Init), nameof(CompileCoreHost), nameof(CompileStage1), nameof(CompileStage2))]
|
||||
public static BuildTargetResult Compile(BuildTargetContext c)
|
||||
{
|
||||
return c.Success();
|
||||
}
|
||||
|
||||
[Target]
|
||||
public static BuildTargetResult CompileCoreHost(BuildTargetContext c)
|
||||
{
|
||||
// Generate build files
|
||||
var cmakeOut = Path.Combine(Dirs.Corehost, "cmake");
|
||||
|
||||
Rmdir(cmakeOut);
|
||||
Mkdirp(cmakeOut);
|
||||
|
||||
var configuration = (string)c.BuildContext["Configuration"];
|
||||
|
||||
// Run the build
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
// Why does Windows directly call cmake but Linux/Mac calls "build.sh" in the corehost dir?
|
||||
// See the comment in "src/corehost/build.sh" for details. It doesn't work for some reason.
|
||||
ExecIn(cmakeOut, "cmake",
|
||||
Path.Combine(c.BuildContext.BuildDirectory, "src", "corehost"),
|
||||
"-G",
|
||||
"Visual Studio 14 2015 Win64");
|
||||
|
||||
var pf32 = RuntimeInformation.OSArchitecture == Architecture.X64 ?
|
||||
Environment.GetEnvironmentVariable("ProgramFiles(x86)") :
|
||||
Environment.GetEnvironmentVariable("ProgramFiles");
|
||||
|
||||
if (configuration.Equals("Release"))
|
||||
{
|
||||
// Cmake calls it "RelWithDebInfo" in the generated MSBuild
|
||||
configuration = "RelWithDebInfo";
|
||||
}
|
||||
|
||||
Exec(Path.Combine(pf32, "MSBuild", "14.0", "Bin", "MSBuild.exe"),
|
||||
Path.Combine(cmakeOut, "ALL_BUILD.vcxproj"),
|
||||
$"/p:Configuration={configuration}");
|
||||
|
||||
// Copy the output out
|
||||
File.Copy(Path.Combine(cmakeOut, "cli", "Debug", "corehost.exe"), Path.Combine(Dirs.Corehost, "corehost.exe"), overwrite: true);
|
||||
File.Copy(Path.Combine(cmakeOut, "cli", "Debug", "corehost.pdb"), Path.Combine(Dirs.Corehost, "corehost.pdb"), overwrite: true);
|
||||
File.Copy(Path.Combine(cmakeOut, "cli", "dll", "Debug", "hostpolicy.dll"), Path.Combine(Dirs.Corehost, "hostpolicy.dll"), overwrite: true);
|
||||
File.Copy(Path.Combine(cmakeOut, "cli", "dll", "Debug", "hostpolicy.pdb"), Path.Combine(Dirs.Corehost, "hostpolicy.pdb"), overwrite: true);
|
||||
}
|
||||
else
|
||||
{
|
||||
ExecIn(cmakeOut, Path.Combine(c.BuildContext.BuildDirectory, "src", "corehost", "build.sh"));
|
||||
|
||||
// Copy the output out
|
||||
File.Copy(Path.Combine(cmakeOut, "cli", "corehost"), Path.Combine(Dirs.Corehost, "corehost"), overwrite: true);
|
||||
File.Copy(Path.Combine(cmakeOut, "cli", "dll", $"{Constants.DynamicLibPrefix}hostpolicy{Constants.DynamicLibSuffix}"), Path.Combine(Dirs.Corehost, $"{Constants.DynamicLibPrefix}hostpolicy{Constants.DynamicLibSuffix}"), overwrite: true);
|
||||
}
|
||||
|
||||
return c.Success();
|
||||
}
|
||||
|
||||
[Target]
|
||||
public static BuildTargetResult CompileStage1(BuildTargetContext c)
|
||||
{
|
||||
CleanBinObj(c, Path.Combine(c.BuildContext.BuildDirectory, "src"));
|
||||
CleanBinObj(c, Path.Combine(c.BuildContext.BuildDirectory, "test"));
|
||||
return CompileStage(c,
|
||||
dotnet: DotNetCli.Stage0,
|
||||
outputDir: Dirs.Stage1);
|
||||
}
|
||||
|
||||
[Target]
|
||||
public static BuildTargetResult CompileStage2(BuildTargetContext c)
|
||||
{
|
||||
var configuration = (string)c.BuildContext["Configuration"];
|
||||
|
||||
CleanBinObj(c, Path.Combine(c.BuildContext.BuildDirectory, "src"));
|
||||
CleanBinObj(c, Path.Combine(c.BuildContext.BuildDirectory, "test"));
|
||||
var result = CompileStage(c,
|
||||
dotnet: DotNetCli.Stage1,
|
||||
outputDir: Dirs.Stage2);
|
||||
if (!result.Success)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
// Build projects that are packed in NuGet packages, but only on Windows
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
var packagingOutputDir = Path.Combine(Dirs.Stage2Compilation, "forPackaging");
|
||||
Mkdirp(packagingOutputDir);
|
||||
foreach(var project in ProjectsToPack)
|
||||
{
|
||||
// Just build them, we'll pack later
|
||||
DotNetCli.Stage1.Build(
|
||||
"--build-base-path",
|
||||
packagingOutputDir,
|
||||
"--configuration",
|
||||
configuration,
|
||||
Path.Combine(c.BuildContext.BuildDirectory, "src", project))
|
||||
.Execute()
|
||||
.EnsureSuccessful();
|
||||
}
|
||||
}
|
||||
|
||||
return c.Success();
|
||||
}
|
||||
|
||||
private static BuildTargetResult CompileStage(BuildTargetContext c, DotNetCli dotnet, string outputDir)
|
||||
{
|
||||
Rmdir(outputDir);
|
||||
|
||||
dotnet.SetDotNetHome();
|
||||
|
||||
var configuration = (string)c.BuildContext["Configuration"];
|
||||
var binDir = Path.Combine(outputDir, "bin");
|
||||
var runtimeOutputDir = Path.Combine(outputDir, "runtime", "coreclr");
|
||||
|
||||
Mkdirp(binDir);
|
||||
Mkdirp(runtimeOutputDir);
|
||||
|
||||
foreach (var project in ProjectsToPublish)
|
||||
{
|
||||
dotnet.Publish(
|
||||
"--native-subdirectory",
|
||||
"--output",
|
||||
binDir,
|
||||
"--configuration",
|
||||
configuration,
|
||||
Path.Combine(c.BuildContext.BuildDirectory, "src", project))
|
||||
.Execute()
|
||||
.EnsureSuccessful();
|
||||
}
|
||||
|
||||
// Publish the runtime
|
||||
dotnet.Publish(
|
||||
"--output",
|
||||
runtimeOutputDir,
|
||||
"--configuration",
|
||||
configuration,
|
||||
Path.Combine(c.BuildContext.BuildDirectory, "src", "Microsoft.DotNet.Runtime"))
|
||||
.Execute()
|
||||
.EnsureSuccessful();
|
||||
|
||||
// Clean bogus files
|
||||
foreach (var fileToClean in FilesToClean)
|
||||
{
|
||||
var pathToClean = Path.Combine(runtimeOutputDir, fileToClean);
|
||||
if (File.Exists(pathToClean))
|
||||
{
|
||||
File.Delete(pathToClean);
|
||||
}
|
||||
}
|
||||
|
||||
FixModeFlags(outputDir);
|
||||
|
||||
// Copy the whole runtime local to the tools
|
||||
CopyRecursive(runtimeOutputDir, binDir);
|
||||
|
||||
// Copy corehost
|
||||
File.Copy(Path.Combine(Dirs.Corehost, $"corehost{Constants.ExeSuffix}"), Path.Combine(binDir, $"corehost{Constants.ExeSuffix}"), overwrite: true);
|
||||
File.Copy(Path.Combine(Dirs.Corehost, $"{Constants.DynamicLibPrefix}hostpolicy{Constants.DynamicLibSuffix}"), Path.Combine(binDir, $"{Constants.DynamicLibPrefix}hostpolicy{Constants.DynamicLibSuffix}"), overwrite: true);
|
||||
|
||||
// Corehostify binaries
|
||||
foreach(var binaryToCorehostify in BinariesForCoreHost)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Yes, it is .exe even on Linux. This is the managed exe we're working with
|
||||
File.Copy(Path.Combine(binDir, $"{binaryToCorehostify}.exe"), Path.Combine(binDir, $"{binaryToCorehostify}.dll"));
|
||||
File.Delete(Path.Combine(binDir, $"{binaryToCorehostify}.exe"));
|
||||
File.Copy(Path.Combine(binDir, $"corehost{Constants.ExeSuffix}"), Path.Combine(binDir, binaryToCorehostify + Constants.ExeSuffix));
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
return c.Failed($"Failed to corehostify '{binaryToCorehostify}': {ex.ToString()}");
|
||||
}
|
||||
}
|
||||
|
||||
// Crossgen Roslyn
|
||||
var result = Crossgen(c, binDir);
|
||||
if (!result.Success)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
// Copy AppDeps
|
||||
result = CopyAppDeps(c, binDir);
|
||||
if(!result.Success)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
// Generate .version file
|
||||
var version = ((BuildVersion)c.BuildContext["BuildVersion"]).SimpleVersion;
|
||||
var content = $@"{version}{Environment.NewLine}{c.BuildContext["CommitHash"]}{Environment.NewLine}";
|
||||
File.WriteAllText(Path.Combine(outputDir, ".version"), content);
|
||||
|
||||
return c.Success();
|
||||
}
|
||||
|
||||
private static BuildTargetResult CopyAppDeps(BuildTargetContext c, string outputDir)
|
||||
{
|
||||
var appDepOutputDir = Path.Combine(outputDir, "appdepsdk");
|
||||
Rmdir(appDepOutputDir);
|
||||
Mkdirp(appDepOutputDir);
|
||||
|
||||
// Find toolchain package
|
||||
string packageId;
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
packageId = "toolchain.win7-x64.Microsoft.DotNet.AppDep";
|
||||
}
|
||||
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
||||
{
|
||||
var osname = PlatformServices.Default.Runtime.OperatingSystem;
|
||||
if (string.Equals(osname, "ubuntu", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
packageId = "toolchain.ubuntu.14.04-x64.Microsoft.DotNet.AppDep";
|
||||
}
|
||||
else if (string.Equals(osname, "centos", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
c.Warn("Native compilation is not yet working on CentOS");
|
||||
return c.Success();
|
||||
}
|
||||
else
|
||||
{
|
||||
return c.Failed($"Unknown Linux Distro: {osname}");
|
||||
}
|
||||
}
|
||||
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
|
||||
{
|
||||
packageId = "toolchain.osx.10.10-x64.Microsoft.DotNet.AppDep";
|
||||
}
|
||||
else
|
||||
{
|
||||
return c.Failed("Unsupported OS Platform");
|
||||
}
|
||||
|
||||
var appDepPath = Path.Combine(
|
||||
Dirs.NuGetPackages,
|
||||
packageId,
|
||||
AppDepSdkVersion);
|
||||
CopyRecursive(appDepPath, appDepOutputDir, overwrite: true);
|
||||
|
||||
return c.Success();
|
||||
}
|
||||
|
||||
private static BuildTargetResult Crossgen(BuildTargetContext c, string outputDir)
|
||||
{
|
||||
// Check if we need to skip crossgen
|
||||
if (string.Equals(Environment.GetEnvironmentVariable("DOTNET_BUILD_SKIP_CROSSGEN"), "1"))
|
||||
{
|
||||
c.Warn("Skipping crossgen because DOTNET_BUILD_SKIP_CROSSGEN is set");
|
||||
return c.Success();
|
||||
}
|
||||
|
||||
// Find crossgen
|
||||
string packageId;
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
packageId = "runtime.win7-x64.Microsoft.NETCore.Runtime.CoreCLR";
|
||||
}
|
||||
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
||||
{
|
||||
var osname = PlatformServices.Default.Runtime.OperatingSystem;
|
||||
if (string.Equals(osname, "ubuntu", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
packageId = "runtime.ubuntu.14.04-x64.Microsoft.NETCore.Runtime.CoreCLR";
|
||||
}
|
||||
else if (string.Equals(osname, "centos", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
// CentOS runtime is in the runtime.rhel.7-x64... package.
|
||||
packageId = "runtime.rhel.7-x64.Microsoft.NETCore.Runtime.CoreCLR";
|
||||
}
|
||||
else
|
||||
{
|
||||
return c.Failed($"Unknown Linux Distro: {osname}");
|
||||
}
|
||||
}
|
||||
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
|
||||
{
|
||||
packageId = "runtime.osx.10.10-x64.Microsoft.NETCore.Runtime.CoreCLR";
|
||||
}
|
||||
else
|
||||
{
|
||||
return c.Failed("Unsupported OS Platform");
|
||||
}
|
||||
|
||||
var crossGenExePath = Path.Combine(
|
||||
Dirs.NuGetPackages,
|
||||
packageId,
|
||||
CoreCLRVersion,
|
||||
"tools",
|
||||
$"crossgen{Constants.ExeSuffix}");
|
||||
|
||||
// We have to copy crossgen next to mscorlib
|
||||
var crossgen = Path.Combine(outputDir, $"crossgen{Constants.ExeSuffix}");
|
||||
File.Copy(crossGenExePath, crossgen, overwrite: true);
|
||||
Chmod(crossgen, "a+x");
|
||||
|
||||
// And if we have mscorlib.ni.dll, we need to rename it to mscorlib.dll
|
||||
if (File.Exists(Path.Combine(outputDir, "mscorlib.ni.dll")))
|
||||
{
|
||||
File.Copy(Path.Combine(outputDir, "mscorlib.ni.dll"), Path.Combine(outputDir, "mscorlib.dll"), overwrite: true);
|
||||
}
|
||||
|
||||
foreach (var assemblyToCrossgen in AssembliesToCrossGen)
|
||||
{
|
||||
c.Info($"Crossgenning {assemblyToCrossgen}");
|
||||
ExecIn(outputDir, crossgen, "-nologo", "-platform_assemblies_paths", outputDir, assemblyToCrossgen);
|
||||
}
|
||||
|
||||
c.Info("Crossgen complete");
|
||||
|
||||
// Check if csc/vbc.ni.exe exists, and overwrite the dll with it just in case
|
||||
if (File.Exists(Path.Combine(outputDir, "csc.ni.exe")) && !File.Exists(Path.Combine(outputDir, "csc.ni.dll")))
|
||||
{
|
||||
File.Move(Path.Combine(outputDir, "csc.ni.exe"), Path.Combine(outputDir, "csc.ni.dll"));
|
||||
}
|
||||
|
||||
if (File.Exists(Path.Combine(outputDir, "vbc.ni.exe")) && !File.Exists(Path.Combine(outputDir, "vbc.ni.dll")))
|
||||
{
|
||||
File.Move(Path.Combine(outputDir, "vbc.ni.exe"), Path.Combine(outputDir, "vbc.ni.dll"));
|
||||
}
|
||||
|
||||
return c.Success();
|
||||
}
|
||||
|
||||
private static List<string> GetAssembliesToCrossGen()
|
||||
{
|
||||
var list = new List<string>
|
||||
{
|
||||
"System.Collections.Immutable.dll",
|
||||
"System.Reflection.Metadata.dll",
|
||||
"Microsoft.CodeAnalysis.dll",
|
||||
"Microsoft.CodeAnalysis.CSharp.dll",
|
||||
"Microsoft.CodeAnalysis.VisualBasic.dll",
|
||||
"csc.dll",
|
||||
"vbc.dll"
|
||||
};
|
||||
|
||||
// mscorlib is already crossgenned on Windows
|
||||
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
// mscorlib has to be crossgenned first
|
||||
list.Insert(0, "mscorlib.dll");
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
}
|
||||
}
|
219
scripts/dotnet-cli-build/PrepareTargets.cs
Normal file
219
scripts/dotnet-cli-build/PrepareTargets.cs
Normal file
|
@ -0,0 +1,219 @@
|
|||
using Microsoft.DotNet.Cli.Build.Framework;
|
||||
using Microsoft.Extensions.PlatformAbstractions;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
using static Microsoft.DotNet.Cli.Build.FS;
|
||||
using static Microsoft.DotNet.Cli.Build.Utils;
|
||||
using static Microsoft.DotNet.Cli.Build.Framework.BuildHelpers;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build
|
||||
{
|
||||
public class PrepareTargets
|
||||
{
|
||||
[Target(nameof(Init), nameof(RestorePackages))]
|
||||
public static BuildTargetResult Prepare(BuildTargetContext c) => c.Success();
|
||||
|
||||
// All major targets will depend on this in order to ensure variables are set up right if they are run independently
|
||||
[Target(nameof(GenerateVersions), nameof(CheckPrereqs), nameof(LocateStage0))]
|
||||
public static BuildTargetResult Init(BuildTargetContext c)
|
||||
{
|
||||
var runtimeInfo = PlatformServices.Default.Runtime;
|
||||
|
||||
var configEnv = Environment.GetEnvironmentVariable("CONFIGURATION");
|
||||
|
||||
if(string.IsNullOrEmpty(configEnv))
|
||||
{
|
||||
configEnv = "Debug";
|
||||
}
|
||||
c.BuildContext["Configuration"] = configEnv;
|
||||
|
||||
c.Info($"Building {c.BuildContext["Configuration"]} to: {Dirs.Output}");
|
||||
c.Info("Build Environment:");
|
||||
c.Info($" Operating System: {runtimeInfo.OperatingSystem} {runtimeInfo.OperatingSystemVersion}");
|
||||
c.Info($" Platform: {runtimeInfo.OperatingSystemPlatform}");
|
||||
|
||||
return c.Success();
|
||||
}
|
||||
|
||||
[Target]
|
||||
public static BuildTargetResult GenerateVersions(BuildTargetContext c)
|
||||
{
|
||||
var gitResult = Cmd("git", "rev-list", "--count", "HEAD")
|
||||
.CaptureStdOut()
|
||||
.Execute();
|
||||
gitResult.EnsureSuccessful();
|
||||
var commitCount = int.Parse(gitResult.StdOut);
|
||||
|
||||
gitResult = Cmd("git", "rev-parse", "HEAD")
|
||||
.CaptureStdOut()
|
||||
.Execute();
|
||||
gitResult.EnsureSuccessful();
|
||||
var commitHash = gitResult.StdOut.Trim();
|
||||
|
||||
var branchInfo = ReadBranchInfo(c, Path.Combine(c.BuildContext.BuildDirectory, "branchinfo.txt"));
|
||||
var buildVersion = new BuildVersion()
|
||||
{
|
||||
Major = int.Parse(branchInfo["MAJOR_VERSION"]),
|
||||
Minor = int.Parse(branchInfo["MINOR_VERSION"]),
|
||||
Patch = int.Parse(branchInfo["PATCH_VERSION"]),
|
||||
ReleaseSuffix = branchInfo["RELEASE_SUFFIX"],
|
||||
CommitCount = commitCount
|
||||
};
|
||||
c.BuildContext["BuildVersion"] = buildVersion;
|
||||
c.BuildContext["CommitHash"] = commitHash;
|
||||
|
||||
c.Info($"Building Version: {buildVersion.SimpleVersion} (NuGet Packages: {buildVersion.NuGetVersion})");
|
||||
c.Info($"From Commit: {commitHash}");
|
||||
|
||||
return c.Success();
|
||||
}
|
||||
|
||||
[Target]
|
||||
public static BuildTargetResult LocateStage0(BuildTargetContext c)
|
||||
{
|
||||
// We should have been run in the repo root, so locate the stage 0 relative to current directory
|
||||
var stage0 = DotNetCli.Stage0.BinPath;
|
||||
|
||||
if (!Directory.Exists(stage0))
|
||||
{
|
||||
return c.Failed($"Stage 0 directory does not exist: {stage0}");
|
||||
}
|
||||
|
||||
// Identify the version
|
||||
var version = File.ReadAllLines(Path.Combine(stage0, "..", ".version"));
|
||||
c.Info($"Using Stage 0 Version: {version[1]}");
|
||||
|
||||
return c.Success();
|
||||
}
|
||||
|
||||
[Target]
|
||||
public static BuildTargetResult CheckPrereqs(BuildTargetContext c)
|
||||
{
|
||||
try
|
||||
{
|
||||
Command.Create("cmake", "--version")
|
||||
.CaptureStdOut()
|
||||
.CaptureStdErr()
|
||||
.Execute();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
string message = $@"Error running cmake: {ex.Message}
|
||||
cmake is required to build the native host 'corehost'";
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
message += Environment.NewLine + "Download it from https://www.cmake.org";
|
||||
}
|
||||
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
||||
{
|
||||
message += Environment.NewLine + "Ubuntu: 'sudo apt-get install cmake'";
|
||||
}
|
||||
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
|
||||
{
|
||||
message += Environment.NewLine + "OS X w/Homebrew: 'brew install cmake'";
|
||||
}
|
||||
return c.Failed(message);
|
||||
}
|
||||
|
||||
return c.Success();
|
||||
}
|
||||
|
||||
[Target]
|
||||
public static BuildTargetResult CheckPackageCache(BuildTargetContext c)
|
||||
{
|
||||
var ciBuild = string.Equals(Environment.GetEnvironmentVariable("CI_BUILD"), "1", StringComparison.Ordinal);
|
||||
|
||||
if (ciBuild)
|
||||
{
|
||||
// On CI, HOME is redirected under the repo, which gets deleted after every build.
|
||||
// So make NUGET_PACKAGES outside of the repo.
|
||||
var nugetPackages = Path.GetFullPath(Path.Combine(c.BuildContext.BuildDirectory, "..", ".nuget", "packages"));
|
||||
Environment.SetEnvironmentVariable("NUGET_PACKAGES", nugetPackages);
|
||||
Dirs.NuGetPackages = nugetPackages;
|
||||
}
|
||||
|
||||
// Set the package cache location in NUGET_PACKAGES just to be safe
|
||||
if (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("NUGET_PACKAGES")))
|
||||
{
|
||||
Environment.SetEnvironmentVariable("NUGET_PACKAGES", Dirs.NuGetPackages);
|
||||
}
|
||||
|
||||
CleanNuGetTempCache();
|
||||
|
||||
// Determine cache expiration time
|
||||
var cacheExpiration = 7 * 24; // cache expiration in hours
|
||||
var cacheExpirationStr = Environment.GetEnvironmentVariable("NUGET_PACKAGES_CACHE_TIME_LIMIT");
|
||||
if (!string.IsNullOrEmpty(cacheExpirationStr))
|
||||
{
|
||||
cacheExpiration = int.Parse(cacheExpirationStr);
|
||||
}
|
||||
|
||||
if (ciBuild)
|
||||
{
|
||||
var cacheTimeFile = Path.Combine(Dirs.NuGetPackages, "packageCacheTime.txt");
|
||||
|
||||
DateTime? cacheTime = null;
|
||||
try
|
||||
{
|
||||
// Read the cache file
|
||||
if(File.Exists(cacheTimeFile))
|
||||
{
|
||||
var content = File.ReadAllText(cacheTimeFile);
|
||||
if(!string.IsNullOrEmpty(content))
|
||||
{
|
||||
cacheTime = DateTime.ParseExact("O", content, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
c.Warn($"Error reading NuGet cache time file, leaving the cache alone");
|
||||
c.Warn($"Error Detail: {ex.ToString()}");
|
||||
}
|
||||
|
||||
if(cacheTime == null || (cacheTime.Value.AddHours(cacheExpiration) < DateTime.UtcNow))
|
||||
{
|
||||
// Cache has expired or the status is unknown, clear it and write the file
|
||||
c.Info("Clearing NuGet cache");
|
||||
Rmdir(Dirs.NuGetPackages);
|
||||
Mkdirp(Dirs.NuGetPackages);
|
||||
File.WriteAllText(cacheTimeFile, DateTime.UtcNow.ToString("O"));
|
||||
}
|
||||
}
|
||||
|
||||
return c.Success();
|
||||
}
|
||||
|
||||
[Target(nameof(CheckPackageCache))]
|
||||
public static BuildTargetResult RestorePackages(BuildTargetContext c)
|
||||
{
|
||||
var dotnet = DotNetCli.Stage0;
|
||||
|
||||
dotnet.Restore().WorkingDirectory(Path.Combine(c.BuildContext.BuildDirectory, "src")).Execute().EnsureSuccessful();
|
||||
dotnet.Restore().WorkingDirectory(Path.Combine(c.BuildContext.BuildDirectory, "tools")).Execute().EnsureSuccessful();
|
||||
|
||||
return c.Success();
|
||||
}
|
||||
|
||||
private static IDictionary<string, string> ReadBranchInfo(BuildTargetContext c, string path)
|
||||
{
|
||||
var lines = File.ReadAllLines(path);
|
||||
var dict = new Dictionary<string, string>();
|
||||
c.Verbose("Branch Info:");
|
||||
foreach(var line in lines)
|
||||
{
|
||||
if(!line.Trim().StartsWith("#") && !string.IsNullOrWhiteSpace(line))
|
||||
{
|
||||
var splat = line.Split(new[] { '=' }, 2);
|
||||
dict[splat[0]] = splat[1];
|
||||
c.Verbose($" {splat[0]} = {splat[1]}");
|
||||
}
|
||||
}
|
||||
return dict;
|
||||
}
|
||||
}
|
||||
}
|
12
scripts/dotnet-cli-build/Program.cs
Executable file
12
scripts/dotnet-cli-build/Program.cs
Executable file
|
@ -0,0 +1,12 @@
|
|||
using Microsoft.DotNet.Cli.Build.Framework;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build
|
||||
{
|
||||
public class Program
|
||||
{
|
||||
public static int Main(string[] args) => BuildSetup.Create(".NET Core CLI")
|
||||
.UseStandardGoals()
|
||||
.UseAllTargetsFromAssembly<Program>()
|
||||
.Run(args);
|
||||
}
|
||||
}
|
241
scripts/dotnet-cli-build/TestTargets.cs
Normal file
241
scripts/dotnet-cli-build/TestTargets.cs
Normal file
|
@ -0,0 +1,241 @@
|
|||
using Microsoft.DotNet.Cli.Build.Framework;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
using static Microsoft.DotNet.Cli.Build.FS;
|
||||
using static Microsoft.DotNet.Cli.Build.Utils;
|
||||
using static Microsoft.DotNet.Cli.Build.Framework.BuildHelpers;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build
|
||||
{
|
||||
public class TestTargets
|
||||
{
|
||||
public static readonly string[] TestPackageProjects = new[]
|
||||
{
|
||||
"dotnet-hello/v1/dotnet-hello",
|
||||
"dotnet-hello/v2/dotnet-hello"
|
||||
};
|
||||
|
||||
public static readonly string[] TestProjects = new[]
|
||||
{
|
||||
"EndToEnd",
|
||||
"dotnet-publish.Tests",
|
||||
"dotnet-compile.Tests",
|
||||
"dotnet-compile.UnitTests",
|
||||
"dotnet-build.Tests",
|
||||
"Microsoft.DotNet.Cli.Utils.Tests",
|
||||
"Microsoft.DotNet.Compiler.Common.Tests",
|
||||
"ArgumentForwardingTests"
|
||||
};
|
||||
|
||||
[Target(nameof(PrepareTargets.Init), nameof(SetupTests), nameof(RestoreTests), nameof(BuildTests), nameof(RunTests), nameof(ValidateDependencies))]
|
||||
public static BuildTargetResult Test(BuildTargetContext c) => c.Success();
|
||||
|
||||
[Target(nameof(RestoreTestPrerequisites), nameof(BuildTestPrerequisites))]
|
||||
public static BuildTargetResult SetupTests(BuildTargetContext c) => c.Success();
|
||||
|
||||
[Target]
|
||||
public static BuildTargetResult RestoreTestPrerequisites(BuildTargetContext c)
|
||||
{
|
||||
CleanBinObj(c, Path.Combine(c.BuildContext.BuildDirectory, "src"));
|
||||
CleanBinObj(c, Path.Combine(c.BuildContext.BuildDirectory, "test"));
|
||||
|
||||
CleanNuGetTempCache();
|
||||
|
||||
var dotnet = DotNetCli.Stage2;
|
||||
dotnet.Restore().WorkingDirectory(Path.Combine(c.BuildContext.BuildDirectory, "TestAssets")).Execute().EnsureSuccessful();
|
||||
|
||||
// The 'testapp' directory contains intentionally-unresolved dependencies, so don't check for success. Also, suppress the output
|
||||
dotnet.Restore().WorkingDirectory(Path.Combine(c.BuildContext.BuildDirectory, "testapp")).CaptureStdErr().CaptureStdOut().Execute();
|
||||
|
||||
return c.Success();
|
||||
}
|
||||
|
||||
[Target]
|
||||
public static BuildTargetResult BuildTestPrerequisites(BuildTargetContext c)
|
||||
{
|
||||
var dotnet = DotNetCli.Stage2;
|
||||
|
||||
Rmdir(Dirs.TestPackages);
|
||||
Mkdirp(Dirs.TestPackages);
|
||||
|
||||
foreach (var relativePath in TestPackageProjects)
|
||||
{
|
||||
var fullPath = Path.Combine(c.BuildContext.BuildDirectory, "TestAssets", "TestPackages", relativePath.Replace('/', Path.DirectorySeparatorChar));
|
||||
c.Info("Packing: {fullPath}");
|
||||
dotnet.Pack("--output", Dirs.TestPackages)
|
||||
.WorkingDirectory(fullPath)
|
||||
.Execute()
|
||||
.EnsureSuccessful();
|
||||
}
|
||||
|
||||
return c.Success();
|
||||
}
|
||||
|
||||
[Target]
|
||||
public static BuildTargetResult RestoreTests(BuildTargetContext c)
|
||||
{
|
||||
CleanBinObj(c, Path.Combine(c.BuildContext.BuildDirectory, "src"));
|
||||
CleanBinObj(c, Path.Combine(c.BuildContext.BuildDirectory, "test"));
|
||||
|
||||
CleanNuGetTempCache();
|
||||
DotNetCli.Stage2.Restore("--fallbacksource", Dirs.TestPackages)
|
||||
.WorkingDirectory(Path.Combine(c.BuildContext.BuildDirectory, "test"))
|
||||
.Execute()
|
||||
.EnsureSuccessful();
|
||||
return c.Success();
|
||||
}
|
||||
|
||||
[Target]
|
||||
public static BuildTargetResult BuildTests(BuildTargetContext c)
|
||||
{
|
||||
var dotnet = DotNetCli.Stage2;
|
||||
foreach (var testProject in TestProjects)
|
||||
{
|
||||
c.Info("Building tests: {project}");
|
||||
dotnet.Build()
|
||||
.WorkingDirectory(Path.Combine(c.BuildContext.BuildDirectory, "test", testProject))
|
||||
.Execute()
|
||||
.EnsureSuccessful();
|
||||
}
|
||||
return c.Success();
|
||||
}
|
||||
|
||||
[Target(nameof(RunXUnitTests), nameof(RunPackageCommandTests))]
|
||||
public static BuildTargetResult RunTests(BuildTargetContext c) => c.Success();
|
||||
|
||||
[Target]
|
||||
public static BuildTargetResult RunXUnitTests(BuildTargetContext c)
|
||||
{
|
||||
// Need to load up the VS Vars
|
||||
var dotnet = DotNetCli.Stage2;
|
||||
var vsvars = LoadVsVars();
|
||||
|
||||
// Copy the test projects
|
||||
var testProjectsDir = Path.Combine(Dirs.TestOutput, "TestProjects");
|
||||
Rmdir(testProjectsDir);
|
||||
Mkdirp(testProjectsDir);
|
||||
CopyRecursive(Path.Combine(c.BuildContext.BuildDirectory, "TestAssets", "TestProjects"), testProjectsDir);
|
||||
|
||||
// Run the tests and set the VS vars in the environment when running them
|
||||
var failingTests = new List<string>();
|
||||
foreach (var project in TestProjects)
|
||||
{
|
||||
c.Info("Running tests in: {project}");
|
||||
var result = dotnet.Test("-xml", $"{project}-testResults.xml", "-notrait", "category=failing")
|
||||
.WorkingDirectory(Path.Combine(c.BuildContext.BuildDirectory, "test", project))
|
||||
.Environment(vsvars)
|
||||
.EnvironmentVariable("PATH", $"{DotNetCli.Stage2.BinPath}{Path.PathSeparator}{Environment.GetEnvironmentVariable("PATH")}")
|
||||
.Execute();
|
||||
if (result.ExitCode != 0)
|
||||
{
|
||||
failingTests.Add(project);
|
||||
}
|
||||
}
|
||||
|
||||
if (failingTests.Any())
|
||||
{
|
||||
foreach (var project in failingTests)
|
||||
{
|
||||
c.Error($"{project} failed");
|
||||
}
|
||||
return c.Failed("Tests failed!");
|
||||
}
|
||||
|
||||
return c.Success();
|
||||
}
|
||||
|
||||
[Target]
|
||||
public static BuildTargetResult RunPackageCommandTests(BuildTargetContext c)
|
||||
{
|
||||
var dotnet = DotNetCli.Stage2;
|
||||
var consumers = Path.Combine(c.BuildContext.BuildDirectory, "test", "PackagedCommands", "Consumers");
|
||||
|
||||
// Compile the consumer apps
|
||||
foreach(var dir in Directory.EnumerateDirectories(consumers))
|
||||
{
|
||||
dotnet.Build().WorkingDirectory(dir).Execute().EnsureSuccessful();
|
||||
}
|
||||
|
||||
// Test the apps
|
||||
foreach(var dir in Directory.EnumerateDirectories(consumers))
|
||||
{
|
||||
var result = dotnet.Exec("hello").WorkingDirectory(dir).CaptureStdOut().CaptureStdErr().Execute();
|
||||
result.EnsureSuccessful();
|
||||
if(!string.Equals("Hello", result.StdOut.Trim(), StringComparison.Ordinal))
|
||||
{
|
||||
var testName = Path.GetFileName(dir);
|
||||
c.Error($"Packaged Commands Test '{testName}' failed");
|
||||
c.Error($" Expected 'Hello', but got: '{result.StdOut.Trim()}'");
|
||||
return c.Failed($"Packaged Commands Test failed '{testName}'");
|
||||
}
|
||||
}
|
||||
|
||||
return c.Success();
|
||||
}
|
||||
|
||||
[Target]
|
||||
public static BuildTargetResult ValidateDependencies(BuildTargetContext c)
|
||||
{
|
||||
var configuration = (string)c.BuildContext["Configuration"];
|
||||
var dotnet = DotNetCli.Stage2;
|
||||
|
||||
c.Info("Publishing MultiProjectValidator");
|
||||
dotnet.Publish("--output", Path.Combine(Dirs.Output, "tools"), "--configuration", configuration)
|
||||
.WorkingDirectory(Path.Combine(c.BuildContext.BuildDirectory, "tools", "MultiProjectValidator"))
|
||||
.Execute()
|
||||
.EnsureSuccessful();
|
||||
|
||||
var validator = Path.Combine(Dirs.Output, "tools", $"pjvalidate{Constants.ExeSuffix}");
|
||||
|
||||
Cmd(validator, Path.Combine(c.BuildContext.BuildDirectory, "src"))
|
||||
.Execute();
|
||||
|
||||
return c.Success();
|
||||
}
|
||||
|
||||
private static Dictionary<string, string> LoadVsVars()
|
||||
{
|
||||
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
return new Dictionary<string, string>();
|
||||
}
|
||||
|
||||
var vsvarsPath = Path.GetFullPath(Path.Combine(Environment.GetEnvironmentVariable("VS140COMNTOOLS"), "..", "..", "VC"));
|
||||
|
||||
// Write a temp batch file because that seems to be the easiest way to do this (argument parsing is hard)
|
||||
var temp = Path.Combine(Path.GetTempPath(), $"{Path.GetRandomFileName()}.cmd");
|
||||
File.WriteAllText(temp, $@"@echo off
|
||||
cd {vsvarsPath}
|
||||
call vcvarsall.bat x64
|
||||
set");
|
||||
|
||||
CommandResult result;
|
||||
try
|
||||
{
|
||||
result = Cmd(Environment.GetEnvironmentVariable("COMSPEC"), "/c", temp)
|
||||
.WorkingDirectory(vsvarsPath)
|
||||
.CaptureStdOut()
|
||||
.Execute();
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (File.Exists(temp))
|
||||
{
|
||||
File.Delete(temp);
|
||||
}
|
||||
}
|
||||
result.EnsureSuccessful();
|
||||
var vars = new Dictionary<string, string>();
|
||||
foreach (var line in result.StdOut.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries))
|
||||
{
|
||||
var splat = line.Split(new[] { '=' }, 2);
|
||||
vars[splat[0]] = splat[1];
|
||||
}
|
||||
return vars;
|
||||
}
|
||||
}
|
||||
}
|
47
scripts/dotnet-cli-build/Utils/BuildVersion.cs
Normal file
47
scripts/dotnet-cli-build/Utils/BuildVersion.cs
Normal file
|
@ -0,0 +1,47 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build
|
||||
{
|
||||
public class BuildVersion
|
||||
{
|
||||
public int Major { get; set; }
|
||||
public int Minor { get; set; }
|
||||
public int Patch { get; set; }
|
||||
public int CommitCount { get; set; }
|
||||
public string CommitCountString => CommitCount.ToString("000000");
|
||||
public string ReleaseSuffix { get; set; }
|
||||
|
||||
public string SimpleVersion => $"{Major}.{Minor}.{Patch}.{CommitCount}";
|
||||
public string VersionSuffix => $"{ReleaseSuffix}-{CommitCount}";
|
||||
public string NuGetVersion => $"{Major}.{Minor}.{Patch}-{VersionSuffix}";
|
||||
|
||||
public string GenerateMsiVersion()
|
||||
{
|
||||
// MSI versioning
|
||||
// Encode the CLI version to fit into the MSI versioning scheme - https://msdn.microsoft.com/en-us/library/windows/desktop/aa370859(v=vs.85).aspx
|
||||
// MSI versions are 3 part
|
||||
// major.minor.build
|
||||
// Size(bits) of each part 8 8 16
|
||||
// So we have 32 bits to encode the CLI version
|
||||
// Starting with most significant bit this how the CLI version is going to be encoded as MSI Version
|
||||
// CLI major -> 6 bits
|
||||
// CLI minor -> 6 bits
|
||||
// CLI patch -> 6 bits
|
||||
// CLI commitcount -> 14 bits
|
||||
|
||||
var major = Major << 26;
|
||||
var minor = Minor << 20;
|
||||
var patch = Patch << 14;
|
||||
var msiVersionNumber = major | minor | patch | CommitCount;
|
||||
|
||||
var msiMajor = (msiVersionNumber >> 24) & 0xFF;
|
||||
var msiMinor = (msiVersionNumber >> 16) & 0xFF;
|
||||
var msiBuild = msiVersionNumber & 0xFFFF;
|
||||
|
||||
return $"{msiMajor}.{msiMinor}.{msiBuild}";
|
||||
}
|
||||
}
|
||||
}
|
38
scripts/dotnet-cli-build/Utils/Dirs.cs
Normal file
38
scripts/dotnet-cli-build/Utils/Dirs.cs
Normal file
|
@ -0,0 +1,38 @@
|
|||
using Microsoft.Extensions.PlatformAbstractions;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build
|
||||
{
|
||||
public static class Dirs
|
||||
{
|
||||
public static readonly string Output = Path.Combine(
|
||||
Directory.GetCurrentDirectory(),
|
||||
"artifacts",
|
||||
PlatformServices.Default.Runtime.GetRuntimeIdentifier());
|
||||
public static readonly string Packages = Path.Combine(Output, "packages");
|
||||
public static readonly string Stage1 = Path.Combine(Output, "stage1");
|
||||
public static readonly string Stage1Compilation = Path.Combine(Output, "stage1compilation");
|
||||
public static readonly string Stage2 = Path.Combine(Output, "stage2");
|
||||
public static readonly string Stage2Compilation = Path.Combine(Output, "stage2compilation");
|
||||
public static readonly string Corehost = Path.Combine(Output, "corehost");
|
||||
public static readonly string TestOutput = Path.Combine(Output, "tests");
|
||||
public static readonly string TestPackages = Path.Combine(TestOutput, "packages");
|
||||
|
||||
public static readonly string OSXReferenceAssembliesPath = "/Library/Frameworks/Mono.framework/Versions/Current/lib/mono/xbuild-frameworks";
|
||||
public static readonly string UsrLocalReferenceAssembliesPath = "/usr/local/lib/mono/xbuild-frameworks";
|
||||
public static readonly string UsrReferenceAssembliesPath = "/usr/lib/mono/xbuild-frameworks";
|
||||
|
||||
public static string NuGetPackages = Environment.GetEnvironmentVariable("NUGET_PACKAGES") ?? GetNuGetPackagesDir();
|
||||
|
||||
private static string GetNuGetPackagesDir()
|
||||
{
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
return Path.Combine(Environment.GetEnvironmentVariable("USERPROFILE"), ".nuget", "packages");
|
||||
}
|
||||
return Path.Combine(Environment.GetEnvironmentVariable("HOME"), ".nuget", "packages");
|
||||
}
|
||||
}
|
||||
}
|
51
scripts/dotnet-cli-build/Utils/DotNetCli.cs
Normal file
51
scripts/dotnet-cli-build/Utils/DotNetCli.cs
Normal file
|
@ -0,0 +1,51 @@
|
|||
using System.IO;
|
||||
using System.Linq;
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using Microsoft.DotNet.Cli.Build.Framework;
|
||||
using Microsoft.Extensions.PlatformAbstractions;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build
|
||||
{
|
||||
internal class DotNetCli
|
||||
{
|
||||
public static readonly DotNetCli Stage0 = new DotNetCli(GetStage0Path());
|
||||
public static readonly DotNetCli Stage1 = new DotNetCli(Path.Combine(Dirs.Stage1, "bin"));
|
||||
public static readonly DotNetCli Stage2 = new DotNetCli(Path.Combine(Dirs.Stage2, "bin"));
|
||||
|
||||
public string BinPath { get; }
|
||||
|
||||
public DotNetCli(string binPath)
|
||||
{
|
||||
BinPath = binPath;
|
||||
}
|
||||
|
||||
public void SetDotNetHome()
|
||||
{
|
||||
Environment.SetEnvironmentVariable("DOTNET_HOME", Path.GetDirectoryName(BinPath));
|
||||
}
|
||||
|
||||
public Command Exec(string command, params string[] args)
|
||||
{
|
||||
return Command.Create(Path.Combine(BinPath, $"dotnet{Constants.ExeSuffix}"), Enumerable.Concat(new[] { command }, args));
|
||||
}
|
||||
|
||||
public Command Restore(params string[] args) => Exec("restore", args);
|
||||
public Command Build(params string[] args) => Exec("build", args);
|
||||
public Command Pack(params string[] args) => Exec("pack", args);
|
||||
public Command Test(params string[] args) => Exec("test", args);
|
||||
public Command Publish(params string[] args) => Exec("publish", args);
|
||||
|
||||
private static string GetStage0Path()
|
||||
{
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
return Path.Combine(Directory.GetCurrentDirectory(), ".dotnet_stage0", PlatformServices.Default.Runtime.OperatingSystemPlatform.ToString(), "cli", "bin");
|
||||
}
|
||||
else
|
||||
{
|
||||
return Path.Combine(Directory.GetCurrentDirectory(), ".dotnet_stage0", PlatformServices.Default.Runtime.OperatingSystemPlatform.ToString(), "share", "dotnet", "cli", "bin");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
114
scripts/dotnet-cli-build/Utils/FS.cs
Normal file
114
scripts/dotnet-cli-build/Utils/FS.cs
Normal file
|
@ -0,0 +1,114 @@
|
|||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System;
|
||||
|
||||
using Microsoft.DotNet.Cli.Build.Framework;
|
||||
|
||||
using static Microsoft.DotNet.Cli.Build.Framework.BuildHelpers;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build
|
||||
{
|
||||
public static class FS
|
||||
{
|
||||
public static void Mkdirp(string dir)
|
||||
{
|
||||
if (!Directory.Exists(dir))
|
||||
{
|
||||
Directory.CreateDirectory(dir);
|
||||
}
|
||||
}
|
||||
|
||||
public static void Rm(string file)
|
||||
{
|
||||
if(File.Exists(file))
|
||||
{
|
||||
File.Delete(file);
|
||||
}
|
||||
}
|
||||
|
||||
public static void Rmdir(string dir)
|
||||
{
|
||||
if(Directory.Exists(dir))
|
||||
{
|
||||
Directory.Delete(dir, recursive: true);
|
||||
}
|
||||
}
|
||||
|
||||
public static void Chmod(string file, string mode, bool recursive = false)
|
||||
{
|
||||
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
if (recursive)
|
||||
{
|
||||
Command.Create("chmod", "-R", mode, file).Execute().EnsureSuccessful();
|
||||
}
|
||||
else
|
||||
{
|
||||
Command.Create("chmod", mode, file).Execute().EnsureSuccessful();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void ChmodAll(string searchDir, string pattern, string mode)
|
||||
{
|
||||
Exec("find", searchDir, "-type", "f", "-name", pattern, "-exec", "chmod", mode, "{}", ";");
|
||||
}
|
||||
|
||||
public static void FixModeFlags(string dir)
|
||||
{
|
||||
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
// Managed code doesn't need 'x'
|
||||
ChmodAll(dir, "*.dll", "644");
|
||||
ChmodAll(dir, "*.exe", "644");
|
||||
|
||||
// Generally, dylibs and sos have 'x' (no idea if it's required ;))
|
||||
// (No need to condition this on OS since there shouldn't be any dylibs on Linux,
|
||||
// but even if they are we may as well set their mode flags :))
|
||||
ChmodAll(dir, "*.dylib", "755");
|
||||
ChmodAll(dir, "*.so", "755");
|
||||
|
||||
// Executables (those without dots) are executable :)
|
||||
Exec("find", dir, "-type", "f", "!", "-name", "*.*", "-exec", "chmod", "755", "{}", ";");
|
||||
}
|
||||
}
|
||||
|
||||
public static void CopyRecursive(string sourceDirectory, string destinationDirectory, bool overwrite = false)
|
||||
{
|
||||
Mkdirp(destinationDirectory);
|
||||
|
||||
foreach(var dir in Directory.EnumerateDirectories(sourceDirectory))
|
||||
{
|
||||
CopyRecursive(dir, Path.Combine(destinationDirectory, Path.GetFileName(dir)), overwrite);
|
||||
}
|
||||
|
||||
foreach(var file in Directory.EnumerateFiles(sourceDirectory))
|
||||
{
|
||||
var dest = Path.Combine(destinationDirectory, Path.GetFileName(file));
|
||||
if (!File.Exists(dest) || overwrite)
|
||||
{
|
||||
// We say overwrite true, because we only get here if the file didn't exist (thus it doesn't matter) or we
|
||||
// wanted to overwrite :)
|
||||
File.Copy(file, dest, overwrite: true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void CleanBinObj(BuildTargetContext c, string dir)
|
||||
{
|
||||
dir = dir ?? c.BuildContext.BuildDirectory;
|
||||
foreach(var candidate in Directory.EnumerateDirectories(dir))
|
||||
{
|
||||
if (string.Equals(Path.GetFileName(candidate), "bin") ||
|
||||
string.Equals(Path.GetFileName(candidate), "obj"))
|
||||
{
|
||||
Directory.Delete(candidate, recursive: true);
|
||||
}
|
||||
else
|
||||
{
|
||||
CleanBinObj(c, candidate);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
38
scripts/dotnet-cli-build/Utils/Utils.cs
Normal file
38
scripts/dotnet-cli-build/Utils/Utils.cs
Normal file
|
@ -0,0 +1,38 @@
|
|||
using System;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Build
|
||||
{
|
||||
public static class Utils
|
||||
{
|
||||
public static void CleanNuGetTempCache()
|
||||
{
|
||||
// Clean NuGet Temp Cache on Linux (seeing some issues on Linux)
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) && Directory.Exists("/tmp/NuGet"))
|
||||
{
|
||||
Directory.Delete("/tmp/NuGet", recursive: true);
|
||||
}
|
||||
}
|
||||
|
||||
public static string GetOSName()
|
||||
{
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
return "win";
|
||||
}
|
||||
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
|
||||
{
|
||||
return "osx";
|
||||
}
|
||||
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new PlatformNotSupportedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
18
scripts/dotnet-cli-build/dotnet-cli-build.xproj
Normal file
18
scripts/dotnet-cli-build/dotnet-cli-build.xproj
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
|
||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>d7b9695d-23eb-4ea8-b8ab-707a0092e1d5</ProjectGuid>
|
||||
<RootNamespace>Microsoft.DotNet.Cli.Build</RootNamespace>
|
||||
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">..\..\artifacts\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
|
||||
<OutputPath Condition="'$(OutputPath)'=='' ">..\..\artifacts\bin\$(MSBuildProjectName)\</OutputPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||
</Project>
|
18
scripts/dotnet-cli-build/project.json
Executable file
18
scripts/dotnet-cli-build/project.json
Executable file
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"version": "1.0.0-*",
|
||||
"description": "Build scripts for dotnet-cli",
|
||||
"compilationOptions": {
|
||||
"emitEntryPoint": true
|
||||
},
|
||||
|
||||
"dependencies": {
|
||||
"NETStandard.Library": "1.0.0-rc2-23811",
|
||||
"System.IO.Compression.ZipFile": "4.0.1-rc2-23811",
|
||||
"Microsoft.Extensions.PlatformAbstractions": "1.0.0-rc2-16537",
|
||||
"Microsoft.DotNet.Cli.Build.Framework": "1.0.0-*"
|
||||
},
|
||||
|
||||
"frameworks": {
|
||||
"dnxcore50": { }
|
||||
}
|
||||
}
|
3
scripts/global.json
Normal file
3
scripts/global.json
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"projects": [ "." ]
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
. $PSScriptRoot\..\common\_common.ps1
|
||||
|
||||
# Use a repo-local install directory (but not the artifacts directory because that gets cleaned a lot
|
||||
if (!(Test-Path $env:DOTNET_INSTALL_DIR))
|
||||
{
|
||||
mkdir $env:DOTNET_INSTALL_DIR | Out-Null
|
||||
}
|
||||
|
||||
# Install a stage 0
|
||||
header "Installing dotnet stage 0"
|
||||
_ "$RepoRoot\scripts\obtain\install.ps1" @("$env:Channel")
|
|
@ -1,24 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
source "$DIR/../common/_common.sh"
|
||||
|
||||
# Use a repo-local install directory (but not the artifacts directory because that gets cleaned a lot
|
||||
[ -d $DOTNET_INSTALL_DIR ] || mkdir -p $DOTNET_INSTALL_DIR
|
||||
|
||||
# Ensure the latest stage0 is installed
|
||||
header "Installing dotnet stage 0"
|
||||
$REPOROOT/scripts/obtain/install.sh
|
|
@ -33,6 +33,6 @@ header "Packaging $PACKAGE_SHORT_NAME"
|
|||
# We need both "*" and ".version" to ensure we pick up that file
|
||||
tar -czf $PACKAGE_NAME * .version
|
||||
|
||||
info "Packaged stage2 to $PACKAGE_NAME"
|
||||
info "Packaged stage2 from '$STAGE2_DIR' to '$PACKAGE_NAME'"
|
||||
|
||||
$REPOROOT/scripts/publish/publish.sh $PACKAGE_NAME
|
||||
|
|
|
@ -4,7 +4,8 @@
|
|||
#
|
||||
|
||||
. "$PSScriptRoot\..\common\_common.ps1"
|
||||
. "$RepoRoot\scripts\build\generate-version.ps1"
|
||||
|
||||
$RepoRoot = Convert-Path "$PSScriptRoot\..\.."
|
||||
|
||||
header "Generating zip package"
|
||||
_ "$RepoRoot\scripts\package\package-zip.ps1"
|
||||
|
|
|
@ -12,8 +12,9 @@ while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symli
|
|||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
export REPOROOT="$(cd -P "$DIR/../.." && pwd)"
|
||||
|
||||
source "$DIR/../common/_common.sh"
|
||||
source "$REPOROOT/scripts/build/generate-version.sh"
|
||||
|
||||
if [ -z "$DOTNET_CLI_VERSION" ]; then
|
||||
TIMESTAMP=$(date "+%Y%m%d%H%M%S")
|
||||
|
@ -33,5 +34,5 @@ header "Generating version badge"
|
|||
sed "s/ver_number/$DOTNET_CLI_VERSION/g" $VERSION_BADGE > $BADGE_DESTINATION
|
||||
|
||||
header "Publishing version badge"
|
||||
$REPOROOT/scripts/publish/publish.sh $BADGE_DESTINATION
|
||||
$DIR/../publish/publish.sh $BADGE_DESTINATION
|
||||
|
||||
|
|
55
scripts/run-build.ps1
Normal file
55
scripts/run-build.ps1
Normal file
|
@ -0,0 +1,55 @@
|
|||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
param(
|
||||
[string]$Configuration="Debug")
|
||||
|
||||
$env:CONFIGURATION = $Configuration;
|
||||
|
||||
# Load Branch Info
|
||||
cat "$PSScriptRoot\..\branchinfo.txt" | ForEach-Object {
|
||||
if(!$_.StartsWith("#") -and ![String]::IsNullOrWhiteSpace($_)) {
|
||||
$splat = $_.Split([char[]]@("="), 2)
|
||||
Set-Content "env:\$($splat[0])" -Value $splat[1]
|
||||
}
|
||||
}
|
||||
|
||||
$env:CHANNEL=$env:RELEASE_SUFFIX
|
||||
|
||||
# Use a repo-local install directory (but not the artifacts directory because that gets cleaned a lot
|
||||
if (!$env:DOTNET_INSTALL_DIR)
|
||||
{
|
||||
$env:DOTNET_INSTALL_DIR="$PSScriptRoot\..\.dotnet_stage0\Windows"
|
||||
}
|
||||
|
||||
if (!(Test-Path $env:DOTNET_INSTALL_DIR))
|
||||
{
|
||||
mkdir $env:DOTNET_INSTALL_DIR | Out-Null
|
||||
}
|
||||
|
||||
# Install a stage 0
|
||||
Write-Host "Installing .NET Core CLI Stage 0 from beta channel"
|
||||
& "$PSScriptRoot\obtain\install.ps1" -Channel $env:CHANNEL
|
||||
|
||||
# Put the stage0 on the path
|
||||
$env:PATH = "$env:DOTNET_INSTALL_DIR\cli\bin;$env:PATH"
|
||||
|
||||
# Restore the build scripts
|
||||
Write-Host "Restoring Build Script projects..."
|
||||
pushd $PSScriptRoot
|
||||
dotnet restore
|
||||
if($LASTEXITCODE -ne 0) { throw "Failed to restore" }
|
||||
popd
|
||||
|
||||
# Publish the builder
|
||||
Write-Host "Compiling Build Scripts..."
|
||||
dotnet publish "$PSScriptRoot\dotnet-cli-build" -o "$PSScriptRoot/dotnet-cli-build/bin" --framework dnxcore50
|
||||
if($LASTEXITCODE -ne 0) { throw "Failed to compile build scripts" }
|
||||
|
||||
# Run the builder
|
||||
Write-Host "Invoking Build Scripts..."
|
||||
$env:DOTNET_HOME="$env:DOTNET_INSTALL_DIR\cli"
|
||||
& "$PSScriptRoot\dotnet-cli-build\bin\dotnet-cli-build.exe" @args
|
||||
if($LASTEXITCODE -ne 0) { throw "Build failed" }
|
80
scripts/run-build.sh
Executable file
80
scripts/run-build.sh
Executable file
|
@ -0,0 +1,80 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
# Set up the environment to be used for building with clang.
|
||||
if which "clang-3.5" > /dev/null 2>&1; then
|
||||
export CC="$(which clang-3.5)"
|
||||
export CXX="$(which clang++-3.5)"
|
||||
elif which "clang-3.6" > /dev/null 2>&1; then
|
||||
export CC="$(which clang-3.6)"
|
||||
export CXX="$(which clang++-3.6)"
|
||||
elif which clang > /dev/null 2>&1; then
|
||||
export CC="$(which clang)"
|
||||
export CXX="$(which clang++)"
|
||||
else
|
||||
error "Unable to find Clang Compiler"
|
||||
error "Install clang-3.5 or clang3.6"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Load Branch Info
|
||||
while read line; do
|
||||
if [[ $line != \#* ]]; then
|
||||
IFS='=' read -ra splat <<< "$line"
|
||||
export ${splat[0]}="${splat[1]}"
|
||||
fi
|
||||
done < "$DIR/../branchinfo.txt"
|
||||
|
||||
# Use a repo-local install directory (but not the artifacts directory because that gets cleaned a lot
|
||||
[ -z "$DOTNET_INSTALL_DIR" ] && export DOTNET_INSTALL_DIR=$DIR/../.dotnet_stage0/$(uname)
|
||||
[ -d $DOTNET_INSTALL_DIR ] || mkdir -p $DOTNET_INSTALL_DIR
|
||||
|
||||
# Ensure the latest stage0 is installed
|
||||
$DIR/obtain/install.sh --channel $RELEASE_SUFFIX
|
||||
|
||||
# Put stage 0 on the PATH (for this shell only)
|
||||
PATH="$DOTNET_INSTALL_DIR/bin:$PATH"
|
||||
|
||||
# Increases the file descriptors limit for this bash. It prevents an issue we were hitting during restore
|
||||
FILE_DESCRIPTOR_LIMIT=$( ulimit -n )
|
||||
if [ $FILE_DESCRIPTOR_LIMIT -lt 1024 ]
|
||||
then
|
||||
echo "Increasing file description limit to 1024"
|
||||
ulimit -n 1024
|
||||
fi
|
||||
|
||||
# Restore the build scripts
|
||||
echo "Restoring Build Script projects..."
|
||||
(
|
||||
cd $DIR
|
||||
dotnet restore
|
||||
)
|
||||
|
||||
# Build the builder
|
||||
echo "Compiling Build Scripts..."
|
||||
dotnet publish "$DIR/dotnet-cli-build" -o "$DIR/dotnet-cli-build/bin" --framework dnxcore50
|
||||
|
||||
# Run the builder
|
||||
echo "Invoking Build Scripts..."
|
||||
|
||||
if [ -f "$DIR/dotnet-cli-build/bin/dotnet-cli-build" ]; then
|
||||
DOTNET_HOME="$DOTNET_INSTALL_DIR/share/dotnet/cli" $DIR/dotnet-cli-build/bin/dotnet-cli-build "$@"
|
||||
exit $?
|
||||
else
|
||||
# We're on an older CLI. This is temporary while Ubuntu and CentOS VSO builds are stalled.
|
||||
DOTNET_HOME="$DOTNET_INSTALL_DIR/share/dotnet/cli" $DIR/dotnet-cli-build/bin/Debug/dnxcore50/dotnet-cli-build "$@"
|
||||
exit $?
|
||||
fi
|
|
@ -1,17 +0,0 @@
|
|||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
. "$PSScriptRoot\..\common\_common.ps1"
|
||||
|
||||
# Publish each test project
|
||||
loadTestProjectList | foreach {
|
||||
#we should use publish to an output path, we will once issue #1183 has been fixed and we can point dotnet test do a dll.
|
||||
#we need to add back tfm, rid and configuration, but dotnet test need to be made aware of those as well. Tracked at issue #1237.
|
||||
dotnet build "$RepoRoot\test\$($_.ProjectName)"
|
||||
if (!$?) {
|
||||
Write-Host Command failed: dotnet build "$RepoRoot\test\$($_.ProjectName)"
|
||||
exit 1
|
||||
}
|
||||
}
|
|
@ -1,27 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
source "$DIR/../common/_common.sh"
|
||||
|
||||
PROJECTS=$(loadTestProjectList)
|
||||
|
||||
for project in $PROJECTS
|
||||
do
|
||||
#we should use publish to an output path, we will once issue #1183 has been fixed and we can point dotnet test do a dll.
|
||||
dotnet build "$REPOROOT/test/$project"
|
||||
done
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
if (!(Get-Command -ErrorAction SilentlyContinue cmake)) {
|
||||
throw @"
|
||||
cmake is required to build the native host 'corehost'
|
||||
Download it from https://www.cmake.org
|
||||
"@
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
source "$DIR/../common/_common.sh"
|
||||
|
||||
if ! type -p cmake >/dev/null; then
|
||||
error "cmake is required to build the native host 'corehost'"
|
||||
error "OS X w/Homebrew: 'brew install cmake'"
|
||||
error "Ubuntu: 'sudo apt-get install cmake'"
|
||||
exit 1
|
||||
fi
|
|
@ -1,34 +0,0 @@
|
|||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
. "$PSScriptRoot\..\common\_common.ps1"
|
||||
|
||||
#compile apps
|
||||
dir "$RepoRoot\test\PackagedCommands\Consumers" | where {$_.PsIsContainer} | where {$_.Name.Contains("Direct")} |
|
||||
foreach {
|
||||
pushd "$RepoRoot\test\PackagedCommands\Consumers\$_"
|
||||
dotnet build
|
||||
popd
|
||||
}
|
||||
|
||||
#run test
|
||||
dir "$RepoRoot\test\PackagedCommands\Consumers" | where {$_.PsIsContainer} | where {$_.Name.Contains("AppWith")} |
|
||||
foreach {
|
||||
$testName = "test\PackagedCommands\Consumers\$_"
|
||||
pushd "$RepoRoot\$testName"
|
||||
$outputArray = dotnet hello | Out-String
|
||||
$output = [string]::Join('\n', $outputArray).Trim("`r", "`n")
|
||||
|
||||
if ($output -ne "hello") {
|
||||
error "Test Failed: $testName\dotnet hello"
|
||||
error " printed $output"
|
||||
Exit 1
|
||||
}
|
||||
|
||||
info "Test passed: $testName"
|
||||
popd
|
||||
}
|
||||
|
||||
Exit 0
|
|
@ -1,48 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
source "$DIR/../common/_common.sh"
|
||||
|
||||
#compile tests with direct dependencies
|
||||
for test in $(ls -l "$REPOROOT/test/PackagedCommands/Consumers" | grep ^d | awk '{print $9}' | grep "Direct")
|
||||
do
|
||||
pushd "$REPOROOT/test/PackagedCommands/Consumers/$test"
|
||||
dotnet build
|
||||
popd
|
||||
done
|
||||
|
||||
#run test
|
||||
for test in $(ls -l "$REPOROOT/test/PackagedCommands/Consumers" | grep ^d | awk '{print $9}' | grep "AppWith")
|
||||
do
|
||||
testName="test/PackagedCommands/Consumers/$test"
|
||||
|
||||
pushd "$REPOROOT/$testName"
|
||||
|
||||
output=$(dotnet hello)
|
||||
|
||||
|
||||
if [ "$output" == "Hello" ] ;
|
||||
then
|
||||
echo "Test Passed: $testName"
|
||||
else
|
||||
error "Test Failed: $testName/dotnet hello"
|
||||
error " printed $output"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
popd
|
||||
done
|
|
@ -1,11 +0,0 @@
|
|||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
. $PSScriptRoot\..\common\_common.ps1
|
||||
|
||||
info "Restoring Test Projects"
|
||||
|
||||
# Restore packages
|
||||
& dotnet restore "$RepoRoot\test" -f "$TestPackageDir"
|
|
@ -1,67 +0,0 @@
|
|||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
. "$PSScriptRoot\..\common\_common.ps1"
|
||||
|
||||
$TestBinRoot = "$RepoRoot\artifacts\tests"
|
||||
|
||||
$TestProjects = loadTestProjectList
|
||||
$TestScripts = loadTestScriptList
|
||||
|
||||
$failCount = 0
|
||||
$failingTests = @()
|
||||
|
||||
## Temporary Workaround for Native Compilation
|
||||
## Need x64 Native Tools Dev Prompt Env Vars
|
||||
## Tracked Here: https://github.com/dotnet/cli/issues/301
|
||||
pushd "$env:VS140COMNTOOLS\..\..\VC"
|
||||
cmd /c "vcvarsall.bat x64&set" |
|
||||
foreach {
|
||||
if ($_ -match "=") {
|
||||
$v = $_.split("=", 2); set-item -force -literalpath "ENV:\$($v[0])" -value "$($v[1])"
|
||||
}
|
||||
}
|
||||
popd
|
||||
|
||||
# copy TestProjects to $TestBinRoot
|
||||
mkdir -Force "$TestBinRoot\TestProjects"
|
||||
cp -rec -Force "$RepoRoot\TestAssets\TestProjects\*" "$TestBinRoot\TestProjects"
|
||||
|
||||
# Run each test project
|
||||
$TestProjects | foreach {
|
||||
# This is a workaroudn for issue #1184, where dotnet test needs to be executed from the folder containing the project.json.
|
||||
pushd "$RepoRoot\test\$($_.ProjectName)"
|
||||
dotnet test -xml "$TestBinRoot\$($_.ProjectName)-testResults.xml" -notrait category=failing
|
||||
popd
|
||||
|
||||
$exitCode = $LastExitCode
|
||||
if ($exitCode -ne 0) {
|
||||
$failingTests += "$($_.ProjectName)"
|
||||
}
|
||||
|
||||
$failCount += $exitCode
|
||||
}
|
||||
|
||||
$TestScripts | foreach {
|
||||
$scriptName = "$($_.ProjectName).ps1"
|
||||
|
||||
& "$RepoRoot\scripts\test\$scriptName"
|
||||
$exitCode = $LastExitCode
|
||||
if ($exitCode -ne 0) {
|
||||
$failingTests += "$scriptName"
|
||||
$failCount += 1
|
||||
}
|
||||
}
|
||||
|
||||
if ($failCount -ne 0) {
|
||||
Write-Host -ForegroundColor Red "The following tests failed."
|
||||
$failingTests | foreach {
|
||||
Write-Host -ForegroundColor Red "$_.dll failed. Logs in '$TestBinRoot\$_-testResults.xml'"
|
||||
}
|
||||
} else {
|
||||
Write-Host -ForegroundColor Green "All the tests passed!"
|
||||
}
|
||||
|
||||
Exit $failCount
|
|
@ -1,67 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
source "$DIR/../common/_common.sh"
|
||||
|
||||
TestProjects=$(loadTestProjectList)
|
||||
TestScripts=$(loadTestScriptList)
|
||||
|
||||
failedTests=()
|
||||
failCount=0
|
||||
|
||||
# Copy TestProjects to $TEST_BIN_ROOT
|
||||
mkdir -p "$TEST_BIN_ROOT/TestProjects"
|
||||
cp -a $REPOROOT/TestAssets/TestProjects/* $TEST_BIN_ROOT/TestProjects
|
||||
|
||||
pushd "$TEST_BIN_ROOT"
|
||||
set +e
|
||||
|
||||
for project in $TestProjects
|
||||
do
|
||||
# This is a workaroudn for issue #1184, where dotnet test needs to be executed from the folder containing the project.json.
|
||||
pushd "$REPOROOT/test/$project"
|
||||
dotnet test -xml "$TEST_BIN_ROOT/${project}-testResults.xml" -notrait category=failing
|
||||
popd
|
||||
|
||||
exitCode=$?
|
||||
failCount+=$exitCode
|
||||
if [ $exitCode -ne 0 ]; then
|
||||
failedTests+=("${project}.dll")
|
||||
fi
|
||||
done
|
||||
|
||||
popd
|
||||
|
||||
for script in $TestScripts
|
||||
do
|
||||
scriptName=${script}.sh
|
||||
|
||||
"$REPOROOT/scripts/test/${scriptName}"
|
||||
exitCode=$?
|
||||
if [ $exitCode -ne 0 ]; then
|
||||
failedTests+=("$scriptName")
|
||||
failCount+=1
|
||||
fi
|
||||
done
|
||||
|
||||
for test in ${failedTests[@]}
|
||||
do
|
||||
error "$test failed. Logs in '$TEST_BIN_ROOT/${test}-testResults.xml'"
|
||||
done
|
||||
|
||||
set -e
|
||||
|
||||
exit $failCount
|
|
@ -1,17 +0,0 @@
|
|||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
. "$PSScriptRoot\..\..\common\_common.ps1"
|
||||
|
||||
mkdir -Force $TestPackageDir
|
||||
|
||||
loadTestPackageList | foreach {
|
||||
dotnet pack "$RepoRoot\TestAssets\TestPackages\$($_.ProjectName)" --output "$TestPackageDir"
|
||||
|
||||
if (!$?) {
|
||||
error "Command failed: dotnet pack"
|
||||
Exit 1
|
||||
}
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
". $PSScriptRoot\..\..\common\_common.ps1"
|
||||
|
||||
header "Restoring TestAssets"
|
||||
& dotnet restore "$RepoRoot\TestAssets" --quiet --runtime "$Rid"
|
||||
|
||||
$oldErrorAction=$ErrorActionPreference
|
||||
$ErrorActionPreference="SilentlyContinue"
|
||||
& dotnet restore "$RepoRoot\testapp" "$Rid" 2>&1 | Out-Null
|
||||
$ErrorActionPreference=$oldErrorAction
|
|
@ -1,24 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
source "$DIR/../../common/_common.sh"
|
||||
|
||||
header "Restoring TestAssets"
|
||||
dotnet restore "$REPOROOT/TestAssets" --runtime $RID --quiet $DISABLE_PARALLEL
|
||||
|
||||
set +e
|
||||
dotnet restore "$REPOROOT/testapp" --runtime $RID $DISABLE_PARALLEL >/dev/null 2>&1
|
||||
set -e
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue