Unverified Commit ec56f7ae authored by Cosima Neidahl's avatar Cosima Neidahl Committed by GitHub
Browse files

np2kai: 0.86rev22 -> 0.86rev22-unstable-2024-12-22 (#405367)

parents 1f232dd4 f0b38d6c
Loading
Loading
Loading
Loading
+90 −193
Original line number Diff line number Diff line
@@ -2,32 +2,23 @@
  stdenv,
  lib,
  fetchFromGitHub,
  enable16Bit ? true,
  enable32Bit ? true,

  enableSDL ? true,
  withSDLVersion ? "2",
  SDL,
  SDL_ttf,
  SDL_mixer,
  unstableGitUpdater,
  writeShellApplication,
  cmake,
  fontconfig,
  freetype,
  glib,
  gtk2,
  libusb1,
  libX11,
  openssl,
  pkg-config,
  SDL2,
  SDL2_ttf,
  SDL2_mixer,

  enable16Bit ? true,
  enableX11 ? stdenv.hostPlatform.isLinux,
  automake,
  autoconf,
  autoconf-archive,
  libtool,
  pkg-config,
  unzip,
  gtk2,
  libusb1,
  libXxf86vm,
  nasm,
  libICE,
  libSM,

  # HAXM build succeeds but the binary segfaults, seemingly due to the missing HAXM kernel module
  # Enable once there is a HAXM kernel module option in NixOS? Or somehow bind it to the system kernel having HAXM?
  # Or leave it disabled by default?
@@ -35,198 +26,104 @@
  enableHAXM ? false,
}:

assert lib.assertMsg (
  enable16Bit || enable32Bit
) "Must enable 16-Bit and/or 32-Bit system variant.";
assert lib.assertMsg (enableSDL || enableX11) "Must enable SDL and/or X11 graphics interfaces.";
assert lib.assertOneOf "withSDLVersion" withSDLVersion [
  "1"
  "2"
];
assert enableHAXM -> (lib.assertMsg enableX11 "Must enable X11 graphics interface for HAXM build.");
let
  inherit (lib) optional optionals optionalString;
  inherit (lib.strings) concatStringsSep concatMapStringsSep;
  isSDL2 = (withSDLVersion == "2");
  sdlInfix = optionalString isSDL2 "2";
  sdlDeps1 = [
    SDL
    SDL_ttf
    SDL_mixer
  ];
  sdlDeps2 = [
    SDL2
    SDL2_ttf
    SDL2_mixer
  ];
  sdlDepsBuildonly = if isSDL2 then sdlDeps1 else sdlDeps2;
  sdlDepsTarget = if isSDL2 then sdlDeps2 else sdlDeps1;
  sdlMakefileSuffix =
    if stdenv.hostPlatform.isWindows then
      "win"
    else if stdenv.hostPlatform.isDarwin then
      "mac"
    else
      "unix";
  sdlMakefiles = concatMapStringsSep " " (x: x + "." + sdlMakefileSuffix) (
    optionals enable16Bit [
      "Makefile"
    ]
    ++ optionals enable32Bit [
      "Makefile21"
    ]
  );
  sdlBuildFlags = concatStringsSep " " (
    optionals enableSDL [
      "SDL_VERSION=${withSDLVersion}"
    ]
  );
  sdlBins = concatStringsSep " " (
    optionals enable16Bit [
      "np2kai"
    ]
    ++ optionals enable32Bit [
      "np21kai"
    ]
  );
  x11ConfigureFlags = concatStringsSep " " (
    (
      if ((enableHAXM && (enable16Bit || enable32Bit)) || (enable16Bit && enable32Bit)) then
        [
          "--enable-build-all"
        ]
      else if enableHAXM then
        [
          "--enable-haxm"
        ]
      else if enable32Bit then
        [
          "--enable-ia32"
        ]
      else
        [ ]
    )
    ++ optionals (!isSDL2) [
      "--enable-sdl"
      "--enable-sdlmixer"
      "--enable-sdlttf"

      "--enable-sdl2=no"
      "--enable-sdl2mixer=no"
      "--enable-sdl2ttf=no"
    ]
  );
  x11BuildFlags = concatStringsSep " " [
    "SDL2_CONFIG=sdl2-config"
    "SDL_CONFIG=sdl-config"
    "SDL_CFLAGS=\"$(sdl${sdlInfix}-config --cflags)\""
    "SDL_LIBS=\"$(sdl${sdlInfix}-config --libs) -lSDL${sdlInfix}_mixer -lSDL${sdlInfix}_ttf\""
  ];
  x11Bins = concatStringsSep " " (
    optionals enable16Bit [
      "xnp2kai"
    ]
    ++ optionals enable32Bit [
      "xnp21kai"
    ]
    ++ optionals enableHAXM [
      "xnp21kai_haxm"
    ]
  );
