nix-update icon indicating copy to clipboard operation
nix-update copied to clipboard

issue getting new package to work with command

Open Redhawk18 opened this issue 5 months ago • 11 comments

❯ nix-update edopro --version 40.1.4
$ nix eval --json --impure --expr 
let
  
  pkgs = import "/home/redhawk/code/nixpkgs";
  args =  builtins.functionArgs pkgs;
  inputs = (if args ? system then { system = builtins.currentSystem; } else {}) //
           (if args ? overlays then { overlays = [ ]; } else {});
  pkg = (pkgs inputs)."edopro";
  sanitizePosition = x: x;

  raw_version_position = sanitizePosition (builtins.unsafeGetAttrPos "version" pkg);

  position = if pkg ? isRubyGem then
    raw_version_position
  else if pkg ? isPhpExtension then
    raw_version_position
   else
    sanitizePosition (builtins.unsafeGetAttrPos "src" pkg);
in {
  name = pkg.name;
  old_version = pkg.version or (builtins.parseDrvName pkg.name).version;
  inherit raw_version_position;
  filename = position.file;
  line = position.line;
  urls = pkg.src.urls or null;
  url = pkg.src.url or null;
  rev = pkg.src.rev or null;
  hash = pkg.src.outputHash or null;
  go_modules = pkg.goModules.outputHash or null;
  go_modules_old = pkg.go-modules.outputHash or null;
  cargo_deps = pkg.cargoDeps.outputHash or null;
  raw_cargo_lock =
    if pkg ? cargoDeps.lockFile then
      let
        inherit (pkg.cargoDeps) lockFile;
        res = builtins.tryEval (sanitizePosition {
          file = toString lockFile;
        });
      in
      if res.success then res.value.file else false
    else
      null;
  composer_deps = pkg.composerRepository.outputHash or null;
  npm_deps = pkg.npmDeps.outputHash or null;
  yarn_deps = pkg.offlineCache.outputHash or null;
  maven_deps = pkg.fetchedMavenDeps.outputHash or null;
  tests = builtins.attrNames (pkg.passthru.tests or {});
  has_update_script = pkg.passthru.updateScript or null != null;
  src_homepage = pkg.src.meta.homepage or null;
  changelog = pkg.meta.changelog or null;
  maintainers = pkg.meta.maintainers or null;
} --extra-experimental-features flakes nix-command
error:
       … while evaluating attribute 'filename'

         at «string»:23:3:

           22|   inherit raw_version_position;
           23|   filename = position.file;
             |   ^
           24|   line = position.line;

       … while selecting an attribute

         at «string»:23:14:

           22|   inherit raw_version_position;
           23|   filename = position.file;
             |              ^
           24|   line = position.line;

       error: value is null while a set was expected
