depot/third_party/nixpkgs/pkgs/applications/radio/gnuradio/wrapper.nix

253 lines
6.9 KiB
Nix

{
lib,
stdenv,
# The unwrapped gnuradio derivation
unwrapped,
# If it's a minimal build, we don't want to wrap it with lndir and
# wrapProgram..
doWrap ? true,
# For the wrapper
makeWrapper,
# For lndir
xorg,
# To define a the gnuradio.pkgs scope
newScope,
# For Emulating wrapGAppsHook3
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 ? [ ],
soapysdr, # For it's passthru.searchPath
# soapysdr plugins we add by default. Ideally, we should have a
# soapysdrPackages = soapysdr.pkgs attribute set, but until now this wasn't
# crucial.
soapyairspy,
soapyaudio,
soapybladerf,
soapyhackrf,
soapyremote,
soapyrtlsdr,
soapyuhd,
# For adding / changing soapysdr packages, like soapsdr-with-plugins does
extraSoapySdrPackages ? [
soapyairspy
soapyaudio
soapybladerf
soapyhackrf
soapyremote
soapyrtlsdr
soapyuhd
],
# Allow to add whatever you want to the wrapper
extraMakeWrapperArgs ? [ ],
}:
let
# We don't check if `python-support` feature is on, as it's unlikely someone
# may wish to wrap GR without python support.
pythonPkgs =
extraPythonPackages
++ [ (unwrapped.python.pkgs.toPythonModule unwrapped) ]
++ unwrapped.passthru.uhd.pythonPath
++ lib.optionals (unwrapped.passthru.uhd.pythonPath != [ ]) [
(unwrapped.python.pkgs.toPythonModule unwrapped.passthru.uhd)
]
# Add the extraPackages as python modules as well
++ (builtins.map unwrapped.python.pkgs.toPythonModule extraPackages)
++ lib.flatten (
lib.mapAttrsToList (
feat: info:
(lib.optionals (
(unwrapped.hasFeature feat) && (builtins.hasAttr "pythonRuntime" info)
) info.pythonRuntime)
) unwrapped.featuresInfo
);
pythonEnv = unwrapped.python.withPackages (ps: pythonPkgs);
pname = unwrapped.pname + "-wrapped";
inherit (unwrapped) version;
makeWrapperArgs = builtins.concatStringsSep " " (
[
]
# Emulating wrapGAppsHook3 & wrapQtAppsHook working together
++
lib.optionals ((unwrapped.hasFeature "gnuradio-companion") || (unwrapped.hasFeature "gr-qtgui"))
[
"--prefix"
"XDG_DATA_DIRS"
":"
"$out/share"
"--prefix"
"XDG_DATA_DIRS"
":"
"$out/share/gsettings-schemas/${pname}"
"--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"
":"
"${lib.getBin glib}/bin"
]
++ lib.optionals (unwrapped.hasFeature "gnuradio-companion") [
"--set"
"GDK_PIXBUF_MODULE_FILE"
"${librsvg}/${gdk-pixbuf.moduleDir}.cache"
"--prefix"
"GIO_EXTRA_MODULES"
":"
"${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"
":"
"${lib.makeSearchPath "lib/girepository-1.0" [
(lib.getLib glib)
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
]}"
]
++ lib.optionals (extraPackages != [ ]) [
"--prefix"
"GRC_BLOCKS_PATH"
":"
"${lib.makeSearchPath "share/gnuradio/grc/blocks" extraPackages}"
]
++ lib.optionals (extraSoapySdrPackages != [ ]) [
"--prefix"
"SOAPY_SDR_PLUGIN_PATH"
":"
"${lib.makeSearchPath soapysdr.passthru.searchPath extraSoapySdrPackages}"
]
++
lib.optionals (unwrapped.hasFeature "gr-qtgui")
# 3.7 builds with qt4
(
if lib.versionAtLeast unwrapped.versionAttr.major "3.8" then
[
"--prefix"
"QT_PLUGIN_PATH"
":"
"${lib.makeSearchPath unwrapped.qt.qtbase.qtPluginPrefix (
builtins.map lib.getBin (
[
unwrapped.qt.qtbase
]
++ lib.optionals stdenv.hostPlatform.isLinux [
unwrapped.qt.qtwayland
]
)
)}"
"--prefix"
"QML2_IMPORT_PATH"
":"
"${lib.makeSearchPath unwrapped.qt.qtbase.qtQmlPrefix (
builtins.map lib.getBin (
[
unwrapped.qt.qtbase
]
++ lib.optionals stdenv.hostPlatform.isLinux [
unwrapped.qt.qtwayland
]
)
)}"
]
else
# Add here qt4 related environment for 3.7?
[
]
)
++ extraMakeWrapperArgs
);
packages = import ../../../top-level/gnuradio-packages.nix {
inherit lib stdenv newScope;
gnuradio = unwrapped;
};
passthru = unwrapped.passthru // {
inherit
pythonEnv
pythonPkgs
unwrapped
;
pkgs = packages;
};
self =
if doWrap then
stdenv.mkDerivation {
inherit pname version passthru;
nativeBuildInputs = [ makeWrapper ];
buildInputs = [
xorg.lndir
];
buildCommand = ''
mkdir $out
cd $out
lndir -silent ${unwrapped}
${lib.optionalString (extraPackages != [ ]) (
builtins.concatStringsSep "\n" (
builtins.map (pkg: ''
if [[ -d ${lib.getBin pkg}/bin/ ]]; then
lndir -silent ${pkg}/bin ./bin
fi
'') extraPackages
)
)}
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} ${pythonEnv}
fi
wrapProgram "$i" ${makeWrapperArgs}
done
'';
inherit (unwrapped) meta;
}
else
unwrapped.overrideAttrs (_: {
inherit passthru;
});
in
self