Merge pull request #161504 from moinessim/writefsharp
writers: Add writeFSharp and makeFSharpWriter functions to writers
This commit is contained in:
commit
1d8b13942b
|
@ -1,4 +1,4 @@
|
||||||
{ lib, stdenvNoCC, linkFarmFromDrvs, callPackage, nuget-to-nix, writeScript, makeWrapper, fetchurl, xml2, dotnetCorePackages, dotnetPackages, cacert }:
|
{ lib, stdenvNoCC, linkFarmFromDrvs, callPackage, nuget-to-nix, writeScript, makeWrapper, fetchurl, xml2, dotnetCorePackages, dotnetPackages, mkNugetSource, mkNugetDeps, cacert }:
|
||||||
|
|
||||||
{ name ? "${args.pname}-${args.version}"
|
{ name ? "${args.pname}-${args.version}"
|
||||||
, pname ? name
|
, pname ? name
|
||||||
|
@ -74,40 +74,13 @@ let
|
||||||
inherit dotnet-sdk dotnet-test-sdk disabledTests nuget-source dotnet-runtime runtimeDeps buildType;
|
inherit dotnet-sdk dotnet-test-sdk disabledTests nuget-source dotnet-runtime runtimeDeps buildType;
|
||||||
}) dotnetConfigureHook dotnetBuildHook dotnetCheckHook dotnetInstallHook dotnetFixupHook;
|
}) dotnetConfigureHook dotnetBuildHook dotnetCheckHook dotnetInstallHook dotnetFixupHook;
|
||||||
|
|
||||||
_nugetDeps = linkFarmFromDrvs "${name}-nuget-deps" (import nugetDeps {
|
_nugetDeps = mkNugetDeps { name = "${name}-nuget-deps"; nugetDeps = import nugetDeps; };
|
||||||
fetchNuGet = { pname, version, sha256 }: fetchurl {
|
|
||||||
name = "${pname}-${version}.nupkg";
|
|
||||||
url = "https://www.nuget.org/api/v2/package/${pname}/${version}";
|
|
||||||
inherit sha256;
|
|
||||||
};
|
|
||||||
});
|
|
||||||
_localDeps = linkFarmFromDrvs "${name}-local-nuget-deps" projectReferences;
|
_localDeps = linkFarmFromDrvs "${name}-local-nuget-deps" projectReferences;
|
||||||
|
|
||||||
nuget-source = stdenvNoCC.mkDerivation rec {
|
nuget-source = mkNugetSource {
|
||||||
name = "${pname}-nuget-source";
|
name = "${args.pname}-nuget-source";
|
||||||
meta.description = "A Nuget source with the dependencies for ${pname}";
|
description = "A Nuget source with the dependencies for ${args.pname}";
|
||||||
|
deps = [ _nugetDeps _localDeps ];
|
||||||
nativeBuildInputs = [ dotnetPackages.Nuget xml2 ];
|
|
||||||
buildCommand = ''
|
|
||||||
export HOME=$(mktemp -d)
|
|
||||||
mkdir -p $out/{lib,share}
|
|
||||||
|
|
||||||
nuget sources Add -Name nixos -Source "$out/lib"
|
|
||||||
nuget init "${_nugetDeps}" "$out/lib"
|
|
||||||
${lib.optionalString (projectReferences != [])
|
|
||||||
"nuget init \"${_localDeps}\" \"$out/lib\""}
|
|
||||||
|
|
||||||
# Generates a list of all unique licenses' spdx ids.
|
|
||||||
find "$out/lib" -name "*.nuspec" -exec sh -c \
|
|
||||||
"xml2 < {} | grep "license=" | cut -d'=' -f2" \; | sort -u > $out/share/licenses
|
|
||||||
'';
|
|
||||||
} // { # This is done because we need data from `$out` for `meta`. We have to use overrides as to not hit infinite recursion.
|
|
||||||
meta.licence = let
|
|
||||||
depLicenses = lib.splitString "\n" (builtins.readFile "${nuget-source}/share/licenses");
|
|
||||||
getLicence = spdx: lib.filter (license: license.spdxId or null == spdx) (builtins.attrValues lib.licenses);
|
|
||||||
in (lib.flatten (lib.forEach depLicenses (spdx:
|
|
||||||
if (getLicence spdx) != [] then (getLicence spdx) else [] ++ lib.optional (spdx != "") spdx
|
|
||||||
)));
|
|
||||||
};
|
};
|
||||||
|
|
||||||
in stdenvNoCC.mkDerivation (args // {
|
in stdenvNoCC.mkDerivation (args // {
|
||||||
|
|
9
pkgs/build-support/dotnet/make-nuget-deps/default.nix
Normal file
9
pkgs/build-support/dotnet/make-nuget-deps/default.nix
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
{ linkFarmFromDrvs, fetchurl }:
|
||||||
|
{ name, nugetDeps }:
|
||||||
|
linkFarmFromDrvs "${name}-nuget-deps" (nugetDeps {
|
||||||
|
fetchNuGet = { pname, version, sha256 }: fetchurl {
|
||||||
|
name = "${pname}-${version}.nupkg";
|
||||||
|
url = "https://www.nuget.org/api/v2/package/${pname}/${version}";
|
||||||
|
inherit sha256;
|
||||||
|
};
|
||||||
|
})
|
30
pkgs/build-support/dotnet/make-nuget-source/default.nix
Normal file
30
pkgs/build-support/dotnet/make-nuget-source/default.nix
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
{ dotnetPackages, lib, xml2, stdenvNoCC }:
|
||||||
|
{ name, description ? "", deps ? [] }:
|
||||||
|
let
|
||||||
|
_nuget-source = stdenvNoCC.mkDerivation rec {
|
||||||
|
inherit name;
|
||||||
|
meta.description = description;
|
||||||
|
|
||||||
|
nativeBuildInputs = [ dotnetPackages.Nuget xml2 ];
|
||||||
|
buildCommand = ''
|
||||||
|
export HOME=$(mktemp -d)
|
||||||
|
mkdir -p $out/{lib,share}
|
||||||
|
|
||||||
|
nuget sources Add -Name nixos -Source "$out/lib"
|
||||||
|
${ lib.concatMapStringsSep "\n" (dep:
|
||||||
|
''nuget init "${dep}" "$out/lib"''
|
||||||
|
) deps }
|
||||||
|
|
||||||
|
# Generates a list of all unique licenses' spdx ids.
|
||||||
|
find "$out/lib" -name "*.nuspec" -exec sh -c \
|
||||||
|
"xml2 < {} | grep "license=" | cut -d'=' -f2" \; | sort -u > $out/share/licenses
|
||||||
|
'';
|
||||||
|
} // { # This is done because we need data from `$out` for `meta`. We have to use overrides as to not hit infinite recursion.
|
||||||
|
meta.licence = let
|
||||||
|
depLicenses = lib.splitString "\n" (builtins.readFile "${_nuget-source}/share/licenses");
|
||||||
|
getLicence = spdx: lib.filter (license: license.spdxId or null == spdx) (builtins.attrValues lib.licenses);
|
||||||
|
in (lib.flatten (lib.forEach depLicenses (spdx:
|
||||||
|
if (getLicence spdx) != [] then (getLicence spdx) else [] ++ lib.optional (spdx != "") spdx
|
||||||
|
)));
|
||||||
|
};
|
||||||
|
in _nuget-source
|
|
@ -1,4 +1,4 @@
|
||||||
{ pkgs, config, buildPackages, lib, stdenv, libiconv, gawk, gnused, gixy }:
|
{ pkgs, config, buildPackages, lib, stdenv, libiconv, mkNugetDeps, mkNugetSource, gawk, gnused, gixy }:
|
||||||
|
|
||||||
let
|
let
|
||||||
aliases = if (config.allowAliases or true) then (import ./aliases.nix lib) else prev: {};
|
aliases = if (config.allowAliases or true) then (import ./aliases.nix lib) else prev: {};
|
||||||
|
@ -301,6 +301,42 @@ let
|
||||||
writePyPy3Bin = name:
|
writePyPy3Bin = name:
|
||||||
writePyPy3 "/bin/${name}";
|
writePyPy3 "/bin/${name}";
|
||||||
|
|
||||||
|
|
||||||
|
makeFSharpWriter = { dotnet-sdk ? pkgs.dotnet-sdk, fsi-flags ? "", libraries ? _: [] }: nameOrPath:
|
||||||
|
let
|
||||||
|
fname = last (builtins.split "/" nameOrPath);
|
||||||
|
path = if strings.hasSuffix ".fsx" nameOrPath then nameOrPath else "${nameOrPath}.fsx";
|
||||||
|
_nugetDeps = mkNugetDeps { name = "${fname}-nuget-deps"; nugetDeps = libraries; };
|
||||||
|
|
||||||
|
nuget-source = mkNugetSource {
|
||||||
|
name = "${fname}-nuget-source";
|
||||||
|
description = "A Nuget source with the dependencies for ${fname}";
|
||||||
|
deps = [ _nugetDeps ];
|
||||||
|
};
|
||||||
|
|
||||||
|
fsi = writeBash "fsi" ''
|
||||||
|
export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
|
||||||
|
export DOTNET_CLI_TELEMETRY_OPTOUT=1
|
||||||
|
export DOTNET_NOLOGO=1
|
||||||
|
script="$1"; shift
|
||||||
|
${dotnet-sdk}/bin/dotnet fsi --quiet --nologo --readline- ${fsi-flags} "$@" < "$script"
|
||||||
|
'';
|
||||||
|
|
||||||
|
in content: writers.makeScriptWriter {
|
||||||
|
interpreter = fsi;
|
||||||
|
} path
|
||||||
|
''
|
||||||
|
#i "nuget: ${nuget-source}/lib"
|
||||||
|
${ content }
|
||||||
|
exit 0
|
||||||
|
'';
|
||||||
|
|
||||||
|
writeFSharp =
|
||||||
|
makeFSharpWriter {};
|
||||||
|
|
||||||
|
writeFSharpBin = name:
|
||||||
|
writeFSharp "/bin/${name}";
|
||||||
|
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
writers // (aliases writers)
|
writers // (aliases writers)
|
||||||
|
|
|
@ -150,6 +150,29 @@ let
|
||||||
print(y[0]['test'])
|
print(y[0]['test'])
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
fsharp = makeFSharpWriter {
|
||||||
|
libraries = { fetchNuGet }: [
|
||||||
|
(fetchNuGet { pname = "FSharp.SystemTextJson"; version = "0.17.4"; sha256 = "1bplzc9ybdqspii4q28l8gmfvzpkmgq5l1hlsiyg2h46w881lwg2"; })
|
||||||
|
];
|
||||||
|
} "test-writers-fsharp" ''
|
||||||
|
#r "nuget: FSharp.SystemTextJson, 0.17.4"
|
||||||
|
|
||||||
|
module Json =
|
||||||
|
open System.Text.Json
|
||||||
|
open System.Text.Json.Serialization
|
||||||
|
let options = JsonSerializerOptions()
|
||||||
|
options.Converters.Add(JsonFSharpConverter())
|
||||||
|
let serialize<'a> (o: 'a) = JsonSerializer.Serialize<'a>(o, options)
|
||||||
|
let deserialize<'a> (str: string) = JsonSerializer.Deserialize<'a>(str, options)
|
||||||
|
|
||||||
|
type Letter = A | B
|
||||||
|
let a = {| Hello = Some "World"; Letter = A |}
|
||||||
|
if a |> Json.serialize |> Json.deserialize |> (=) a
|
||||||
|
then "success"
|
||||||
|
else "failed"
|
||||||
|
|> printfn "%s"
|
||||||
|
'';
|
||||||
|
|
||||||
pypy2NoLibs = writePyPy2 "test-writers-pypy2-no-libs" {} ''
|
pypy2NoLibs = writePyPy2 "test-writers-pypy2-no-libs" {} ''
|
||||||
print("success")
|
print("success")
|
||||||
'';
|
'';
|
||||||
|
@ -161,6 +184,10 @@ let
|
||||||
pypy3NoLibs = writePyPy3 "test-writers-pypy3-no-libs" {} ''
|
pypy3NoLibs = writePyPy3 "test-writers-pypy3-no-libs" {} ''
|
||||||
print("success")
|
print("success")
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
fsharpNoNugetDeps = writeFSharp "test-writers-fsharp-no-nuget-deps" ''
|
||||||
|
printfn "success"
|
||||||
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -464,6 +464,8 @@ with pkgs;
|
||||||
|
|
||||||
buildDotnetModule = callPackage ../build-support/dotnet/build-dotnet-module { };
|
buildDotnetModule = callPackage ../build-support/dotnet/build-dotnet-module { };
|
||||||
nuget-to-nix = callPackage ../build-support/dotnet/nuget-to-nix { };
|
nuget-to-nix = callPackage ../build-support/dotnet/nuget-to-nix { };
|
||||||
|
mkNugetSource = callPackage ../build-support/dotnet/make-nuget-source { };
|
||||||
|
mkNugetDeps = callPackage ../build-support/dotnet/make-nuget-deps { };
|
||||||
|
|
||||||
dotnetenv = callPackage ../build-support/dotnet/dotnetenv {
|
dotnetenv = callPackage ../build-support/dotnet/dotnetenv {
|
||||||
dotnetfx = dotnetfx40;
|
dotnetfx = dotnetfx40;
|
||||||
|
|
Loading…
Reference in a new issue