diff --git a/README.md b/README.md index e55fe79..7b51561 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,18 @@ # devkitnix -Collection of devkitPro toolchains using Nix. -To install a toolchain, use following: +Collection of devkitPro packages for Nix using flakes. +To build a toolchain like devkitPPC, use following: ``` -git clone https://github.com/zig-homebrew/devkitnix -cd devkitnix -nix-build .nix +nix build github:zig-homebrew/devkitnix#devkitPPC ``` -## devkitARM +## Toolchains -- Game Boy Advance -- Nintendo DS -- Nintendo 3DS -- GP32 -- GP2X - -## devkitPPC - -- GameCube -- Wii -- Wii U - -## devkitA64 - -- Nintendo Switch +``` +└───packages + └───x86_64-linux + ├───devkitA64: package 'devkitA64' + ├───devkitARM: package 'devkitARM' + └───devkitPPC: package 'devkitPPC' +``` diff --git a/devkitA64.nix b/devkitA64.nix deleted file mode 100644 index d0862b4..0000000 --- a/devkitA64.nix +++ /dev/null @@ -1,27 +0,0 @@ -let - pkgs = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/e3583ad6e533a9d8dd78f90bfa93812d390ea187.tar.gz") {}; - image = pkgs.dockerTools.pullImage { - imageName = "devkitpro/devkita64"; - imageDigest = "sha256:70db4c954eea43be5f1bc64c8882154126c99f47927ecb1e6b27fa18004fc961"; - sha256 = "a05LU5jF5KxQdqWJv+4b3EBRlVCZjBGx69WpFL57wP4="; - finalImageName = "devkitpro/devkita64"; - finalImageTag = "20221113"; - }; -in { - devkitA64 = pkgs.stdenv.mkDerivation { - name = "devkitA64"; - src = import ./extract-docker.nix pkgs image; - nativeBuildInputs = [ pkgs.autoPatchelfHook ]; - buildInputs = [ - pkgs.stdenv.cc.cc - pkgs.ncurses6 - pkgs.zsnes - ]; - buildPhase = "true"; - installPhase = '' - mkdir -p $out - cp -r $src/{devkitA64,libnx,portlibs,tools} $out - rm -rf $out/pacman - ''; - }; -} diff --git a/devkitARM.nix b/devkitARM.nix deleted file mode 100644 index cf68e93..0000000 --- a/devkitARM.nix +++ /dev/null @@ -1,27 +0,0 @@ -let - pkgs = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/e3583ad6e533a9d8dd78f90bfa93812d390ea187.tar.gz") {}; - image = pkgs.dockerTools.pullImage { - imageName = "devkitpro/devkitarm"; - imageDigest = "sha256:695d1eb865ca4b908b1f5c4de777b9eef0f927680f0c0654b07721f1df908606"; - sha256 = "U2Xkt4IYUeU00w/FzlvySzG5lFL2R7kN8sjxL0EEKD4="; - finalImageName = "devkitpro/devkitarm"; - finalImageTag = "20221115"; - }; -in { - devkitARM = pkgs.stdenv.mkDerivation { - name = "devkitARM"; - src = import ./extract-docker.nix pkgs image; - nativeBuildInputs = [ pkgs.autoPatchelfHook ]; - buildInputs = [ - pkgs.stdenv.cc.cc - pkgs.ncurses6 - pkgs.zsnes - ]; - buildPhase = "true"; - installPhase = '' - mkdir -p $out - cp -r $src/{devkitARM,libgba,libnds,libctru,libmirko,liborcus,portlibs,tools} $out - rm -rf $out/pacman - ''; - }; -} diff --git a/devkitPPC.nix b/devkitPPC.nix deleted file mode 100644 index d3f2117..0000000 --- a/devkitPPC.nix +++ /dev/null @@ -1,28 +0,0 @@ -let - pkgs = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/e3583ad6e533a9d8dd78f90bfa93812d390ea187.tar.gz") {}; - image = pkgs.dockerTools.pullImage { - imageName = "devkitpro/devkitppc"; - imageDigest = "sha256:d88e21c1a7b5f8070ba7a15aa892e395f118ded9803b0f8223a3d29ba279fff3"; - sha256 = "nVtz/9mbYveKbvTMj/39EzND7qiLkjBHfqSOgT6SBUY="; - finalImageName = "devkitpro/devkitppc"; - finalImageTag = "20220821"; - }; -in { - devkitPPC = pkgs.stdenv.mkDerivation { - name = "devkitPPC"; - src = import ./extract-docker.nix pkgs image; - nativeBuildInputs = [ pkgs.autoPatchelfHook ]; - buildInputs = [ - pkgs.stdenv.cc.cc - pkgs.ncurses5 - pkgs.expat - pkgs.xz - ]; - buildPhase = "true"; - installPhase = '' - mkdir -p $out - cp -r $src/{devkitPPC,libogc,portlibs,tools,wut} $out - rm -rf $out/pacman - ''; - }; -} diff --git a/extract-docker.nix b/extract-docker.nix deleted file mode 100644 index e0fc9df..0000000 --- a/extract-docker.nix +++ /dev/null @@ -1,47 +0,0 @@ -pkgs: image: -let - directory = "/opt/devkitpro"; -in -pkgs.vmTools.runInLinuxVM ( - pkgs.runCommand "docker-preload-image" { - memSize = 12 * 1024; - buildInputs = [ - pkgs.curl - pkgs.kmod - pkgs.docker - pkgs.e2fsprogs - pkgs.utillinux - ]; - } - '' - modprobe overlay - - # from https://github.com/tianon/cgroupfs-mount/blob/master/cgroupfs-mount - mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup - cd /sys/fs/cgroup - for sys in $(awk '!/^#/ { if ($4 == 1) print $1 }' /proc/cgroups); do - mkdir -p $sys - if ! mountpoint -q $sys; then - if ! mount -n -t cgroup -o $sys cgroup $sys; then - rmdir $sys || true - fi - fi - done - - dockerd -H tcp://127.0.0.1:5555 -H unix:///var/run/docker.sock & - - until $(curl --output /dev/null --silent --connect-timeout 2 http://127.0.0.1:5555); do - printf '.' - sleep 1 - done - - echo load image - docker load -i ${image} - - echo run image - docker run ${image.destNameTag} tar -C '${toString directory}' -c . | tar -xv --no-same-owner -C $out || true - - echo end - kill %1 - '' -) diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..41f6d6a --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1668595291, + "narHash": "sha256-j8cyfbtT5sAYPYwbERgTDzfD48ZernL0/V668eGpXAM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "6474d93e007e4d165bcf48e7f87de2175c93d10b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix index 63f61b5..91386e8 100644 --- a/flake.nix +++ b/flake.nix @@ -1,46 +1,131 @@ { inputs = { - nixpkgs = { - url = "github:NixOS/nixpkgs/nixos-22.05"; - }; - flake-utils = { - url = "github:numtide/flake-utils"; - inputs.nixpkgs.follows = "nixpkgs"; - }; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-22.05"; }; outputs = { self, nixpkgs, - flake-utils, - ... - }: - flake-utils.lib.eachDefaultSystem (system: let - pkgs = import nixpkgs {}; - image = pkgs.dockerTools.pullImage { - imageName = "devkitpro/devkitppc"; - imageDigest = "sha256:d88e21c1a7b5f8070ba7a15aa892e395f118ded9803b0f8223a3d29ba279fff3"; - sha256 = "nVtz/9mbYveKbvTMj/39EzND7qiLkjBHfqSOgT6SBUY="; - finalImageName = "devkitpro/devkitppc"; - finalImageTag = "20220821"; - }; - in { - devkitPPC = pkgs.stdenv.mkDerivation { - name = "devkitPPC"; - src = import ./extract-docker.nix pkgs image; - nativeBuildInputs = [ pkgs.autoPatchelfHook ]; - buildInputs = [ - pkgs.stdenv.cc.cc - pkgs.ncurses5 - pkgs.expat - pkgs.xz - ]; - buildPhase = "true"; - installPhase = '' - mkdir -p $out - cp -r $src/{devkitPPC,libogc,portlibs,tools,wut} $out - rm -rf $out/pacman - ''; - }; - }); + }: let + pkgs = import nixpkgs {system = "x86_64-linux";}; + imageA64 = pkgs.dockerTools.pullImage { + imageName = "devkitpro/devkita64"; + imageDigest = "sha256:70db4c954eea43be5f1bc64c8882154126c99f47927ecb1e6b27fa18004fc961"; + sha256 = "a05LU5jF5KxQdqWJv+4b3EBRlVCZjBGx69WpFL57wP4="; + finalImageName = "devkitpro/devkita64"; + finalImageTag = "20221113"; + }; + imageARM = pkgs.dockerTools.pullImage { + imageName = "devkitpro/devkitarm"; + imageDigest = "sha256:695d1eb865ca4b908b1f5c4de777b9eef0f927680f0c0654b07721f1df908606"; + sha256 = "U2Xkt4IYUeU00w/FzlvySzG5lFL2R7kN8sjxL0EEKD4="; + finalImageName = "devkitpro/devkitarm"; + finalImageTag = "20221115"; + }; + imagePPC = pkgs.dockerTools.pullImage { + imageName = "devkitpro/devkitppc"; + imageDigest = "sha256:d88e21c1a7b5f8070ba7a15aa892e395f118ded9803b0f8223a3d29ba279fff3"; + sha256 = "nVtz/9mbYveKbvTMj/39EzND7qiLkjBHfqSOgT6SBUY="; + finalImageName = "devkitpro/devkitppc"; + finalImageTag = "20220821"; + }; + extractDocker = image: + pkgs.vmTools.runInLinuxVM ( + pkgs.runCommand "docker-preload-image" { + memSize = 10 * 1024; + buildInputs = [ + pkgs.curl + pkgs.kmod + pkgs.docker + pkgs.e2fsprogs + pkgs.utillinux + ]; + } + '' + modprobe overlay + + # from https://github.com/tianon/cgroupfs-mount/blob/master/cgroupfs-mount + mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup + cd /sys/fs/cgroup + for sys in $(awk '!/^#/ { if ($4 == 1) print $1 }' /proc/cgroups); do + mkdir -p $sys + if ! mountpoint -q $sys; then + if ! mount -n -t cgroup -o $sys cgroup $sys; then + rmdir $sys || true + fi + fi + done + + dockerd -H tcp://127.0.0.1:5555 -H unix:///var/run/docker.sock & + + until $(curl --output /dev/null --silent --connect-timeout 2 http://127.0.0.1:5555); do + printf '.' + sleep 1 + done + + echo load image + docker load -i ${image} + + echo run image + docker run ${image.destNameTag} tar -C /opt/devkitpro -c . | tar -xv --no-same-owner -C $out || true + + echo end + kill %1 + '' + ); + in { + packages.x86_64-linux.devkitA64 = pkgs.stdenv.mkDerivation { + name = "devkitA64"; + src = extractDocker imageA64; + nativeBuildInputs = [ + pkgs.autoPatchelfHook + ]; + buildInputs = [ + pkgs.stdenv.cc.cc + pkgs.ncurses6 + pkgs.zsnes + ]; + buildPhase = "true"; + installPhase = '' + mkdir -p $out + cp -r $src/{devkitA64,libnx,portlibs,tools} $out + rm -rf $out/pacman + ''; + }; + + packages.x86_64-linux.devkitARM = pkgs.stdenv.mkDerivation { + name = "devkitARM"; + src = extractDocker imageARM; + nativeBuildInputs = [pkgs.autoPatchelfHook]; + buildInputs = [ + pkgs.stdenv.cc.cc + pkgs.ncurses6 + pkgs.zsnes + ]; + buildPhase = "true"; + installPhase = '' + mkdir -p $out + cp -r $src/{devkitARM,libgba,libnds,libctru,libmirko,liborcus,portlibs,tools} $out + rm -rf $out/pacman + ''; + }; + + packages.x86_64-linux.devkitPPC = pkgs.stdenv.mkDerivation { + name = "devkitPPC"; + src = extractDocker imagePPC; + nativeBuildInputs = [pkgs.autoPatchelfHook]; + buildInputs = [ + pkgs.stdenv.cc.cc + pkgs.ncurses5 + pkgs.expat + pkgs.xz + ]; + buildPhase = "true"; + installPhase = '' + mkdir -p $out + cp -r $src/{devkitPPC,libogc,portlibs,tools,wut} $out + rm -rf $out/pacman + ''; + }; + }; }