From 8d1eb3fdf0d73e045a92caf7744fb5fab71a78c3 Mon Sep 17 00:00:00 2001 From: Tristan Ross Date: Mon, 21 Nov 2022 14:39:05 -0800 Subject: [PATCH 1/7] feat: initial work for flatpaks --- modules/system.nix | 52 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/modules/system.nix b/modules/system.nix index bc5c1d3..7fa3f6f 100644 --- a/modules/system.nix +++ b/modules/system.nix @@ -52,6 +52,30 @@ in }; }; }; + + flatpak = mkOption { + description = '' + Flatpak package + ''; + type = types.path; + }; + }; + + flatapk = mkOption { + description = '' + Flatpak package configuration + ''; + type = types.submodule { + options = { + name = mkOption { + description = '' + Package name of the Flatpak + ''; + type = types.str; + default = "org.nixng.nix-community.${config.system.name}"; + }; + }; + }; }; activation = mkOption { @@ -150,6 +174,34 @@ in build = dockerTools.buildLayeredImage config; stream = dockerTools.streamLayeredImage config; }; + + flatpak = + let + toplevelHash = builtins.elemAt (builtins.split "-" (lib.removePrefix "${builtins.storeDir}/" (toString config.system.build.toplevel))) 0; + + metadata = pkgs.writeText "metadata" '' + [Runtime] + name=${config.system.flatpak.name} + runtime=${config.system.flatpak.name}/${pkgs.targetPlatform.uname.processor}/${toplevelHash} + sdk=${config.system.flatpak.name}/${pkgs.targetPlatform.uname.processor}/${toplevelHash} + ''; + + toplevel = pkgs.runCommandNoCC "nixng-flatpak-toplevel" + { nativeBuildInputs = with pkgs; [ busybox makeWrapper ]; } + (with configFinal; '' + mkdir $out + substitute ${configFinal.built.toplevel} $out/files \ + --subst-var-by "systemConfig" "$out" + substitute ${metadata} $out/metadata \ + --subst-var-by "systemConfig" "$out" + ''); + in pkgs.runCommandNoCC "nixng-flatpak" + { nativeBuildInputs = with pkgs; [ flatpak-builder ]; } + (with configFinal; '' + mkdir -p $out + ostree init --mode archive-z2 --repo=$out + ostree commit -b ${configFinal.system.flatpak.name}//${pkgs.targetPlatform.uname.processor}/${toplevelHash} --tree=dir=${toplevel} + ''); }; system.activation.currentSystem = nglib.dag.dagEntryAnywhere From 2c211dbe9a4ae54307486a7d07eff8d225f552d3 Mon Sep 17 00:00:00 2001 From: Tristan Ross Date: Mon, 21 Nov 2022 14:42:32 -0800 Subject: [PATCH 2/7] fix: typo --- modules/system.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/system.nix b/modules/system.nix index 7fa3f6f..3712ae3 100644 --- a/modules/system.nix +++ b/modules/system.nix @@ -61,7 +61,7 @@ in }; }; - flatapk = mkOption { + flatpak = mkOption { description = '' Flatpak package configuration ''; From 6d48b7093047506aa013fd119705be513a67beb2 Mon Sep 17 00:00:00 2001 From: Tristan Ross Date: Tue, 29 Nov 2022 11:16:30 -0800 Subject: [PATCH 3/7] feat: runtime generation --- modules/system.nix | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/modules/system.nix b/modules/system.nix index 3712ae3..079aa89 100644 --- a/modules/system.nix +++ b/modules/system.nix @@ -65,6 +65,7 @@ in description = '' Flatpak package configuration ''; + default = {}; type = types.submodule { options = { name = mkOption { @@ -186,21 +187,24 @@ in sdk=${config.system.flatpak.name}/${pkgs.targetPlatform.uname.processor}/${toplevelHash} ''; - toplevel = pkgs.runCommandNoCC "nixng-flatpak-toplevel" + runtime = pkgs.runCommandNoCC "nixng-flatpak-runtime" { nativeBuildInputs = with pkgs; [ busybox makeWrapper ]; } (with configFinal; '' - mkdir $out - substitute ${configFinal.built.toplevel} $out/files \ + mkdir -p $out/files + substitute ${configFinal.system.build.toplevel}/init $out/files/init \ + --subst-var-by "systemConfig" "$out" + substitute ${configFinal.system.build.toplevel}/activation $out/files/activation \ --subst-var-by "systemConfig" "$out" substitute ${metadata} $out/metadata \ --subst-var-by "systemConfig" "$out" ''); in pkgs.runCommandNoCC "nixng-flatpak" - { nativeBuildInputs = with pkgs; [ flatpak-builder ]; } + { nativeBuildInputs = with pkgs; [ flatpak-builder ostree ]; } (with configFinal; '' mkdir -p $out ostree init --mode archive-z2 --repo=$out - ostree commit -b ${configFinal.system.flatpak.name}//${pkgs.targetPlatform.uname.processor}/${toplevelHash} --tree=dir=${toplevel} + ostree commit --repo=$out -b runtime/${configFinal.system.flatpak.name}/${pkgs.targetPlatform.uname.processor}/${toplevelHash} --tree=dir=${runtime} + ostree summary --repo=$out -u ''); }; From 622e9e1df253c6891c7185612e7bed81b0544d01 Mon Sep 17 00:00:00 2001 From: Tristan Ross Date: Wed, 30 Nov 2022 10:28:04 -0800 Subject: [PATCH 4/7] feat: add runtime and sdk package building --- modules/system.nix | 90 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 68 insertions(+), 22 deletions(-) diff --git a/modules/system.nix b/modules/system.nix index 079aa89..75fbfdd 100644 --- a/modules/system.nix +++ b/modules/system.nix @@ -75,6 +75,42 @@ in type = types.str; default = "org.nixng.nix-community.${config.system.name}"; }; + + runtime = mkOption { + description = '' + Flatpak runtime package options + ''; + default = {}; + type = types.submodule { + options = { + name = mkOption { + description = '' + Package name of the Flatpak + ''; + type = types.str; + default = "org.nixng.nix-community.runtime.${config.system.name}"; + }; + }; + }; + }; + + sdk = mkOption { + description = '' + Flatpak SDK package options + ''; + default = {}; + type = types.submodule { + options = { + name = mkOption { + description = '' + Package name of the Flatpak + ''; + type = types.str; + default = "org.nixng.nix-community.sdk.${config.system.name}"; + }; + }; + }; + }; }; }; }; @@ -180,32 +216,42 @@ in let toplevelHash = builtins.elemAt (builtins.split "-" (lib.removePrefix "${builtins.storeDir}/" (toString config.system.build.toplevel))) 0; - metadata = pkgs.writeText "metadata" '' - [Runtime] - name=${config.system.flatpak.name} - runtime=${config.system.flatpak.name}/${pkgs.targetPlatform.uname.processor}/${toplevelHash} - sdk=${config.system.flatpak.name}/${pkgs.targetPlatform.uname.processor}/${toplevelHash} - ''; + packageStep = name: + let + metadata = pkgs.writeText "metadata" '' + [Runtime] + name=${config.system.flatpak.${name}.name} + runtime=${config.system.flatpak.${name}.name}/${pkgs.targetPlatform.uname.processor}/${toplevelHash} + sdk=${config.system.flatpak.${name}.name}/${pkgs.targetPlatform.uname.processor}/${toplevelHash} + ''; + + refs = pkgs.writeReferencesToFile configFinal.system.build.toplevel; + in pkgs.runCommandNoCC "nixng-flatpak-${name}-${toplevelHash}" + { nativeBuildInputs = with pkgs; [ busybox makeWrapper ]; } + '' + mkdir -p $out/files + cp ${metadata} $out/metadata + + shopt -s dotglob + cp -r ${configFinal.system.build.toplevel}/* $out + + for path in $(cat ${refs}); do + test -f $path && ( mkdir -p $out/files/$(dirname $path) ; cp -r $path $out/files/$path ) + test -d $path && ( mkdir -p $out/files/$path ; cp -r $path/* $out/files/$path ) + done + ''; - runtime = pkgs.runCommandNoCC "nixng-flatpak-runtime" - { nativeBuildInputs = with pkgs; [ busybox makeWrapper ]; } - (with configFinal; '' - mkdir -p $out/files - substitute ${configFinal.system.build.toplevel}/init $out/files/init \ - --subst-var-by "systemConfig" "$out" - substitute ${configFinal.system.build.toplevel}/activation $out/files/activation \ - --subst-var-by "systemConfig" "$out" - substitute ${metadata} $out/metadata \ - --subst-var-by "systemConfig" "$out" - ''); + runtime = packageStep "runtime"; + sdk = packageStep "sdk"; in pkgs.runCommandNoCC "nixng-flatpak" { nativeBuildInputs = with pkgs; [ flatpak-builder ostree ]; } (with configFinal; '' - mkdir -p $out - ostree init --mode archive-z2 --repo=$out - ostree commit --repo=$out -b runtime/${configFinal.system.flatpak.name}/${pkgs.targetPlatform.uname.processor}/${toplevelHash} --tree=dir=${runtime} - ostree summary --repo=$out -u - ''); + mkdir -p $out/repo + ostree init --mode archive-z2 --repo=$out/repo + ostree commit --repo=$out/repo -b runtime/${configFinal.system.flatpak.runtime.name}/${pkgs.targetPlatform.uname.processor}/${toplevelHash} --tree=dir=${runtime} + ostree commit --repo=$out/repo -b runtime/${configFinal.system.flatpak.sdk.name}/${pkgs.targetPlatform.uname.processor}/${toplevelHash} --tree=dir=${sdk} + ostree summary --repo=$out/repo -u + ''); # TODO: figure out how to produce a flatpak package out of the runtime and SDK }; system.activation.currentSystem = nglib.dag.dagEntryAnywhere From e4ee2898737917281ebf4f909d6e20a120354149 Mon Sep 17 00:00:00 2001 From: Tristan Ross Date: Wed, 30 Nov 2022 10:53:27 -0800 Subject: [PATCH 5/7] feat: produce application without flatpak command --- modules/system.nix | 130 +++++++++++++++++++++++++++------------------ 1 file changed, 77 insertions(+), 53 deletions(-) diff --git a/modules/system.nix b/modules/system.nix index 75fbfdd..36366ba 100644 --- a/modules/system.nix +++ b/modules/system.nix @@ -67,51 +67,56 @@ in ''; default = {}; type = types.submodule { - options = { - name = mkOption { - description = '' - Package name of the Flatpak - ''; - type = types.str; - default = "org.nixng.nix-community.${config.system.name}"; - }; + options = + let + makeOptions = name: { + name = mkOption { + description = '' + Package name + ''; + type = types.str; + default = "${name}.${config.system.name}"; + }; - runtime = mkOption { - description = '' - Flatpak runtime package options - ''; - default = {}; - type = types.submodule { - options = { - name = mkOption { - description = '' - Package name of the Flatpak - ''; - type = types.str; - default = "org.nixng.nix-community.runtime.${config.system.name}"; - }; + metadata = mkOption { + description = '' + Package metadata + ''; + type = with types; attrsOf (oneOf [ str int bool ]); + default = {}; + }; + }; + in { + application = mkOption { + description = '' + Flatpak application package options + ''; + default = {}; + type = types.submodule { + options = makeOptions "org.nixng.nix-community"; }; }; - }; - sdk = mkOption { - description = '' - Flatpak SDK package options - ''; - default = {}; - type = types.submodule { - options = { - name = mkOption { - description = '' - Package name of the Flatpak - ''; - type = types.str; - default = "org.nixng.nix-community.sdk.${config.system.name}"; - }; + runtime = mkOption { + description = '' + Flatpak runtime package options + ''; + default = {}; + type = types.submodule { + options = makeOptions "org.nixng.nix-community.runtime"; + }; + }; + + sdk = mkOption { + description = '' + Flatpak SDK package options + ''; + default = {}; + type = types.submodule { + options = makeOptions "org.nixng.nix-community.sdk"; }; }; }; - }; }; }; @@ -216,14 +221,31 @@ in let toplevelHash = builtins.elemAt (builtins.split "-" (lib.removePrefix "${builtins.storeDir}/" (toString config.system.build.toplevel))) 0; - packageStep = name: + makePackage = name: let - metadata = pkgs.writeText "metadata" '' - [Runtime] - name=${config.system.flatpak.${name}.name} - runtime=${config.system.flatpak.${name}.name}/${pkgs.targetPlatform.uname.processor}/${toplevelHash} - sdk=${config.system.flatpak.${name}.name}/${pkgs.targetPlatform.uname.processor}/${toplevelHash} - ''; + metadataHeader = { + runtime = "Runtime"; + sdk = "Runtime"; + application = "Application"; + }; + + baseMetadata = { + "${metadataHeader.${name}}" = { + inherit (config.system.flatpak.${name}) name; + runtime = "${config.system.flatpak.runtime.name}/${pkgs.targetPlatform.uname.processor}/${toplevelHash}"; + sdk = "${config.system.flatpak.sdk.name}/${pkgs.targetPlatform.uname.processor}/${toplevelHash}"; + }; + }; + + extraMetadata = ({ + application = { + "${metadataHeader.${name}}" = { + command = "${configFinal.system.build.toplevel}/init"; + }; + }; + }).${name} or {}; + + metadata = pkgs.writeText "metadata" (generators.toINI {} (baseMetadata // extraMetadata // configFinal.system.flatpak.${name}.metadata)); refs = pkgs.writeReferencesToFile configFinal.system.build.toplevel; in pkgs.runCommandNoCC "nixng-flatpak-${name}-${toplevelHash}" @@ -241,17 +263,19 @@ in done ''; - runtime = packageStep "runtime"; - sdk = packageStep "sdk"; + makeCommit = kind: name: '' + ostree commit --repo=$out -b ${kind}/${configFinal.system.flatpak.${name}.name}/${pkgs.targetPlatform.uname.processor}/${toplevelHash} --tree=dir=${makePackage name} + ''; in pkgs.runCommandNoCC "nixng-flatpak" - { nativeBuildInputs = with pkgs; [ flatpak-builder ostree ]; } + { nativeBuildInputs = with pkgs; [ ostree ]; } (with configFinal; '' mkdir -p $out/repo - ostree init --mode archive-z2 --repo=$out/repo - ostree commit --repo=$out/repo -b runtime/${configFinal.system.flatpak.runtime.name}/${pkgs.targetPlatform.uname.processor}/${toplevelHash} --tree=dir=${runtime} - ostree commit --repo=$out/repo -b runtime/${configFinal.system.flatpak.sdk.name}/${pkgs.targetPlatform.uname.processor}/${toplevelHash} --tree=dir=${sdk} - ostree summary --repo=$out/repo -u - ''); # TODO: figure out how to produce a flatpak package out of the runtime and SDK + ostree init --mode archive-z2 --repo=$out + ${makeCommit "runtime" "runtime"} + ${makeCommit "runtime" "sdk"} + ${makeCommit "application" "application"} + ostree summary --repo=$out -u + ''); }; system.activation.currentSystem = nglib.dag.dagEntryAnywhere From ae0321c3d45fb4e57a3512be2b2139504bb261a3 Mon Sep 17 00:00:00 2001 From: Tristan Ross Date: Thu, 1 Dec 2022 10:30:25 -0800 Subject: [PATCH 6/7] fix: copying files to the packages --- modules/system.nix | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/modules/system.nix b/modules/system.nix index 36366ba..aca3f8e 100644 --- a/modules/system.nix +++ b/modules/system.nix @@ -240,7 +240,7 @@ in extraMetadata = ({ application = { "${metadataHeader.${name}}" = { - command = "${configFinal.system.build.toplevel}/init"; + command = "/init"; }; }; }).${name} or {}; @@ -248,20 +248,26 @@ in metadata = pkgs.writeText "metadata" (generators.toINI {} (baseMetadata // extraMetadata // configFinal.system.flatpak.${name}.metadata)); refs = pkgs.writeReferencesToFile configFinal.system.build.toplevel; - in pkgs.runCommandNoCC "nixng-flatpak-${name}-${toplevelHash}" - { nativeBuildInputs = with pkgs; [ busybox makeWrapper ]; } - '' - mkdir -p $out/files - cp ${metadata} $out/metadata - - shopt -s dotglob - cp -r ${configFinal.system.build.toplevel}/* $out - - for path in $(cat ${refs}); do - test -f $path && ( mkdir -p $out/files/$(dirname $path) ; cp -r $path $out/files/$path ) - test -d $path && ( mkdir -p $out/files/$path ; cp -r $path/* $out/files/$path ) - done - ''; + in pkgs.runCommandNoCC "nixng-flatpak-${name}-${toplevelHash}" {} '' + mkdir -p $out/files + cp "${metadata}" $out/metadata + + shopt -s dotglob + cp -r ${configFinal.system.build.toplevel}/* $out/files + + for path in $(cat ${refs}); do + dest=$out/files/$path + rm -rf $dest + mkdir -p $(dirname $dest) + if test -f $path; then + echo "Copying file from $path to $dest" + cp -r $path $dest + elif test -d $path; then + echo "Copying dir from $path to $dest" + cp -r $path $(dirname $dest) + fi + done + ''; makeCommit = kind: name: '' ostree commit --repo=$out -b ${kind}/${configFinal.system.flatpak.${name}.name}/${pkgs.targetPlatform.uname.processor}/${toplevelHash} --tree=dir=${makePackage name} From 418d1c6475760eac70603c92d054acba023ddfbb Mon Sep 17 00:00:00 2001 From: Tristan Ross Date: Thu, 1 Dec 2022 10:38:16 -0800 Subject: [PATCH 7/7] feat: add log messages --- modules/system.nix | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/modules/system.nix b/modules/system.nix index aca3f8e..64974bb 100644 --- a/modules/system.nix +++ b/modules/system.nix @@ -269,17 +269,27 @@ in done ''; - makeCommit = kind: name: '' - ostree commit --repo=$out -b ${kind}/${configFinal.system.flatpak.${name}.name}/${pkgs.targetPlatform.uname.processor}/${toplevelHash} --tree=dir=${makePackage name} - ''; + makeCommit = kind: name: + let + pkg = makePackage name; + pkgId = "${configFinal.system.flatpak.${name}.name}/${pkgs.targetPlatform.uname.processor}/${toplevelHash}"; + in '' + echo "Adding ${pkgId} to $out" + ostree commit --repo=$out -b ${kind}/${pkgId} --tree=dir=${pkg} + ''; + in pkgs.runCommandNoCC "nixng-flatpak" { nativeBuildInputs = with pkgs; [ ostree ]; } (with configFinal; '' - mkdir -p $out/repo + mkdir -p $out + echo "Creating repo at $out" ostree init --mode archive-z2 --repo=$out + ${makeCommit "runtime" "runtime"} ${makeCommit "runtime" "sdk"} ${makeCommit "application" "application"} + + echo "Generating summary for $out" ostree summary --repo=$out -u ''); };