This commit is contained in:
Félix Baylac Jacqué 2023-04-17 15:31:21 +02:00
parent 3862ba03f0
commit 57d071645f
11 changed files with 286 additions and 0 deletions

25
flake.lock Normal file
View File

@ -0,0 +1,25 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1681389457,
"narHash": "sha256-Z6TRJ2aI1eRd+kICdrkNyL2aH7XKw8ogzLdtGz1Q9qI=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "c58e6fbf258df1572b535ac1868ec42faf7675dd",
"type": "github"
},
"original": {
"id": "nixpkgs",
"type": "indirect"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

View File

@ -0,0 +1,14 @@
{
description = "Kefla POC";
outputs = { self, nixpkgs }:
let
kefla = import ./kefla nixpkgs;
in {
packages = kefla {
package-all = ./package-all.nix;
package-darwin = ./package-darwin.nix;
package-linux = ./package-linux.nix;
};
};
}

2
kefla/default.nix Normal file
View File

@ -0,0 +1,2 @@
nixpkgs: packages:
(import ./internal.nix nixpkgs).kefla packages

View File

@ -0,0 +1,29 @@
{ lib
, stdenv
, fetchurl
}:
stdenv.mkDerivation (finalAttrs: {
pname = "hello";
version = "2.12.1";
src = fetchurl {
url = "mirror://gnu/hello/hello-${finalAttrs.version}.tar.gz";
sha256 = "sha256-jZkUKv2SV28wsM18tCqNxoCZmLxdYH2Idh9RLibH2yA=";
};
doCheck = true;
meta = with lib; {
description = "A program that produces a familiar, friendly greeting";
longDescription = ''
GNU Hello is a program that prints "Hello, world!" when you run it.
It is fully customizable.
'';
homepage = "https://www.gnu.org/software/hello/manual/";
changelog = "https://git.savannah.gnu.org/cgit/hello.git/plain/NEWS?h=v${finalAttrs.version}";
license = licenses.gpl3Plus;
maintainers = [ maintainers.eelco ];
platforms = platforms.darwin;
};
})

View File

@ -0,0 +1,29 @@
{ lib
, stdenv
, fetchurl
}:
stdenv.mkDerivation (finalAttrs: {
pname = "hello";
version = "2.12.1";
src = fetchurl {
url = "mirror://gnu/hello/hello-${finalAttrs.version}.tar.gz";
sha256 = "sha256-jZkUKv2SV28wsM18tCqNxoCZmLxdYH2Idh9RLibH2yA=";
};
doCheck = true;
meta = with lib; {
description = "A program that produces a familiar, friendly greeting";
longDescription = ''
GNU Hello is a program that prints "Hello, world!" when you run it.
It is fully customizable.
'';
homepage = "https://www.gnu.org/software/hello/manual/";
changelog = "https://git.savannah.gnu.org/cgit/hello.git/plain/NEWS?h=v${finalAttrs.version}";
license = licenses.gpl3Plus;
maintainers = [ maintainers.eelco ];
platforms = platforms.all;
};
})

71
kefla/internal.nix Normal file
View File

@ -0,0 +1,71 @@
nixpkgs:
let
dummyPkgs = import nixpkgs { system = "x86_64-linux"; };
lib = dummyPkgs.lib;
in rec {
# Collects all the supported for drv leveraging the meta.platforms
# Nixpkgs attribute.
#
# We callPackage the derivation with a dummy Nixpkgs x86_64
# instance, regardless of the underlying arch. It doesn't matter
# much, we won't build anything here, we just need callPackage to
# evaluate the meta attributes.
collectPlatformsForDrv = drv: (dummyPkgs.callPackage drv {}).meta.platforms;
# Generates the flake outputs for PATH for each PLATFORMS platform.
# IE. from
# {
# path = /tmp/dummy/path;
# pathName = "hello";
# platforms = [ "x86_64-linux""aarch64-linux"];
# };
#
# We get:
#
# {
# aarch64-linux = { hello = /tmp/dummy/path; };
# x86_64-linux = { hello = /tmp/dummy/path; };
# }
genFlakeOutputForPlatforms = { path, name, platforms }:
lib.genAttrs platforms (platform: { ${name} = path; });
# Goes through a flake-like packages output attrs to inject the
# relevant callPackage function call. Obviously, this callPackage
# function is platform-dependant, we'll instantiate a different one
# for each platform subtree.
injectCallPackage = packages:
let
injectPlatformCallPackage = { attrs, platform }:
let
pkgs = import nixpkgs { system = platform; };
callPackage = pkgs.lib.callPackageWith pkgs;
in builtins.mapAttrs (_name: value: callPackage value {}) attrs;
in builtins.mapAttrs (name: value:
injectPlatformCallPackage { attrs = value; platform = name; }) packages;
#
kefla = packagesOutput:
let
packagesWithoutCallPackage = lib.foldlAttrs
(acc: name: path:
let
platforms = collectPlatformsForDrv path;
packageOutput = genFlakeOutputForPlatforms { inherit path platforms name; };
in lib.recursiveUpdate acc packageOutput)
{ }
packagesOutput;
in injectCallPackage packagesWithoutCallPackage;
}
# lib.foldlAttrs
# (acc: name: value:
# let
# platforms = (dummyPkgs.callPackage value {}).meta.platforms;
# # TODO: découper ça avec des tests intermediaires.
# entries = lib.genAttrs platforms (platform: )
# in builtins.trace platforms (lib.recursiveUpdate acc { hello = platforms; }))
# {}
# packages
# }

2
kefla/test Executable file
View File

@ -0,0 +1,2 @@
#!/usr/bin/env bash
nix-instantiate --eval --strict test.nix

27
kefla/test.nix Normal file
View File

@ -0,0 +1,27 @@
let
nixpkgs = <nixpkgs>;
pkgs = import nixpkgs { };
internal = import ./internal.nix nixpkgs;
fixtures = {
testDrv = import ./fixtures/test-drv.nix;
testDrvDarwin = import ./fixtures/test-drv-darwin.nix;
};
in pkgs.lib.runTests {
# CollectPlatforms
##################
testCollectPlatformsAllDrv = {
expr = internal.collectPlatformsForDrv fixtures.testDrv ;
expected = [ "i686-cygwin" "x86_64-cygwin" "x86_64-darwin" "i686-darwin" "aarch64-darwin" "armv7a-darwin" "i686-freebsd13" "x86_64-freebsd13" "aarch64-genode" "i686-genode" "x86_64-genode" "x86_64-solaris" "javascript-ghcjs" "aarch64-linux" "armv5tel-linux" "armv6l-linux" "armv7a-linux" "armv7l-linux" "i686-linux" "m68k-linux" "microblaze-linux" "microblazeel-linux" "mipsel-linux" "mips64el-linux" "powerpc64-linux" "powerpc64le-linux" "riscv32-linux" "riscv64-linux" "s390-linux" "s390x-linux" "x86_64-linux" "mmix-mmixware" "aarch64-netbsd" "armv6l-netbsd" "armv7a-netbsd" "armv7l-netbsd" "i686-netbsd" "m68k-netbsd" "mipsel-netbsd" "powerpc-netbsd" "riscv32-netbsd" "riscv64-netbsd" "x86_64-netbsd" "aarch64_be-none" "aarch64-none" "arm-none" "armv6l-none" "avr-none" "i686-none" "microblaze-none" "microblazeel-none" "msp430-none" "or1k-none" "m68k-none" "powerpc-none" "powerpcle-none" "riscv32-none" "riscv64-none" "rx-none" "s390-none" "s390x-none" "vc4-none" "x86_64-none" "i686-openbsd" "x86_64-openbsd" "x86_64-redox" "wasm64-wasi" "wasm32-wasi" "x86_64-windows" "i686-windows" ];
};
testCollectPlatformsDarwinDrv = {
expr = internal.collectPlatformsForDrv fixtures.testDrvDarwin ;
expected = [ "x86_64-darwin" "i686-darwin" "aarch64-darwin" "armv7a-darwin" ];
};
# genFlakeOutputForPlatforms
############################
testGenFlakeOutputForPlatforms = {
expr = internal.genFlakeOutputForPlatforms { path = /tmp/dummy/path; name = "hello"; platforms = [ "x86_64-linux" "x86_64-darwin" "aarch64-linux"]; };
expected = { aarch64-linux = { hello = /tmp/dummy/path; }; x86_64-darwin = { hello = /tmp/dummy/path; }; x86_64-linux = { hello = /tmp/dummy/path; };};
};
}

29
package-all.nix Normal file
View File

@ -0,0 +1,29 @@
{ lib
, stdenv
, fetchurl
}:
stdenv.mkDerivation (finalAttrs: {
pname = "hello";
version = "2.12.1";
src = fetchurl {
url = "mirror://gnu/hello/hello-${finalAttrs.version}.tar.gz";
sha256 = "sha256-jZkUKv2SV28wsM18tCqNxoCZmLxdYH2Idh9RLibH2yA=";
};
doCheck = true;
meta = with lib; {
description = "A program that produces a familiar, friendly greeting";
longDescription = ''
GNU Hello is a program that prints "Hello, world!" when you run it.
It is fully customizable.
'';
homepage = "https://www.gnu.org/software/hello/manual/";
changelog = "https://git.savannah.gnu.org/cgit/hello.git/plain/NEWS?h=v${finalAttrs.version}";
license = licenses.gpl3Plus;
maintainers = [ maintainers.eelco ];
platforms = platforms.all;
};
})

29
package-darwin.nix Normal file
View File

@ -0,0 +1,29 @@
{ lib
, stdenv
, fetchurl
}:
stdenv.mkDerivation (finalAttrs: {
pname = "hello";
version = "2.12.1";
src = fetchurl {
url = "mirror://gnu/hello/hello-${finalAttrs.version}.tar.gz";
sha256 = "sha256-jZkUKv2SV28wsM18tCqNxoCZmLxdYH2Idh9RLibH2yA=";
};
doCheck = true;
meta = with lib; {
description = "A program that produces a familiar, friendly greeting";
longDescription = ''
GNU Hello is a program that prints "Hello, world!" when you run it.
It is fully customizable.
'';
homepage = "https://www.gnu.org/software/hello/manual/";
changelog = "https://git.savannah.gnu.org/cgit/hello.git/plain/NEWS?h=v${finalAttrs.version}";
license = licenses.gpl3Plus;
maintainers = [ maintainers.eelco ];
platforms = platforms.darwin;
};
})

29
package-linux.nix Normal file
View File

@ -0,0 +1,29 @@
{ lib
, stdenv
, fetchurl
}:
stdenv.mkDerivation (finalAttrs: {
pname = "hello";
version = "2.12.1";
src = fetchurl {
url = "mirror://gnu/hello/hello-${finalAttrs.version}.tar.gz";
sha256 = "sha256-jZkUKv2SV28wsM18tCqNxoCZmLxdYH2Idh9RLibH2yA=";
};
doCheck = true;
meta = with lib; {
description = "A program that produces a familiar, friendly greeting";
longDescription = ''
GNU Hello is a program that prints "Hello, world!" when you run it.
It is fully customizable.
'';
homepage = "https://www.gnu.org/software/hello/manual/";
changelog = "https://git.savannah.gnu.org/cgit/hello.git/plain/NEWS?h=v${finalAttrs.version}";
license = licenses.gpl3Plus;
maintainers = [ maintainers.eelco ];
platforms = platforms.all;
};
})