about summary refs log tree commit diff
path: root/pkgs/development/libraries/imgui/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/libraries/imgui/default.nix')
-rw-r--r--pkgs/development/libraries/imgui/default.nix144
1 files changed, 129 insertions, 15 deletions
diff --git a/pkgs/development/libraries/imgui/default.nix b/pkgs/development/libraries/imgui/default.nix
index ed15d6229d9e2..09b88c1a191ce 100644
--- a/pkgs/development/libraries/imgui/default.nix
+++ b/pkgs/development/libraries/imgui/default.nix
@@ -1,32 +1,146 @@
-{ stdenv, lib, fetchFromGitHub }:
+{
+  stdenv,
+  lib,
+  applyPatches,
+  callPackage,
+  cmake,
+  fetchFromGitHub,
+  fetchpatch,
+  darwin,
+  glfw,
+  libGL,
+  SDL2,
+  vcpkg,
+  vulkan-headers,
+  vulkan-loader,
+
+  # The intent is to mirror vcpkg's flags[^1],
+  # but we only actually support Linux and glfw3 until someone contributes the rest
+  # [^1]: https://github.com/microsoft/vcpkg/blob/095ee06e7f60dceef7d713e3f8b1c2eb10d650d7/ports/imgui/CMakeLists.txt#L33-L108
+  IMGUI_BUILD_ALLEGRO5_BINDING ? false,
+  IMGUI_BUILD_ANDROID_BINDING ? stdenv.hostPlatform.isAndroid,
+  IMGUI_BUILD_DX9_BINDING ? false,
+  IMGUI_BUILD_DX10_BINDING ? false,
+  IMGUI_BUILD_DX11_BINDING ? false,
+  IMGUI_BUILD_DX12_BINDING ? false,
+  IMGUI_BUILD_GLFW_BINDING ? !stdenv.isDarwin,
+  IMGUI_BUILD_GLUT_BINDING ? false,
+  IMGUI_BUILD_METAL_BINDING ? stdenv.isDarwin,
+  IMGUI_BUILD_OPENGL2_BINDING ? false,
+  IMGUI_BUILD_OPENGL3_BINDING ?
+    IMGUI_BUILD_SDL2_BINDING || IMGUI_BUILD_GLFW_BINDING || IMGUI_BUILD_GLUT_BINDING,
+  IMGUI_BUILD_OSX_BINDING ? stdenv.isDarwin,
+  IMGUI_BUILD_SDL2_BINDING ?
+    !IMGUI_BUILD_GLFW_BINDING && !stdenv.isDarwin,
+  IMGUI_BUILD_SDL2_RENDERER_BINDING ? IMGUI_BUILD_SDL2_BINDING,
+  IMGUI_BUILD_VULKAN_BINDING ? false,
+  IMGUI_BUILD_WIN32_BINDING ? false,
+  IMGUI_FREETYPE ? false,
+  IMGUI_FREETYPE_LUNASVG ? false,
+  IMGUI_USE_WCHAR32 ? false,
+}@args:
+
+let
+  vcpkgSource = applyPatches {
+    inherit (vcpkg) src;
+    patches = [
+      # Install imgui into split outputs:
+      (fetchpatch {
+        url = "https://github.com/microsoft/vcpkg/commit/e91750f08383112e8850f209e55ed2f960181fa6.patch";
+        hash = "sha256-T+DN42PRl2gWGM8zJb9wZEsDl7+XNT6CFypNX3lBHNc=";
+      })
+    ];
+  };
+in
 
 stdenv.mkDerivation rec {
   pname = "imgui";
-  version = "1.90.5";
+  version = "1.90.6";
+  outputs = [
+    # Note: no "dev" because vcpkg installs include/ and imgui-config.cmake
+    # into different prefixes but expects the merged layout at import time
+    "out"
+    "lib"
+  ];
 
   src = fetchFromGitHub {
     owner = "ocornut";
     repo = "imgui";
     rev = "v${version}";
-    sha256 = "sha256-iTs8bcCAR8lvN1tcKmwyB3CcFmqR1QpqdGqdER920rM=";
+    sha256 = "sha256-FSob6FPfg0tF0n72twA5/moLvEaB251BPkIDJUXhYbg=";
   };
 
-  dontBuild = true;
+  cmakeRules = "${vcpkgSource}/ports/imgui";
+  postPatch = ''
+    cp "$cmakeRules"/{CMakeLists.txt,*.cmake.in} ./
+  '';
 
-  installPhase = ''
-    mkdir -p $out/include/imgui
+  nativeBuildInputs = [ cmake ];
 
-    cp *.h $out/include/imgui
-    cp *.cpp $out/include/imgui
-    cp -a backends $out/include/imgui/
-    cp -a misc $out/include/imgui/
-  '';
+  buildInputs = lib.optionals stdenv.hostPlatform.isDarwin [
+    darwin.apple_sdk.frameworks.ApplicationServices
+    darwin.apple_sdk.frameworks.Cocoa
+    darwin.apple_sdk.frameworks.GameController
+  ];
+
+  propagatedBuildInputs =
+    lib.optionals (IMGUI_BUILD_OPENGL2_BINDING || IMGUI_BUILD_OPENGL3_BINDING) [ libGL ]
+    ++ lib.optionals IMGUI_BUILD_GLFW_BINDING [ glfw ]
+    ++ lib.optionals IMGUI_BUILD_SDL2_BINDING [ SDL2 ]
+    ++ lib.optionals IMGUI_BUILD_VULKAN_BINDING [
+      vulkan-headers
+      vulkan-loader
+    ]
+    ++ lib.optionals IMGUI_BUILD_METAL_BINDING [ darwin.apple_sdk.frameworks.Metal ];
+
+  cmakeFlags = [
+    (lib.cmakeBool "IMGUI_BUILD_GLFW_BINDING" IMGUI_BUILD_GLFW_BINDING)
+    (lib.cmakeBool "IMGUI_BUILD_ALLEGRO5_BINDING" IMGUI_BUILD_ALLEGRO5_BINDING)
+    (lib.cmakeBool "IMGUI_BUILD_ANDROID_BINDING" IMGUI_BUILD_ANDROID_BINDING)
+    (lib.cmakeBool "IMGUI_BUILD_DX9_BINDING" IMGUI_BUILD_DX9_BINDING)
+    (lib.cmakeBool "IMGUI_BUILD_DX10_BINDING" IMGUI_BUILD_DX10_BINDING)
+    (lib.cmakeBool "IMGUI_BUILD_DX11_BINDING" IMGUI_BUILD_DX11_BINDING)
+    (lib.cmakeBool "IMGUI_BUILD_DX12_BINDING" IMGUI_BUILD_DX12_BINDING)
+    (lib.cmakeBool "IMGUI_BUILD_GLFW_BINDING" IMGUI_BUILD_GLFW_BINDING)
+    (lib.cmakeBool "IMGUI_BUILD_GLUT_BINDING" IMGUI_BUILD_GLUT_BINDING)
+    (lib.cmakeBool "IMGUI_BUILD_METAL_BINDING" IMGUI_BUILD_METAL_BINDING)
+    (lib.cmakeBool "IMGUI_BUILD_OPENGL2_BINDING" IMGUI_BUILD_OPENGL2_BINDING)
+    (lib.cmakeBool "IMGUI_BUILD_OPENGL3_BINDING" IMGUI_BUILD_OPENGL3_BINDING)
+    (lib.cmakeBool "IMGUI_BUILD_OSX_BINDING" IMGUI_BUILD_OSX_BINDING)
+    (lib.cmakeBool "IMGUI_BUILD_SDL2_BINDING" IMGUI_BUILD_SDL2_BINDING)
+    (lib.cmakeBool "IMGUI_BUILD_SDL2_RENDERER_BINDING" IMGUI_BUILD_SDL2_RENDERER_BINDING)
+    (lib.cmakeBool "IMGUI_BUILD_VULKAN_BINDING" IMGUI_BUILD_VULKAN_BINDING)
+    (lib.cmakeBool "IMGUI_BUILD_WIN32_BINDING" IMGUI_BUILD_WIN32_BINDING)
+    (lib.cmakeBool "IMGUI_FREETYPE" IMGUI_FREETYPE)
+    (lib.cmakeBool "IMGUI_FREETYPE_LUNASVG" IMGUI_FREETYPE_LUNASVG)
+    (lib.cmakeBool "IMGUI_USE_WCHAR32" IMGUI_USE_WCHAR32)
+  ];
+
+  passthru = {
+    tests = {
+      demo = callPackage ./demo { };
+    };
+  };
 
-  meta = with lib; {
+  meta = {
+    # These flags haven't been tested:
+    broken =
+      IMGUI_FREETYPE
+      || IMGUI_FREETYPE_LUNASVG
+      || IMGUI_BUILD_DX9_BINDING
+      || IMGUI_BUILD_DX10_BINDING
+      || IMGUI_BUILD_DX11_BINDING
+      || IMGUI_BUILD_DX12_BINDING
+      || IMGUI_BUILD_WIN32_BINDING
+      || IMGUI_BUILD_ALLEGRO5_BINDING
+      || IMGUI_BUILD_ANDROID_BINDING;
     description = "Bloat-free Graphical User interface for C++ with minimal dependencies";
     homepage = "https://github.com/ocornut/imgui";
-    license = licenses.mit;
-    maintainers = with maintainers; [ wolfangaukang ];
-    platforms = platforms.all;
+    license = lib.licenses.mit; # vcpkg licensed as MIT too
+    maintainers = with lib.maintainers; [
+      SomeoneSerge
+      wolfangaukang
+    ];
+    platforms = lib.platforms.all;
   };
 }