| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- {
- description = "Dev shell for myBookShelf (Lazarus/FPC)";
- inputs = {
- nixpkgs.url = "github:NixOS/nixpkgs";
- flake-utils.url = "github:numtide/flake-utils";
- };
- outputs = { self, nixpkgs, flake-utils }:
- flake-utils.lib.eachDefaultSystem (system:
- let
- pkgs = import nixpkgs { inherit system; };
- lib = pkgs.lib;
- lazGtk =
- if pkgs ? lazarus-gtk2 then pkgs.lazarus-gtk2
- else if pkgs ? lazarus then pkgs.lazarus
- else pkgs.lazarus-qt5;
- lazQt5 =
- if pkgs ? lazarus-qt5 then pkgs.lazarus-qt5
- else if pkgs ? lazarus then pkgs.lazarus
- else lazGtk;
- fpcSrcOpt = if pkgs ? fpcSrc then pkgs.fpcSrc else null;
- gtkLibPath = lib.makeLibraryPath [
- pkgs.gtk2 pkgs.glib pkgs.pango pkgs.cairo pkgs.gdk-pixbuf pkgs.atk
- pkgs.xorg.libX11 pkgs.xorg.libXext pkgs.xorg.libXrender pkgs.xorg.libXrandr
- pkgs.xorg.libXinerama pkgs.xorg.libXcursor pkgs.xorg.libXi pkgs.xorg.libXfixes
- ];
- qtLibPath = lib.makeLibraryPath [ pkgs.qt5.qtbase pkgs.qt5.qtsvg pkgs.qt5.qtx11extras ];
- qtPlugins = "${pkgs.qt5.qtbase}/lib/qt-5/plugins";
- commonInputs = [
- pkgs.fpc
- lazGtk
- pkgs.poppler_utils
- pkgs.unzip
- pkgs.openssl
- pkgs.cacert
- pkgs.gdb
- pkgs.pkg-config
- pkgs.gtk2
- ] ++ lib.optionals (fpcSrcOpt != null) [ fpcSrcOpt ];
- commonHook = ''
- : "${LCLWidgetType:=gtk2}"
- export LCLWidgetType
- export SSL_CERT_FILE=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt
- export NIX_SSL_CERT_FILE=$SSL_CERT_FILE
- # Find Lazarus IDE binary and expose a 'lazarus' helper
- LAZ_BIN=""
- for b in lazarus lazarus-ide startlazarus; do
- if command -v "$b" >/dev/null 2>&1; then LAZ_BIN="$b"; break; fi
- done
- lazarus () { "$LAZ_BIN" "$@"; }
- export -f lazarus
- # Prefer pkgs.fpcSrc if available; else probe inside pkgs.fpc for sources
- if [ -d "${if fpcSrcOpt != null then fpcSrcOpt else ""}" ]; then
- export FPCSRC="${if fpcSrcOpt != null then fpcSrcOpt else ""}"
- else
- FPC_OUT=${pkgs.fpc}
- for cand in "$FPC_OUT/share/fpcsrc" "$FPC_OUT/lib/fpc"/*/source "$FPC_OUT/share/fpc/source"; do
- [ -d "$cand" ] && export FPCSRC="$cand" && break
- done
- fi
- echo
- echo "myBookShelf dev shell"
- echo " • Widgetset: $LCLWidgetType"
- [ -n "$LAZ_BIN" ] && echo " • Lazarus: $LAZ_BIN (helper: 'lazarus')"
- [ -n "$FPCSRC" ] && echo " • FPC source dir: $FPCSRC" || echo " • FPC sources: not found (OK for building)"
- echo "Commands:"
- echo " lazbuild --ws=\$LCLWidgetType src/myBookShelf.lpi"
- echo " lazarus &"
- echo
- '';
- # Build the application using lazbuild and wrap for runtime libs
- myBookShelfPkg = pkgs.stdenv.mkDerivation rec {
- pname = "myBookShelf";
- version = "0.1.0";
- src = self;
- nativeBuildInputs = [
- lazGtk
- pkgs.fpc
- pkgs.pkg-config
- pkgs.makeWrapper
- ];
- # C/GTK libraries needed at link time (provides .pc files and libs)
- buildInputs = [
- pkgs.gtk2
- pkgs.glib
- pkgs.pango
- pkgs.cairo
- pkgs.gdk-pixbuf
- pkgs.atk
- pkgs.xorg.libX11
- pkgs.xorg.libXext
- pkgs.xorg.libXrender
- pkgs.xorg.libXrandr
- pkgs.xorg.libXinerama
- pkgs.xorg.libXcursor
- pkgs.xorg.libXi
- pkgs.xorg.libXfixes
- ];
- # Lazarus puts the binary next to the .lpr by default
- buildPhase = ''
- runHook preBuild
- export LAZARUS_DIR=${lazGtk}/share/lazarus
- export HOME=$TMPDIR
- mkdir -p "$HOME/.lazarus"
- echo "Using Lazarus at $LAZARUS_DIR"
- # Help the linker find GTK libs at build time
- export FPCOPT="$FPCOPT -k-L${gtkLibPath}"
- export PKG_CONFIG_PATH
- lazbuild --lazarusdir="$LAZARUS_DIR" --ws=gtk2 --build-all src/myBookShelf.lpi
- runHook postBuild
- '';
- installPhase = ''
- runHook preInstall
- mkdir -p $out/bin
- # Try the usual locations for the produced binary
- if [ -x src/myBookShelf ]; then
- cp -v src/myBookShelf $out/bin/myBookShelf
- elif [ -x src/mybookshelf ]; then
- cp -v src/mybookshelf $out/bin/myBookShelf
- elif [ -x src/lib/*/myBookShelf ]; then
- cp -v src/lib/*/myBookShelf $out/bin/myBookShelf
- else
- echo "error: built binary not found" >&2
- ls -R src || true
- exit 1
- fi
- # Wrap with GTK2 runtime libraries and CA bundle for TLS
- wrapProgram $out/bin/myBookShelf \
- --set LCLWidgetType gtk2 \
- --set LD_LIBRARY_PATH "${gtkLibPath}:${pkgs.openssl.out}/lib" \
- --prefix PATH : ${pkgs.poppler_utils}/bin \
- --prefix PATH : ${pkgs.unzip}/bin \
- --set SSL_CERT_FILE ${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt \
- --set NIX_SSL_CERT_FILE ${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt
- runHook postInstall
- '';
- meta = with lib; {
- description = "Personal bookshelf manager (Lazarus/FPC)";
- license = licenses.mit;
- platforms = platforms.linux;
- };
- };
- in {
- packages.default = myBookShelfPkg;
- apps.default = {
- type = "app";
- program = "${myBookShelfPkg}/bin/myBookShelf";
- };
- devShells = {
- default = pkgs.mkShell {
- buildInputs = commonInputs;
- shellHook = ''
- # GTK2 runtime libs so the app runs *inside* the shell
- export LD_LIBRARY_PATH="${gtkLibPath}:${pkgs.openssl.out}/lib:$LD_LIBRARY_PATH"
- ${commonHook}
- '';
- };
- qt5 = pkgs.mkShell {
- buildInputs = commonInputs ++ [ lazQt5 pkgs.qt5.qtbase pkgs.qt5.qttools pkgs.libqt5pas ];
- shellHook = ''
- export LCLWidgetType=qt5
- # Qt runtime libs + plugin search path
- export FPCOPT="$FPCOPT -Fl${pkgs.libqt5pas}/lib"
- export LD_LIBRARY_PATH="${qtLibPath}:${pkgs.libqt5pas}/lib:${pkgs.openssl.out}/lib:$LD_LIBRARY_PATH"
- export QT_PLUGIN_PATH="${qtPlugins}"
- ${commonHook}
- '';
- };
- };
- });
- }
|