diff options
Diffstat (limited to 'pkgs/development/libraries/science/networking/ns-3/default.nix')
-rw-r--r-- | pkgs/development/libraries/science/networking/ns-3/default.nix | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/pkgs/development/libraries/science/networking/ns-3/default.nix b/pkgs/development/libraries/science/networking/ns-3/default.nix new file mode 100644 index 00000000000..73be2a8ca6c --- /dev/null +++ b/pkgs/development/libraries/science/networking/ns-3/default.nix @@ -0,0 +1,110 @@ +{ stdenv +, fetchFromGitLab +, python +, wafHook + +# for binding generation +, castxml ? null + +# can take a long time, generates > 30000 images/graphs +, enableDoxygen ? false + +# e.g. "optimized" or "debug". If not set, use default one +, build_profile ? null + +# --enable-examples +, withExamples ? false + +# very long +, withManual ? false, doxygen ? null, graphviz ? null, imagemagick ? null +# for manual, tetex is used to get the eps2pdf binary +# texlive to get latexmk. building manual still fails though +, dia, tetex ? null, ghostscript ? null, texlive ? null + +# generates python bindings +, pythonSupport ? false, ncurses ? null + +# All modules can be enabled by choosing 'all_modules'. +# we include here the DCE mandatory ones +, modules ? [ "core" "network" "internet" "point-to-point" "fd-net-device" "netanim"] +, lib +}: + +let + pythonEnv = python.withPackages(ps: + stdenv.lib.optional withManual ps.sphinx + ++ stdenv.lib.optionals pythonSupport (with ps;[ pybindgen pygccxml ]) + ); +in +stdenv.mkDerivation rec { + pname = "ns-3"; + version = "30"; + + src = fetchFromGitLab { + owner = "nsnam"; + repo = "ns-3-dev"; + rev = "ns-3.${version}"; + sha256 = "0smdi3gglmafpc7a20hj2lbmwks3d5fpsicpn39lmm3svazw0bvp"; + }; + + nativeBuildInputs = [ wafHook ]; + + outputs = [ "out" ] ++ lib.optional pythonSupport "py"; + + # ncurses is a hidden dependency of waf when checking python + buildInputs = lib.optionals pythonSupport [ castxml ncurses ] + ++ lib.optional enableDoxygen [ doxygen graphviz imagemagick ] + ++ lib.optional withManual [ dia tetex ghostscript texlive.combined.scheme-medium ]; + + propagatedBuildInputs = [ pythonEnv ]; + + postPatch = '' + patchShebangs doc/ns3_html_theme/get_version.sh + ''; + + wafConfigureFlags = with stdenv.lib; [ + "--enable-modules=${concatStringsSep "," modules}" + "--with-python=${pythonEnv.interpreter}" + ] + ++ optional (build_profile != null) "--build-profile=${build_profile}" + ++ optional withExamples " --enable-examples " + ++ optional doCheck " --enable-tests " + ; + + doCheck = true; + + buildTargets = "build" + + lib.optionalString enableDoxygen " doxygen" + + lib.optionalString withManual "sphinx"; + + # to prevent fatal error: 'backward_warning.h' file not found + CXXFLAGS = "-D_GLIBCXX_PERMIT_BACKWARD_HASH"; + + postBuild = with stdenv.lib; let flags = concatStringsSep ";" ( + optional enableDoxygen "./waf doxygen" + ++ optional withManual "./waf sphinx" + ); + in "${flags}" + ; + + postInstall = '' + moveToOutput "${pythonEnv.libPrefix}" "$py" + ''; + + # we need to specify the proper interpreter else ns3 can check against a + # different version + checkPhase = '' + ${pythonEnv.interpreter} ./test.py --nowaf + ''; + + # strictoverflow prevents clang from discovering pyembed when bindings + hardeningDisable = [ "fortify" "strictoverflow"]; + + meta = with stdenv.lib; { + homepage = "http://www.nsnam.org"; + license = licenses.gpl3; + description = "A discrete time event network simulator"; + platforms = with platforms; unix; + maintainers = with maintainers; [ teto ]; + }; +} |