summary refs log tree commit diff
diff options
context:
space:
mode:
authorDoron Behar <doron.behar@gmail.com>2020-10-05 12:04:49 +0300
committerDoron Behar <doron.behar@gmail.com>2020-12-05 13:23:00 +0200
commit3becac02f894b4f29ade13318b9297d827d84525 (patch)
treeba5234d532394fe260f5ed1101469df2e0fb4178
parent7e96d9ee61cbe72dfe72d522dbed2d0c89b500d4 (diff)
downloadnixpkgs-3becac02f894b4f29ade13318b9297d827d84525.tar
nixpkgs-3becac02f894b4f29ade13318b9297d827d84525.tar.gz
nixpkgs-3becac02f894b4f29ade13318b9297d827d84525.tar.bz2
nixpkgs-3becac02f894b4f29ade13318b9297d827d84525.tar.lz
nixpkgs-3becac02f894b4f29ade13318b9297d827d84525.tar.xz
nixpkgs-3becac02f894b4f29ade13318b9297d827d84525.tar.zst
nixpkgs-3becac02f894b4f29ade13318b9297d827d84525.zip
gnuradio: rewrite
Write (similar) expressions for GNURadio 3.7 and 3.8 and make 3.8
available as `gnuradio`, and `gnuradio3_7` point to the 3.7 build.

Teach both 3.7 & 3.8 expressions accept a `features` attribute set, that
tells them what features to compile. There are dependencies within the
different features, and we rely on upstream's cmake scripts to make sure
the `configurePhase` will fail if a feature is not enabled and needed by
another feature.  All features are enabled by default.

Put shared Nix functions and attributes for both 3.7 and 3.8 in:
pkgs/applications/radio/gnuradio/shared.nix

Add 2 patches accepted upstream, that don't install some python related
examples if python-support is not enabled.

Remove cmake python reference in 3.8 with removeReferencesTo, if
python-support is turned off.

Update gqrx (reverse dependency) to use a build of gnuradio3_7 without
gui components and for it's gr-osmosdr as well.