Traceback (most recent call last):
  File "/nix/store/17yljvqhcmbp7lzywfz70bxsnrdgayg5-nix-update-1.3.1/bin/.nix-update-wrapped", line 9, in <module>
    sys.exit(main())
             ^^^^^^
  File "/nix/store/17yljvqhcmbp7lzywfz70bxsnrdgayg5-nix-update-1.3.1/lib/python3.11/site-packages/nix_update/__init__.py", line 291, in main
    package = update(options)
              ^^^^^^^^^^^^^^^
  File "/nix/store/17yljvqhcmbp7lzywfz70bxsnrdgayg5-nix-update-1.3.1/lib/python3.11/site-packages/nix_update/update.py", line 339, in update
    package = eval_attr(opts)
              ^^^^^^^^^^^^^^^
  File "/nix/store/17yljvqhcmbp7lzywfz70bxsnrdgayg5-nix-update-1.3.1/lib/python3.11/site-packages/nix_update/eval.py", line 205, in eval_attr
    res = run(cmd)
          ^^^^^^^^
  File "/nix/store/17yljvqhcmbp7lzywfz70bxsnrdgayg5-nix-update-1.3.1/lib/python3.11/site-packages/nix_update/utils.py", line 37, in run
    return subprocess.run(
           ^^^^^^^^^^^^^^^
  File "/nix/store/h723hb9m43lybmvfxkk6n7j4v664qy7b-python3-3.11.9/lib/python3.11/subprocess.py", line 571, in run
    raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['nix', 'eval', '--json', '--impure', '--expr', '\nlet\n  \n  pkgs = import "/home/redhawk/code/nixpkgs";\n  args =  builtins.functionArgs pkgs;\n  inputs = (if args ? system then { system = builtins.currentSystem; } else {}) //\n           (if args ? overlays then { overlays = [ ]; } else {});\n  pkg = (pkgs inputs)."edopro";\n  sanitizePosition = x: x;\n\n  raw_version_position = sanitizePosition (builtins.unsafeGetAttrPos "version" pkg);\n\n  position = if pkg ? isRubyGem then\n    raw_version_position\n  else if pkg ? isPhpExtension then\n    raw_version_position\n   else\n    sanitizePosition (builtins.unsafeGetAttrPos "src" pkg);\nin {\n  name = pkg.name;\n  old_version = pkg.version or (builtins.parseDrvName pkg.name).version;\n  inherit raw_version_position;\n  filename = position.file;\n  line = position.line;\n  urls = pkg.src.urls or null;\n  url = pkg.src.url or null;\n  rev = pkg.src.rev or null;\n  hash = pkg.src.outputHash or null;\n  go_modules = pkg.goModules.outputHash or null;\n  go_modules_old = pkg.go-modules.outputHash or null;\n  cargo_deps = pkg.cargoDeps.outputHash or null;\n  raw_cargo_lock =\n    if pkg ? cargoDeps.lockFile then\n      let\n        inherit (pkg.cargoDeps) lockFile;\n        res = builtins.tryEval (sanitizePosition {\n          file = toString lockFile;\n        });\n      in\n      if res.success then res.value.file else false\n    else\n      null;\n  composer_deps = pkg.composerRepository.outputHash or null;\n  npm_deps = pkg.npmDeps.outputHash or null;\n  yarn_deps = pkg.offlineCache.outputHash or null;\n  maven_deps = pkg.fetchedMavenDeps.outputHash or null;\n  tests = builtins.attrNames (pkg.passthru.tests or {});\n  has_update_script = pkg.passthru.updateScript or null != null;\n  src_homepage = pkg.src.meta.homepage or null;\n  changelog = pkg.meta.changelog or null;\n  maintainers = pkg.meta.maintainers or null;\n}', '--extra-experimental-features', 'flakes nix-command']' returned non-zero exit status 1.

This is my package below

{
  lib,
  stdenv,
  fetchFromGitHub,
  fetchzip,
  premake5,
  writeShellScriptBin,
  runCommandLocal,
  symlinkJoin,
  imagemagick,
  bzip2,
  curl,
  flac,
  fmt_9,
  freetype,
  libevent,
  libgit2,
  libGL,
  libGLU,
  libjpeg,
  libpng,
  libvorbis,
  libX11,
  libxkbcommon,
  libXxf86vm,
  lua5_3,
  mono,
  nlohmann_json,
  noto-fonts-cjk-sans,
  openal,
  SDL2,
  sqlite,
  wayland,
  egl-wayland,
  covers_url ? "https://pics.projectignis.org:2096/pics/cover/{}.jpg",
  fields_url ? "https://pics.projectignis.org:2096/pics/field/{}.png",
  font ? false,
  # TODO
  # While ygoprodeck has higher quality images, "spamming" of their api results in a ban.
  # Thats why this link can change since it's compiled into the program, However it will
  # download assets when needed so it is unlikely to get banned. Unless you search the
  # card list with no filters of any kind. When testing use ProjectIgnis' website instead.
  pics_url ? "https://images.ygoprodeck.com/images/cards/{}.jpg",
}:
let
  edopro-version = "40.1.4";

  assets = {
    pname = "assets";
    version = edopro-version;

    src = fetchzip {
      url = "https://github.com/ProjectIgnis/edopro-assets/releases/download/${edopro-version}/ProjectIgnis-EDOPro-${edopro-version}-linux.tar.gz";
      sha256 = "sha256-vZhkWJ1ZoNEwdc5kM1S0hyXnWmupiTOanCi9DCuqw/k=";
    };
  };

  irrlicht-edopro = stdenv.mkDerivation {
    pname = "irrlicht-edopro";
    version = "1.9-custom";

    src = fetchFromGitHub {
      owner = "edo9300";
      repo = "irrlicht1-8-4";
      # Found by getting the newest version before EDOPro's tagged release comes out.
      rev = "7edde28d4f8c0c3589934c398a3a441286bb7c22";
      hash = "sha256-Q2tNiYE/enZPqA5YhUe+Tkvmqtmmz2E0OqTRUDnt+UA=";
    };

    buildInputs = [
      libGLU
      libX11
      libxkbcommon
      libXxf86vm
      wayland
    ];

    enableParallelBuilding = true;
    buildFlags = "NDEBUG=1";
    makeFlags = "-C source/Irrlicht";

    installPhase = ''
      mkdir -p $out/{bin,include}
      cp lib/Linux/libIrrlicht.a $out/bin
      cp -r include/* $out/include
    '';
  };

  ocgcore = stdenv.mkDerivation rec {
    pname = "ygopro-core";
    # Tied to the tagged version of EDOPro's git module.
    version = "4a872ad7686e0d00ee4c1c051e90fc07c40613d4";

    src = fetchFromGitHub {
      owner = "edo9300";
      repo = pname;
      rev = version;
      hash = "sha256-s3DOHrZilRUy6fbXObNiLRinxpdHY99vDOmS/ZfOI78=";
      fetchSubmodules = true;
    };

    nativeBuildInputs = [ premake5 ];

    buildInputs = [ lua5_3 ];

    preBuild = ''
      premake5 gmake2
    '';

    enableParallelBuilding = true;
    buildFlags = "verbose=true config=release ocgcore";
    makeFlags = "-C build";

    installPhase = ''
      mkdir -p $out/bin
      cp bin/release/libocgcore.a $out/bin
    '';
  };

  edopro = stdenv.mkDerivation rec {
    pname = "edopro";
    version = edopro-version;

    src = fetchFromGitHub {
      owner = "edo9300";
      repo = pname;
      rev = "c713e23491a1e55c9d8e91257e5f2b5873696b9b";
      hash = "sha256-2E1cjG0FONu/fbr67/3qRCKQ1W/wPznClEWsMa1FAzo=";
      fetchSubmodules = true;
    };

    nativeBuildInputs = [ premake5 ];

    buildInputs = [
      bzip2
      curl
      flac
      fmt_9
      freetype
      irrlicht-edopro
      libevent
      libgit2
      libjpeg
      libpng
      libvorbis
      nlohmann_json
      openal
      SDL2
      sqlite
    ];

    # nixpkgs' gcc stack currently appears to not support LTO
    postPatch = ''
      sed -i '/LinkTimeOptimization/d' ./premake5.lua
    '';

    # ${lib.optionals font "--bundled-font=${font}"}
    # ${lib.optionals font [ "--bundled-font=${noto-fonts-cjk-sans}/share/fonts/opentype/noto-cjk/NotoSansCJK-VF.otf.ttc" ] }
    preBuild = ''
      premake5 gmake2 \
        --covers=\"${covers_url}\" \
        --fields=\"${fields_url}\" \
        --no-core \
        --pics=\"${pics_url}\" \
        --prebuilt-core="${ocgcore}/bin" \
        --sound=sfml
    '';

    enableParallelBuilding = true;
    CXXFLAGS = "-include cstdint";
    LDFLAGS = "-I ${irrlicht-edopro}/include -L ${irrlicht-edopro}/bin";
    buildFlags = "verbose=true config=release_x64 ygoprodll";
    makeFlags = "-C build";

    installPhase = ''
      mkdir -p $out/bin
      cp bin/x64/release/ygoprodll $out/bin
    '';
  };

  edopro-script =
    let
      assetsToCopy = lib.concatStringsSep "," [
        # Needed if we download files from ProjectIgnis' website or any https only website.
        "cacert.pem"
        "config"
        "deck"
        "COPYING.txt"
        "expansions"
        "lflists"
        "notices"
        "puzzles"
        "fonts"
        "script"
        "skin"
        "sound"
        "textures"
        "WindBot"
      ];
    in
    writeShellScriptBin "EDOPro" ''
      set -eu
      EDOPRO_DIR="''${XDG_DATA_HOME:-$HOME/.local/share}/edopro"

      if [ ! -d $EDOPRO_DIR ]; then
          mkdir -p $EDOPRO_DIR
          cp -r ${assets.src}/{${assetsToCopy}} $EDOPRO_DIR

          find $EDOPRO_DIR -type d -exec chmod u=rwx,go-rwx {} +
          find $EDOPRO_DIR -type f -exec chmod u=rw,go-rwx {} +

          rm $EDOPRO_DIR/config/io.github.edo9300.EDOPro.desktop.in
      fi

      export PATH=PATH:'${lib.makeBinPath [ mono ]}';
      export LD_LIBRARY_PATH='${
        lib.makeLibraryPath [
          libGL
          libX11
          libxkbcommon
          libXxf86vm
          sqlite
          wayland
          egl-wayland
        ]
      }';

      exec ${edopro}/bin/ygoprodll -C $EDOPRO_DIR $@
    '';

  edopro-desktop = runCommandLocal "io.github.edo9300.EDOPro.desktop" { } ''
    cp ${assets.src}/config/io.github.edo9300.EDOPro.desktop.in desktop-template

    sed '/Path=/d' -i desktop-template
    sed 's/Exec=.*/Exec=EDOPro/' -i desktop-template
    sed 's/Icon=.*/Icon=EDOPro/' -i desktop-template

    install -D desktop-template $out/share/applications/io.github.edo9300.EDOPro.desktop
  '';
in
symlinkJoin {
  name = "edopro-application";
  paths = [
    edopro
    edopro-script
    edopro-desktop
  ];

  postBuild = ''
    mkdir -p $out/share/icons/hicolor/256x256/apps/
    ${imagemagick}/bin/magick \
        ${assets.src}/textures/AppIcon.png \
        -resize 256x256 \
        $out/share/icons/hicolor/256x256/apps/EDOPro.png
  '';

  meta = with lib; {
    description = "The bleeding-edge automatic duel simulator, a fork of the YGOPro client.";
    homepage = "https://projectignis.github.io";
    changelog = "https://github.com/edo9300/edopro/releases";
    license = licenses.agpl3Plus;
    maintainers = with maintainers; [
      redhawk
      tlater
    ];
    mainprogram = "edopro";
    platforms = [ "x86_64-linux" ];
  };
}

I believe my problem is likely the git module called ocgcore, but I'm unsure. If theres a way I can interop with nix update to help it I'd like to know to.

Redhawk18 avatar Sep 26 '24 06:09 Redhawk18