2021-03-15 08:37:03 +00:00
{ lib
, stdenv
, fetchurl
, fetchFromGitHub
, cmake
, pkg-config
# See https://files.ettus.com/manual_archive/v3.15.0.0/html/page_build_guide.html for dependencies explanations
, boost
, enableLibuhd_C_api ? true
# requires numpy
, enableLibuhd_Python_api ? false
, python3
, enableExamples ? false
, enableUtils ? false
, enableLiberio ? false
, liberio
, libusb1
, enableDpdk ? false
, dpdk
# Devices
, enableOctoClock ? true
, enableMpmd ? true
, enableB100 ? true
, enableB200 ? true
, enableUsrp1 ? true
, enableUsrp2 ? true
, enableX300 ? true
, enableN230 ? true
, enableN300 ? true
, enableN320 ? true
, enableE300 ? true
, enableE320 ? true
} :
let
onOffBool = b : if b then " O N " else " O F F " ;
inherit ( lib ) optionals ;
in
stdenv . mkDerivation rec {
pname = " u h d " ;
# UHD seems to use three different version number styles: x.y.z, xxx_yyy_zzz
# and xxx.yyy.zzz. Hrmpf... style keeps changing
version = " 3 . 1 5 . 0 . 0 " ;
src = fetchFromGitHub {
owner = " E t t u s R e s e a r c h " ;
repo = " u h d " ;
rev = " v ${ version } " ;
sha256 = " 0 j k n l n 8 8 a 6 9 f h 2 4 4 6 7 0 n b 7 q r f l b y v 0 v v d x f d d b 5 g 8 n c p b 6 h c g 8 q f " ;
} ;
# Firmware images are downloaded (pre-built) from the respective release on Github
uhdImagesSrc = fetchurl {
url = " h t t p s : / / g i t h u b . c o m / E t t u s R e s e a r c h / u h d / r e l e a s e s / d o w n l o a d / v ${ version } / u h d - i m a g e s _ ${ version } . t a r . x z " ;
sha256 = " 1 f i r 1 a 1 3 a c 0 7 m q h m 4 s r 3 4 c i x i q j 2 d i f x q 0 8 7 0 q v 1 w r 7 a 7 c b f w 6 v p " ;
} ;
cmakeFlags = [
" - D E N A B L E _ L I B U H D = O N "
" - D E N A B L E _ U S B = O N "
" - D E N A B L E _ T E S T S = O N " # This installs tests as well so we delete them via postPhases
" - D E N A B L E _ E X A M P L E S = ${ onOffBool enableExamples } "
" - D E N A B L E _ U T I L S = ${ onOffBool enableUtils } "
" - D E N A B L E _ L I B U H D _ C _ A P I = ${ onOffBool enableLibuhd_C_api } "
" - D E N A B L E _ L I B U H D _ P Y T H O N _ A P I = ${ onOffBool enableLibuhd_Python_api } "
" - D E N A B L E _ L I B E R I O = ${ onOffBool enableLiberio } "
" - D E N A B L E _ D P D K = ${ onOffBool enableDpdk } "
# Devices
" - D E N A B L E _ O C T O C L O C K = ${ onOffBool enableOctoClock } "
" - D E N A B L E _ M P M D = ${ onOffBool enableMpmd } "
" - D E N A B L E _ B 1 0 0 = ${ onOffBool enableB100 } "
" - D E N A B L E _ B 2 0 0 = ${ onOffBool enableB200 } "
" - D E N A B L E _ U S R P 1 = ${ onOffBool enableUsrp1 } "
" - D E N A B L E _ U S R P 2 = ${ onOffBool enableUsrp2 } "
" - D E N A B L E _ X 3 0 0 = ${ onOffBool enableX300 } "
" - D E N A B L E _ N 2 3 0 = ${ onOffBool enableN230 } "
" - D E N A B L E _ N 3 0 0 = ${ onOffBool enableN300 } "
" - D E N A B L E _ N 3 2 0 = ${ onOffBool enableN320 } "
" - D E N A B L E _ E 3 0 0 = ${ onOffBool enableE300 } "
" - D E N A B L E _ E 3 2 0 = ${ onOffBool enableE320 } "
]
# TODO: Check if this still needed
# ABI differences GCC 7.1
# /nix/store/wd6r25miqbk9ia53pp669gn4wrg9n9cj-gcc-7.3.0/include/c++/7.3.0/bits/vector.tcc:394:7: note: parameter passing for argument of type 'std::vector<uhd::range_t>::iterator {aka __gnu_cxx::__normal_iterator<uhd::range_t*, std::vector<uhd::range_t> >}' changed in GCC 7.1
++ [ ( lib . optionalString stdenv . isAarch32 " - D C M A K E _ C X X _ F L A G S = - W n o - p s a b i " ) ]
;
# Python + Mako are always required for the build itself but not necessary for runtime.
pythonEnv = python3 . withPackages ( ps : with ps ; [ Mako ]
++ optionals ( enableLibuhd_Python_api ) [ numpy setuptools ]
++ optionals ( enableUtils ) [ requests six ]
) ;
nativeBuildInputs = [
cmake
pkg-config
]
# If both enableLibuhd_Python_api and enableUtils are off, we don't need
# pythonEnv in buildInputs as it's a 'build' dependency and not a runtime
# dependency
++ optionals ( ! enableLibuhd_Python_api && ! enableUtils ) [ pythonEnv ]
;
buildInputs = [
boost
libusb1
]
# However, if enableLibuhd_Python_api *or* enableUtils is on, we need
# pythonEnv for runtime as well. The utilities' runtime dependencies are
# handled at the environment
++ optionals ( enableLibuhd_Python_api || enableUtils ) [ pythonEnv ]
++ optionals ( enableLiberio ) [ liberio ]
++ optionals ( enableDpdk ) [ dpdk ]
;
doCheck = true ;
# Build only the host software
preConfigure = " c d h o s t " ;
# TODO: Check if this still needed, perhaps relevant:
# https://files.ettus.com/manual_archive/v3.15.0.0/html/page_build_guide.html#build_instructions_unix_arm
patches = if stdenv . isAarch32 then ./neon.patch else null ;
postPhases = [ " i n s t a l l F i r m w a r e " " r e m o v e I n s t a l l e d T e s t s " ]
++ optionals ( enableUtils ) [ " m o v e U d e v R u l e s " ]
;
# UHD expects images in `$CMAKE_INSTALL_PREFIX/share/uhd/images`
installFirmware = ''
mkdir - p " $ o u t / s h a r e / u h d / i m a g e s "
tar - - strip-components = 1 - xvf " ${ uhdImagesSrc } " - C " $ o u t / s h a r e / u h d / i m a g e s "
'' ;
# -DENABLE_TESTS=ON installs the tests, we don't need them in the output
removeInstalledTests = ''
rm - r $ out/lib/uhd/tests
'' ;
# Moves the udev rules to the standard location, needed only if utils are
# enabled
moveUdevRules = ''
mkdir - p $ out/lib/udev/rules.d
mv $ out/lib/uhd/utils/uhd-usrp.rules $ out/lib/udev/rules.d /
'' ;
meta = with lib ; {
2022-06-16 17:23:12 +00:00
broken = ( stdenv . isLinux && stdenv . isAarch64 ) || stdenv . isDarwin ;
2021-03-15 08:37:03 +00:00
description = " U S R P H a r d w a r e D r i v e r ( f o r S o f t w a r e D e f i n e d R a d i o ) " ;
longDescription = ''
The USRP Hardware Driver ( UHD ) software is the hardware driver for all
USRP ( Universal Software Radio Peripheral ) devices .
USRP devices are designed and sold by Ettus Research , LLC and its parent
company , National Instruments .
'' ;
homepage = " h t t p s : / / u h d . e t t u s . c o m / " ;
license = licenses . gpl3Plus ;
platforms = platforms . linux ++ platforms . darwin ;
maintainers = with maintainers ; [ bjornfor fpletz tomberek ] ;
} ;
}