Write an external, `wrapper.nix` (shared for both 3.7 and 3.8). Teach it
to handle extra `gr-` packages via `GRC_BLOCKS_PATH`. Likely enable it
to accept extra python packages. Wrap the executables with env vars
wrapGAppsHook and wrapQtAppsHook would have likely given them (hence,
fix #87510). Point `gnuradio` to the wrapped 3.8 derivation.

Add @doronbehar to maintainers of both 3.8 and 3.7.

dirty: use upstreamed patches
-rw-r--r--pkgs/applications/radio/gnuradio/3.7.nix297
-rw-r--r--pkgs/applications/radio/gnuradio/ais.nix4
-rw-r--r--pkgs/applications/radio/gnuradio/default.nix423
-rw-r--r--pkgs/applications/radio/gnuradio/shared.nix135
-rw-r--r--pkgs/applications/radio/gnuradio/wrapper.nix138
-rw-r--r--pkgs/top-level/aliases.nix4
-rw-r--r--pkgs/top-level/all-packages.nix98
7 files changed, 913 insertions, 186 deletions
diff --git a/pkgs/applications/radio/gnuradio/3.7.nix b/pkgs/applications/radio/gnuradio/3.7.nix
new file mode 100644
index 00000000000..fdf0016de8c
--- /dev/null
+++ b/pkgs/applications/radio/gnuradio/3.7.nix
@@ -0,0 +1,297 @@
+{ stdenv
+, fetchFromGitHub
+, fetchpatch
+, cmake
+# Remove gcc and python references
+, removeReferencesTo
+, pkgconfig
+, cppunit
+, swig
+, orc
+, boost
+, log4cpp
+, mpir
+, doxygen
+, python
+, codec2
+, gsm
+, fftwFloat
+, alsaLib
+, libjack2
+, CoreAudio
+, uhd
+, comedilib
+, libusb1
+, SDL
+, gsl
+, cppzmq
+, zeromq
+# GUI related
+, gtk2
+, pango
+, cairo
+, qt4
+, qwt6_qt4
+# Features available to override, the list of them is in featuresInfo. They
+# are all turned on by default, besides wxgui which is recommended by upstream
+# in favor of gr-qtgui, see:
+# https://www.gnuradio.org/news/2019-08-10-gnu-radio-v3-8-0-0-release/
+, features ? { gr-wxgui = false; }
+# If one wishes to use a different src or name for a very custom build
+, overrideSrc ? {}
+, pname ? "gnuradio"
+, versionAttr ? {
+  major = "3.7";
+  minor = "14";
+  patch = "0";
+}
+, fetchSubmodules ? true
+}:
+
+let
+  sourceSha256 = "1nh4f9dmygprlbqybd3j1byg9fsr6065n140mvc4b0v8qqygmhrc";
+  featuresInfo = {
+    # Needed always
+    basic = {
+      native = [
+        cmake
+        pkgconfig
+        orc
+      ];
+      runtime = [ boost log4cpp mpir ];
+      pythonNative = with python.pkgs; [ Mako six ];
+    };
+    volk = {
+      cmakeEnableFlag = "VOLK";
+    };
+    doxygen = {
+      native = [ doxygen ];
+      cmakeEnableFlag = "DOXYGEN";
+    };
+    sphinx = {
+      pythonNative = with python.pkgs; [ sphinx ];
+      cmakeEnableFlag = "SPHINX";
+    };
+    python-support = {
+      pythonRuntime = [ python.pkgs.six ];
+      native = [
+        swig
+        python
+      ];
+      cmakeEnableFlag = "PYTHON";
+    };
+    testing-support = {
+      native = [ cppunit ];
+      cmakeEnableFlag = "TESTING";
+    };
+    gnuradio-runtime = {
+      cmakeEnableFlag = "GNURADIO_RUNTIME";
+    };
+    gr-ctrlport = {
+      cmakeEnableFlag = "GR_CTRLPORT";
+      native = [
+        swig
+      ];
+    };
+    gnuradio-companion = {
+      pythonRuntime = with python.pkgs; [
+        pyyaml
+        cheetah
+        lxml
+        pygtk
+        numpy
+        # propagated by pygtk, but since wrapping is done externally, it help
+        # the wrapper if it's here
+        pycairo
+        pygobject2
+      ];
+      runtime = [
+        gtk2
+        pango
+        cairo
+      ];
+      cmakeEnableFlag = "GRC";
+    };
+    gr-blocks = {
+      cmakeEnableFlag = "GR_BLOCKS";
+    };
+    gr-fec = {
+      cmakeEnableFlag = "GR_FEC";
+    };
+    gr-fft = {
+      runtime = [ fftwFloat ];
+      cmakeEnableFlag = "GR_FFT";
+    };
+    gr-filter = {
+      runtime = [ fftwFloat ];
+      cmakeEnableFlag = "GR_FILTER";
+    };
+    gr-analog = {
+      cmakeEnableFlag = "GR_ANALOG";
+    };
+    gr-digital = {
+      cmakeEnableFlag = "GR_DIGITAL";
+    };
+    gr-dtv = {
+      cmakeEnableFlag = "GR_DTV";
+    };
+    gr-atsc = {
+      cmakeEnableFlag = "GR_ATSC";
+    };
+    gr-audio = {
+      runtime = []
+        ++ stdenv.lib.optionals stdenv.isLinux [ alsaLib libjack2 ]
+        ++ stdenv.lib.optionals stdenv.isDarwin [ CoreAudio ]
+      ;
+      cmakeEnableFlag = "GR_AUDIO";
+    };
+    gr-comedi = {
+      runtime = [ comedilib ];
+      cmakeEnableFlag = "GR_COMEDI";
+    };
+    gr-channels = {
+      cmakeEnableFlag = "GR_CHANNELS";
+    };
+    gr-noaa = {
+      cmakeEnableFlag = "GR_NOAA";
+    };
+    gr-pager = {
+      cmakeEnableFlag = "GR_PAGER";
+    };
+    gr-qtgui = {
+      runtime = [ qt4 qwt6_qt4 ];
+      pythonRuntime = [ python.pkgs.pyqt4 ];
+      cmakeEnableFlag = "GR_QTGUI";
+    };
+    gr-trellis = {
+      cmakeEnableFlag = "GR_TRELLIS";
+    };
+    gr-uhd = {
+      runtime = [ uhd ];
+      cmakeEnableFlag = "GR_UHD";
+    };
+    gr-utils = {
+      cmakeEnableFlag = "GR_UTILS";
+    };
+    gr-video-sdl = {
+      runtime = [ SDL ];
+      cmakeEnableFlag = "GR_VIDEO_SDL";
+    };
+    gr-vocoder = {
+      runtime = [ codec2 gsm ];
+      cmakeEnableFlag = "GR_VOCODER";
+    };
+    gr-fcd = {
+      runtime = [ libusb1 ];
+      cmakeEnableFlag = "GR_FCD";
+    };
+    gr-wavelet = {
+      cmakeEnableFlag = "GR_WAVELET";
+      runtime = [ gsl ];
+    };
+    gr-zeromq = {
+      runtime = [ cppzmq zeromq ];
+      cmakeEnableFlag = "GR_ZEROMQ";
+    };
+    gr-wxgui = {
+      pythonRuntime = with python.pkgs; [ numpy wxPython ];
+      cmakeEnableFlag = "GR_WXGUI";
+    };
+  };
+  shared = (import ./shared.nix {
+    inherit
+      stdenv
+      python
+      removeReferencesTo
+      featuresInfo
+      features
+      versionAttr
+      sourceSha256
+      overrideSrc
+      fetchFromGitHub
+      fetchSubmodules
+    ;
+    qt = qt4;
+    gtk = gtk2;
+  });
+  inherit (shared)
+    version
+    src
+    hasFeature # function
+    nativeBuildInputs
+    buildInputs
+    disallowedReferences
+    postInstall
+    passthru
+    doCheck
+    dontWrapPythonPrograms
+    meta
+  ;
+  cmakeFlags = shared.cmakeFlags
+    # From some reason, if these are not set, libcodec2 and gsm are
+    # not detected properly (slightly different then what's in
+    # ./default.nix).
+    ++ stdenv.lib.optionals (hasFeature "gr-vocoder" features) [
+      "-DLIBCODEC2_LIBRARIES=${codec2}/lib/libcodec2.so"
+      "-DLIBCODEC2_INCLUDE_DIR=${codec2}/include"
+      "-DLIBGSM_LIBRARIES=${gsm}/lib/libgsm.so"
+      "-DLIBGSM_INCLUDE_DIR=${gsm}/include/gsm"
+    ]
+  ;
+  stripDebugList = shared.stripDebugList
+    # gr-fcd feature was dropped in 3.8
+    ++ stdenv.lib.optionals (hasFeature "gr-fcd" features) [ "share/gnuradio/examples/fcd" ]
+  ;
+  preConfigure = ''
+  ''
+    # wxgui and pygtk are not looked up properly, so we force them to be
+    # detected as found, if they are requested by the `features` attrset.
+    + stdenv.lib.optionalString (hasFeature "gr-wxgui" features) ''
+      sed -i 's/.*wx\.version.*/set(WX_FOUND TRUE)/g' gr-wxgui/CMakeLists.txt
+    ''
+    + stdenv.lib.optionalString (hasFeature "gnuradio-companion" features) ''
+      sed -i 's/.*pygtk_version.*/set(PYGTK_FOUND TRUE)/g' grc/CMakeLists.txt
+    ''
+    # If python-support is disabled, don't install volk's (git submodule)
+    # volk_modtool - it references python.
+    #
+    # NOTE: The same is done for 3.8, but we don't put this string in
+    # ./shared.nix since on the next release of 3.8 it won't be needed there,
+    # but it will be needed for 3.7, probably for ever.
+    + stdenv.lib.optionalString (!hasFeature "python-support" features) ''
+      sed -i -e "/python\/volk_modtool/d" volk/CMakeLists.txt
+    ''
+  ;
+  patches = [
+    # Don't install python referencing files if python support is disabled.
+    # See: https://github.com/gnuradio/gnuradio/pull/3856
+    (fetchpatch {
+      url = "https://github.com/gnuradio/gnuradio/commit/acef55433d15c231661fa44751f9a2d90a4baa4b.diff";
+      sha256 = "2CEX44Ll8frfLXTIWjdDhKl7aXcjiAWsezVdwrynelE=";
+    })
+    (fetchpatch {
+      url = "https://github.com/gnuradio/gnuradio/commit/a2681edcfaabcb1ecf878ae861161b6a6bf8459d.diff";
+      sha256 = "2Pitgu8accs16B5X5+/q51hr+IY9DMsA15f56gAtBs8=";
+    })
+  ];
+in
+
+stdenv.mkDerivation rec {
+  inherit
+    pname
+    version
+    src
+    nativeBuildInputs
+    buildInputs
+    cmakeFlags
+    preConfigure
+    # disallowedReferences
+    stripDebugList
+    patches
+    postInstall
+    passthru
+    doCheck
+    dontWrapPythonPrograms
+    meta
+  ;
+}
diff --git a/pkgs/applications/radio/gnuradio/ais.nix b/pkgs/applications/radio/gnuradio/ais.nix
index 30c2638a72f..46d46d1c325 100644
--- a/pkgs/applications/radio/gnuradio/ais.nix
+++ b/pkgs/applications/radio/gnuradio/ais.nix
@@ -1,5 +1,5 @@
 { stdenv, fetchFromGitHub, cmake, pkgconfig, boost, gnuradio
-, makeWrapper, cppunit, gr-osmosdr
+, makeWrapper, cppunit, gr-osmosdr, log4cpp
 , pythonSupport ? true, python, swig
 }:
 
@@ -19,7 +19,7 @@ stdenv.mkDerivation {
 
   nativeBuildInputs = [ pkgconfig ];
   buildInputs = [
-    cmake boost gnuradio makeWrapper cppunit gr-osmosdr
+    cmake boost gnuradio makeWrapper cppunit gr-osmosdr log4cpp
   ] ++ stdenv.lib.optionals pythonSupport [ python swig ];
 
   postInstall = ''
diff --git a/pkgs/applications/radio/gnuradio/default.nix b/pkgs/applications/radio/gnuradio/default.nix
index dec968cd32d..811eb37f4f3 100644
--- a/pkgs/applications/radio/gnuradio/default.nix
+++ b/pkgs/applications/radio/gnuradio/default.nix
@@ -1,165 +1,288 @@
 { stdenv
 , fetchFromGitHub
-, makeWrapper
-, writeText
-# Dependencies documented @ https://gnuradio.org/doc/doxygen/build_guide.html
-# => core dependencies
+, fetchpatch
 , cmake
+# Remove gcc and python references
+, removeReferencesTo
 , pkgconfig
-, git
-, boost
 , cppunit
-, fftw
-# => python wrappers
-# May be able to upgrade to swig3
+, swig
+, orc
+, boost
+, log4cpp
+, mpir
+, doxygen
 , python
-, swig2
-, numpy
-, scipy
-, matplotlib
-# => grc - the gnu radio companion
-, Mako
-, cheetah
-, pygtk # Note: GR is migrating to Mako. Cheetah should be removed for GR3.8
-# => gr-wavelet: collection of wavelet blocks
-, gsl
-# => gr-qtgui: the Qt-based GUI
-, qt4
-, qwt
-, pyqt4
-# => gr-wxgui: the Wx-based GUI
-, wxPython
-, lxml
-# => gr-audio: audio subsystems (system/OS dependent)
-, alsaLib   # linux   'audio-alsa'
-, CoreAudio # darwin  'audio-osx'
-# => uhd: the Ettus USRP Hardware Driver Interface
+, codec2
+, gsm
+, fftwFloat
+, alsaLib
+, libjack2
+, CoreAudio
 , uhd
-# => gr-video-sdl: PAL and NTSC display
 , SDL
-# Other
-, libusb1
-, orc
-, pyopengl
+, gsl
+, cppzmq
+, zeromq
+# GUI related
+, gtk3
+, pango
+, gobject-introspection
+, cairo
+, qt5
+, libsForQt5
+# Features available to override, the list of them is in featuresInfo. They
+# are all turned on by default.
+, features ? {}
+# If one wishes to use a different src or name for a very custom build
+, overrideSrc ? {}
+, pname ? "gnuradio"
+, versionAttr ? {
+  major = "3.8";
+  minor = "2";
+  patch = "0";
+}
+# Should be false on the release after 3.8.2.0
+, fetchSubmodules ? true
 }:
 
-stdenv.mkDerivation rec {
-  pname = "gnuradio";
-  version = "3.7.14.0";
-
-  src = fetchFromGitHub {
-    owner = "gnuradio";
-    repo = "gnuradio";
-    rev = "v${version}";
-    sha256 = "1nh4f9dmygprlbqybd3j1byg9fsr6065n140mvc4b0v8qqygmhrc";
-    fetchSubmodules = true;
+let
+  sourceSha256 =  "1mnfwdy7w3160vi6110x2qkyq8l78qi8771zwak9n72bl7lhhpnf";
+  featuresInfo = {
+    # Needed always
+    basic = {
+      native = [
+        cmake
+        pkgconfig
+        orc
+      ];
+      runtime = [
+        boost
+        log4cpp
+        mpir
+      ];
+      pythonNative = with python.pkgs; [
+        Mako
+        six
+      ];
+    };
+    # NOTE: Should be removed on the release after 3.8.2.0, see:
+    # https://github.com/gnuradio/gnuradio/commit/80c04479d
+    volk = {
+      cmakeEnableFlag = "VOLK";
+    };
+    doxygen = {
+      native = [ doxygen ];
+      cmakeEnableFlag = "DOXYGEN";
+    };
+    sphinx = {
+      pythonNative = with python.pkgs; [ sphinx ];
+      cmakeEnableFlag = "SPHINX";
+    };
+    python-support = {
+      pythonRuntime = [ python.pkgs.six ];
+      native = [
+        swig
+        python
+      ];
+      cmakeEnableFlag = "PYTHON";
+    };
+    testing-support = {
+      native = [ cppunit ];
+      cmakeEnableFlag = "TESTING";
+    };
+    gnuradio-runtime = {
+      cmakeEnableFlag = "GNURADIO_RUNTIME";
+    };
+    gr-ctrlport = {
+      # Thrift support is not really working well, and even the patch they
+      # recommend applying on 0.9.2 won't apply. See:
+      # https://github.com/gnuradio/gnuradio/blob/v3.8.2.0/gnuradio-runtime/lib/controlport/thrift/README
+      cmakeEnableFlag = "GR_CTRLPORT";
+      native = [
+        swig
+      ];
+    };
+    gnuradio-companion = {
+      pythonRuntime = with python.pkgs; [
+        pyyaml
+        Mako
+        numpy
+        pygobject3
+      ];
+      runtime = [
+        gtk3
+        pango
+        gobject-introspection
+        cairo
+      ];
+      cmakeEnableFlag = "GRC";
+    };
+    gr-blocks = {
+      cmakeEnableFlag = "GR_BLOCKS";
+    };
+    gr-fec = {
+      cmakeEnableFlag = "GR_FEC";
+    };
+    gr-fft = {
+      runtime = [ fftwFloat ];
+      cmakeEnableFlag = "GR_FFT";
+    };
+    gr-filter = {
+      runtime = [ fftwFloat ];
+      cmakeEnableFlag = "GR_FILTER";
+    };
+    gr-analog = {
+      cmakeEnableFlag = "GR_ANALOG";
+    };
+    gr-digital = {
+      cmakeEnableFlag = "GR_DIGITAL";
+    };
+    gr-dtv = {
+      cmakeEnableFlag = "GR_DTV";
+    };
+    gr-audio = {
+      runtime = []
+        ++ stdenv.lib.optionals stdenv.isLinux [ alsaLib libjack2 ]
+        ++ stdenv.lib.optionals stdenv.isDarwin [ CoreAudio ]
+      ;
+      cmakeEnableFlag = "GR_AUDIO";
+    };
+    gr-channels = {
+      cmakeEnableFlag = "GR_CHANNELS";
+    };
+    gr-qtgui = {
+      runtime = [ qt5.qtbase libsForQt5.qwt ];
+      pythonRuntime = [ python.pkgs.pyqt5 ];
+      cmakeEnableFlag = "GR_QTGUI";
+    };
+    gr-trellis = {
+      cmakeEnableFlag = "GR_TRELLIS";
+    };
+    gr-uhd = {
+      runtime = [ uhd ];
+      cmakeEnableFlag = "GR_UHD";
+    };
+    gr-utils = {
+      cmakeEnableFlag = "GR_UTILS";
+    };
+    gr-modtool = {
+      pythonRuntime = with python.pkgs; [
+        click
+        click-plugins
+      ];
+      cmakeEnableFlag = "GR_MODTOOL";
+    };
+    gr-video-sdl = {
+      runtime = [ SDL ];
+      cmakeEnableFlag = "GR_VIDEO_SDL";
+    };
+    gr-vocoder = {
+      runtime = [ codec2 gsm ];
+      cmakeEnableFlag = "GR_VOCODER";
+    };
+    gr-wavelet = {
+      cmakeEnableFlag = "GR_WAVELET";
+      runtime = [ gsl ];
+    };
+    gr-zeromq = {
+      runtime = [ cppzmq zeromq ];
+      cmakeEnableFlag = "GR_ZEROMQ";
+    };
   };
+  shared = (import ./shared.nix {
+    inherit
+      stdenv
+      python
+      removeReferencesTo
+      featuresInfo
+      features
+      versionAttr
+      sourceSha256
+      overrideSrc
+      fetchFromGitHub
+      fetchSubmodules
+    ;
+    qt = qt5;
+    gtk = gtk3;
+  });
+  inherit (shared)
+    version
+    src
+    hasFeature # function
+    nativeBuildInputs
+    buildInputs
+    disallowedReferences
+    stripDebugList
+    passthru
+    doCheck
+    dontWrapPythonPrograms
+    meta
+  ;
+  cmakeFlags = shared.cmakeFlags
+    # From some reason, if these are not set, libcodec2 and gsm are not
+    # detected properly. NOTE: qradiolink needs libcodec2 to be detected in
+    # order to build, see https://github.com/qradiolink/qradiolink/issues/67
+    ++ stdenv.lib.optionals (hasFeature "gr-vocoder" features) [
+      "-DLIBCODEC2_LIBRARIES=${codec2}/lib/libcodec2.so"
+      "-DLIBCODEC2_INCLUDE_DIRS=${codec2}/include"
+      "-DLIBCODEC2_HAS_FREEDV_API=ON"
+      "-DLIBGSM_LIBRARIES=${gsm}/lib/libgsm.so"
+      "-DLIBGSM_INCLUDE_DIRS=${gsm}/include/gsm"
+    ]
+  ;
 
-  nativeBuildInputs = [
-    cmake
-    pkgconfig
-    git
-    makeWrapper
-    cppunit
-    orc
-  ];
-
-  buildInputs = [
-    boost
-    fftw
-    python
-    swig2
-    lxml
-    qt4
-    qwt
-    SDL
-    libusb1
-    uhd
-    gsl
-  ] ++ stdenv.lib.optionals stdenv.isLinux  [ alsaLib   ]
-    ++ stdenv.lib.optionals stdenv.isDarwin [ CoreAudio ];
-
-  propagatedBuildInputs = [
-    Mako
-    cheetah
-    numpy
-    scipy
-    matplotlib
-    pyqt4
-    pygtk
-    wxPython
-    pyopengl
-  ];
-
-  NIX_LDFLAGS = "-lpthread";
-
-  enableParallelBuilding = true;
-
-  postPatch = ''
-    substituteInPlace \
-        gr-fec/include/gnuradio/fec/polar_decoder_common.h \
-        --replace BOOST_CONSTEXPR_OR_CONST const
-  '';
-
-  # Enables composition with nix-shell
-  grcSetupHook = writeText "grcSetupHook.sh" ''
-    addGRCBlocksPath() {
-      addToSearchPath GRC_BLOCKS_PATH $1/share/gnuradio/grc/blocks
-    }
-    addEnvHooks "$targetOffset" addGRCBlocksPath
-  '';
-
-  setupHook = [ grcSetupHook ];
-
-  # patch wxgui and pygtk check due to python importerror in a headless environment
-  # wxgtk gui will be removed in GR3.8
-  # c++11 hack may not be necessary anymore
+  postInstall = shared.postInstall
+    # This is the only python reference worth removing, if needed (3.7 doesn't
+    # set that reference).
+    + stdenv.lib.optionalString (!hasFeature "python-support" features) ''
+      ${removeReferencesTo}/bin/remove-references-to -t ${python} $out/lib/cmake/gnuradio/GnuradioConfig.cmake
+    ''
+  ;
   preConfigure = ''
-    export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -Wno-unused-variable ${stdenv.lib.optionalString (!stdenv.isDarwin) "-std=c++11"}"
-    sed -i 's/.*wx\.version.*/set(WX_FOUND TRUE)/g' gr-wxgui/CMakeLists.txt
-    sed -i 's/.*pygtk_version.*/set(PYGTK_FOUND TRUE)/g' grc/CMakeLists.txt
-    find . -name "CMakeLists.txt" -exec sed -i '1iadd_compile_options($<$<COMPILE_LANGUAGE:CXX>:-std=c++11>)' "{}" ";"
-  '';
-
-  # Framework path needed for qwt6_qt4 but not qwt5
-  cmakeFlags =
-    stdenv.lib.optionals stdenv.isDarwin [ "-DCMAKE_FRAMEWORK_PATH=${qwt}/lib" ];
-
-  # - Ensure we get an interactive backend for matplotlib. If not the gr_plot_*
-  #   programs will not display anything. Yes, $MATPLOTLIBRC must point to the
-  #   *dirname* where matplotlibrc is located, not the file itself.
-  # - GNU Radio core is C++ but the user interface (GUI and API) is Python, so
-  #   we must wrap the stuff in bin/.
-  # Notes:
-  # - May want to use makeWrapper instead of wrapProgram
-  # - may want to change interpreter path on Python examples instead of wrapping
-  # - see https://github.com/NixOS/nixpkgs/issues/22688 regarding use of --prefix / python.withPackages
-  # - see https://github.com/NixOS/nixpkgs/issues/24693 regarding use of DYLD_FRAMEWORK_PATH on Darwin
-  postInstall = ''
-    printf "backend : Qt4Agg\n" > "$out/share/gnuradio/matplotlibrc"
-
-    for file in $(find $out/bin $out/share/gnuradio/examples -type f -executable); do
-        wrapProgram "$file" \
-            --prefix PYTHONPATH : $PYTHONPATH:$(toPythonPath "$out") \
-            --set MATPLOTLIBRC "$out/share/gnuradio" \
-            ${stdenv.lib.optionalString stdenv.isDarwin "--set DYLD_FRAMEWORK_PATH /System/Library/Frameworks"}
-    done
-  '';
+  ''
+    # If python-support is disabled, don't install volk's (git submodule)
+    # volk_modtool - it references python.
+    #
+    # NOTE: on the next release, volk will always be required to be installed
+    # externally (submodule removed upstream). Hence this hook will fail and
+    # we'll need to package volk while able to tell it to install or not
+    # install python referencing files. When we'll be there, this will help:
+    # https://github.com/gnuradio/volk/pull/404
+    + stdenv.lib.optionalString (!hasFeature "python-support" features) ''
+      sed -i -e "/python\/volk_modtool/d" volk/CMakeLists.txt
+    ''
+  ;
+  patches = [
+    # Don't install python referencing files if python support is disabled.
+    # See: https://github.com/gnuradio/gnuradio/pull/3839
+    (fetchpatch {
+      url = "https://github.com/gnuradio/gnuradio/commit/4a4fd570b398b0b50fe875fcf0eb9c9db2ea5c6e.diff";
+      sha256 = "xz2E0ji6zfdOAhjfPecAcaVOIls1XP8JngLkBbBBW5Q=";
+    })
+    (fetchpatch {
+      url = "https://github.com/gnuradio/gnuradio/commit/dbc8ad7e7361fddc7b1dbc267c07a776a3f9664b.diff";
+      sha256 = "tQcCpcUbJv3yqAX8rSHN/pAuBq4ueEvoVo7sNzZGvf4=";
+    })
+  ];
+in
 
-  meta = with stdenv.lib; {
-    description = "Software Defined Radio (SDR) software";
-    longDescription = ''
-      GNU Radio is a free & open-source software development toolkit that
-      provides signal processing blocks to implement software radios. It can be
-      used with readily-available low-cost external RF hardware to create
-      software-defined radios, or without hardware in a simulation-like
-      environment. It is widely used in hobbyist, academic and commercial
-      environments to support both wireless communications research and
-      real-world radio systems.
-    '';
-    homepage = "https://www.gnuradio.org";
-    license = licenses.gpl3;
-    platforms = platforms.linux ++ platforms.darwin;
-    maintainers = with maintainers; [ bjornfor fpletz ];
-  };
+stdenv.mkDerivation rec {
+  inherit
+    pname
+    version
+    src
+    nativeBuildInputs
+    buildInputs
+    cmakeFlags
+    preConfigure
+    # disallowedReferences
+    stripDebugList
+    patches
+    postInstall
+    passthru
+    doCheck
+    dontWrapPythonPrograms
+    meta
+  ;
 }
diff --git a/pkgs/applications/radio/gnuradio/shared.nix b/pkgs/applications/radio/gnuradio/shared.nix
new file mode 100644
index 00000000000..66ce0a5f513
--- /dev/null
+++ b/pkgs/applications/radio/gnuradio/shared.nix
@@ -0,0 +1,135 @@
+{ stdenv
+, python
+, qt
+, gtk
+, removeReferencesTo
+, featuresInfo
+, features
+, versionAttr
+, sourceSha256
+# If overriden. No need to set default values, as they are given defaults in
+# the main expressions
+, overrideSrc
+, fetchFromGitHub
+, fetchSubmodules
+}:
+
+let
+  lib = stdenv.lib;
+in rec {
+  version = builtins.concatStringsSep "." (
+    lib.attrVals [ "major" "minor" "patch" ] versionAttr
+  );
+  src = if overrideSrc != {} then
+    overrideSrc
+  else
+    fetchFromGitHub {
+      repo = "gnuradio";
+      owner = "gnuradio";
+      rev = "v${version}";
+      sha256 = sourceSha256;
+      inherit fetchSubmodules;
+    }
+  ;
+  # Check if a feature is enabled, while defaulting to true if feat is not
+  # specified.
+  hasFeature = feat: features: (
+    if builtins.hasAttr feat features then
+      features.${feat}
+    else
+      true
+  );
+  nativeBuildInputs = lib.flatten (lib.mapAttrsToList (
+    feat: info: (
+      if hasFeature feat features then
+        (if builtins.hasAttr "native" info then info.native else []) ++
+        (if builtins.hasAttr "pythonNative" info then info.pythonNative else [])
+      else
+        []
+    )
+  ) featuresInfo);
+  buildInputs = lib.flatten (lib.mapAttrsToList (
+    feat: info: (
+      if hasFeature feat features then
+        (if builtins.hasAttr "runtime" info then info.runtime else []) ++
+        (if builtins.hasAttr "pythonRuntime" info then info.pythonRuntime else [])
+      else
+        []
+    )
+  ) featuresInfo);
+  cmakeFlags = lib.mapAttrsToList (
+    feat: info: (
+      if feat == "basic" then
+        # Abuse this unavoidable "iteration" to set this flag which we want as
+        # well - it means: Don't turn on features just because their deps are
+        # satisfied, let only our cmakeFlags decide.
+        "-DENABLE_DEFAULT=OFF"
+      else
+        if hasFeature feat features then
+          "-DENABLE_${info.cmakeEnableFlag}=ON"
+        else
+          "-DENABLE_${info.cmakeEnableFlag}=OFF"
+    )) featuresInfo
+  ;
+  disallowedReferences = [
+    # TODO: Should this be conditional?
+    stdenv.cc
+    stdenv.cc.cc
+  ]
+    # If python-support is disabled, we probably don't want it referenced
+    ++ lib.optionals (!hasFeature "python-support" features) [ python ]
+  ;
+  # Gcc references from examples
+  stripDebugList = [ "lib" "bin" ]
+    ++ lib.optionals (hasFeature "gr-audio" features) [ "share/gnuradio/examples/audio" ]
+    ++ lib.optionals (hasFeature "gr-uhd" features) [ "share/gnuradio/examples/uhd" ]
+    ++ lib.optionals (hasFeature "gr-qtgui" features) [ "share/gnuradio/examples/qt-gui" ]
+  ;
+  postInstall = ''
+  ''
+    # Gcc references
+    + lib.optionalString (hasFeature "volk" features) ''
+      ${removeReferencesTo}/bin/remove-references-to -t ${stdenv.cc} $(readlink -f $out/lib/libvolk.so)
+    ''
+    + lib.optionalString (hasFeature "gnuradio-runtime" features) ''
+      ${removeReferencesTo}/bin/remove-references-to -t ${stdenv.cc} $(readlink -f $out/lib/libgnuradio-runtime.so)
+    ''
+  ;
+  # NOTE: Outputs are disabled due to upstream not using GNU InstallDIrs cmake
+  # module. It's not that bad since it's a development package for most
+  # purposes. If closure size needs to be reduced, features should be disabled
+  # via an override.
+  passthru = {
+    inherit
+      hasFeature
+      versionAttr
+      features
+      featuresInfo
+      python
+      qt
+      gtk
+    ;
+  };
+  # Wrapping is done with an external wrapper
+  dontWrapPythonPrograms = true;
+  # Tests should succeed, but it's hard to get LD_LIBRARY_PATH right in order
+  # for it to happen.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Software Defined Radio (SDR) software";
+    longDescription = ''
+      GNU Radio is a free & open-source software development toolkit that
+      provides signal processing blocks to implement software radios. It can be
+      used with readily-available low-cost external RF hardware to create
+      software-defined radios, or without hardware in a simulation-like
+      environment. It is widely used in hobbyist, academic and commercial
+      environments to support both wireless communications research and
+      real-world radio systems.
+    '';
+    homepage = "https://www.gnuradio.org";
+    license = licenses.gpl3;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ doronbehar bjornfor fpletz ];
+  };
+}
diff --git a/pkgs/applications/radio/gnuradio/wrapper.nix b/pkgs/applications/radio/gnuradio/wrapper.nix
index ffed3da0318..05202840ac0 100644
--- a/pkgs/applications/radio/gnuradio/wrapper.nix
+++ b/pkgs/applications/radio/gnuradio/wrapper.nix
@@ -1,24 +1,132 @@
-{ stdenv, gnuradio, makeWrapper, python, extraPackages ? [] }:
+{ stdenv
+, unwrapped
+, makeWrapper
+# For lndir
+, xorg
+# For Emulating wrapGAppsHook
+, gsettings-desktop-schemas
+, glib
+, hicolor-icon-theme
+, pango
+, json-glib
+, dconf
+, gobject-introspection
+, librsvg
+, gdk-pixbuf
+, harfbuzz
+, at-spi2-core
+, atk
+# For Adding additional GRC blocks
+, extraPackages ? []
+# For Adding additional python packaages
+, extraPythonPackages ? []
+# Allow to add whatever you want to the wrapper
+, extraMakeWrapperArgs ? []
+}:
 
-with { inherit (stdenv.lib) appendToName makeSearchPath; };
+let
+  pythonPkgs = extraPythonPackages
+    ++ stdenv.lib.flatten (stdenv.lib.mapAttrsToList (
+      feat: info: (
+        if unwrapped.hasFeature feat unwrapped.features then
+          (if builtins.hasAttr "pythonRuntime" info then info.pythonRuntime else [])
+        else
+          []
+      )
+      ) unwrapped.featuresInfo)
+    ++ stdenv.lib.optionals (unwrapped.hasFeature "python-support" unwrapped.features) [
+      # Add unwrapped itself as a python module
+      (unwrapped.python.pkgs.toPythonModule unwrapped)
+    ]
+  ;
+  python3Env = unwrapped.python.withPackages(ps: pythonPkgs);
 
+  name = (stdenv.lib.appendToName "wrapped" unwrapped).name;
+  makeWrapperArgs = builtins.concatStringsSep " " ([
+  ]
+    # Emulating wrapGAppsHook & wrapQtAppsHook working together
+    ++ stdenv.lib.optionals (
+      (unwrapped.hasFeature "gnuradio-companion" unwrapped.features)
+      || (unwrapped.hasFeature "gr-qtgui" unwrapped.features)
+      ) [
+      "--prefix" "XDG_DATA_DIRS" ":" "$out/share"
+      "--prefix" "XDG_DATA_DIRS" ":" "$out/share/gsettings-schemas/${name}"
+      "--prefix" "XDG_DATA_DIRS" ":" "${gsettings-desktop-schemas}/share/gsettings-schemas/${gsettings-desktop-schemas.name}"
+      "--prefix" "XDG_DATA_DIRS" ":" "${hicolor-icon-theme}/share"
+      # Needs to run `gsettings` on startup, see:
+      # https://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg1764890.html
+      "--prefix" "PATH" ":" "${stdenv.lib.getBin glib}/bin"
+    ]
+    ++ stdenv.lib.optionals (unwrapped.hasFeature "gnuradio-companion" unwrapped.features) [
+      "--set" "GDK_PIXBUF_MODULE_FILE" "${librsvg}/${gdk-pixbuf.moduleDir}.cache"
+      "--prefix" "GIO_EXTRA_MODULES" ":" "${stdenv.lib.getLib dconf}/lib/gio/modules"
+      "--prefix" "XDG_DATA_DIRS" ":" "${unwrapped.gtk}/share"
+      "--prefix" "XDG_DATA_DIRS" ":" "${unwrapped.gtk}/share/gsettings-schemas/${unwrapped.gtk.name}"
+      "--prefix" "GI_TYPELIB_PATH" ":" "${stdenv.lib.makeSearchPath "lib/girepository-1.0" [
+        unwrapped.gtk
+        gsettings-desktop-schemas
+        atk
+        # From some reason, if .out is not used, .bin is used, and we want
+        # what's in `.out`.
+        pango.out
+        gdk-pixbuf
+        json-glib
+        harfbuzz
+        librsvg
+        gobject-introspection
+        at-spi2-core
+      ]}"
+    ]
+    ++ stdenv.lib.optionals (extraPackages != []) [
+      "--prefix" "GRC_BLOCKS_PATH" ":" "${stdenv.lib.makeSearchPath "share/gnuradio/grc/blocks" extraPackages}"
+    ]
+    ++ stdenv.lib.optionals (unwrapped.hasFeature "gr-qtgui" unwrapped.features)
+      # 3.7 builds with qt4
+      (if unwrapped.versionAttr.major == "3.8" then
+        [
+          "--prefix" "QT_PLUGIN_PATH" ":"
+          "${stdenv.lib.getBin unwrapped.qt.qtbase}/${unwrapped.qt.qtbase.qtPluginPrefix}"
+          "--prefix" "QML2_IMPORT_PATH" ":"
+          "${stdenv.lib.getBin unwrapped.qt.qtbase}/${unwrapped.qt.qtbase.qtQmlPrefix}"
+        ]
+      else
+        # TODO: Add here qt4 related environment for 3.7?
+        [
+
+        ]
+      )
+    ++ extraMakeWrapperArgs
+  );
+in
 stdenv.mkDerivation {
-  name = (appendToName "with-packages" gnuradio).name;
-  buildInputs = [ makeWrapper python ];
+  inherit name;
 
-  buildCommand = ''
-    mkdir -p $out/bin
-    ln -s "${gnuradio}"/bin/* $out/bin/
+  buildInputs = [
+    makeWrapper
+    xorg.lndir
+  ];
 
-    for file in $(find -L $out/bin -type f); do
-        if test -x "$(readlink -f "$file")"; then
-            wrapProgram "$file" \
-                --prefix PYTHONPATH : ${stdenv.lib.concatStringsSep ":"
-                                         (map (path: "$(toPythonPath ${path})") extraPackages)} \
-                --prefix GRC_BLOCKS_PATH : ${makeSearchPath "share/gnuradio/grc/blocks" extraPackages}
-        fi
+  passthru = {
+    inherit python3Env pythonPkgs unwrapped;
+  };
+
+  buildCommand = ''
+    mkdir $out
+    cd $out
+    lndir -silent ${unwrapped}
+    for i in $out/bin/*; do
+      if [[ ! -x "$i" ]]; then
+        continue
+      fi
+      cp -L "$i" "$i".tmp
+      mv -f "$i".tmp "$i"
+      if head -1 "$i" | grep -q ${unwrapped.python}; then
+        substituteInPlace "$i" \
+          --replace ${unwrapped.python} ${python3Env}
+      fi
+      wrapProgram "$i" ${makeWrapperArgs}
     done
   '';
 
-  inherit (gnuradio) meta;
+  inherit (unwrapped) meta;
 }
diff --git a/pkgs/top-level/aliases.nix b/pkgs/top-level/aliases.nix
index 28b5614a80c..d9ec9bdca97 100644
--- a/pkgs/top-level/aliases.nix
+++ b/pkgs/top-level/aliases.nix
@@ -189,6 +189,10 @@ mapAliases ({
   gnuradio-limesdr = gr-limesdr; # added 2019-05-27
   gnuradio-rds = gr-rds; # added 2019-05-27
   gnuradio-osmosdr = gr-osmosdr; # added 2019-05-27
+  # added 20-10-2020
+  gnuradio-with-packages = gnuradio3_7.override {
+    extraPackages = [ gr-nacl gr-gsm gr-ais gr-limesdr gr-rds gr-osmosdr ];
+  };
   gnustep-make = gnustep.make; # added 2016-7-6
   gnupg20 = throw "gnupg20 has been removed from nixpkgs as upstream dropped support on 2017-12-31";# added 2020-07-12
   go_1_12 = throw "go_1_12 has been removed"; # added 2020-04-26
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 9a0051b5bf9..67bed0dedb2 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -15743,7 +15743,13 @@ in
 
   qm-dsp = callPackage ../development/libraries/audio/qm-dsp { };
 
-  qradiolink = callPackage ../applications/radio/qradiolink { };
+  qradiolink = callPackage ../applications/radio/qradiolink {
+    # 3.8 support is not ready yet:
+    # https://github.com/qradiolink/qradiolink/issues/67#issuecomment-703222573
+    # The non minimal build is used because the 'qtgui' component is needed.
+    # gr-osmosdr is using the same gnuradio as of now.
+    gnuradio = gnuradio3_7-unwrapped;
+  };
 
   qrupdate = callPackage ../development/libraries/qrupdate { };
 
@@ -21154,34 +21160,80 @@ in
 
   gksu = callPackage ../applications/misc/gksu { };
 
-  gnss-sdr = callPackage ../applications/radio/gnss-sdr { boost=boost166; };
+  gnss-sdr = callPackage ../applications/radio/gnss-sdr {
+    boost = boost166;
+    gnuradio = gnuradio3_7-unwrapped;
+  };
 
-  gnuradio = callPackage ../applications/radio/gnuradio {
-    inherit (python2Packages) cheetah lxml Mako matplotlib numpy python pyopengl pyqt4 scipy wxPython pygtk;
+  gnuradio-unwrapped = callPackage ../applications/radio/gnuradio {
     inherit (darwin.apple_sdk.frameworks) CoreAudio;
-    fftw = fftwFloat;
-    qwt = qwt6_qt4;
+    python = python3;
   };
-
-  gnuradio-with-packages = callPackage ../applications/radio/gnuradio/wrapper.nix {
-    inherit (python2Packages) python;
-    extraPackages = [ gr-nacl gr-osmosdr gr-ais gr-rds ]
-      ++ lib.optionals stdenv.isLinux [ gr-gsm gr-limesdr ];
+  # A build without gui components and other utilites not needed for end user
+  # libraries
+  gnuradioMinimal = gnuradio-unwrapped.override {
+    features = {
+      gnuradio-companion = false;
+      python-support = false;
+      gr-ctrlport = false;
+      examples = false;
+      gr-qtgui = false;
+      gr-utils = false;
+      gr-modtool = false;
+      sphinx = false;
+      doxygen = false;
+    };
+  };
+  gnuradio = callPackage ../applications/radio/gnuradio/wrapper.nix {
+    unwrapped = gnuradio-unwrapped;
+  };
+  gnuradio3_7-unwrapped = callPackage ../applications/radio/gnuradio/3.7.nix {
+    inherit (darwin.apple_sdk.frameworks) CoreAudio;
+    python = python2;
+  };
+  # A build without gui components and other utilites not needed if gnuradio is
+  # used as a c++ library.
+  gnuradio3_7Minimal = gnuradio3_7-unwrapped.override {
+    features = {
+      gnuradio-companion = false;
+      python-support = false;
+      gr-ctrlport = false;
+      gr-qtgui = false;
+      gr-utils = false;
+      sphinx = false;
+      doxygen = false;
+      gr-wxgui = false;
+    };
+  };
+  gnuradio3_7 = callPackage ../applications/radio/gnuradio/wrapper.nix {
+    unwrapped = gnuradio3_7-unwrapped;
   };
 
   grandorgue = callPackage ../applications/audio/grandorgue { };
 
-  gr-nacl = callPackage ../applications/radio/gnuradio/nacl.nix { };
+  gr-nacl = callPackage ../applications/radio/gnuradio/nacl.nix {
+    gnuradio = gnuradio3_7-unwrapped;
+  };
 
-  gr-gsm = callPackage ../applications/radio/gnuradio/gsm.nix { };
+  gr-gsm = callPackage ../applications/radio/gnuradio/gsm.nix {
+    gnuradio = gnuradio3_7-unwrapped;
+  };
 
-  gr-ais = callPackage ../applications/radio/gnuradio/ais.nix { };
+  gr-ais = callPackage ../applications/radio/gnuradio/ais.nix {
+    gnuradio = gnuradio3_7-unwrapped;
+  };
 
-  gr-limesdr = callPackage ../applications/radio/gnuradio/limesdr.nix { };
+  gr-limesdr = callPackage ../applications/radio/gnuradio/limesdr.nix {
+    gnuradio = gnuradio3_7-unwrapped;
+  };
 
-  gr-rds = callPackage ../applications/radio/gnuradio/rds.nix { };
+  gr-rds = callPackage ../applications/radio/gnuradio/rds.nix {
+    gnuradio = gnuradio3_7-unwrapped;
+  };
 
-  gr-osmosdr = callPackage ../applications/radio/gnuradio/osmosdr.nix { };
+  gr-osmosdr = callPackage ../applications/radio/gnuradio/osmosdr.nix {
+    gnuradio = gnuradio3_7-unwrapped;
+  };
 
   goldendict = libsForQt514.callPackage ../applications/misc/goldendict {
     inherit (darwin) libiconv;
@@ -21220,7 +21272,13 @@ in
 
   gpx = callPackage ../applications/misc/gpx { };
 
-  gqrx = libsForQt514.callPackage ../applications/radio/gqrx { };
+  gqrx = libsForQt514.callPackage ../applications/radio/gqrx {
+    gnuradio = gnuradio3_7Minimal;
+    # Use the same gnuradio for gr-osmosdr as well
+    gr-osmosdr = gr-osmosdr.override {
+      gnuradio = gnuradio3_7Minimal;
+    };
+  };
 
   gpx-viewer = callPackage ../applications/misc/gpx-viewer { };
 
@@ -21986,7 +22044,9 @@ in
 
   inkscape-extensions = recurseIntoAttrs (callPackages ../applications/graphics/inkscape/extensions.nix {});
 
-  inspectrum = libsForQt514.callPackage ../applications/radio/inspectrum { };
+  inspectrum = libsForQt514.callPackage ../applications/radio/inspectrum {
+    gnuradio = gnuradioMinimal;
+  };
 
   ion3 = callPackage ../applications/window-managers/ion-3 {
     lua = lua5_1;