1{
2 stdenv,
3 lib,
4 applyPatches,
5 callPackage,
6 cmake,
7 fetchFromGitHub,
8 fetchpatch,
9 glfw,
10 libGL,
11 SDL2,
12 sdl3,
13 vcpkg,
14 vulkan-headers,
15 vulkan-loader,
16 imgui,
17
18 # NOTE: Not coming from vcpkg
19 IMGUI_LINK_GLVND ?
20 !stdenv.hostPlatform.isWindows && (IMGUI_BUILD_OPENGL2_BINDING || IMGUI_BUILD_OPENGL3_BINDING),
21
22 # The intent is to mirror vcpkg's flags[^1],
23 # but we only actually support Linux and glfw3 until someone contributes the rest
24 # [^1]: https://github.com/microsoft/vcpkg/blob/095ee06e7f60dceef7d713e3f8b1c2eb10d650d7/ports/imgui/CMakeLists.txt#L33-L108
25 IMGUI_BUILD_ALLEGRO5_BINDING ? false,
26 IMGUI_BUILD_ANDROID_BINDING ? stdenv.hostPlatform.isAndroid,
27 IMGUI_BUILD_DX9_BINDING ? false,
28 IMGUI_BUILD_DX10_BINDING ? false,
29 IMGUI_BUILD_DX11_BINDING ? false,
30 IMGUI_BUILD_DX12_BINDING ? false,
31 IMGUI_BUILD_GLFW_BINDING ? !stdenv.hostPlatform.isDarwin,
32 IMGUI_BUILD_GLUT_BINDING ? false,
33 IMGUI_BUILD_METAL_BINDING ? stdenv.hostPlatform.isDarwin,
34 IMGUI_BUILD_OPENGL2_BINDING ? false,
35 IMGUI_BUILD_OPENGL3_BINDING ?
36 IMGUI_BUILD_SDL3_BINDING || IMGUI_BUILD_GLFW_BINDING || IMGUI_BUILD_GLUT_BINDING,
37 IMGUI_BUILD_OSX_BINDING ? stdenv.hostPlatform.isDarwin,
38 IMGUI_BUILD_SDL3_BINDING ? !IMGUI_BUILD_GLFW_BINDING && !stdenv.hostPlatform.isDarwin,
39 IMGUI_BUILD_SDL3_RENDERER_BINDING ? IMGUI_BUILD_SDL3_BINDING,
40 IMGUI_BUILD_SDL2_BINDING ? false,
41 IMGUI_BUILD_SDL2_RENDERER_BINDING ? false,
42 IMGUI_BUILD_SDLGPU3_BINDING ? IMGUI_BUILD_SDL3_BINDING && lib.versionAtLeast imgui.version "1.91.8",
43 IMGUI_BUILD_VULKAN_BINDING ? false,
44 IMGUI_BUILD_WIN32_BINDING ? false,
45 IMGUI_FREETYPE ? false,
46 IMGUI_FREETYPE_LUNASVG ? false,
47 IMGUI_USE_WCHAR32 ? false,
48}:
49let
50 vcpkgRevs.postSdl3 = lib.versionAtLeast vcpkg.version "2025.03.19";
51 vcpkgRevs.others = !vcpkgRevs.postSdl3;
52 vcpkgSource = applyPatches {
53 inherit (vcpkg) src;
54 patches =
55 lib.optionals vcpkgRevs.postSdl3 [
56 # This patch was not accepted mainstream, as out-of-scope
57 # and also to not encourage dependencies between Nixpkgs and Vcpkg.
58 # Currently @SomeoneSerge is responsible for rebasing it when necessary.
59 # Consider vendoring instead?
60 ./0001-imgui-allow-installing-into-split-outputs.patch
61 ]
62 ++ lib.optionals vcpkgRevs.others [
63 # Original version of the split-outputs patch
64 fetchpatch
65 {
66 url = "https://github.com/microsoft/vcpkg/commit/4108dd75ce9731a4fdcf50fd05034405156eaddf.patch";
67 hash = "sha256-jXbR0NfyuO8EESmva5A+H3WmBfCG83OiA8ZCcWsRhQA=";
68 }
69 ];
70 };
71in
72
73stdenv.mkDerivation rec {
74 pname = "imgui";
75 version = "1.91.4";
76 outputs = [
77 # Note: no "dev" because vcpkg installs include/ and imgui-config.cmake
78 # into different prefixes but expects the merged layout at import time
79 "out"
80 "lib"
81 ];
82
83 src = fetchFromGitHub {
84 owner = "ocornut";
85 repo = "imgui";
86 tag = "v${version}";
87 hash = "sha256-6j4keBOAzbBDsV0+R4zTNlsltxz2dJDGI43UIrHXDNM=";
88 };
89
90 cmakeRules = "${vcpkgSource}/ports/imgui";
91 postPatch = ''
92 cp "$cmakeRules"/{CMakeLists.txt,*.cmake.in} ./
93 '';
94
95 nativeBuildInputs = [ cmake ];
96
97 propagatedBuildInputs =
98 lib.optionals IMGUI_LINK_GLVND [ libGL ]
99 ++ lib.optionals IMGUI_BUILD_GLFW_BINDING [ glfw ]
100 ++ lib.optionals IMGUI_BUILD_SDL3_BINDING [ sdl3 ]
101 ++ lib.optionals IMGUI_BUILD_SDL2_BINDING [ SDL2 ]
102 ++ lib.optionals IMGUI_BUILD_VULKAN_BINDING [
103 vulkan-headers
104 vulkan-loader
105 ];
106
107 cmakeFlags = [
108 (lib.cmakeBool "IMGUI_BUILD_GLFW_BINDING" IMGUI_BUILD_GLFW_BINDING)
109 (lib.cmakeBool "IMGUI_BUILD_ALLEGRO5_BINDING" IMGUI_BUILD_ALLEGRO5_BINDING)
110 (lib.cmakeBool "IMGUI_BUILD_ANDROID_BINDING" IMGUI_BUILD_ANDROID_BINDING)
111 (lib.cmakeBool "IMGUI_BUILD_DX9_BINDING" IMGUI_BUILD_DX9_BINDING)
112 (lib.cmakeBool "IMGUI_BUILD_DX10_BINDING" IMGUI_BUILD_DX10_BINDING)
113 (lib.cmakeBool "IMGUI_BUILD_DX11_BINDING" IMGUI_BUILD_DX11_BINDING)
114 (lib.cmakeBool "IMGUI_BUILD_DX12_BINDING" IMGUI_BUILD_DX12_BINDING)
115 (lib.cmakeBool "IMGUI_BUILD_GLFW_BINDING" IMGUI_BUILD_GLFW_BINDING)
116 (lib.cmakeBool "IMGUI_BUILD_GLUT_BINDING" IMGUI_BUILD_GLUT_BINDING)
117 (lib.cmakeBool "IMGUI_BUILD_METAL_BINDING" IMGUI_BUILD_METAL_BINDING)
118 (lib.cmakeBool "IMGUI_BUILD_OPENGL2_BINDING" IMGUI_BUILD_OPENGL2_BINDING)
119 (lib.cmakeBool "IMGUI_BUILD_OPENGL3_BINDING" IMGUI_BUILD_OPENGL3_BINDING)
120 (lib.cmakeBool "IMGUI_BUILD_OSX_BINDING" IMGUI_BUILD_OSX_BINDING)
121 (lib.cmakeBool "IMGUI_BUILD_SDL2_BINDING" IMGUI_BUILD_SDL2_BINDING)
122 (lib.cmakeBool "IMGUI_BUILD_SDL3_BINDING" IMGUI_BUILD_SDL3_BINDING)
123 (lib.cmakeBool "IMGUI_BUILD_SDL2_RENDERER_BINDING" IMGUI_BUILD_SDL2_RENDERER_BINDING)
124 (lib.cmakeBool "IMGUI_BUILD_SDL3_RENDERER_BINDING" IMGUI_BUILD_SDL3_RENDERER_BINDING)
125 (lib.cmakeBool "IMGUI_BUILD_SDLGPU3_BINDING" IMGUI_BUILD_SDLGPU3_BINDING)
126 (lib.cmakeBool "IMGUI_BUILD_VULKAN_BINDING" IMGUI_BUILD_VULKAN_BINDING)
127 (lib.cmakeBool "IMGUI_BUILD_WIN32_BINDING" IMGUI_BUILD_WIN32_BINDING)
128 (lib.cmakeBool "IMGUI_FREETYPE" IMGUI_FREETYPE)
129 (lib.cmakeBool "IMGUI_FREETYPE_LUNASVG" IMGUI_FREETYPE_LUNASVG)
130 (lib.cmakeBool "IMGUI_USE_WCHAR32" IMGUI_USE_WCHAR32)
131 ];
132
133 passthru = {
134 tests = {
135 demo = callPackage ./demo { };
136 };
137 };
138
139 meta = {
140 # These flags haven't been tested:
141 broken =
142 IMGUI_BUILD_SDL2_BINDING # Option removed from Vcpkg' CMakeLists
143 || IMGUI_BUILD_SDL2_RENDERER_BINDING
144 || IMGUI_FREETYPE
145 || IMGUI_FREETYPE_LUNASVG
146 || IMGUI_BUILD_DX9_BINDING
147 || IMGUI_BUILD_DX10_BINDING
148 || IMGUI_BUILD_DX11_BINDING
149 || IMGUI_BUILD_DX12_BINDING
150 || IMGUI_BUILD_WIN32_BINDING
151 || IMGUI_BUILD_ALLEGRO5_BINDING
152 || IMGUI_BUILD_ANDROID_BINDING;
153 description = "Bloat-free Graphical User interface for C++ with minimal dependencies";
154 homepage = "https://github.com/ocornut/imgui";
155 license = lib.licenses.mit; # vcpkg licensed as MIT too
156 maintainers = with lib.maintainers; [
157 SomeoneSerge
158 ];
159 platforms = lib.platforms.all;
160 };
161}