diff --git a/build.fsx b/build.fsx
index 6b646462..712292ba 100644
--- a/build.fsx
+++ b/build.fsx
@@ -44,44 +44,32 @@ traceHeader releases
// NUMERICS PACKAGES
-let numericsZipPackage =
- { Id = "MathNet.Numerics"
- Release = numericsRelease
- Title = "Math.NET Numerics"
- FsLoader = true }
+let numericsZipPackage = zipPackage "MathNet.Numerics" "Math.NET Numerics" numericsRelease true
+let numericsStrongNameZipPackage = zipPackage "MathNet.Numerics.Signed" "Math.NET Numerics" numericsRelease true
-let numericsStrongNameZipPackage =
- { numericsZipPackage with
- Id = "MathNet.Numerics.Signed" }
+let numericsNuGetPackage = nugetPackage "MathNet.Numerics" numericsRelease
+let numericsFSharpNuGetPackage = nugetPackage "MathNet.Numerics.FSharp" numericsRelease
+let numericsStrongNameNuGetPackage = nugetPackage "MathNet.Numerics.Signed" numericsRelease
+let numericsFSharpStrongNameNuGetPackage = nugetPackage "MathNet.Numerics.FSharp.Signed" numericsRelease
-let numericsNuGetPackage = { Id = "MathNet.Numerics"; Release = numericsRelease }
-let numericsFSharpNuGetPackage = { Id = "MathNet.Numerics.FSharp"; Release = numericsRelease }
-let numericsStrongNameNuGetPackage = { Id = "MathNet.Numerics.Signed"; Release = numericsRelease }
-let numericsFSharpStrongNameNuGetPackage = { Id = "MathNet.Numerics.FSharp.Signed"; Release = numericsRelease }
-
-let numericsProject = { AssemblyName = "MathNet.Numerics"; ProjectFile = "src/Numerics/Numerics.csproj"; OutputDir = "src/Numerics/bin/Release" }
-let fsharpProject = { AssemblyName = "MathNet.Numerics.FSharp"; ProjectFile = "src/FSharp/FSharp.fsproj"; OutputDir = "src/FSharp/bin/Release" }
+let numericsProject = project "MathNet.Numerics" "src/Numerics/Numerics.csproj" [numericsNuGetPackage; numericsStrongNameNuGetPackage]
+let numericsFsharpProject = project "MathNet.Numerics.FSharp" "src/FSharp/FSharp.fsproj" [numericsFSharpNuGetPackage; numericsFSharpStrongNameNuGetPackage]
+let numericsSolution = solution "Numerics" "MathNet.Numerics.sln" [numericsProject; numericsFsharpProject]
// DATA EXTENSION PACKAGES
-let dataZipPackage =
- { Id = "MathNet.Numerics.Data"
- Release = dataRelease
- Title = "Math.NET Numerics Data Extensions"
- FsLoader = false }
-
-let dataStrongNameZipPackage =
- { dataZipPackage with
- Id = "MathNet.Numerics.Data.Signed" }
+let dataZipPackage = zipPackage "MathNet.Numerics.Data" "Math.NET Numerics Data Extensions" dataRelease false
+let dataStrongNameZipPackage = zipPackage "MathNet.Numerics.Data.Signed" "Math.NET Numerics Data Extensions" dataRelease false
-let dataTextNuGetPackage = { Id = "MathNet.Numerics.Data.Text"; Release = dataRelease }
-let dataMatlabNuGetPackage = { Id = "MathNet.Numerics.Data.Matlab"; Release = dataRelease }
-let dataTextStrongNameNuGetPackage = { Id = "MathNet.Numerics.Data.Text.Signed"; Release = dataRelease }
-let dataMatlabStrongNameNuGetPackage = { Id = "MathNet.Numerics.Data.Matlab.Signed"; Release = dataRelease }
+let dataTextNuGetPackage = nugetPackage "MathNet.Numerics.Data.Text" dataRelease
+let dataMatlabNuGetPackage = nugetPackage "MathNet.Numerics.Data.Matlab" dataRelease
+let dataTextStrongNameNuGetPackage = nugetPackage "MathNet.Numerics.Data.Text.Signed" dataRelease
+let dataMatlabStrongNameNuGetPackage = nugetPackage "MathNet.Numerics.Data.Matlab.Signed" dataRelease
-let dataTextProject = { AssemblyName = "MathNet.Numerics.Data.Text"; ProjectFile = "src/Data/Text/Text.csproj"; OutputDir = "src/Data/Text/bin/Release" }
-let dataMatlabProject = { AssemblyName = "MathNet.Numerics.Data.Matlab"; ProjectFile = "src/Data/Matlab/Matlab.csproj"; OutputDir = "src/Data/Matlab/bin/Release" }
+let dataTextProject = project "MathNet.Numerics.Data.Text" "src/Data/Text/Text.csproj" [dataTextNuGetPackage; dataTextStrongNameNuGetPackage]
+let dataMatlabProject = project "MathNet.Numerics.Data.Matlab" "src/Data/Matlab/Matlab.csproj" [dataMatlabNuGetPackage; dataMatlabStrongNameNuGetPackage]
+let dataSolution = solution "Data" "MathNet.Numerics.Data.sln" [dataTextProject; dataMatlabProject]
// MKL NATIVE PROVIDER PACKAGES
@@ -168,25 +156,15 @@ let mklLinuxBundle =
Title = "Math.NET Numerics MKL Native Provider for Linux"
Packages = [ mklLinuxPack; mklLinux32Pack; mklLinux64Pack ] }
-let mklWinZipPackage =
- { Id = "MathNet.Numerics.MKL.Win"
- Release = mklRelease
- Title = "Math.NET Numerics MKL Native Provider for Windows"
- FsLoader = false }
-
-let mklLinuxZipPackage =
- { Id = "MathNet.Numerics.MKL.Linux"
- Release = mklRelease
- Title = "Math.NET Numerics MKL Native Provider for Linux"
- FsLoader = false }
-
+let mklWinZipPackage = zipPackage "MathNet.Numerics.MKL.Win" "Math.NET Numerics MKL Native Provider for Windows" mklRelease false
+let mklLinuxZipPackage = zipPackage "MathNet.Numerics.MKL.Linux" "Math.NET Numerics MKL Native Provider for Linux" mklRelease false
-let mklWinNuGetPackage = { Id = "MathNet.Numerics.MKL.Win"; Release = mklRelease }
-let mklWin32NuGetPackage = { Id = "MathNet.Numerics.MKL.Win-x86"; Release = mklRelease }
-let mklWin64NuGetPackage = { Id = "MathNet.Numerics.MKL.Win-x64"; Release = mklRelease }
-let mklLinuxNuGetPackage = { Id = "MathNet.Numerics.MKL.Linux"; Release = mklRelease }
-let mklLinux32NuGetPackage = { Id = "MathNet.Numerics.MKL.Linux-x86"; Release = mklRelease }
-let mklLinux64NuGetPackage = { Id = "MathNet.Numerics.MKL.Linux-x64"; Release = mklRelease }
+let mklWinNuGetPackage = nugetPackage "MathNet.Numerics.MKL.Win" mklRelease
+let mklWin32NuGetPackage = nugetPackage "MathNet.Numerics.MKL.Win-x86" mklRelease
+let mklWin64NuGetPackage = nugetPackage "MathNet.Numerics.MKL.Win-x64" mklRelease
+let mklLinuxNuGetPackage = nugetPackage "MathNet.Numerics.MKL.Linux" mklRelease
+let mklLinux32NuGetPackage = nugetPackage "MathNet.Numerics.MKL.Linux-x86" mklRelease
+let mklLinux64NuGetPackage = nugetPackage "MathNet.Numerics.MKL.Linux-x64" mklRelease
// CUDA NATIVE PROVIDER PACKAGES
@@ -214,13 +192,8 @@ let cudaWinBundle =
Title = "Math.NET Numerics CUDA Native Provider for Windows"
Packages = [ cudaWinPack ] }
-let cudaWinZipPackage =
- { Id = "MathNet.Numerics.CUDA.Win"
- Release = cudaRelease
- Title = "Math.NET Numerics CUDA Native Provider for Windows"
- FsLoader = false }
-
-let cudaWinNuGetPackage = { Id = "MathNet.Numerics.CUDA.Win"; Release = cudaRelease }
+let cudaWinZipPackage = zipPackage "MathNet.Numerics.CUDA.Win" "Math.NET Numerics CUDA Native Provider for Windows" cudaRelease false
+let cudaWinNuGetPackage = nugetPackage "MathNet.Numerics.CUDA.Win" cudaRelease
// OpenBLAS NATIVE PROVIDER PACKAGES
@@ -254,13 +227,14 @@ let openBlasWinBundle =
Title = "Math.NET Numerics OpenBLAS Native Provider for Windows"
Packages = [ openBlasWinPack ] }
-let openBlasWinZipPackage =
- { Id = "MathNet.Numerics.OpenBLAS.Win"
- Release = openBlasRelease
- Title = "Math.NET Numerics OpenBLAS Native Provider for Windows"
- FsLoader = false }
+let openBlasWinZipPackage = zipPackage "MathNet.Numerics.OpenBLAS.Win" "Math.NET Numerics OpenBLAS Native Provider for Windows" openBlasRelease false
+let openBlasWinNuGetPackage = nugetPackage "MathNet.Numerics.OpenBLAS.Win" openBlasRelease
+
+
+// ALL
-let openBlasWinNuGetPackage = { Id = "MathNet.Numerics.OpenBLAS.Win"; Release = openBlasRelease }
+let allSolutions = [numericsSolution; dataSolution]
+let allProjects = allSolutions |> List.collect (fun s -> s.Projects) |> List.distinct
// --------------------------------------------------------------------------------------
@@ -271,29 +245,23 @@ Target "Start" DoNothing
Target "Clean" (fun _ ->
DeleteDirs (!! "src/**/obj/" ++ "src/**/bin/" )
- CleanDirs [ "out/api"; "out/docs"; "out/Numerics/packages/Zip"; "out/Numerics/packages/NuGet"; "out/Numerics/lib"; "out/Numerics/lib-strongname" ]
- CleanDirs [ "out/Data"; "out/Data/packages/Zip"; "out/Data/packages/NuGet"; "out/Data/lib"; "out/Data/lib-strongname" ] // Data Extensions
+ CleanDirs [ "out/api"; "out/docs" ]
CleanDirs [ "out/MKL"; "out/ATLAS"; "out/CUDA"; "out/OpenBLAS" ] // Native Providers
- clean "MathNet.Numerics.sln"
- clean "MathNet.Numerics.Data.sln")
+ allSolutions |> List.iter (fun solution -> CleanDirs [ solution.OutputZipDir; solution.OutputNuGetDir; solution.OutputLibDir; solution.OutputLibStrongNameDir ])
+ allSolutions |> List.iter clean)
Target "ApplyVersion" (fun _ ->
+ allProjects |> List.iter patchVersionInProjectFile
patchVersionInAssemblyInfo "src/FSharp" numericsRelease
patchVersionInAssemblyInfo "src/TestData" numericsRelease
patchVersionInAssemblyInfo "src/Numerics.Tests" numericsRelease
patchVersionInAssemblyInfo "src/FSharp.Tests" numericsRelease
patchVersionInAssemblyInfo "src/Data.Tests" dataRelease
- patchVersionInProjectFile "src/Numerics/Numerics.csproj" numericsRelease
- patchVersionInProjectFile "src/FSharp/FSharp.fsproj" numericsRelease
- patchVersionInProjectFile "src/Data/Text/Text.csproj" dataRelease
- patchVersionInProjectFile "src/Data/Matlab/Matlab.csproj" dataRelease
patchVersionInResource "src/NativeProviders/MKL/resource.rc" mklRelease
patchVersionInResource "src/NativeProviders/CUDA/resource.rc" cudaRelease
patchVersionInResource "src/NativeProviders/OpenBLAS/resource.rc" openBlasRelease)
-Target "Restore" (fun _ ->
- restore "MathNet.Numerics.sln"
- restore "MathNet.Numerics.Data.sln")
+Target "Restore" (fun _ -> allSolutions |> List.iter restore)
"Start"
=?> ("Clean", not (hasBuildParam "incremental"))
==> "Restore"
@@ -317,33 +285,27 @@ Target "Build" (fun _ ->
// Strong Name Build (with strong name, without certificate signature)
if hasBuildParam "strongname" then
CleanDirs (!! "src/**/obj/" ++ "src/**/bin/" )
- restoreSN "MathNet.Numerics.sln"
- buildSN "MathNet.Numerics.sln"
- collectBinaries numericsProject "out/Numerics/lib-strongname"
- collectBinaries fsharpProject "out/Numerics/lib-strongname"
- zip numericsStrongNameZipPackage "out/Numerics/packages/Zip" "out/Numerics/lib-strongname" (fun f -> f.Contains("MathNet.Numerics.") || f.Contains("System.Threading.") || f.Contains("FSharp.Core."))
+ restoreSN numericsSolution
+ buildSN numericsSolution
+ collectBinariesSN numericsSolution
+ zip numericsStrongNameZipPackage numericsSolution.OutputZipDir numericsSolution.OutputLibStrongNameDir (fun f -> f.Contains("MathNet.Numerics.") || f.Contains("System.Threading.") || f.Contains("FSharp.Core."))
if isWindows then
- packSN "MathNet.Numerics.sln"
- collectNuGetPackages numericsProject "out/Numerics/packages/NuGet"
- collectNuGetPackages fsharpProject "out/Numerics/packages/NuGet"
+ packSN numericsSolution.SolutionFile
+ collectNuGetPackages numericsSolution
// Normal Build (without strong name, with certificate signature)
CleanDirs (!! "src/**/obj/" ++ "src/**/bin/" )
- restore "MathNet.Numerics.sln"
- build "MathNet.Numerics.sln"
- if isWindows && hasBuildParam "sign" then
- sign fingerprint timeserver (!! (numericsProject.OutputDir + "**/MathNet.Numerics.dll") ++ (fsharpProject.OutputDir + "**/MathNet.Numerics.FSharp.dll") )
- collectBinaries numericsProject "out/Numerics/lib"
- collectBinaries fsharpProject "out/Numerics/lib"
- zip numericsZipPackage "out/Numerics/packages/Zip" "out/Numerics/lib" (fun f -> f.Contains("MathNet.Numerics.") || f.Contains("System.Threading.") || f.Contains("FSharp.Core."))
+ restore numericsSolution
+ build numericsSolution
+ if isWindows && hasBuildParam "sign" then sign fingerprint timeserver numericsSolution
+ collectBinaries numericsSolution
+ zip numericsZipPackage numericsSolution.OutputZipDir numericsSolution.OutputLibDir (fun f -> f.Contains("MathNet.Numerics.") || f.Contains("System.Threading.") || f.Contains("FSharp.Core."))
if isWindows then
- pack "MathNet.Numerics.sln"
- collectNuGetPackages numericsProject "out/Numerics/packages/NuGet"
- collectNuGetPackages fsharpProject "out/Numerics/packages/NuGet"
+ pack numericsSolution.SolutionFile
+ collectNuGetPackages numericsSolution
// NuGet Sign (all or nothing)
- if isWindows && hasBuildParam "sign" then
- Seq.iter (signNuGet fingerprint timeserver) !! "out/Numerics/packages/NuGet/*.nupkg"
+ if isWindows && hasBuildParam "sign" then signNuGet fingerprint timeserver numericsSolution
)
"Prepare" ==> "Build"
@@ -353,35 +315,29 @@ Target "DataBuild" (fun _ ->
// Strong Name Build (with strong name, without certificate signature)
if hasBuildParam "strongname" then
CleanDirs (!! "src/**/obj/" ++ "src/**/bin/" )
- restoreSN "MathNet.Numerics.Data.sln"
- buildSN "MathNet.Numerics.Data.sln"
- collectBinaries dataTextProject "out/Data/lib-strongname"
- collectBinaries dataMatlabProject "out/Data/lib-strongname"
- zip dataStrongNameZipPackage "out/Data/packages/Zip" "out/Data/lib-strongname" (fun f -> f.Contains("MathNet.Numerics.Data."))
+ restoreSN dataSolution
+ buildSN dataSolution
+ collectBinariesSN dataSolution
+ zip dataStrongNameZipPackage dataSolution.OutputZipDir dataSolution.OutputLibStrongNameDir (fun f -> f.Contains("MathNet.Numerics.Data."))
if isWindows then
packSN dataTextProject.ProjectFile
packSN dataMatlabProject.ProjectFile
- collectNuGetPackages dataTextProject "out/Data/packages/NuGet"
- collectNuGetPackages dataMatlabProject "out/Data/packages/NuGet"
+ collectNuGetPackages dataSolution
// Normal Build (without strong name, with certificate signature)
CleanDirs (!! "src/**/obj/" ++ "src/**/bin/" )
- restore "MathNet.Numerics.Data.sln"
- build "MathNet.Numerics.Data.sln"
- if isWindows && hasBuildParam "sign" then
- sign fingerprint timeserver (!! (dataTextProject.OutputDir + "**/MathNet.Numerics.Data.Text.dll") ++ (dataMatlabProject.OutputDir + "**/MathNet.Numerics.Data.Matlab.dll") )
- collectBinaries dataTextProject "out/Data/lib"
- collectBinaries dataMatlabProject "out/Data/lib"
- zip dataZipPackage "out/Data/packages/Zip" "out/Data/lib" (fun f -> f.Contains("MathNet.Numerics.Data."))
+ restore dataSolution
+ build dataSolution
+ if isWindows && hasBuildParam "sign" then sign fingerprint timeserver dataSolution
+ collectBinaries dataSolution
+ zip dataZipPackage dataSolution.OutputZipDir dataSolution.OutputLibDir (fun f -> f.Contains("MathNet.Numerics.Data."))
if isWindows then
pack dataTextProject.ProjectFile
pack dataMatlabProject.ProjectFile
- collectNuGetPackages dataTextProject "out/Data/packages/NuGet"
- collectNuGetPackages dataMatlabProject "out/Data/packages/NuGet"
+ collectNuGetPackages dataSolution
// NuGet Sign (all or nothing)
- if isWindows && hasBuildParam "sign" then
- Seq.iter (signNuGet fingerprint timeserver) !! "out/Data/packages/NuGet/*.nupkg"
+ if isWindows && hasBuildParam "sign" then signNuGet fingerprint timeserver dataSolution
)
"Prepare" ==> "DataBuild"
@@ -472,8 +428,6 @@ Target "DataTestNET45" (fun _ -> testData "net45")
// PACKAGES
// --------------------------------------------------------------------------------------
-Target "Pack" DoNothing
-Target "DataPack" DoNothing
Target "MklWinPack" DoNothing
Target "MklLinuxPack" DoNothing
Target "CudaWinPack" DoNothing
@@ -598,17 +552,17 @@ Target "PublishMirrors" (fun _ -> publishMirrors ())
Target "PublishDocs" (fun _ -> publishDocs numericsRelease)
Target "PublishApi" (fun _ -> publishApi numericsRelease)
-Target "PublishArchive" (fun _ -> publishArchive "out/Numerics/packages/Zip" "out/Numerics/packages/NuGet" [numericsZipPackage; numericsStrongNameZipPackage] [numericsNuGetPackage; numericsFSharpNuGetPackage; numericsStrongNameNuGetPackage; numericsFSharpStrongNameNuGetPackage])
-Target "DataPublishArchive" (fun _ -> publishArchive "out/Data/packages/Zip" "out/Data/packages/NuGet" [dataZipPackage; dataStrongNameZipPackage] [dataTextNuGetPackage; dataMatlabNuGetPackage; dataTextStrongNameNuGetPackage; dataMatlabStrongNameNuGetPackage])
+Target "PublishArchive" (fun _ -> publishArchive numericsSolution.OutputZipDir numericsSolution.OutputNuGetDir [numericsZipPackage; numericsStrongNameZipPackage] [numericsNuGetPackage; numericsFSharpNuGetPackage; numericsStrongNameNuGetPackage; numericsFSharpStrongNameNuGetPackage])
+Target "DataPublishArchive" (fun _ -> publishArchive dataSolution.OutputZipDir dataSolution.OutputNuGetDir [dataZipPackage; dataStrongNameZipPackage] [dataTextNuGetPackage; dataMatlabNuGetPackage; dataTextStrongNameNuGetPackage; dataMatlabStrongNameNuGetPackage])
Target "MklPublishArchive" (fun _ -> publishArchive "out/MKL/packages/Zip" "out/MKL/packages/NuGet" [mklWinZipPackage; mklLinuxZipPackage] [mklWinNuGetPackage; mklWin32NuGetPackage; mklWin64NuGetPackage; mklLinuxNuGetPackage; mklLinux32NuGetPackage; mklLinux64NuGetPackage])
Target "CudaPublishArchive" (fun _ -> publishArchive "out/CUDA/packages/Zip" "out/CUDA/packages/NuGet" [cudaWinZipPackage] [cudaWinNuGetPackage])
Target "OpenBlasPublishArchive" (fun _ -> publishArchive "out/OpenBLAS/packages/Zip" "out/OpenBLAS/packages/NuGet" [openBlasWinZipPackage] [openBlasWinNuGetPackage])
-Target "PublishNuGet" (fun _ -> !! "out/Numerics/packages/NuGet/*.nupkg" -- "out/Numerics/packages/NuGet/*.symbols.nupkg" |> publishNuGet)
-Target "DataPublishNuGet" (fun _ -> !! "out/Data/packages/NuGet/*.nupkg" |> publishNuGet)
-Target "MklPublishNuGet" (fun _ -> !! "out/MKL/packages/NuGet/*.nupkg" |> publishNuGet)
-Target "CudaPublishNuGet" (fun _ -> !! "out/CUDA/packages/NuGet/*.nupkg" |> publishNuGet)
-Target "OpenBlasPublishNuGet" (fun _ -> !! "out/OpenBLAS/packages/NuGet/*.nupkg" |> publishNuGet)
+Target "PublishNuGet" (fun _ -> publishNuGet !! (numericsSolution.OutputNuGetDir > "/*.nupkg"))
+Target "DataPublishNuGet" (fun _ -> publishNuGet !! (dataSolution.OutputNuGetDir > "/*.nupkg"))
+Target "MklPublishNuGet" (fun _ -> publishNuGet !! "out/MKL/packages/NuGet/*.nupkg")
+Target "CudaPublishNuGet" (fun _ -> publishNuGet !! "out/CUDA/packages/NuGet/*.nupkg")
+Target "OpenBlasPublishNuGet" (fun _ -> publishNuGet !! "out/OpenBLAS/packages/NuGet/*.nupkg")
Target "Publish" DoNothing
Dependencies "Publish" [ "PublishTag"; "PublishDocs"; "PublishApi"; "PublishArchive"; "PublishNuGet" ]
diff --git a/build/build-framework.fsx b/build/build-framework.fsx
index 47e0137d..d74c2405 100644
--- a/build/build-framework.fsx
+++ b/build/build-framework.fsx
@@ -99,6 +99,34 @@ type Release =
ReleaseNotes: string
ReleaseNotesFile: string }
+type ZipPackage =
+ { Id: string
+ Release: Release
+ Title: string
+ FsLoader: bool }
+
+type NuGetPackage =
+ { Id: string
+ Release: Release }
+
+type Project =
+ { AssemblyName: string
+ ProjectFile: string
+ OutputDir: string
+ Release: Release
+ NuGetPackages: NuGetPackage list }
+
+type Solution =
+ { Key: string
+ SolutionFile: string
+ Projects: Project list
+ Release: Release
+ OutputDir: string
+ OutputLibDir: string
+ OutputLibStrongNameDir: string
+ OutputZipDir: string
+ OutputNuGetDir: string }
+
type Package =
{ Id: string
Release: Release
@@ -117,20 +145,6 @@ type Bundle =
Title: string
Packages: Package list }
-type ZipPackage =
- { Id: string
- Release: Release
- Title: string
- FsLoader: bool }
-
-type NuGetPackage =
- { Id: string
- Release: Release }
-
-type Project =
- { AssemblyName: string
- ProjectFile: string
- OutputDir: string }
let release title releaseNotesFile : Release =
let info = LoadReleaseNotes releaseNotesFile
@@ -138,12 +152,40 @@ let release title releaseNotesFile : Release =
let assemblyVersion = info.AssemblyVersion + "." + buildPart
let packageVersion = info.NugetVersion
let notes = info.Notes |> List.map (fun l -> l.Replace("*","").Replace("`","")) |> toLines
- { Title = title
+ { Release.Title = title
AssemblyVersion = assemblyVersion
PackageVersion = packageVersion
ReleaseNotes = notes
ReleaseNotesFile = releaseNotesFile }
+let zipPackage packageId title release fsLoader =
+ { ZipPackage.Id = packageId
+ Title = title
+ Release = release
+ FsLoader = fsLoader }
+
+let nugetPackage packageId release =
+ { NuGetPackage.Id = packageId
+ Release = release }
+
+let project assemblyName projectFile nuGetPackages =
+ { Project.AssemblyName = assemblyName
+ ProjectFile = projectFile
+ OutputDir = (Path.GetDirectoryName projectFile) > "bin" > "Release"
+ NuGetPackages = nuGetPackages
+ Release = nuGetPackages |> List.map (fun p -> p.Release) |> List.distinct |> List.exactlyOne }
+
+let solution key solutionFile projects =
+ { Solution.Key = key
+ SolutionFile = solutionFile
+ Projects = projects
+ Release = projects |> List.map (fun p -> p.Release) |> List.distinct |> List.exactlyOne
+ OutputDir = "out" > key
+ OutputLibDir = "out" > key > "Lib"
+ OutputLibStrongNameDir = "out" > key > "Lib-StrongName"
+ OutputZipDir = "out" > key > "Zip"
+ OutputNuGetDir = "out" > key > "NuGet" }
+
let traceHeader (releases:Release list) =
trace header
let titleLength = releases |> List.map (fun r -> r.Title.Length) |> List.max
@@ -195,32 +237,32 @@ let patchVersionInResource path (release:Release) =
>> regex_replace @"\d+,\d+,\d+,\d+" (replace "." "," release.AssemblyVersion))
path
-let patchVersionInProjectFile path (release:Release) =
- let semverSplit = release.PackageVersion.IndexOf('-')
- let prefix = if semverSplit <= 0 then release.PackageVersion else release.PackageVersion.Substring(0, semverSplit)
- let suffix = if semverSplit <= 0 then "" else release.PackageVersion.Substring(semverSplit+1)
+let patchVersionInProjectFile (project:Project) =
+ let semverSplit = project.Release.PackageVersion.IndexOf('-')
+ let prefix = if semverSplit <= 0 then project.Release.PackageVersion else project.Release.PackageVersion.Substring(0, semverSplit)
+ let suffix = if semverSplit <= 0 then "" else project.Release.PackageVersion.Substring(semverSplit+1)
ReplaceInFile
- (regex_replace """\.*\""" (sprintf """%s""" release.PackageVersion)
- >> regex_replace """\.*\""" (sprintf """%s""" release.PackageVersion)
- >> regex_replace """\.*\""" (sprintf """%s""" release.AssemblyVersion)
- >> regex_replace """\.*\""" (sprintf """%s""" release.AssemblyVersion)
+ (regex_replace """\.*\""" (sprintf """%s""" project.Release.PackageVersion)
+ >> regex_replace """\.*\""" (sprintf """%s""" project.Release.PackageVersion)
+ >> regex_replace """\.*\""" (sprintf """%s""" project.Release.AssemblyVersion)
+ >> regex_replace """\.*\""" (sprintf """%s""" project.Release.AssemblyVersion)
>> regex_replace """\.*\""" (sprintf """%s""" prefix)
>> regex_replace """\.*\""" (sprintf """%s""" suffix)
- >> regex_replace_singleline """\.*\""" (sprintf """%s""" release.ReleaseNotes))
- path
+ >> regex_replace_singleline """\.*\""" (sprintf """%s""" project.Release.ReleaseNotes))
+ project.ProjectFile
// --------------------------------------------------------------------------------------
// BUILD
// --------------------------------------------------------------------------------------
-let clean project = msbuild [ "Clean" ] "Release" project
+let clean (solution:Solution) = msbuild [ "Clean" ] "Release" solution.SolutionFile
-let restore project = msbuild [ "Restore" ] "Release" project
-let restoreSN project = msbuildSN [ "Restore" ] "Release" project
+let restore (solution:Solution) = msbuild [ "Restore" ] "Release" solution.SolutionFile
+let restoreSN (solution:Solution) = msbuildSN [ "Restore" ] "Release" solution.SolutionFile
-let build project = msbuild [ (if hasBuildParam "incremental" then "Build" else "Rebuild") ] "Release" project
-let buildSN project = msbuildSN [ (if hasBuildParam "incremental" then "Build" else "Rebuild") ] "Release" project
+let build (solution:Solution) = msbuild [ (if hasBuildParam "incremental" then "Build" else "Rebuild") ] "Release" solution.SolutionFile
+let buildSN (solution:Solution) = msbuildSN [ (if hasBuildParam "incremental" then "Build" else "Rebuild") ] "Release" solution.SolutionFile
let pack project = dotnet rootDir (sprintf "pack %s --configuration Release --no-restore --no-build" project)
let packSN project = dotnetSN rootDir (sprintf "pack %s --configuration Release --no-restore --no-build" project)
@@ -236,11 +278,14 @@ let buildConfig64 config subject = MSBuild "" (if hasBuildParam "incremental" th
// COLLECT
// --------------------------------------------------------------------------------------
-let collectBinaries (project:Project) targetDir =
- CopyDir targetDir project.OutputDir (fun n -> n.Contains(project.AssemblyName + ".dll") || n.Contains(project.AssemblyName + ".pdb") || n.Contains(project.AssemblyName + ".xml"))
+let collectBinaries (solution:Solution) =
+ solution.Projects |> List.iter (fun project -> CopyDir solution.OutputLibDir project.OutputDir (fun n -> n.Contains(project.AssemblyName + ".dll") || n.Contains(project.AssemblyName + ".pdb") || n.Contains(project.AssemblyName + ".xml")))
+
+let collectBinariesSN (solution:Solution) =
+ solution.Projects |> List.iter (fun project -> CopyDir solution.OutputLibStrongNameDir project.OutputDir (fun n -> n.Contains(project.AssemblyName + ".dll") || n.Contains(project.AssemblyName + ".pdb") || n.Contains(project.AssemblyName + ".xml")))
-let collectNuGetPackages (project:Project) targetDir =
- CopyDir targetDir project.OutputDir (fun n -> n.EndsWith(".nupkg"))
+let collectNuGetPackages (solution:Solution) =
+ solution.Projects |> List.iter (fun project -> CopyDir solution.OutputNuGetDir project.OutputDir (fun n -> n.EndsWith(".nupkg")))
// --------------------------------------------------------------------------------------
@@ -301,7 +346,8 @@ let provideNuGetExtraFiles path (bundle:Bundle) (pack:Package) =
// SIGN
-let sign fingerprint timeserver files =
+let sign fingerprint timeserver (solution: Solution) =
+ let files = solution.Projects |> Seq.collect (fun p -> !! (p.OutputDir + "/**/" + p.AssemblyName + ".dll"))
let fileArgs = files |> Seq.map (sprintf "\"%s\"") |> String.concat " "
let optionsArgs = sprintf """/v /fd sha256 /sha1 "%s" /tr "%s" /td sha256""" fingerprint timeserver
let arguments = sprintf """sign %s %s""" optionsArgs fileArgs
@@ -312,15 +358,17 @@ let sign fingerprint timeserver files =
if result <> 0 then
failwithf "Error during SignTool call "
-let signNuGet fingerprint timeserver file =
+let signNuGet fingerprint timeserver (solution: Solution) =
CleanDir "obj/NuGet"
- let args = sprintf """sign "%s" -HashAlgorithm SHA256 -TimestampHashAlgorithm SHA256 -CertificateFingerprint "%s" -Timestamper "%s""" (FullName file) fingerprint timeserver
- let result =
- ExecProcess (fun info ->
- info.FileName <- "packages/build/NuGet.CommandLine/tools/NuGet.exe"
- info.WorkingDirectory <- FullName "obj/NuGet"
- info.Arguments <- args) (TimeSpan.FromMinutes 10.)
- if result <> 0 then failwith "Error during NuGet sign."
+ !! (solution.OutputNuGetDir > "*.nupkg")
+ |> Seq.iter (fun file ->
+ let args = sprintf """sign "%s" -HashAlgorithm SHA256 -TimestampHashAlgorithm SHA256 -CertificateFingerprint "%s" -Timestamper "%s""" (FullName file) fingerprint timeserver
+ let result =
+ ExecProcess (fun info ->
+ info.FileName <- "packages/build/NuGet.CommandLine/tools/NuGet.exe"
+ info.WorkingDirectory <- FullName "obj/NuGet"
+ info.Arguments <- args) (TimeSpan.FromMinutes 10.)
+ if result <> 0 then failwith "Error during NuGet sign.")
DeleteDir "obj/NuGet"