diff --git a/DEVGUIDE.md b/DEVGUIDE.md
index 1ee9c227d..e944b0731 100644
--- a/DEVGUIDE.md
+++ b/DEVGUIDE.md
@@ -52,6 +52,10 @@ After you build the first time you can open and use this solution:
If you are just developing the core compiler and library then building ``FSharp.sln`` will be enough.
+If you do not have Visual Studio installed and want to simply build the compiler as a .NET Core application, use this:
+
+ Build.cmd -noVisualStudio
+
### Developing the F# Compiler (Linux/macOS)
For Linux/Mac:
diff --git a/eng/Build.ps1 b/eng/Build.ps1
index 54e6ff5e2..f329cba02 100644
--- a/eng/Build.ps1
+++ b/eng/Build.ps1
@@ -53,6 +53,7 @@ param (
[switch]$testVs,
[switch]$testAll,
[string]$officialSkipTests = "false",
+ [switch]$noVisualStudio,
[parameter(ValueFromRemainingArguments=$true)][string[]]$properties)
@@ -96,6 +97,7 @@ function Print-Usage() {
Write-Host " -procdump Monitor test runs with procdump"
Write-Host " -prepareMachine Prepare machine for CI run, clean up processes after build"
Write-Host " -useGlobalNuGetCache Use global NuGet cache."
+ Write-Host " -noVisualStudio Only build fsc and fsi as .NET Core applications. No Visual Studio required. '-configuration', '-verbosity', '-norestore', '-rebuild' are supported."
Write-Host ""
Write-Host "Command line arguments starting with '/p:' are passed through to MSBuild."
}
@@ -145,8 +147,19 @@ function Process-Arguments() {
}
function Update-Arguments() {
- if (-Not (Test-Path "$ArtifactsDir\Bootstrap\fsc\fsc.exe")) {
- $script:bootstrap = $True
+ if ($script:noVisualStudio) {
+ $script:bootstrapTfm = "netcoreapp2.1"
+ $script:msbuildEngine = "dotnet"
+ }
+
+ if ($bootstrapTfm -eq "netcoreapp2.1") {
+ if (-Not (Test-Path "$ArtifactsDir\Bootstrap\fsc\fsc.runtimeconfig.json")) {
+ $script:bootstrap = $True
+ }
+ } else {
+ if (-Not (Test-Path "$ArtifactsDir\Bootstrap\fsc\fsc.exe") -or (Test-Path "$ArtifactsDir\Bootstrap\fsc\fsc.runtimeconfig.json")) {
+ $script:bootstrap = $True
+ }
}
}
@@ -227,10 +240,37 @@ function TestUsingNUnit([string] $testProject, [string] $targetFramework) {
$projectName = [System.IO.Path]::GetFileNameWithoutExtension($testProject)
$testLogPath = "$ArtifactsDir\TestResults\$configuration\${projectName}_$targetFramework.xml"
$testBinLogPath = "$LogDir\${projectName}_$targetFramework.binlog"
- $args = "test $testProject --no-restore --no-build -c $configuration -f $targetFramework -v n --test-adapter-path . --logger ""nunit;LogFilePath=$testLogPath"" /bl:$testBinLogPath"
+ $args = "test $testProject -c $configuration -f $targetFramework -v n --test-adapter-path . --logger ""nunit;LogFilePath=$testLogPath"" /bl:$testBinLogPath"
+
+ if (-not $noVisualStudio -or $norestore) {
+ $args += " --no-restore"
+ }
+
+ if (-not $noVisualStudio) {
+ $args += " --no-build"
+ }
+
Exec-Console $dotnetExe $args
}
+function BuildCompiler() {
+ if ($bootstrapTfm -eq "netcoreapp2.1") {
+ $dotnetPath = InitializeDotNetCli
+ $dotnetExe = Join-Path $dotnetPath "dotnet.exe"
+ $fscProject = "$RepoRoot\src\fsharp\fsc\fsc.fsproj"
+ $fsiProject = "$RepoRoot\src\fsharp\fsi\fsi.fsproj"
+
+ $argNoRestore = if ($norestore) { " --no-restore" } else { "" }
+ $argNoIncremental = if ($rebuild) { " --no-incremental" } else { "" }
+
+ $args = "build $fscProject -c $configuration -v $verbosity -f netcoreapp2.1" + $argNoRestore + $argNoIncremental
+ Exec-Console $dotnetExe $args
+
+ $args = "build $fsiProject -c $configuration -v $verbosity -f netcoreapp2.1" + $argNoRestore + $argNoIncremental
+ Exec-Console $dotnetExe $args
+ }
+}
+
function Prepare-TempDir() {
Copy-Item (Join-Path $RepoRoot "tests\Resources\Directory.Build.props") $TempDir
Copy-Item (Join-Path $RepoRoot "tests\Resources\Directory.Build.targets") $TempDir
@@ -259,7 +299,11 @@ try {
}
if ($restore -or $build -or $rebuild -or $pack -or $sign -or $publish) {
- BuildSolution
+ if ($noVisualStudio) {
+ BuildCompiler
+ } else {
+ BuildSolution
+ }
}
if ($build) {
@@ -269,7 +313,7 @@ try {
$desktopTargetFramework = "net472"
$coreclrTargetFramework = "netcoreapp2.1"
- if ($testDesktop) {
+ if ($testDesktop -and -not $noVisualStudio) {
TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Compiler.UnitTests\FSharp.Compiler.UnitTests.fsproj" -targetFramework $desktopTargetFramework
TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Compiler.LanguageServer.UnitTests\FSharp.Compiler.LanguageServer.UnitTests.fsproj" -targetFramework $desktopTargetFramework
TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Build.UnitTests\FSharp.Build.UnitTests.fsproj" -targetFramework $desktopTargetFramework
@@ -285,7 +329,7 @@ try {
TestUsingNUnit -testProject "$RepoRoot\tests\fsharp\FSharpSuite.Tests.fsproj" -targetFramework $coreclrTargetFramework
}
- if ($testFSharpQA) {
+ if ($testFSharpQA -and -not $noVisualStudio) {
Push-Location "$RepoRoot\tests\fsharpqa\source"
$resultsRoot = "$ArtifactsDir\TestResults\$configuration"
$resultsLog = "test-net40-fsharpqa-results.log"
@@ -304,21 +348,27 @@ try {
}
if ($testFSharpCore) {
- TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj" -targetFramework $desktopTargetFramework
+ if (-not $noVisualStudio) {
+ TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj" -targetFramework $desktopTargetFramework
+ }
TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj" -targetFramework $coreclrTargetFramework
}
if ($testCompiler) {
- TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Compiler.UnitTests\FSharp.Compiler.UnitTests.fsproj" -targetFramework $desktopTargetFramework
+ if (-not $noVisualStudio) {
+ TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Compiler.UnitTests\FSharp.Compiler.UnitTests.fsproj" -targetFramework $desktopTargetFramework
+ }
TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Compiler.UnitTests\FSharp.Compiler.UnitTests.fsproj" -targetFramework $coreclrTargetFramework
}
if ($testCambridge) {
- TestUsingNUnit -testProject "$RepoRoot\tests\fsharp\FSharpSuite.Tests.fsproj" -targetFramework $desktopTargetFramework
+ if (-not $noVisualStudio) {
+ TestUsingNUnit -testProject "$RepoRoot\tests\fsharp\FSharpSuite.Tests.fsproj" -targetFramework $desktopTargetFramework
+ }
TestUsingNUnit -testProject "$RepoRoot\tests\fsharp\FSharpSuite.Tests.fsproj" -targetFramework $coreclrTargetFramework
}
- if ($testVs) {
+ if ($testVs -and -not $noVisualStudio) {
TestUsingNUnit -testProject "$RepoRoot\vsintegration\tests\GetTypesVS.UnitTests\GetTypesVS.UnitTests.fsproj" -targetFramework $desktopTargetFramework
TestUsingNUnit -testProject "$RepoRoot\vsintegration\tests\UnitTests\VisualFSharp.UnitTests.fsproj" -targetFramework $desktopTargetFramework
}
diff --git a/eng/build-utils.ps1 b/eng/build-utils.ps1
index 335379b2f..fcda1a58e 100644
--- a/eng/build-utils.ps1
+++ b/eng/build-utils.ps1
@@ -230,7 +230,7 @@ function Run-MSBuild([string]$projectFilePath, [string]$buildArgs = "", [string]
# Important to not set $script:bootstrapDir here yet as we're actually in the process of
# building the bootstrap.
function Make-BootstrapBuild() {
- Write-Host "Building bootstrap compiler"
+ Write-Host "Building bootstrap '$bootstrapTfm' compiler"
$dir = Join-Path $ArtifactsDir "Bootstrap"
Remove-Item -re $dir -ErrorAction SilentlyContinue
@@ -243,7 +243,7 @@ function Make-BootstrapBuild() {
# prepare compiler
$projectPath = "$RepoRoot\proto.proj"
- Run-MSBuild $projectPath "/restore /t:Publish" -logFileName "Bootstrap" -configuration $bootstrapConfiguration
+ Run-MSBuild $projectPath "/restore /t:Publish /p:TargetFramework=$bootstrapTfm;ProtoTargetFramework=$bootstrapTfm" -logFileName "Bootstrap" -configuration $bootstrapConfiguration
Copy-Item "$ArtifactsDir\bin\fsc\$bootstrapConfiguration\$bootstrapTfm\publish" -Destination "$dir\fsc" -Force -Recurse
Copy-Item "$ArtifactsDir\bin\fsi\$bootstrapConfiguration\$bootstrapTfm\publish" -Destination "$dir\fsi" -Force -Recurse
diff --git a/proto.proj b/proto.proj
index b0ee28897..23d7525d1 100644
--- a/proto.proj
+++ b/proto.proj
@@ -7,15 +7,12 @@
- TargetFramework=net472
TargetFramework=netcoreapp2.1
- TargetFramework=net472
TargetFramework=netcoreapp2.1
- TargetFramework=net472
TargetFramework=netcoreapp2.1
diff --git a/src/fsharp/FSharp.Build/FSharp.Build.fsproj b/src/fsharp/FSharp.Build/FSharp.Build.fsproj
index 0bf32ed19..e22c87970 100644
--- a/src/fsharp/FSharp.Build/FSharp.Build.fsproj
+++ b/src/fsharp/FSharp.Build/FSharp.Build.fsproj
@@ -4,7 +4,8 @@
Library
- net472;netcoreapp2.1
+ $(ProtoTargetFramework)
+ net472;netcoreapp2.1
netcoreapp2.1
FSharp.Build
$(NoWarn);45;55;62;75;1204
diff --git a/src/fsharp/fsc/fsc.fsproj b/src/fsharp/fsc/fsc.fsproj
index 370664ee6..7bddcb9df 100644
--- a/src/fsharp/fsc/fsc.fsproj
+++ b/src/fsharp/fsc/fsc.fsproj
@@ -4,7 +4,8 @@
Exe
- net472;netcoreapp2.1
+ $(ProtoTargetFramework)
+ net472;netcoreapp2.1
netcoreapp2.1
.exe
$(NoWarn);45;55;62;75;1204
diff --git a/src/fsharp/fsi/fsi.fsproj b/src/fsharp/fsi/fsi.fsproj
index fb55d4d89..5b4978679 100644
--- a/src/fsharp/fsi/fsi.fsproj
+++ b/src/fsharp/fsi/fsi.fsproj
@@ -4,7 +4,8 @@
Exe
- net472;netcoreapp2.1
+ $(ProtoTargetFramework)
+ net472;netcoreapp2.1
netcoreapp2.1
.exe
$(NoWarn);45;55;62;75;1204