in
stdenv.mkDerivation rec {
stdenv.mkDerivation (finalAttrs: {
  pname = "np2kai";
  version = "0.86rev22"; # update src.rev to commit rev accordingly
  version = "0.86rev22-unstable-2024-12-22";

  src = fetchFromGitHub {
    owner = "AZO234";
    repo = "NP2kai";
    rev = "4a317747724669343e4c33ebdd34783fb7043221";
    sha256 = "0kxysxhx6jyk82mx30ni0ydzmwdcbnlxlnarrlq018rsnwb4md72";
    rev = "da219658c24c610ba82d5a07ea9897e8e0eef670";
    hash = "sha256-b0KOfqUgVtFuZxw8js6JCnzMh6Wh+f7o/IHcD6TiG1s=";
  };

  configurePhase =
    ''
      export GIT_VERSION=${builtins.substring 0 7 src.rev}
    ''
    + optionalString enableParallelBuilding ''
      appendToVar buildFlags "-j$NIX_BUILD_CORES"
    ''
    + optionalString enableX11 ''
      cd x11
      substituteInPlace Makefile.am \
        --replace 'GIT_VERSION :=' 'GIT_VERSION ?='
      ./autogen.sh ${x11ConfigureFlags}
      ./configure ${x11ConfigureFlags}
      cd ..
  # Don't require Git
  # Use SDL2(_*) targets for correct includedirs
  # Add return type in ancient code
  postPatch = ''
    substituteInPlace CMakeLists.txt \
      --replace-fail 'if(NOT git_result EQUAL 0)' 'if(FALSE)' \
      --replace-fail "\''${SDL2_DEFINE}" "" \
      --replace-fail "\''${SDL2_INCLUDE_DIR}" "" \
      --replace-fail "\''${SDL2_LIBRARY}" "SDL2::SDL2" \
      --replace-fail "\''${SDL2_MIXER_DEFINE}" "" \
      --replace-fail "\''${SDL2_MIXER_INCLUDE_DIR}" "" \
      --replace-fail "\''${SDL2_MIXER_LIBRARY}" "SDL2_mixer::SDL2_mixer" \
      --replace-fail "\''${SDL2_TTF_DEFINE}" "" \
      --replace-fail "\''${SDL2_TTF_INCLUDE_DIR}" "" \
      --replace-fail "\''${SDL2_TTF_LIBRARY}" "SDL2_ttf::SDL2_ttf" \

    substituteInPlace x/cmserial.c \
      --replace-fail 'convert_np2tocm(UINT port, UINT8* param, UINT32* speed) {' 'int convert_np2tocm(UINT port, UINT8* param, UINT32* speed) {'
    substituteInPlace x/gtk2/gtk_menu.c \
      --replace-fail 'xmenu_visible_item(MENU_HDL hdl, const char *name, BOOL onoff)' 'int xmenu_visible_item(MENU_HDL hdl, const char *name, BOOL onoff)'
  '';

  strictDeps = true;

  nativeBuildInputs =
    sdlDepsBuildonly
    ++ optionals enableX11 [
      automake
      autoconf
      autoconf-archive
      libtool
    [
      cmake
    ]
    ++ lib.optionals enableX11 [
      pkg-config
      unzip
      nasm
    ];

  buildInputs =
    sdlDepsTarget
    ++ optionals enableX11 [
      gtk2
      libICE
      libSM
    [
      libusb1
      libXxf86vm
      openssl
      SDL2
      SDL2_ttf
      SDL2_mixer
    ]
    ++ lib.optionals enableX11 [
      fontconfig
      freetype
      glib
      gtk2
      libX11
    ];

  enableParallelBuilding = true;
  cmakeFlags = [
    (lib.cmakeBool "BUILD_SDL" true)
    (lib.cmakeBool "BUILD_X" enableX11)
    (lib.cmakeBool "BUILD_HAXM" enableHAXM)
    (lib.cmakeBool "BUILD_I286" enable16Bit)

  # TODO Remove when bumping past rev22
  env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.hostPlatform.isDarwin "-D_DARWIN_C_SOURCE";
    (lib.cmakeBool "USE_SDL" true)
    (lib.cmakeBool "USE_SDL2" true)
    (lib.cmakeBool "USE_SDL_MIXER" true)
    (lib.cmakeBool "USE_SDL_TTF" true)
    (lib.cmakeBool "USE_X" enableX11)
    (lib.cmakeBool "USE_HAXM" enableHAXM)
  ];

  buildPhase =
    optionalString enableSDL ''
      cd sdl2
      for mkfile in ${sdlMakefiles}; do
        substituteInPlace $mkfile \
          --replace 'GIT_VERSION :=' 'GIT_VERSION ?='
        echo make -f $mkfile $buildFlags ${sdlBuildFlags} clean
        make -f $mkfile $buildFlags ${sdlBuildFlags} clean
        make -f $mkfile $buildFlags ${sdlBuildFlags}
      done
      cd ..
    ''
    + optionalString enableX11 ''
      cd x11
      make $buildFlags ${x11BuildFlags}
      cd ..
    '';
  enableParallelBuilding = true;

  installPhase =
    optionalString enableSDL ''
      cd sdl2
      for emu in ${sdlBins}; do
        install -D -m 755 $emu $out/bin/$emu
      done
      cd ..
    ''
    + optionalString enableX11 ''
      cd x11
      for emu in ${x11Bins}; do
        install -D -m 755 $emu $out/bin/$emu
      done
      cd ..
  env = {
    NP2KAI_VERSION = finalAttrs.version;
    NP2KAI_HASH = builtins.substring 0 7 finalAttrs.src.rev;
    # GCC 14 incompatibility
    NIX_CFLAGS_COMPILE = "-Wno-error=incompatible-pointer-types";
  };

  passthru.updateScript = unstableGitUpdater {
    # 0.86 version prefix is implied, add it back for our versioning
    tagConverter = lib.getExe (writeShellApplication {
      name = "update-np2kai";
      text = ''
        sed -e 's/^rev\./0.86rev/g'
      '';
    });
  };

  meta = with lib; {
  meta = {
    description = "PC-9801 series emulator";
    homepage = "https://github.com/AZO234/NP2kai";
    license = licenses.mit;
    maintainers = with maintainers; [ OPNA2608 ];
    platforms = platforms.x86;
    license = lib.licenses.mit;
    maintainers = with lib.maintainers; [ OPNA2608 ];
    mainProgram = "${if enableX11 then "x" else "sdl"}np21kai";
    platforms = lib.platforms.x86;
  };
}
})