Skip to content

Commit 0c95edd

Browse files
vzarytovskiiKevinRansom
authored andcommitted
Netstandard2.0 FSharp.Core in master + netcoreapp3.1 fix for tests (#9870)
* Net Standard 2.0 only FSharp.Core (#9801) * Net standard only FSharp.Core * temp * Cherry-pick of FSharp.Core netstandard + fix for netcoreapp3.1 tests * Fixed netcoreapp30 -> netcoreapp31 test references * Cleaned up projects, added testplatform package, moved some tests to new suite * Tests changes * Revert accidental revert * Added missing tests * Cleaned up packages, fixed tests * Add System.Runtime to references Co-authored-by: Kevin Ransom (msft) <codecutter@hotmail.com>
1 parent ae7f7dd commit 0c95edd

File tree

12 files changed

+117
-59
lines changed

12 files changed

+117
-59
lines changed

eng/Build.ps1

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,8 +505,10 @@ try {
505505

506506
if ($testCompiler) {
507507
if (-not $noVisualStudio) {
508+
TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Compiler.ComponentTests\FSharp.Compiler.ComponentTests.fsproj" -targetFramework $desktopTargetFramework
508509
TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Compiler.UnitTests\FSharp.Compiler.UnitTests.fsproj" -targetFramework $desktopTargetFramework
509510
}
511+
TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Compiler.ComponentTests\FSharp.Compiler.ComponentTests.fsproj" -targetFramework $coreclrTargetFramework
510512
TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Compiler.UnitTests\FSharp.Compiler.UnitTests.fsproj" -targetFramework $coreclrTargetFramework
511513
}
512514

eng/Versions.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@
174174
<MicrosoftCompositionVersion>1.0.30</MicrosoftCompositionVersion>
175175
<MicrosoftMSXMLVersion>8.0.0-alpha</MicrosoftMSXMLVersion>
176176
<MicrosoftNetCompilersVersion>2.7.0</MicrosoftNetCompilersVersion>
177+
<MicrosoftNETCoreAppRefVersion>3.1.0</MicrosoftNETCoreAppRefVersion>
177178
<MicrosoftNETCoreILDAsmVersion>3.0.0-preview-27318-01</MicrosoftNETCoreILDAsmVersion>
178179
<MicrosoftNETCoreILAsmVersion>3.0.0-preview-27318-01</MicrosoftNETCoreILAsmVersion>
179180
<MicrosoftNETTestSdkVersion>16.6.1</MicrosoftNETTestSdkVersion>

fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@
2222
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
2323
<GenerateDocumentationFile>true</GenerateDocumentationFile>
2424
<DebugType>embedded</DebugType>
25+
<MicrosoftBuildOverallPackagesVersion>16.6</MicrosoftBuildOverallPackagesVersion>
26+
<MicrosoftBuildVersion>$(MicrosoftBuildOverallPackagesVersion)</MicrosoftBuildVersion>
27+
<MicrosoftBuildFrameworkVersion>$(MicrosoftBuildOverallPackagesVersion)</MicrosoftBuildFrameworkVersion>
28+
<MicrosoftBuildTasksCoreVersion>$(MicrosoftBuildOverallPackagesVersion)</MicrosoftBuildTasksCoreVersion>
29+
<MicrosoftBuildUtilitiesCoreVersion>$(MicrosoftBuildOverallPackagesVersion)</MicrosoftBuildUtilitiesCoreVersion>
2530
</PropertyGroup>
2631
<PropertyGroup>
2732
<Summary>The F# compiler as library. For editors, for tools, for scripting. For you.</Summary>
@@ -727,6 +732,9 @@
727732
<PackageReference Include="System.Buffers" Version="4.5.0" />
728733
<PackageReference Include="System.Memory" Version="4.5.3" />
729734
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
735+
<PackageReference Include="Microsoft.Build.Framework" Version="$(MicrosoftBuildVersion)" />
736+
<PackageReference Include="Microsoft.Build.Tasks.Core" Version="$(MicrosoftBuildVersion)" />
737+
<PackageReference Include="Microsoft.Build.Utilities.Core" Version="$(MicrosoftBuildVersion)" />
730738
</ItemGroup>
731739
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
732740
<PackageReference Include="System.Reflection.Emit" Version="4.3.0" />

fcs/netfx.props

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net462'">$(BaseFrameworkPathOverrideForMono)/4.6.2-api</FrameworkPathOverride>
2121
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net47'">$(BaseFrameworkPathOverrideForMono)/4.7-api</FrameworkPathOverride>
2222
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net471'">$(BaseFrameworkPathOverrideForMono)/4.7.1-api</FrameworkPathOverride>
23+
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net472'">$(BaseFrameworkPathOverrideForMono)/4.7.2-api</FrameworkPathOverride>
24+
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net48'">$(BaseFrameworkPathOverrideForMono)/4.8-api</FrameworkPathOverride>
2325
<EnableFrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != ''">true</EnableFrameworkPathOverride>
2426

2527
<!-- Add the Facades directory. Not sure how else to do this. Necessary at least for .NET 4.5 -->

src/fsharp/CompileOps.fs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3700,12 +3700,17 @@ type TcAssemblyResolutions(tcConfig: TcConfig, results: AssemblyResolution list,
37003700

37013701
static member GetAllDllReferences (tcConfig: TcConfig) = [
37023702
let primaryReference = tcConfig.PrimaryAssemblyDllReference()
3703-
//yield primaryReference
3703+
3704+
let assumeDotNetFramework = primaryReference.SimpleAssemblyNameIs("mscorlib")
37043705

37053706
if not tcConfig.compilingFslib then
37063707
yield tcConfig.CoreLibraryDllReference()
3708+
if assumeDotNetFramework then
3709+
// When building desktop then we need these additional dependencies
3710+
yield AssemblyReference(rangeStartup, "System.Numerics.dll", None)
3711+
yield AssemblyReference(rangeStartup, "System.dll", None)
3712+
yield AssemblyReference(rangeStartup, "netstandard.dll", None)
37073713

3708-
let assumeDotNetFramework = primaryReference.SimpleAssemblyNameIs("mscorlib")
37093714
if tcConfig.framework then
37103715
for s in defaultReferencesForScriptsAndOutOfProjectSources tcConfig.useFsiAuxLib assumeDotNetFramework tcConfig.useSdkRefs do
37113716
yield AssemblyReference(rangeStartup, (if s.EndsWith(".dll", StringComparison.OrdinalIgnoreCase) then s else s+".dll"), None)
@@ -4107,7 +4112,6 @@ and [<Sealed>] TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAsse
41074112
| None ->
41084113
tcImports.ImplicitLoadIfAllowed(ctok, m, assemblyName, lookupOnly)
41094114
look tcImports
4110-
41114115

41124116
member tcImports.FindDllInfo (ctok, m, assemblyName) =
41134117
match tcImports.TryFindDllInfo (ctok, m, assemblyName, lookupOnly=false) with
@@ -4784,7 +4788,7 @@ and [<Sealed>] TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAsse
47844788
// If the user is asking for the default framework then also try to resolve other implicit assemblies as they are discovered.
47854789
// Using this flag to mean 'allow implicit discover of assemblies'.
47864790
let tcConfig = tcConfigP.Get ctok
4787-
if not lookupOnly && tcConfig.implicitlyResolveAssemblies then
4791+
if not lookupOnly && tcConfig.implicitlyResolveAssemblies then
47884792
let tryFile speculativeFileName =
47894793
let foundFile = tcImports.TryResolveAssemblyReference (ctok, AssemblyReference (m, speculativeFileName, None), ResolveAssemblyReferenceMode.Speculative)
47904794
match foundFile with
@@ -4825,7 +4829,7 @@ and [<Sealed>] TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAsse
48254829
ResultD [assemblyResolution]
48264830
| None ->
48274831
#if NO_MSBUILD_REFERENCE_RESOLUTION
4828-
try
4832+
try
48294833
ResultD [tcConfig.ResolveLibWithDirectories assemblyReference]
48304834
with e ->
48314835
ErrorD e
@@ -4846,7 +4850,7 @@ and [<Sealed>] TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAsse
48464850
ResultD [resolved]
48474851
| None ->
48484852
ErrorD(AssemblyNotResolved(assemblyReference.Text, assemblyReference.Range))
4849-
else
4853+
else
48504854
// This is a previously unencountered assembly. Resolve it and add it to the list.
48514855
// But don't cache resolution failures because the assembly may appear on the disk later.
48524856
let resolved, unresolved = TcConfig.TryResolveLibsUsingMSBuildRules(tcConfig, [ assemblyReference ], assemblyReference.Range, mode)
@@ -4861,9 +4865,7 @@ and [<Sealed>] TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAsse
48614865
// Note, if mode=ResolveAssemblyReferenceMode.Speculative and the resolution failed then TryResolveLibsUsingMSBuildRules returns
48624866
// the empty list and we convert the failure into an AssemblyNotResolved here.
48634867
ErrorD(AssemblyNotResolved(assemblyReference.Text, assemblyReference.Range))
4864-
4865-
#endif
4866-
4868+
#endif
48674869

48684870
member tcImports.ResolveAssemblyReference(ctok, assemblyReference, mode) : AssemblyResolution list =
48694871
CommitOperationResult(tcImports.TryResolveAssemblyReference(ctok, assemblyReference, mode))

src/fsharp/CompileOps.fsi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,8 @@ type TcImports =
673673
member ReportUnresolvedAssemblyReferences: UnresolvedAssemblyReference list -> unit
674674
member SystemRuntimeContainsType: string -> bool
675675

676+
member internal Base: TcImports option
677+
676678
static member BuildFrameworkTcImports : CompilationThreadToken * TcConfigProvider * AssemblyResolution list * AssemblyResolution list -> Cancellable<TcGlobals * TcImports>
677679
static member BuildNonFrameworkTcImports : CompilationThreadToken * TcConfigProvider * TcGlobals * TcImports * AssemblyResolution list * UnresolvedAssemblyReference list -> Cancellable<TcImports>
678680
static member BuildTcImports : CompilationThreadToken * TcConfigProvider -> Cancellable<TcGlobals * TcImports>

src/fsharp/CompileOptions.fs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -983,7 +983,9 @@ let advancedFlagsFsc tcConfigB =
983983

984984
yield CompilerOption
985985
("staticlink", tagFile,
986-
OptionString (fun s -> tcConfigB.extraStaticLinkRoots <- tcConfigB.extraStaticLinkRoots @ [s]), None,
986+
OptionString (fun s ->
987+
tcConfigB.extraStaticLinkRoots <- tcConfigB.extraStaticLinkRoots @ [s]
988+
tcConfigB.implicitlyResolveAssemblies <- true), None,
987989
Some (FSComp.SR.optsStaticlink()))
988990

989991
#if ENABLE_MONO_SUPPORT

src/fsharp/FSharp.Core/FSharp.Core.fsproj

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,20 @@
44

55
<PropertyGroup>
66
<OutputType>Library</OutputType>
7-
<TargetFrameworks>net45;netstandard2.0</TargetFrameworks>
8-
<TargetFrameworks Condition="'$(OS)' == 'Unix'">netstandard2.0</TargetFrameworks>
7+
<TargetFrameworks>netstandard2.0</TargetFrameworks>
98
<NoWarn>$(NoWarn);45;55;62;75;1204</NoWarn>
109
<AllowCrossTargeting>true</AllowCrossTargeting>
1110
<DefineConstants>$(DefineConstants);FSHARP_CORE</DefineConstants>
1211
<DefineConstants Condition="'$(Configuration)' == 'Proto'">BUILDING_WITH_LKG;$(DefineConstants)</DefineConstants>
1312
<OtherFlags>$(OtherFlags) --warnon:1182 --compiling-fslib --compiling-fslib-40 --maxerrors:20 --extraoptimizationloops:1 --nowarn:57</OtherFlags>
1413
<Tailcalls>true</Tailcalls> <!-- .tail annotations always emitted for this binary, even in debug mode -->
1514
<NGenBinary>true</NGenBinary>
15+
16+
<PreRelease>true</PreRelease>
17+
<PackageId>FSharp.Core</PackageId>
18+
<NuspecFile>FSharp.Core.nuspec</NuspecFile>
19+
<IsPackable>true</IsPackable>
20+
<PackageDescription>FSharp.Core redistributables from Visual F# Tools version $(FSPackageMajorVersion) For F# $(FSCoreMajorVersion). Contains code from the F# Software Foundation.</PackageDescription>
1621
</PropertyGroup>
1722

1823
<ItemGroup>

src/fsharp/SimulatedMSBuildReferenceResolver.fs

Lines changed: 78 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,90 @@ open System
1010
open System.IO
1111
open System.Reflection
1212
open Microsoft.Win32
13+
open Microsoft.Build.Utilities
1314
open FSharp.Compiler.ReferenceResolver
1415
open FSharp.Compiler.AbstractIL.Internal.Library
1516

17+
// ATTENTION!: the following code needs to be updated every time we are switching to the new MSBuild version because new .NET framework version was released
18+
// 1. List of frameworks
19+
// 2. DeriveTargetFrameworkDirectoriesFor45Plus
20+
// 3. HighestInstalledRefAssembliesOrDotNETFramework
21+
// 4. GetPathToDotNetFrameworkImlpementationAssemblies
22+
[<Literal>]
23+
let private Net45 = "v4.5"
24+
25+
[<Literal>]
26+
let private Net451 = "v4.5.1"
27+
28+
[<Literal>]
29+
let private Net452 = "v4.5.2" // not available in Dev15 MSBuild version
30+
31+
[<Literal>]
32+
let private Net46 = "v4.6"
33+
34+
[<Literal>]
35+
let private Net461 = "v4.6.1"
36+
37+
[<Literal>]
38+
let private Net462 = "v4.6.2"
39+
40+
[<Literal>]
41+
let private Net47 = "v4.7"
42+
43+
[<Literal>]
44+
let private Net471 = "v4.7.1"
45+
46+
[<Literal>]
47+
let private Net472 = "v4.7.2"
48+
49+
[<Literal>]
50+
let private Net48 = "v4.8"
51+
52+
let SupportedDesktopFrameworkVersions = [ Net48; Net472; Net471; Net47; Net462; Net461; Net46; Net452; Net451; Net45 ]
53+
1654
let private SimulatedMSBuildResolver =
17-
let supportedFrameworks = [|
18-
"v4.7.2"
19-
"v4.7.1"
20-
"v4.7"
21-
"v4.6.2"
22-
"v4.6.1"
23-
"v4.6"
24-
"v4.5.1"
25-
"v4.5"
26-
"v4.0"
27-
|]
55+
56+
/// Get the path to the .NET Framework implementation assemblies by using ToolLocationHelper.GetPathToDotNetFramework
57+
/// This is only used to specify the "last resort" path for assembly resolution.
58+
let GetPathToDotNetFrameworkImlpementationAssemblies(v) =
59+
let v =
60+
match v with
61+
| Net45 -> Some TargetDotNetFrameworkVersion.Version45
62+
| Net451 -> Some TargetDotNetFrameworkVersion.Version451
63+
#if MSBUILD_AT_LEAST_15
64+
| Net452 -> Some TargetDotNetFrameworkVersion.Version452
65+
| Net46 -> Some TargetDotNetFrameworkVersion.Version46
66+
| Net461 -> Some TargetDotNetFrameworkVersion.Version461
67+
| Net462 -> Some TargetDotNetFrameworkVersion.Version462
68+
| Net47 -> Some TargetDotNetFrameworkVersion.Version47
69+
| Net471 -> Some TargetDotNetFrameworkVersion.Version471
70+
| Net472 -> Some TargetDotNetFrameworkVersion.Version472
71+
| Net48 -> Some TargetDotNetFrameworkVersion.Version48
72+
#endif
73+
| _ -> assert false; None
74+
match v with
75+
| Some v ->
76+
match ToolLocationHelper.GetPathToDotNetFramework v with
77+
| null -> []
78+
| x -> [x]
79+
| _ -> []
80+
81+
let GetPathToDotNetFrameworkReferenceAssemblies(version) =
82+
#if NETSTANDARD
83+
ignore version
84+
let r : string list = []
85+
r
86+
#else
87+
match Microsoft.Build.Utilities.ToolLocationHelper.GetPathToStandardLibraries(".NETFramework",version,"") with
88+
| null | "" -> []
89+
| x -> [x]
90+
#endif
91+
2892
{ new Resolver with
2993
member x.HighestInstalledNetFrameworkVersion() =
3094

3195
let root = x.DotNetFrameworkReferenceAssembliesRootDirectory
32-
let fwOpt = supportedFrameworks |> Seq.tryFind(fun fw -> Directory.Exists(Path.Combine(root, fw) ))
96+
let fwOpt = SupportedDesktopFrameworkVersions |> Seq.tryFind(fun fw -> Directory.Exists(Path.Combine(root, fw) ))
3397
match fwOpt with
3498
| Some fw -> fw
3599
| None -> "v4.5"
@@ -86,6 +150,8 @@ let private SimulatedMSBuildResolver =
86150
if System.Environment.OSVersion.Platform = System.PlatformID.Win32NT then
87151
yield! registrySearchPaths()
88152
#endif
153+
yield! GetPathToDotNetFrameworkReferenceAssemblies targetFrameworkVersion
154+
yield! GetPathToDotNetFrameworkImlpementationAssemblies targetFrameworkVersion
89155
]
90156

91157
for (r, baggage) in references do

src/fsharp/fsc.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1315,7 +1315,7 @@ module StaticLinker =
13151315
data=ilxMainModule // any old module
13161316
edges = []
13171317
visited = true }
1318-
let assumedIndependentSet = set [ "mscorlib"; "System"; "System.Core"; "System.Xml"; "Microsoft.Build.Framework"; "Microsoft.Build.Utilities" ]
1318+
let assumedIndependentSet = set [ "mscorlib"; "System"; "System.Core"; "System.Xml"; "Microsoft.Build.Framework"; "Microsoft.Build.Utilities"; "netstandard" ]
13191319

13201320
begin
13211321
let mutable remaining = (computeILRefs ilGlobals ilxMainModule).AssemblyReferences
@@ -1325,7 +1325,7 @@ module StaticLinker =
13251325
if assumedIndependentSet.Contains ilAssemRef.Name || (ilAssemRef.PublicKey = Some ecmaPublicKey) then
13261326
depModuleTable.[ilAssemRef.Name] <- dummyEntry ilAssemRef.Name
13271327
else
1328-
if not (depModuleTable.ContainsKey ilAssemRef.Name) then
1328+
if not (depModuleTable.ContainsKey ilAssemRef.Name) then
13291329
match tcImports.TryFindDllInfo(ctok, Range.rangeStartup, ilAssemRef.Name, lookupOnly=false) with
13301330
| Some dllInfo ->
13311331
let ccu =

0 commit comments

Comments
 (0)