Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -221,3 +221,8 @@ tests/fsharpqa/testenv/bin/System.ValueTuple.dll
lib/netcore/fsc/bin/

!lib/bootstrap/signed/**/*
*/.fake
/fcs/packages/
*/paket-files/
/fcs/TestResult.xml
/tests/fcs/
5 changes: 1 addition & 4 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
language: csharp
sudo: required

os:
- linux
Expand All @@ -10,9 +11,6 @@ mono:
- 4.8.0
- 4.4.2


sudo: false

install:

script:
Expand All @@ -23,7 +21,6 @@ script:
# This fails because NUnit gives an exception (!!!!)
# - ./fcs/build.sh Test.NetFx
#
# System.IO.FileNotFoundException: Could not load file or assembly 'nunit.engine.api, Version=3.0.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb' or one of its dependencies.
#
# This fails because Nuget packaging doesn't like backslashes in the package file, but Windows does
# - ./fcs/build.sh NuGet
Expand Down
6 changes: 3 additions & 3 deletions fcs/.paket/Paket.Restore.targets
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
<DisableImplicitSystemValueTupleReference>true</DisableImplicitSystemValueTupleReference>
</PropertyGroup>

<Target Name="PaketRestore" BeforeTargets="_GenerateDotnetCliToolReferenceSpecs;_GenerateProjectRestoreGraphPerFramework;_GenerateRestoreGraphWalkPerFramework;CollectPackageReferences" >
<Target Name="PaketRestore" Condition="'$(PaketRestoreDisabled)' != 'True'" BeforeTargets="_GenerateDotnetCliToolReferenceSpecs;_GenerateProjectRestoreGraphPerFramework;_GenerateRestoreGraphWalkPerFramework;CollectPackageReferences" >

<!-- Step 1 Check if lockfile is properly restored -->
<PropertyGroup>
Expand Down Expand Up @@ -84,11 +84,11 @@
</PropertyGroup>

<!-- Step 3 Restore project specific stuff if required -->
<Warning Condition=" '$(PaketRestoreRequired)' == 'true' " Text="Detected a change ('$(PaketRestoreRequiredReason)') in the project file '$(MSBuildProjectFullPath)', calling paket restore" />
<Message Condition=" '$(PaketRestoreRequired)' == 'true' " Importance="low" Text="Detected a change ('$(PaketRestoreRequiredReason)') in the project file '$(MSBuildProjectFullPath)', calling paket restore" />
<Exec Command='$(PaketCommand) restore --project "$(MSBuildProjectFullPath)"' Condition=" '$(PaketRestoreRequired)' == 'true' " ContinueOnError="false" />

<!-- This shouldn't actually happen, but just to be sure. -->
<Error Condition=" !Exists('$(PaketResolvedFilePath)') AND '$(TargetFramework)' != '' " Text="A paket file for the framework '$(TargetFramework)' is missing. Please delete 'paket-files/paket.restore.cached' and call 'paket restore'." />
<Error Condition=" !Exists('$(PaketResolvedFilePath)') AND '$(TargetFramework)' != '' AND '$(ResolveNuGetPackages)' != 'False' " Text="Paket file '$(PaketResolvedFilePath)' is missing while restoring $(MSBuildProjectFile). Please delete 'paket-files/paket.restore.cached' and call 'paket restore'." />

<!-- Step 4 forward all msbuild properties (PackageReference, DotNetCliToolReference) to msbuild -->
<ReadLinesFromFile Condition="Exists('$(PaketResolvedFilePath)')" File="$(PaketResolvedFilePath)" >
Expand Down
Binary file removed fcs/.paket/paket.bootstrapper.exe
Binary file not shown.
Binary file added fcs/.paket/paket.exe
Binary file not shown.
38 changes: 0 additions & 38 deletions fcs/.paket/paket.targets

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -89,4 +89,4 @@
</ProjectReference>
</ItemGroup>
<Import Project="$(FSharpSourcesRoot)\..\packages\FSharp.Compiler.Tools.4.1.27\tools\Microsoft.FSharp.Targets" />
</Project>
</Project>
60 changes: 48 additions & 12 deletions fcs/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,17 @@ open System.Diagnostics
open System.Text
open System.IO
open System
open System.Xml

type ProjectCracker =
static member GetProjectOptionsFromProjectFileLogged(projectFileName : string, ?properties : (string * string) list, ?loadedTimeStamp, ?enableLogging) =
let loadedTimeStamp = defaultArg loadedTimeStamp DateTime.MaxValue // Not 'now', we don't want to force reloading
let properties = defaultArg properties []
let enableLogging = defaultArg enableLogging true
module Utils =

let Convert loadedTimeStamp (originalOpts: ProjectCrackerTool.ProjectOptions) =
let logMap = ref Map.empty

