253 lines
6.9 KiB
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
|