1{
2 lib,
3 stdenv,
4 fetchFromGitHub,
5 fetchurl,
6 runCommand,
7 biber,
8
9 # nativeBuildInputs
10 bison,
11 cmake,
12 curl,
13 flex,
14 fop,
15 libxslt,
16 pkg-config,
17 writableTmpDirAsHomeHook,
18
19 # buildInputs
20 apr,
21 aprutil,
22 boost,
23 bzip2,
24 cairo,
25 expat,
26 fontconfig,
27 freetype,
28 fribidi,
29 gd,
30 gmp,
31 graphite2,
32 harfbuzzFull,
33 hunspell,
34 libjpeg,
35 log4cxx,
36 xz,
37 mpfr,
38 mpfi,
39 libmspack,
40 libressl,
41 pixman,
42 libpng,
43 popt,
44 uriparser,
45 zziplib,
46 qt6Packages,
47}:
48let
49 # This is needed for some bootstrap packages.
50 webArchivePrefix = "https://web.archive.org/web/20250323131915if_";
51 miktexRemoteRepository = "https://ctan.org/tex-archive/systems/win32/miktex/tm/packages";
52 miktexLocalRepository =
53 runCommand "miktex-local-repository"
54 {
55 src1 = fetchurl {
56 url = "${webArchivePrefix}/${miktexRemoteRepository}/miktex-zzdb1-2.9.tar.lzma";
57 hash = "sha256-XYhbKlxhVSOlCcm0IOs2ddFgAt/CWXJoY6IuLSw74y4=";
58 };
59 src2 = fetchurl {
60 url = "${webArchivePrefix}/${miktexRemoteRepository}/miktex-zzdb3-2.9.tar.lzma";
61 hash = "sha256-5vLuGwjddqtJ5F/DtVKuRVRqgGNbkGFxRF41cXwseIs=";
62 };
63 src3 = fetchurl {
64 url = "${webArchivePrefix}/${miktexRemoteRepository}/miktex-config-2.9.tar.lzma";
65 hash = "sha256-fkh5KL+BU+gl8Sih8xBLi1DOx2vMuSflXlSTchjlGWQ=";
66 };
67 src4 = fetchurl {
68 url = "${webArchivePrefix}/${miktexRemoteRepository}/miktex-dvips.tar.lzma";
69 hash = "sha256-eJQdLhYetNlXAyyiGD/JRDA3fv0BbALwXtNfRxkLM7o=";
70 };
71 src5 = fetchurl {
72 url = "${webArchivePrefix}/${miktexRemoteRepository}/miktex-fontconfig.tar.lzma";
73 hash = "sha256-dxH/0iIL3SnjCSXLGAcNTb5cGJb5AQmV/JbH5CcPHdk=";
74 };
75 src6 = fetchurl {
76 url = "${webArchivePrefix}/${miktexRemoteRepository}/miktex-misc.tar.lzma";
77 hash = "sha256-ysNREvnKWseqqN59cwNzlV21UmccbjSGFyno8lv2H+M=";
78 };
79 src7 = fetchurl {
80 url = "${webArchivePrefix}/${miktexRemoteRepository}/tetex.tar.lzma";
81 hash = "sha256-DE1o66r2SFxxxuYeCRuFn6L1uBn26IFnje9b/qeVl6Q=";
82 };
83 }
84 ''
85 mkdir $out
86 cp $src1 $out/miktex-zzdb1-2.9.tar.lzma
87 cp $src2 $out/miktex-zzdb3-2.9.tar.lzma
88 cp $src3 $out/miktex-config-2.9.tar.lzma
89 cp $src4 $out/miktex-dvips.tar.lzma
90 cp $src5 $out/miktex-fontconfig.tar.lzma
91 cp $src6 $out/miktex-misc.tar.lzma
92 cp $src7 $out/tetex.tar.lzma
93 '';
94in
95stdenv.mkDerivation (finalAttrs: {
96 pname = "miktex";
97 version = "25.4";
98
99 src = fetchFromGitHub {
100 owner = "miktex";
101 repo = "miktex";
102 tag = finalAttrs.version;
103 hash = "sha256-3QGW8rsettA+Jtrsi9C5ONIG4vP+iuUEUi9dGHfWMSY=";
104 };
105
106 patches = [
107 ./startup-config-support-nix-store.patch
108 # Miktex will search exectables in "GetMyPrefix(true)/bin".
109 # The path evaluate to "/usr/bin" in FHS style linux distribution,
110 # compared to "/nix/store/.../bin" in NixOS.
111 # As a result, miktex will fail to find e.g. 'pkexec','ksudo','gksu'
112 # under /run/wrappers/bin in NixOS.
113 # We fix this by adding the PATH environment variable to exectables' search path.
114 ./find-exectables-in-path.patch
115 ];
116
117 postPatch = ''
118 # dont symlink fontconfig to /etc/fonts/conf.d
119 substituteInPlace Programs/MiKTeX/miktex/topics/fontmaps/commands/FontMapManager.cpp \
120 --replace-fail 'this->ctx->session->IsAdminMode()' 'false'
121
122 substituteInPlace \
123 Libraries/MiKTeX/App/app.cpp \
124 Programs/Editors/TeXworks/miktex/miktex-texworks.cpp \
125 Programs/MiKTeX/Console/Qt/main.cpp \
126 Programs/MiKTeX/PackageManager/mpm/mpm.cpp \
127 Programs/MiKTeX/Yap/MFC/StdAfx.h \
128 Programs/MiKTeX/initexmf/initexmf.cpp \
129 Programs/MiKTeX/miktex/miktex.cpp \
130 --replace-fail "log4cxx/rollingfileappender.h" "log4cxx/rolling/rollingfileappender.h"
131
132 substitute cmake/modules/FindPOPPLER_QT5.cmake \
133 cmake/modules/FindPOPPLER_QT6.cmake \
134 --replace-fail "QT5" "QT6" \
135 --replace-fail "qt5" "qt6"
136
137 substituteInPlace Programs/TeXAndFriends/omega/otps/source/outocp.c \
138 --replace-fail 'fprintf(stderr, s);' 'fprintf(stderr, "%s", s);'
139 ''
140 # This patch fixes mismatch char types (signed int and unsigned int) on aarch64-linux platform.
141 # Should not be applied to other platforms otherwise the build will fail.
142 + lib.optionalString (stdenv.hostPlatform.isAarch64 && stdenv.hostPlatform.isLinux) ''
143 sed -i 's/--using-namespace=MiKTeX::TeXAndFriends/& --chars-are-unsigned/g' \
144 Programs/TeXAndFriends/Knuth/web/CMakeLists.txt
145 '';
146
147 strictDeps = true;
148
149 nativeBuildInputs = [
150 bison
151 cmake
152 curl
153 flex
154 fop
155 libxslt
156 pkg-config
157 writableTmpDirAsHomeHook
158 qt6Packages.wrapQtAppsHook
159 qt6Packages.qttools
160 qt6Packages.qt5compat
161 ];
162
163 buildInputs = [
164 apr
165 aprutil
166 boost
167 bzip2
168 cairo
169 expat
170 fontconfig
171 freetype
172 fribidi
173 gd
174 gmp
175 graphite2
176 harfbuzzFull
177 hunspell
178 libjpeg
179 log4cxx
180 xz
181 mpfr
182 mpfi
183 libmspack
184 libressl
185 pixman
186 libpng
187 popt
188 uriparser
189 zziplib
190 qt6Packages.poppler
191 ];
192
193 cmakeFlags = [
194 (lib.cmakeBool "WITH_BOOTSTRAPPING" true)
195 (lib.cmakeBool "USE_SYSTEM_POPPLER" true)
196 (lib.cmakeBool "USE_SYSTEM_POPPLER_QT" true)
197 (lib.cmakeBool "MIKTEX_SELF_CONTAINED" false)
198 # Miktex infers install prefix by stripping CMAKE_INSTALL_BINDIR from the called program.
199 # It should not be set to absolute path in default cmakeFlags, otherwise an infinite loop will happen.
200 (lib.cmakeFeature "CMAKE_INSTALL_BINDIR" "bin")
201 (lib.cmakeFeature "CMAKE_INSTALL_LIBEXECDIR" "libexec")
202 (lib.cmakeFeature "MIKTEX_SYSTEM_LINK_TARGET_DIR" "${placeholder "out"}/bin")
203 (lib.cmakeFeature "MIKTEX_USER_LINK_TARGET_DIR" "${placeholder "out"}/bin")
204 ];
205
206 env = {
207 LANG = "C.UTF-8";
208 MIKTEX_REPOSITORY = "file://${miktexLocalRepository}/";
209 };
210
211 enableParallelBuilding = false;
212
213 enableParallelChecking = false;
214
215 doCheck = true;
216
217 # Todo: figure out the exact binary to be Qt wrapped.
218 dontWrapQtApps = true;
219
220 postFixup = ''
221 wrapQtApp $out/bin/miktex-console
222 wrapQtApp $out/bin/miktex-texworks
223 $out/bin/miktexsetup finish --verbose
224 ''
225 # Biber binary is missing on ctan.org for aarch64-linux platform.
226 + lib.optionalString (stdenv.hostPlatform.isAarch64 && stdenv.hostPlatform.isLinux) ''
227 ln -sf ${biber}/bin/biber $out/bin/biber
228 '';
229
230 meta = {
231 description = "Modern TeX distribution";
232 homepage = "https://miktex.org";
233 platforms = lib.platforms.linux;
234 license = with lib.licenses; [
235 lppl13c
236 gpl2Plus
237 gpl3Plus
238 publicDomain
239 ];
240 maintainers = with lib.maintainers; [ qbisi ];
241 };
242})