flake.nix 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. {
  2. description = "Dev shell for myBookShelf (Lazarus/FPC)";
  3. inputs = {
  4. nixpkgs.url = "github:NixOS/nixpkgs";
  5. flake-utils.url = "github:numtide/flake-utils";
  6. };
  7. outputs = { self, nixpkgs, flake-utils }:
  8. flake-utils.lib.eachDefaultSystem (system:
  9. let
  10. pkgs = import nixpkgs { inherit system; };
  11. lib = pkgs.lib;
  12. lazGtk =
  13. if pkgs ? lazarus-gtk2 then pkgs.lazarus-gtk2
  14. else if pkgs ? lazarus then pkgs.lazarus
  15. else pkgs.lazarus-qt5;
  16. lazQt5 =
  17. if pkgs ? lazarus-qt5 then pkgs.lazarus-qt5
  18. else if pkgs ? lazarus then pkgs.lazarus
  19. else lazGtk;
  20. fpcSrcOpt = if pkgs ? fpcSrc then pkgs.fpcSrc else null;
  21. gtkLibPath = lib.makeLibraryPath [
  22. pkgs.gtk2 pkgs.glib pkgs.pango pkgs.cairo pkgs.gdk-pixbuf pkgs.atk
  23. pkgs.xorg.libX11 pkgs.xorg.libXext pkgs.xorg.libXrender pkgs.xorg.libXrandr
  24. pkgs.xorg.libXinerama pkgs.xorg.libXcursor pkgs.xorg.libXi pkgs.xorg.libXfixes
  25. ];
  26. qtLibPath = lib.makeLibraryPath [ pkgs.qt5.qtbase pkgs.qt5.qtsvg pkgs.qt5.qtx11extras ];
  27. qtPlugins = "${pkgs.qt5.qtbase}/lib/qt-5/plugins";
  28. commonInputs = [
  29. pkgs.fpc
  30. lazGtk
  31. pkgs.poppler_utils
  32. pkgs.openssl
  33. pkgs.cacert
  34. pkgs.gdb
  35. pkgs.pkg-config
  36. pkgs.gtk2
  37. ] ++ lib.optionals (fpcSrcOpt != null) [ fpcSrcOpt ];
  38. commonHook = ''
  39. : "${LCLWidgetType:=gtk2}"
  40. export LCLWidgetType
  41. export SSL_CERT_FILE=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt
  42. export NIX_SSL_CERT_FILE=$SSL_CERT_FILE
  43. # Find Lazarus IDE binary and expose a 'lazarus' helper
  44. LAZ_BIN=""
  45. for b in lazarus lazarus-ide startlazarus; do
  46. if command -v "$b" >/dev/null 2>&1; then LAZ_BIN="$b"; break; fi
  47. done
  48. lazarus () { "$LAZ_BIN" "$@"; }
  49. export -f lazarus
  50. # Prefer pkgs.fpcSrc if available; else probe inside pkgs.fpc for sources
  51. if [ -d "${if fpcSrcOpt != null then fpcSrcOpt else ""}" ]; then
  52. export FPCSRC="${if fpcSrcOpt != null then fpcSrcOpt else ""}"
  53. else
  54. FPC_OUT=${pkgs.fpc}
  55. for cand in "$FPC_OUT/share/fpcsrc" "$FPC_OUT/lib/fpc"/*/source "$FPC_OUT/share/fpc/source"; do
  56. [ -d "$cand" ] && export FPCSRC="$cand" && break
  57. done
  58. fi
  59. echo
  60. echo "myBookShelf dev shell"
  61. echo " • Widgetset: $LCLWidgetType"
  62. [ -n "$LAZ_BIN" ] && echo " • Lazarus: $LAZ_BIN (helper: 'lazarus')"
  63. [ -n "$FPCSRC" ] && echo " • FPC source dir: $FPCSRC" || echo " • FPC sources: not found (OK for building)"
  64. echo "Commands:"
  65. echo " lazbuild --ws=\$LCLWidgetType src/myBookShelf.lpi"
  66. echo " lazarus &"
  67. echo
  68. '';
  69. in {
  70. devShells = {
  71. default = pkgs.mkShell {
  72. buildInputs = commonInputs;
  73. shellHook = ''
  74. # GTK2 runtime libs so the app runs *inside* the shell
  75. export LD_LIBRARY_PATH="${gtkLibPath}:${pkgs.openssl.out}/lib:$LD_LIBRARY_PATH"
  76. ${commonHook}
  77. '';
  78. };
  79. qt5 = pkgs.mkShell {
  80. buildInputs = commonInputs ++ [ lazQt5 pkgs.qt5.qtbase pkgs.qt5.qttools pkgs.libqt5pas ];
  81. shellHook = ''
  82. export LCLWidgetType=qt5
  83. # Qt runtime libs + plugin search path
  84. export FPCOPT="$FPCOPT -Fl${pkgs.libqt5pas}/lib"
  85. export LD_LIBRARY_PATH="${qtLibPath}:${pkgs.libqt5pas}/lib:${pkgs.openssl.out}/lib:$LD_LIBRARY_PATH"
  86. export QT_PLUGIN_PATH="${qtPlugins}"
  87. ${commonHook}
  88. '';
  89. };
  90. };
  91. });
  92. }