Nixshell Gnuradio

Jag gillar verkligen konceptet med GNURadio med det är ofta omständigt att bygga själv. Därför valde jag att skapa ett nix-script för att alltid göra det enkelt att kunna bygga det igen om jag har behovet. Scriptet är längst ned i posten.

Det som är så coolt är jag ladda ned det med och köra nix-shell -p <script-name>.nix så kommer nix att automatisk ladda ned alla beroende, och sätta upp miljövariabler enligt scriptet. Sedan är det bara att bygga enligt kommandona längst ned.

{
  pkgs ?
    import <nixpkgs> {
      config = {
        permittedInsecurePackages = [
          "qtwebengine-5.15.19"
        ];
      };
    },
}: let
  # Fetch MathJax 2.7.9 (last version of MathJax 2.x)
  mathjax2 = pkgs.fetchzip {
    url = "https://github.com/mathjax/MathJax/archive/refs/tags/2.7.9.tar.gz";
    sha256 = "sha256-GInrIQfQMVPMXIonkD1FcBmUy/Voa4cIgtGH3+1gHWc=";
  };

  pythonEnv = pkgs.python313.withPackages (ps:
    with ps; [
      packaging
      pip
      numpy
      pygccxml
      pybind11
      pyyaml
      thrift
      mako
      jsonschema
      scipy
      pyqtgraph
      txzmq
      pygit2
      pyqt5
      pygobject3
      pycairo
      pytest
      click
    ]);
in
  pkgs.mkShell {
    packages = with pkgs; [
      boost
      cmake
      gsl
      libiio
      fftw
      fftwFloat
      fftwLongDouble
      mako
      zeromq
      cppzmq
      thrift
      libad9361
      rPackages.mathjaxr
      doxygen
      spdlog
      volk
      texliveTeTeX
      pkg-config
      mpir
      gmp
      libunwind
      libsndfile
      mathjax-node-cli
      soapysdr
      uhd
      libsForQt5.qt5.qtbase
      libsForQt5.qwt6_1
      gtk3
      cairo
      pango
      gobject-introspection
      glib
      ninja
      libsodium

      pythonEnv
    ];

    # Help CMake find Python packages
    shellHook = ''
      export PYTHONPATH="${pythonEnv}/${pythonEnv.sitePackages}:$PYTHONPATH"

      # MathJax 2
      export MATHJAX_DIR="${mathjax2}"
      export MATHJAX_PATH="${mathjax2}/MathJax.js"
      export MATHJAX2_JS_PATH="${mathjax2}/MathJax.js"

      # GSM library paths
      export LIBGSM_LIBRARIES="${pkgs.gsm}/lib/libgsm.so"
      export LIBGSM_INCLUDE_DIRS="${pkgs.gsm}/include"

      # Help CMake find ZeroMQ
      export ZeroMQ_DIR="${pkgs.zeromq}"

      # GObject Introspection
      export GI_TYPELIB_PATH="${pkgs.gtk3}/lib/girepository-1.0:${pkgs.pango}/lib/girepository-1.0:${pkgs.gdk-pixbuf}/lib/girepository-1.0:${pkgs.cairo}/lib/girepository-1.0''${GI_TYPELIB_PATH:+:$GI_TYPELIB_PATH}"

      # Link Python runtime and all gr-* modules
      export PYTHONPATH="$PWD/build/gnuradio-runtime/python:$(find "$PWD/build/gr-"* -maxdepth 2 -type d -name "python" | tr '\n' ':')$PYTHONPATH"

      # Link the radio-blocks from both source and build directories
      # UHD creates blocks depending on hardware that are placed in the build folder
      export GRC_BLOCKS_PATH="$(find "$PWD/build" -type d -name "grc" | tr '\n' ':'):$(find "$PWD/gr-"* -maxdepth 1 -type d -name "grc" | tr '\n' ':'):$PWD/grc/blocks"

      # Welcome message
      echo ""
      echo "╔════════════════════════════════════════════════════════════╗"
      echo "║          GNU Radio Development Environment                 ║"
      echo "╚════════════════════════════════════════════════════════════╝"
      echo ""
      echo "📦 Build the project:"
      echo "   cmake -B build -G Ninja -DLIBGSM_FOUND=OFF -DMATHJAX2_JS_PATH=\"\$MATHJAX2_JS_PATH\""
      echo "   cmake --build build -j\$(nproc)"
      echo ""
      echo "🚀 Run GNU Radio Companion:"
      echo "   ./grc/scripts/gnuradio-companion"
      echo ""
  '';
}