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})