From 5a7fb139eb18f76e414d95656636ce42e676797e Mon Sep 17 00:00:00 2001 From: Christoph Ruegg Date: Sat, 26 May 2018 16:30:09 +0200 Subject: [PATCH] Build: define solutions --- build.fsx | 192 +++++++++++++++----------------------- build/build-framework.fsx | 134 +++++++++++++++++--------- 2 files changed, 164 insertions(+), 162 deletions(-) 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"