let rec convert (opts: ProjectCrackerTool.ProjectOptions) : FSharpProjectOptions =
let rec convertProject (opts: ProjectCrackerTool.ProjectOptions) =
if not (isNull opts.Error) then failwith opts.Error

let referencedProjects = Array.map (fun (a, b) -> a, convert b) opts.ReferencedProjectOptions
let referencedProjects() = Array.map (fun (a, b) -> a,convertProject b) opts.ReferencedProjectOptions

let sourceFiles, otherOptions =
opts.Options
Expand All @@ -41,7 +40,7 @@ type ProjectCracker =
{ ProjectFileName = opts.ProjectFile
SourceFiles = sourceFiles
OtherOptions = otherOptions
ReferencedProjects = referencedProjects
ReferencedProjects = referencedProjects()
IsIncompleteTypeCheckEnvironment = false
UseScriptResolutionRules = false
LoadTime = loadedTimeStamp
Expand All @@ -50,6 +49,16 @@ type ProjectCracker =
ExtraProjectInfo = None
Stamp = None }

convertProject originalOpts, !logMap

type ProjectCracker =

static member GetProjectOptionsFromProjectFileLogged(projectFileName : string, ?properties : (string * string) list, ?loadedTimeStamp, ?enableLogging) =
let loadedTimeStamp = defaultArg loadedTimeStamp DateTime.MaxValue // Not 'now', we don't want to force reloading
let properties = defaultArg properties []
let enableLogging = defaultArg enableLogging true


