summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorobadz <dav-github@odav.org>2015-05-22 14:25:02 +0100
committerobadz <dav-github@odav.org>2015-06-06 09:06:22 -0400
commitd4681bf62672083f92545e02e00b8cf040247e8d (patch)
tree24f50b3dfad442cf340db277740ec2e7fe0b7239
parent4cf3596fdae5982b5c549c52977662ace7bff26a (diff)
Lay down the foundation for packaging the .NET echosystem
- fetchNuGet can fetch binaries from nuget servers - buildDotnetPackage can build .NET packages using mono/xbuild - Places nuget & paket as they would clash with nix - Patch project files because F# targets are expected to be found in the mono directory (and we know that's not going to happen on nix) - Find DLLs that were copied from buildInputs and replace by symlink for sharing - Export produced DLL via the pkg-config mechanism - Create wrappers for produced EXEs - Repackaged this new infrastructure: keepass, monodevelop - Newly packaged: ExtCore, UnionArgParser, FSharp.Data, Paket, and a bunch more.. This is a combination of 73 commits.
-rw-r--r--pkgs/applications/editors/monodevelop/default.nix77
-rw-r--r--pkgs/applications/editors/monodevelop/git-revert-12d610fb3f6dce121df538e36f21d8c2eeb0a6e3.patch57
-rw-r--r--pkgs/applications/misc/keepass/default.nix30
-rw-r--r--pkgs/applications/misc/keepass/keepass.patch89
-rw-r--r--pkgs/build-support/build-dotnet-package/default.nix109
-rw-r--r--pkgs/build-support/dotnetbuildhelpers/create-pkg-config-for-dll.sh23
-rw-r--r--pkgs/build-support/dotnetbuildhelpers/default.nix18
-rw-r--r--pkgs/build-support/dotnetbuildhelpers/patch-fsharp-targets.sh20
-rw-r--r--pkgs/build-support/dotnetbuildhelpers/placate-nuget.sh7
-rw-r--r--pkgs/build-support/dotnetbuildhelpers/placate-paket.sh7
-rw-r--r--pkgs/build-support/dotnetbuildhelpers/remove-duplicated-dlls.sh22
-rw-r--r--pkgs/build-support/fetchnuget/default.nix40
-rw-r--r--pkgs/development/compilers/fsharp/default.nix10
-rw-r--r--pkgs/development/compilers/mono/default.nix15
-rw-r--r--pkgs/development/compilers/mono/pkgconfig-before-gac.patch65
-rw-r--r--pkgs/development/dotnet-modules/patches/monodevelop-fsharpbinding.addin-xml.patch88
-rw-r--r--pkgs/development/dotnet-modules/patches/monodevelop-fsharpbinding.references.patch43
-rw-r--r--pkgs/development/dotnet-modules/patches/newtonsoft-json.references.patch11
-rw-r--r--pkgs/top-level/all-packages.nix9
-rw-r--r--pkgs/top-level/dotnet-packages.nix495
20 files changed, 1159 insertions, 76 deletions
diff --git a/pkgs/applications/editors/monodevelop/default.nix b/pkgs/applications/editors/monodevelop/default.nix
index b04e37746e05..b27bc75ed59e 100644
--- a/pkgs/applications/editors/monodevelop/default.nix
+++ b/pkgs/applications/editors/monodevelop/default.nix
@@ -1,6 +1,7 @@
-{ stdenv, fetchurl, fetchgit
+{ stdenv, fetchurl, fetchgit, fetchNuGet
, autoconf, automake, pkgconfig, shared_mime_info, intltool
, glib, mono, gtk-sharp, gnome, gnome-sharp, unzip
+, dotnetPackages
}:
stdenv.mkDerivation rec {
@@ -13,79 +14,33 @@ stdenv.mkDerivation rec {
sha256 = "1bgqvlfi6pilj2zxsviqilh63qq98wsijqdiqwpkqchcw741zlyn";
};
- srcNugetBinary = fetchgit {
- url = "https://github.com/mono/nuget-binary.git";
- rev = "da1f2102f8172df6f7a1370a4998e3f88b91c047";
- sha256 = "1hbnckc4gvqkknf8gh1k7iwqb4vdzifdjd19i60fnczly5v8m1c3";
- };
-
- srcNUnit = fetchurl {
- url = "https://www.nuget.org/api/v2/package/NUnit/2.6.3";
- sha256 = "0bb16i4ggwz32wkxsh485wf014cqqzhbyx0b3wbpmqjw7p4canph";
- };
-
- srcNUnitRunners = fetchurl {
- url = "https://www.nuget.org/api/v2/package/NUnit.Runners/2.6.3";
- sha256 = "0qwx1i9lxkp9pijj2bsczzgsamz651hngkxraqjap1v4m7d09a3b";
- };
-
- srcNUnit2510 = fetchurl {
+ nunit2510 = fetchurl {
url = "http://launchpad.net/nunitv2/2.5/2.5.10/+download/NUnit-2.5.10.11092.zip";
sha256 = "0k5h5bz1p2v3d0w0hpkpbpvdkcszgp8sr9ik498r1bs72w5qlwnc";
};
- srcNugetSystemWebMvcExtensions = fetchurl {
- url = https://www.nuget.org/api/v2/package/System.Web.Mvc.Extensions.Mvc.4/1.0.9;
- sha256 = "19wi662m8primpimzifv8k560m6ymm73z0mf1r8ixl0xqag1hx6j";
- };
-
- srcNugetMicrosoftAspNetMvc = fetchurl {
- url = https://www.nuget.org/api/v2/package/Microsoft.AspNet.Mvc/5.2.2;
- sha256 = "1jwfmz42kw2yb1g2hgp2h34fc4wx6s8z71da3mw5i4ivs25w9n2b";
- };
-
- srcNugetMicrosoftAspNetRazor = fetchurl {
- url = https://www.nuget.org/api/v2/package/Microsoft.AspNet.Razor/3.2.2;
- sha256 = "1db3apn4vzz1bx6q5fyv6nyx0drz095xgazqbw60qnhfs7z45axd";
- };
-
- srcNugetMicrosoftAspNetWebPages = fetchurl {
- url = https://www.nuget.org/api/v2/package/Microsoft.AspNet.WebPages/3.2.2;
- sha256 = "17fwb5yj165sql80i47zirjnm0gr4n8ypz408mz7p8a1n40r4i5l";
- };
-
- srcNugetMicrosoftWebInfrastructure = fetchurl {
- url = https://www.nuget.org/api/v2/package/Microsoft.Web.Infrastructure/1.0.0.0;
- sha256 = "1mxl9dri5729d0jl84gkpqifqf4xzb6aw1rzcfh6l0r24bix9afn";
- };
-
postPatch = ''
# From https://bugzilla.xamarin.com/show_bug.cgi?id=23696#c19
- # it seems parts of MonoDevelop 5.2+ need NUnit 2.6.4, which isn't included
- # (?), so download it and put it in the right place in the tree
- mkdir packages
- unzip ${srcNUnit} -d packages/NUnit.2.6.3
- unzip ${srcNUnitRunners} -d packages/NUnit.Runners.2.6.3
-
# cecil needs NUnit 2.5.10 - this is also missing from the tar
- unzip -j ${srcNUnit2510} -d external/cecil/Test/libs/nunit-2.5.10 NUnit-2.5.10.11092/bin/net-2.0/framework/\*
+ unzip -j ${nunit2510} -d external/cecil/Test/libs/nunit-2.5.10 NUnit-2.5.10.11092/bin/net-2.0/framework/\*
# the tar doesn't include the nuget binary, so grab it from github and copy it
# into the right place
- cp -vfR ${srcNugetBinary}/* external/nuget-binary/
-
- # AspNet plugin requires these packages
- unzip ${srcNugetSystemWebMvcExtensions} -d packages/System.Web.Mvc.Extensions.Mvc.4.1.0.9
- unzip ${srcNugetMicrosoftAspNetMvc} -d packages/Microsoft.AspNet.Mvc.5.2.2
- unzip ${srcNugetMicrosoftAspNetRazor} -d packages/Microsoft.AspNet.Razor.3.2.2
- unzip ${srcNugetMicrosoftAspNetWebPages} -d packages/Microsoft.AspNet.WebPages.3.2.2
- unzip ${srcNugetMicrosoftWebInfrastructure} -d packages/Microsoft.Web.Infrastructure.1.0.0.0
+ cp -vfR "$(dirname $(pkg-config NuGet.Core --variable=Libraries))"/* external/nuget-binary/
'';
+ # Revert this commit which broke the ability to use pkg-config to locate dlls
+ patchFlags = [ "-p2" ];
+ patches = [ ./git-revert-12d610fb3f6dce121df538e36f21d8c2eeb0a6e3.patch ];
+
buildInputs = [
autoconf automake pkgconfig shared_mime_info intltool
mono gtk-sharp gnome-sharp unzip
+ pkgconfig
+ dotnetPackages.NUnit
+ dotnetPackages.NUnitRunners
+ dotnetPackages.Nuget
];
preConfigure = "patchShebangs ./configure";
@@ -108,6 +63,12 @@ stdenv.mkDerivation rec {
>
EOF
done
+
+ # Without this, you get a missing DLL error any time you install an addin..
+ ln -sv `pkg-config nunit.core --variable=Libraries` $out/lib/monodevelop/AddIns/NUnit
+ ln -sv `pkg-config nunit.core.interfaces --variable=Libraries` $out/lib/monodevelop/AddIns/NUnit
+ ln -sv `pkg-config nunit.framework --variable=Libraries` $out/lib/monodevelop/AddIns/NUnit
+ ln -sv `pkg-config nunit.util --variable=Libraries` $out/lib/monodevelop/AddIns/NUnit
'';
dontStrip = true;
diff --git a/pkgs/applications/editors/monodevelop/git-revert-12d610fb3f6dce121df538e36f21d8c2eeb0a6e3.patch b/pkgs/applications/editors/monodevelop/git-revert-12d610fb3f6dce121df538e36f21d8c2eeb0a6e3.patch
new file mode 100644
index 000000000000..969aad33ec0b
--- /dev/null
+++ b/pkgs/applications/editors/monodevelop/git-revert-12d610fb3f6dce121df538e36f21d8c2eeb0a6e3.patch
@@ -0,0 +1,57 @@
+diff --git a/main/src/addins/AspNet/MonoDevelop.AspNet.csproj b/main/src/addins/AspNet/MonoDevelop.AspNet.csproj
+index 02d3a01..c6daaad 100644
+--- a/main/src/addins/AspNet/MonoDevelop.AspNet.csproj
++++ b/main/src/addins/AspNet/MonoDevelop.AspNet.csproj
+@@ -452,34 +452,6 @@
+ <None Include="Templates\Projects\WebApplication.xpt.xml">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+- <None Include="..\..\..\packages\Microsoft.AspNet.Mvc.5.2.2\lib\net45\System.Web.Mvc.dll">
+- <Link>System.Web.Mvc.dll</Link>
+- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+- </None>
+- <None Include="..\..\..\packages\Microsoft.AspNet.Razor.3.2.2\lib\net45\System.Web.Razor.dll">
+- <Link>System.Web.Razor.dll</Link>
+- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+- </None>
+- <None Include="..\..\..\packages\Microsoft.AspNet.WebPages.3.2.2\lib\net45\System.Web.Helpers.dll">
+- <Link>System.Web.Helpers.dll</Link>
+- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+- </None>
+- <None Include="..\..\..\packages\Microsoft.AspNet.WebPages.3.2.2\lib\net45\System.Web.WebPages.Deployment.dll">
+- <Link>System.Web.WebPages.Deployment.dll</Link>
+- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+- </None>
+- <None Include="..\..\..\packages\Microsoft.AspNet.WebPages.3.2.2\lib\net45\System.Web.WebPages.dll">
+- <Link>System.Web.WebPages.dll</Link>
+- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+- </None>
+- <None Include="..\..\..\packages\Microsoft.AspNet.WebPages.3.2.2\lib\net45\System.Web.WebPages.Razor.dll">
+- <Link>System.Web.WebPages.Razor.dll</Link>
+- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+- </None>
+- <None Include="..\..\..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll">
+- <Link>Microsoft.Web.Infrastructure.dll</Link>
+- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+- </None>
+ <None Include="packages.config" />
+ </ItemGroup>
+ <ItemGroup>
+diff --git a/main/src/addins/AspNet/Properties/MonoDevelop.AspNet.addin.xml b/main/src/addins/AspNet/Properties/MonoDevelop.AspNet.addin.xml
+index eab7c32..4a75311 100644
+--- a/main/src/addins/AspNet/Properties/MonoDevelop.AspNet.addin.xml
++++ b/main/src/addins/AspNet/Properties/MonoDevelop.AspNet.addin.xml
+@@ -1,13 +1,6 @@
+ <ExtensionModel>
+
+ <Runtime>
+- <Import assembly = "System.Web.Helpers.dll" />
+- <Import assembly = "System.Web.Mvc.dll" />
+- <Import assembly = "System.Web.Razor.dll" />
+- <Import assembly = "System.Web.WebPages.Deployment.dll" />
+- <Import assembly = "System.Web.WebPages.dll" />
+- <Import assembly = "System.Web.WebPages.Razor.dll" />
+-
+ <Import file = "Html/Schemas/xhtml1-strict.xsd" />
+ <Import file = "Html/Schemas/xhtml1-transitional.xsd" />
+ <Import file = "Html/Schemas/xhtml1-frameset.xsd" />
diff --git a/pkgs/applications/misc/keepass/default.nix b/pkgs/applications/misc/keepass/default.nix
index d46efc4e5e89..f659e4f6c2dd 100644
--- a/pkgs/applications/misc/keepass/default.nix
+++ b/pkgs/applications/misc/keepass/default.nix
@@ -1,17 +1,21 @@
-{ stdenv, fetchurl, unzip, makeDesktopItem, mono }:
+{ stdenv, fetchurl, buildDotnetPackage, makeWrapper, unzip, makeDesktopItem }:
-stdenv.mkDerivation rec {
- name = "keepass-${version}";
+buildDotnetPackage rec {
+ baseName = "keepass";
version = "2.29";
src = fetchurl {
- url = "mirror://sourceforge/keepass/KeePass-${version}.zip";
- sha256 = "16x7m899akpi036c0wlr41w7fz9q0b69yac9q97rqkixb03l4g9d";
+ url = "mirror://sourceforge/keepass/KeePass-${version}-Source.zip";
+ sha256 = "051s0aznyyhbpdbly6h5rs0ax0zvkp45dh93nmq6lwhicswjwn5m";
};
sourceRoot = ".";
- phases = [ "unpackPhase" "installPhase" ];
+ buildInputs = [ unzip ];
+
+ patches = [ ./keepass.patch ];
+
+ preConfigure = "rm -rvf Build/*";
desktopItem = makeDesktopItem {
name = "keepass";
@@ -22,23 +26,19 @@ stdenv.mkDerivation rec {
categories = "Application;Other;";
};
+ outputFiles = [ "Build/KeePass/Release/*" "Build/KeePassLib/Release/*" ];
+ dllFiles = [ "KeePassLib.dll" ];
+ exeFiles = [ "KeePass.exe" ];
- installPhase = ''
- mkdir -p "$out/bin"
- echo "${mono}/bin/mono $out/KeePass.exe" > $out/bin/keepass
- chmod +x $out/bin/keepass
- echo $out
- cp -r ./* $out/
+ postInstall = ''
mkdir -p "$out/share/applications"
cp ${desktopItem}/share/applications/* $out/share/applications
'';
- buildInputs = [ unzip ];
-
meta = {
description = "GUI password manager with strong cryptography";
homepage = http://www.keepass.info/;
- maintainers = with stdenv.lib.maintainers; [amorsillo];
+ maintainers = with stdenv.lib.maintainers; [ amorsillo obadz ];
platforms = with stdenv.lib.platforms; all;
license = stdenv.lib.licenses.gpl2;
};
diff --git a/pkgs/applications/misc/keepass/keepass.patch b/pkgs/applications/misc/keepass/keepass.patch
new file mode 100644
index 000000000000..6ecf0bb074de
--- /dev/null
+++ b/pkgs/applications/misc/keepass/keepass.patch
@@ -0,0 +1,89 @@
+diff -Naur old/KeePass/KeePass.csproj new/KeePass/KeePass.csproj
+--- old/KeePass/KeePass.csproj 2015-04-10 11:00:46.000000000 +0100
++++ new/KeePass/KeePass.csproj 2015-05-27 16:35:52.196177593 +0100
+@@ -1,4 +1,4 @@
+-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
++<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+@@ -10,7 +10,7 @@
+ <RootNamespace>KeePass</RootNamespace>
+ <AssemblyName>KeePass</AssemblyName>
+ <ApplicationIcon>KeePass.ico</ApplicationIcon>
+- <SignAssembly>true</SignAssembly>
++ <SignAssembly>false</SignAssembly>
+ <AssemblyOriginatorKeyFile>KeePass.pfx</AssemblyOriginatorKeyFile>
+ <FileUpgradeFlags>
+ </FileUpgradeFlags>
+@@ -1316,6 +1316,5 @@
+ </Target>
+ -->
+ <PropertyGroup>
+- <PostBuildEvent>"$(FrameworkSDKDir)bin\sgen.exe" /assembly:"$(TargetPath)" /force /nologo /compiler:/keycontainer:VS_KEY_33430356D8D7D1B8 /compiler:/delaysign-</PostBuildEvent>
+ </PropertyGroup>
+-</Project>
+\ No newline at end of file
++</Project>
+diff -Naur old/KeePassLib/KeePassLib.csproj new/KeePassLib/KeePassLib.csproj
+--- old/KeePassLib/KeePassLib.csproj 2014-05-08 15:00:24.000000000 +0100
++++ new/KeePassLib/KeePassLib.csproj 2015-05-27 16:35:52.197177562 +0100
+@@ -1,4 +1,4 @@
+-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
++<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+@@ -9,7 +9,7 @@
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>KeePassLib</RootNamespace>
+ <AssemblyName>KeePassLib</AssemblyName>
+- <SignAssembly>true</SignAssembly>
++ <SignAssembly>false</SignAssembly>
+ <AssemblyOriginatorKeyFile>KeePassLib.pfx</AssemblyOriginatorKeyFile>
+ <FileUpgradeFlags>
+ </FileUpgradeFlags>
+diff -Naur old/KeePass.sln new/KeePass.sln
+--- old/KeePass.sln 2009-08-31 19:47:28.000000000 +0100
++++ new/KeePass.sln 2015-05-27 16:35:59.568953518 +0100
+@@ -1,11 +1,9 @@
+-Microsoft Visual Studio Solution File, Format Version 10.00
++Microsoft Visual Studio Solution File, Format Version 12.00
+ # Visual Studio 2008
+ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeePassLib", "KeePassLib\KeePassLib.csproj", "{53573E4E-33CB-4FDB-8698-C95F5E40E7F3}"
+ EndProject
+ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeePass", "KeePass\KeePass.csproj", "{10938016-DEE2-4A25-9A5A-8FD3444379CA}"
+ EndProject
+-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeePassLibSD", "KeePassLibSD\KeePassLibSD.csproj", "{DC15F71A-2117-4DEF-8C10-AA355B5E5979}"
+-EndProject
+ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TrlUtil", "Translation\TrlUtil\TrlUtil.csproj", "{B7E890E7-BF50-4450-9A52-C105BD98651C}"
+ EndProject
+ Global
+@@ -44,18 +42,6 @@
+ {10938016-DEE2-4A25-9A5A-8FD3444379CA}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {10938016-DEE2-4A25-9A5A-8FD3444379CA}.Release|Win32.ActiveCfg = Release|Any CPU
+ {10938016-DEE2-4A25-9A5A-8FD3444379CA}.Release|x64.ActiveCfg = Release|Any CPU
+- {DC15F71A-2117-4DEF-8C10-AA355B5E5979}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+- {DC15F71A-2117-4DEF-8C10-AA355B5E5979}.Debug|Any CPU.Build.0 = Debug|Any CPU
+- {DC15F71A-2117-4DEF-8C10-AA355B5E5979}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+- {DC15F71A-2117-4DEF-8C10-AA355B5E5979}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+- {DC15F71A-2117-4DEF-8C10-AA355B5E5979}.Debug|Win32.ActiveCfg = Debug|Any CPU
+- {DC15F71A-2117-4DEF-8C10-AA355B5E5979}.Debug|x64.ActiveCfg = Debug|Any CPU
+- {DC15F71A-2117-4DEF-8C10-AA355B5E5979}.Release|Any CPU.ActiveCfg = Release|Any CPU
+- {DC15F71A-2117-4DEF-8C10-AA355B5E5979}.Release|Any CPU.Build.0 = Release|Any CPU
+- {DC15F71A-2117-4DEF-8C10-AA355B5E5979}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+- {DC15F71A-2117-4DEF-8C10-AA355B5E5979}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+- {DC15F71A-2117-4DEF-8C10-AA355B5E5979}.Release|Win32.ActiveCfg = Release|Any CPU
+- {DC15F71A-2117-4DEF-8C10-AA355B5E5979}.Release|x64.ActiveCfg = Release|Any CPU
+ {B7E890E7-BF50-4450-9A52-C105BD98651C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B7E890E7-BF50-4450-9A52-C105BD98651C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B7E890E7-BF50-4450-9A52-C105BD98651C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+diff -Naur old/Translation/TrlUtil/TrlUtil.csproj new/Translation/TrlUtil/TrlUtil.csproj
+--- old/Translation/TrlUtil/TrlUtil.csproj 2013-07-21 10:06:38.000000000 +0100
++++ new/Translation/TrlUtil/TrlUtil.csproj 2015-05-27 16:35:52.197177562 +0100
+@@ -1,4 +1,4 @@
+-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
++<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
diff --git a/pkgs/build-support/build-dotnet-package/default.nix b/pkgs/build-support/build-dotnet-package/default.nix
new file mode 100644
index 000000000000..00be987af752
--- /dev/null
+++ b/pkgs/build-support/build-dotnet-package/default.nix
@@ -0,0 +1,109 @@
+{ stdenv, lib, makeWrapper, pkgconfig, mono, dotnetbuildhelpers }:
+
+attrsOrig @
+{ baseName
+, version
+, buildInputs ? []
+, xBuildFiles ? [ ]
+, xBuildFlags ? [ "/p:Configuration=Release" ]
+, outputFiles ? [ "bin/Release/*" ]
+, dllFiles ? [ "*.dll" ]
+, exeFiles ? [ "*.exe" ]
+, ... }:
+ let
+ arrayToShell = (a: toString (map (lib.escape (lib.stringToCharacters "\\ ';$`()|<>\t") ) a));
+
+ attrs = {
+ name = "${baseName}-${version}";
+
+ buildInputs = [
+ pkgconfig
+ mono
+ dotnetbuildhelpers
+ makeWrapper
+ ] ++ buildInputs;
+
+ configurePhase = ''
+ runHook preConfigure
+
+ [ -z "$dontPlacateNuget" ] && placate-nuget.sh
+ [ -z "$dontPlacatePaket" ] && placate-paket.sh
+ [ -z "$dontPatchFSharpTargets" ] && patch-fsharp-targets.sh
+
+ runHook postConfigure
+ '';
+
+ buildPhase = ''
+ runHook preBuild
+
+ echo Building dotNET packages...
+
+ # Probably needs to be moved to fsharp
+ if pkg-config FSharp.Core
+ then
+ export FSharpTargetsPath="$(dirname $(pkg-config FSharp.Core --variable=Libraries))/Microsoft.FSharp.Targets"
+ fi
+
+ ran=""
+ for xBuildFile in ${arrayToShell xBuildFiles} ''${xBuildFilesExtra}
+ do
+ ran="yes"
+ xbuild ${arrayToShell xBuildFlags} ''${xBuildFlagsArray} $xBuildFile
+ done
+
+ [ -z "$ran" ] && xbuild ${arrayToShell xBuildFlags} ''${xBuildFlagsArray}
+
+ runHook postBuild
+ '';
+
+ dontStrip = true;
+
+ installPhase = ''
+ runHook preInstall
+
+ target="$out/lib/dotnet/${baseName}"
+ mkdir -p "$target"
+
+ cp -rv ${arrayToShell outputFiles} "''${outputFilesArray[@]}" "$target"
+
+ if [ -z "$dontRemoveDuplicatedDlls" ]
+ then
+ pushd "$out"
+ remove-duplicated-dlls.sh
+ popd
+ fi
+
+ set -f
+ for dllPattern in ${arrayToShell dllFiles} ''${dllFilesArray[@]}
+ do
+ set +f
+ for dll in "$target"/$dllPattern
+ do
+ [ -f "$dll" ] || continue
+ if pkg-config $(basename -s .dll "$dll")
+ then
+ echo "$dll already exported by a buildInputs, not re-exporting"
+ else
+ ${dotnetbuildhelpers}/bin/create-pkg-config-for-dll.sh "$out/lib/pkgconfig" "$dll"
+ fi
+ done
+ done
+
+ set -f
+ for exePattern in ${arrayToShell exeFiles} ''${exeFilesArray[@]}
+ do
+ set +f
+ for exe in "$target"/$exePattern
+ do
+ [ -f "$exe" ] || continue
+ mkdir -p "$out"/bin
+ commandName="$(basename -s .exe "$(echo "$exe" | tr "[A-Z]" "[a-z]")")"
+ makeWrapper "${mono}/bin/mono \"$exe\"" "$out"/bin/"$commandName"
+ done
+ done
+
+ runHook postInstall
+ '';
+ };
+ in
+ stdenv.mkDerivation (attrs // (builtins.removeAttrs attrsOrig [ "buildInputs" ] ))
diff --git a/pkgs/build-support/dotnetbuildhelpers/create-pkg-config-for-dll.sh b/pkgs/build-support/dotnetbuildhelpers/create-pkg-config-for-dll.sh
new file mode 100644
index 000000000000..379141704523
--- /dev/null
+++ b/pkgs/build-support/dotnetbuildhelpers/create-pkg-config-for-dll.sh
@@ -0,0 +1,23 @@
+#!/usr/bin/env bash
+
+targetDir="$1"
+dllFullPath="$2"
+
+dllVersion="$(monodis --assembly "$dllFullPath" | grep ^Version: | cut -f 2 -d : | xargs)"
+[ -z "$dllVersion" ] && echo "Defaulting dllVersion to 0.0.0" && dllVersion="0.0.0"
+dllFileName="$(basename $dllFullPath)"
+dllRootName="$(basename -s .dll $dllFileName)"
+targetPcFile="$targetDir"/"$dllRootName".pc
+
+mkdir -p "$targetDir"
+
+cat > $targetPcFile << EOF
+Libraries=$dllFullPath
+
+Name: $dllRootName
+Description: $dllRootName
+Version: $dllVersion
+Libs: -r:$dllFileName
+EOF
+
+echo "Created $targetPcFile"
diff --git a/pkgs/build-support/dotnetbuildhelpers/default.nix b/pkgs/build-support/dotnetbuildhelpers/default.nix
new file mode 100644
index 000000000000..ed0d4f790c81
--- /dev/null
+++ b/pkgs/build-support/dotnetbuildhelpers/default.nix
@@ -0,0 +1,18 @@
+{ helperFunctions, mono, pkgconfig }:
+ helperFunctions.runCommand
+ "dotnetbuildhelpers"
+ { preferLocalBuild = true; }
+ ''
+ target="$out/bin"
+ mkdir -p "$target"
+
+ for script in ${./create-pkg-config-for-dll.sh} ${./patch-fsharp-targets.sh} ${./remove-duplicated-dlls.sh} ${./placate-nuget.sh} ${./placate-paket.sh}
+ do
+ scriptName="$(basename "$script" | cut -f 2- -d -)"
+ cp -v "$script" "$target"/"$scriptName"
+ chmod 755 "$target"/"$scriptName"
+ patchShebangs "$target"/"$scriptName"
+ substituteInPlace "$target"/"$scriptName" --replace pkg-config ${pkgconfig}/bin/pkg-config
+ substituteInPlace "$target"/"$scriptName" --replace monodis ${mono}/bin/monodis
+ done
+ ''
diff --git a/pkgs/build-support/dotnetbuildhelpers/patch-fsharp-targets.sh b/pkgs/build-support/dotnetbuildhelpers/patch-fsharp-targets.sh
new file mode 100644
index 000000000000..3f81cc73e801
--- /dev/null
+++ b/pkgs/build-support/dotnetbuildhelpers/patch-fsharp-targets.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+# Some project files look for F# targets in $(FSharpTargetsPath)
+# so it's a good idea to add something like this to your ~/.bash_profile:
+
+# export FSharpTargetsPath=$(dirname $(which fsharpc))/../lib/mono/4.0/Microsoft.FSharp.Targets
+
+# In build scripts, you would add somehting like this:
+
+# export FSharpTargetsPath="${fsharp}/lib/mono/4.0/Microsoft.FSharp.Targets"
+
+# However, some project files look for F# targets in the main Mono directory. When that happens
+# patch the project files using this script so they will look in $(FSharpTargetsPath) instead.
+
+echo "Patching F# targets in fsproj files..."
+
+find -iname \*.fsproj -print -exec \
+ sed --in-place=.bak \
+ -e 's,<FSharpTargetsPath>\([^<]*\)</FSharpTargetsPath>,<FSharpTargetsPath Condition="Exists('\'\\1\'')">\1</FSharpTargetsPath>,'g \
+ {} \;
diff --git a/pkgs/build-support/dotnetbuildhelpers/placate-nuget.sh b/pkgs/build-support/dotnetbuildhelpers/placate-nuget.sh
new file mode 100644
index 000000000000..8a7f36522a3d
--- /dev/null
+++ b/pkgs/build-support/dotnetbuildhelpers/placate-nuget.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+
+echo Placating Nuget in nuget.targets
+find -iname nuget.targets -print -exec sed --in-place=bak -e 's,mono --runtime[^<]*,true NUGET PLACATED BY buildDotnetPackage,g' {} \;
+
+echo Just to be sure, replacing Nuget executables by empty files.
+find . -iname nuget.exe \! -size 0 -exec mv -v {} {}.bak \; -exec touch {} \;
diff --git a/pkgs/build-support/dotnetbuildhelpers/placate-paket.sh b/pkgs/build-support/dotnetbuildhelpers/placate-paket.sh
new file mode 100644
index 000000000000..0dbf1eecbad8
--- /dev/null
+++ b/pkgs/build-support/dotnetbuildhelpers/placate-paket.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+
+echo Placating Paket in paket.targets
+find -iname paket.targets -print -exec sed --in-place=bak -e 's,mono --runtime[^<]*,true PAKET PLACATED BY buildDotnetPackage,g' {} \;
+
+echo Just to be sure, replacing Paket executables by empty files.
+find . -iname paket\*.exe \! -size 0 -exec mv -v {} {}.bak \; -exec touch {} \;
diff --git a/pkgs/build-support/dotnetbuildhelpers/remove-duplicated-dlls.sh b/pkgs/build-support/dotnetbuildhelpers/remove-duplicated-dlls.sh
new file mode 100644
index 000000000000..d8d29912c8fa
--- /dev/null
+++ b/pkgs/build-support/dotnetbuildhelpers/remove-duplicated-dlls.sh
@@ -0,0 +1,22 @@
+#!/usr/bin/env bash
+
+IFS="
+"
+
+for dll in $(find -iname \*.dll)
+do
+ baseName="$(basename "$dll" | sed "s/.dll$//i")"
+ if pkg-config "$baseName"
+ then
+ candidateDll="$(pkg-config "$baseName" --variable=Libraries)"
+
+ if diff "$dll" "$candidateDll" >/dev/null
+ then
+ echo "$dll is identical to $candidateDll. Substituting..."
+ rm -vf "$dll"
+ ln -sv "$candidateDll" "$dll"
+ else
+ echo "$dll and $candidateDll share the same name but have different contents, leaving alone."
+ fi
+ fi
+done
diff --git a/pkgs/build-support/fetchnuget/default.nix b/pkgs/build-support/fetchnuget/default.nix
new file mode 100644
index 000000000000..803db27c9d56
--- /dev/null
+++ b/pkgs/build-support/fetchnuget/default.nix
@@ -0,0 +1,40 @@
+{ stdenv, fetchurl, buildDotnetPackage, unzip }:
+
+attrs @
+{ baseName
+, version
+, url ? "https://www.nuget.org/api/v2/package/${baseName}/${version}"
+, sha256 ? ""
+, md5 ? ""
+, ...
+}:
+ buildDotnetPackage ({
+ src = fetchurl {
+ inherit url sha256 md5;
+ name = "${baseName}.${version}.zip";
+ };
+
+ sourceRoot = ".";
+
+ buildInputs = [ unzip ];
+
+ phases = [ "unpackPhase" "installPhase" ];
+
+ preInstall = ''
+ function traverseRename () {
+ for e in *
+ do
+ t="$(echo "$e" | sed -e "s/%20/\ /g" -e "s/%2B/+/g")"
+ [ "$t" != "$e" ] && mv -vn "$e" "$t"
+ if [ -d "$t" ]
+ then
+ cd "$t"
+ traverseRename
+ cd ..
+ fi
+ done
+ }
+
+ traverseRename
+ '';
+ } // attrs)
diff --git a/pkgs/development/compilers/fsharp/default.nix b/pkgs/development/compilers/fsharp/default.nix
index 82742cf9af69..92d80deb532e 100644
--- a/pkgs/development/compilers/fsharp/default.nix
+++ b/pkgs/development/compilers/fsharp/default.nix
@@ -1,4 +1,6 @@
-{ stdenv, fetchurl, mono, pkgconfig, autoconf, automake, which }:
+# Temporaririly avoid dependency on dotnetbuildhelpers to avoid rebuilding many times while working on it
+
+{ stdenv, fetchurl, mono, pkgconfig, dotnetbuildhelpers, autoconf, automake, which }:
stdenv.mkDerivation rec {
name = "fsharp-${version}";
@@ -9,7 +11,7 @@ stdenv.mkDerivation rec {
sha256 = "16kqgdx0y0lmxv59mc4g7l5ll60nixg5b8bg07vxfnqrf7i6dffd";
};
- buildInputs = [ mono pkgconfig autoconf automake which ];
+ buildInputs = [ mono pkgconfig dotnetbuildhelpers autoconf automake which ];
configurePhase = ''
substituteInPlace ./autogen.sh --replace "/usr/bin/env sh" "/bin/sh"
./autogen.sh --prefix $out
@@ -23,6 +25,10 @@ stdenv.mkDerivation rec {
substituteInPlace $out/bin/fsharpiAnyCpu --replace " mono " " ${mono}/bin/mono "
ln -s $out/bin/fsharpc $out/bin/fsc
ln -s $out/bin/fsharpi $out/bin/fsi
+ for dll in "$out/lib/mono/4.5"/FSharp*.dll
+ do
+ create-pkg-config-for-dll.sh "$out/lib/pkgconfig" "$dll"
+ done
'';
# To fix this error when running:
diff --git a/pkgs/development/compilers/mono/default.nix b/pkgs/development/compilers/mono/default.nix
index ba2ce00cfb56..66939ff1a026 100644
--- a/pkgs/development/compilers/mono/default.nix
+++ b/pkgs/development/compilers/mono/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, bison, pkgconfig, glib, gettext, perl, libgdiplus, libX11, callPackage, ncurses, zlib, withLLVM ? true }:
+{ stdenv, fetchurl, bison, pkgconfig, glib, gettext, perl, libgdiplus, libX11, callPackage, ncurses, zlib, withLLVM ? false, cacert }:
let
llvm = callPackage ./llvm.nix { };
@@ -31,11 +31,16 @@ stdenv.mkDerivation rec {
# Parallel building doesn't work, as shows http://hydra.nixos.org/build/2983601
enableParallelBuilding = false;
+ # We want pkg-config to take priority over the dlls in the Mono framework and the GAC
+ # because we control pkg-config
+ patches = [ ./pkgconfig-before-gac.patch ];
+
# Patch all the necessary scripts. Also, if we're using LLVM, we fix the default
# LLVM path to point into the Mono LLVM build, since it's private anyway.
preBuild = ''
makeFlagsArray=(INSTALL=`type -tp install`)
patchShebangs ./
+ substituteInPlace mcs/class/corlib/System/Environment.cs --replace /usr/share "$out/share"
'' + stdenv.lib.optionalString withLLVM ''
substituteInPlace mono/mini/aot-compiler.c --replace "llvm_path = g_strdup (\"\")" "llvm_path = g_strdup (\"${llvm}/bin/\")"
'';
@@ -50,6 +55,14 @@ stdenv.mkDerivation rec {
done
'';
+ # Without this, any Mono application attempting to open an SSL connection will throw with
+ # The authentication or decryption has failed.
+ # ---> Mono.Security.Protocol.Tls.TlsException: Invalid certificate received from server.
+ postInstall = ''
+ echo "Updating Mono key store"
+ $out/bin/cert-sync ${cacert}/etc/ssl/certs/ca-bundle.crt
+ '';
+
meta = {
homepage = http://mono-project.com/;
description = "Cross platform, open source .NET development framework";
diff --git a/pkgs/development/compilers/mono/pkgconfig-before-gac.patch b/pkgs/development/compilers/mono/pkgconfig-before-gac.patch
new file mode 100644
index 000000000000..7632d850391e
--- /dev/null
+++ b/pkgs/development/compilers/mono/pkgconfig-before-gac.patch
@@ -0,0 +1,65 @@
+diff -Naur mono-4.0.1.old/mcs/tools/xbuild/data/12.0/Microsoft.Common.targets mono-4.0.1/mcs/tools/xbuild/data/12.0/Microsoft.Common.targets
+--- mono-4.0.1.old/mcs/tools/x