diff --git a/pkgs/by-name/ic/icestudio/package.nix b/pkgs/by-name/ic/icestudio/package.nix new file mode 100644 index 000000000000..c1f3d027e7b4 --- /dev/null +++ b/pkgs/by-name/ic/icestudio/package.nix @@ -0,0 +1,125 @@ +{ + lib, + fetchurl, + fetchFromGitHub, + buildNpmPackage, + makeDesktopItem, + makeWrapper, + + nwjs, + python3, +}: + +let + # Use unstable because it has improvements for finding python + version = "0-unstable-2024-11-18"; + + src = fetchFromGitHub { + owner = "FPGAwars"; + repo = "icestudio"; + rev = "87d057adb1e795352a7dd67666a69ada4269b2e8"; + hash = "sha256-VZuc5Wa6o5PMUE+P4EMDl/pI/zmcff9OEhqeCfS4bzE="; + }; + + collection = fetchurl { + url = "https://github.com/FPGAwars/collection-default/archive/v0.4.1.zip"; + hash = "sha256-F2cAqkTPC7xfGnPQiS8lTrD4y34EkHFUEDPVaYzVVg8="; + }; + + app = buildNpmPackage { + pname = "icestudio-app"; + inherit version src; + npmDepsHash = "sha256-CbrnhnhCG8AdAqySO6fB5hZ128lHyC3WH/vZcFtv6Ko="; + sourceRoot = "${src.name}/app"; + dontNpmBuild = true; + installPhase = '' + cp -r . $out + ''; + }; + + desktopItem = makeDesktopItem { + desktopName = "Icestudio"; + comment = "Visual editor for open FPGA boards"; + name = "icestudio"; + exec = "icestudio"; + icon = "icestudio"; + terminal = false; + categories = [ "Development" ]; + }; +in +buildNpmPackage rec { + pname = "icestudio"; + inherit version src; + npmDepsHash = "sha256-y1lo5+qJ6JBxjt7wtUmTHuJHMH9Mztf6xmmadI8zBgA="; + npmFlags = [ + # Use the legacy dependency resolution, with less strict version + # requirements for transative dependencies + "--legacy-peer-deps" + + # We want to avoid call the scripts/postInstall.sh until we copy the + # collection and app derivation we do that on installPhase + "--ignore-scripts" + ]; + + buildPhase = '' + runHook preBuild + + # Copy the `app` derivation into the folder expected for grunt + cp -r ${app}/* app + + # Copy the cached `collection` derivation into the cache location so that + # grunt avoids downloading it + install -m444 -D ${collection} cache/collection/collection-default.zip + + ./node_modules/.bin/grunt getcollection + + # Use grunt to distribute package + # TODO: support aarch64 + ./node_modules/.bin/grunt dist \ + --platform=none `# skip platform-specific steps` \ + --dont-build-nwjs `# use the nwjs package shipped by Nix` \ + --dont-clean-tmp `# skip cleaning the tmp folder as we'll use it in $out` + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + cp -r dist/tmp $out + + for size in 16 32 64 128 256; do + install -Dm644 docs/resources/icons/"$size"x"$size"/apps/icon.png \ + $out/share/icons/hicolor/"$size"x"$size"/apps/icestudio.png + done + + install -Dm644 ${desktopItem}/share/applications/icestudio.desktop -t $out/share/applications + + makeWrapper ${nwjs}/bin/nw $out/bin/${pname} \ + --add-flags $out \ + --prefix PATH : "${python3}/bin" + + runHook postInstall + ''; + + nativeBuildInputs = [ makeWrapper ]; + + buildInputs = [ python3 ]; + + meta = { + description = "Visual editor for open FPGA boards"; + homepage = "https://github.com/FPGAwars/icestudio/"; + license = lib.licenses.gpl2Only; + maintainers = + with lib.maintainers; + [ + kiike + jleightcap + rcoeurjoly + amerino + ] + ++ [ lib.teams.ngi ]; + mainProgram = "icestudio"; + platforms = lib.platforms.linux; + }; +}