#if NETSTANDARD1_6
let arguments = [|
yield projectFileName
Expand All @@ -70,20 +79,47 @@ type ProjectCracker =
let codebase = Path.GetDirectoryName(Uri(typeof<ProjectCracker>.Assembly.CodeBase).LocalPath)

let crackerFilename = Path.Combine(codebase,"FSharp.Compiler.Service.ProjectCrackerTool.exe")
if not (File.Exists crackerFilename) then failwithf "ProjectCracker exe not found at: %s it must be next to the ProjectCracker dll." crackerFilename
if not (File.Exists crackerFilename) then
failwithf "ProjectCracker exe not found at: %s it must be next to the ProjectCracker dll." crackerFilename

let p = new System.Diagnostics.Process()

p.StartInfo.FileName <- crackerFilename
p.StartInfo.Arguments <- arguments.ToString()
p.StartInfo.UseShellExecute <- false
p.StartInfo.CreateNoWindow <- true
p.StartInfo.RedirectStandardOutput <- true
p.StartInfo.RedirectStandardError <- true

let sbOut = StringBuilder()
let sbErr = StringBuilder()

p.ErrorDataReceived.AddHandler(fun _ a -> sbErr.AppendLine a.Data |> ignore)
p.OutputDataReceived.AddHandler(fun _ a -> sbOut.AppendLine a.Data |> ignore)

ignore <| p.Start()

let ser = new DataContractJsonSerializer(typeof<ProjectCrackerTool.ProjectOptions>)
let opts = ser.ReadObject(p.StandardOutput.BaseStream) :?> ProjectCrackerTool.ProjectOptions
p.EnableRaisingEvents <- true
p.BeginOutputReadLine()
p.BeginErrorReadLine()

p.WaitForExit()

let crackerOut = sbOut.ToString()
let crackerErr = sbErr.ToString()

let opts =
try
let ser = new DataContractJsonSerializer(typeof<ProjectCrackerTool.ProjectOptions>)
let stringBytes = Encoding.Unicode.GetBytes crackerOut
use ms = new MemoryStream(stringBytes)
ser.ReadObject(ms) :?> ProjectCrackerTool.ProjectOptions
with
exn ->
raise (Exception(sprintf "error parsing ProjectCrackerTool output, stdoutput was:\n%s\n\nstderr was:\n%s" crackerOut crackerErr, exn))
#endif

convert opts, !logMap
Utils.Convert loadedTimeStamp opts

static member GetProjectOptionsFromProjectFile(projectFileName : string, ?properties : (string * string) list, ?loadedTimeStamp) =
fst (ProjectCracker.GetProjectOptionsFromProjectFileLogged(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,38 +46,85 @@
<Compile Include="Program.fs" />
<None Include="App.config" />
<None Include="FSharp.Compiler.Service.ProjectCracker.targets" />
<None Include="paket.references" />
</ItemGroup>
<ItemGroup>
<Reference Include="Microsoft.Build.Framework, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<HintPath>$(FSharpSourcesRoot)/../fcs/dependencies/MSBuild.v14.0/Microsoft.Build.Framework.dll</HintPath>
<Private>false</Private>
</Reference>
<Reference Include="Microsoft.Build.Engine, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<HintPath>$(FSharpSourcesRoot)/../fcs/dependencies/MSBuild.v14.0/Microsoft.Build.Engine.dll</HintPath>
<Private>false</Private>
</Reference>
<Reference Include="Microsoft.Build, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<HintPath>$(FSharpSourcesRoot)/../fcs/dependencies/MSBuild.v14.0/Microsoft.Build.dll</HintPath>
<Private>false</Private>
</Reference>
<Reference Include="Microsoft.Build.Utilities.v12.0">
<HintPath>$(FSharpSourcesRoot)/../fcs/dependencies/MSBuild.v12.0/Microsoft.Build.Utilities.v12.0.dll</HintPath>
<Private>false</Private>
</Reference>
<Reference Include="mscorlib" />
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Numerics" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.Xml" />

<!-- we build the nuget against FSHarp.Core 4.4.0.0 instead of our latest to allow use in wider range of F# tools -->
<Reference Include="FSharp.Core">
<HintPath>$(FSharpSourcesRoot)\..\packages\Microsoft.Portable.FSharp.Core.4.1.20\lib\profiles\net40\FSharp.Core.dll</HintPath>
<Private>false</Private>
</Reference>

</ItemGroup>
<Import Project="$(FSharpSourcesRoot)\..\packages\FSharp.Compiler.Tools.4.1.27\tools\Microsoft.FSharp.Targets" />
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.6')">
<ItemGroup>
<Reference Include="Microsoft.Build">
<HintPath>..\packages\Microsoft.Build\lib\net45\Microsoft.Build.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.6')">
<ItemGroup>
<Reference Include="Microsoft.Build.Engine">
<HintPath>..\packages\Microsoft.Build.Engine\lib\net45\Microsoft.Build.Engine.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.6')">
<ItemGroup>
<Reference Include="Microsoft.Build.Framework">
<HintPath>..\packages\Microsoft.Build.Framework\lib\net45\Microsoft.Build.Framework.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.6')">
<ItemGroup>
<Reference Include="Microsoft.Build.Utilities.Core">
<HintPath>..\packages\Microsoft.Build.Utilities.Core\lib\net45\Microsoft.Build.Utilities.Core.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And $(TargetFrameworkVersion) == 'v4.6'">
<ItemGroup>
<Reference Include="System.ComponentModel.Composition">
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.6')">
<ItemGroup>
<Reference Include="System.Threading.Tasks.Dataflow">
<HintPath>..\packages\System.Threading.Tasks.Dataflow\lib\portable-net45+win8+wpa81\System.Threading.Tasks.Dataflow.dll</HintPath>
<Private>True</Private>
<Paket>True</Paket>
</Reference>
</ItemGroup>
</When>
</Choose>
</Project>
37 changes: 31 additions & 6 deletions fcs/FSharp.Compiler.Service.ProjectCrackerTool/Program.fs
Original file line number Diff line number Diff line change
@@ -1,21 +1,46 @@
namespace Microsoft.FSharp.Compiler.SourceCodeServices.ProjectCrackerTool

open System
open System.IO
open System.Reflection
open System.Runtime.Serialization.Json

module Program =

[<EntryPoint>]
let main argv =
let text = Array.exists (fun (s: string) -> s = "--text") argv
let argv = Array.filter (fun (s: string) -> s <> "--text") argv
#if !DOTNETCORE
let addMSBuildv14BackupResolution () =
let onResolveEvent = new ResolveEventHandler(fun sender evArgs ->
let requestedAssembly = AssemblyName(evArgs.Name)
if requestedAssembly.Name.StartsWith("Microsoft.Build") &&
not (requestedAssembly.Name.EndsWith(".resources")) &&
not (requestedAssembly.Version.ToString().Contains("12.0.0.0"))
then
// If the version of MSBuild that we're using wasn't present on the machine, then
// just revert back to 12.0.0.0 since that's normally installed as part of the .NET
// Framework.
requestedAssembly.Version <- Version("12.0.0.0")
Assembly.Load requestedAssembly
else
null)
AppDomain.CurrentDomain.add_AssemblyResolve(onResolveEvent)
#endif

let crackAndSendOutput asText argv =
let ret, opts = ProjectCrackerTool.crackOpen argv

if text then
if asText then
printfn "%A" opts
else
let ser = new DataContractJsonSerializer(typeof<ProjectOptions>)
ser.WriteObject(Console.OpenStandardOutput(), opts)
ret


[<EntryPoint>][<STAThread>]
let main argv =
let asText = Array.exists (fun (s: string) -> s = "--text") argv
let argv = Array.filter (fun (s: string) -> s <> "--text") argv

#if !DOTNETCORE
addMSBuildv14BackupResolution ()
#endif
crackAndSendOutput asText argv
Loading