{ stdenv , lib , fetchFromGitHub , automake , autoconf , libtool , pkg-config , numactl , hwloc , papi , boost , ovni , enableDebug ? false , enableJemalloc ? true , jemallocNanos6 ? null , cachelineBytes ? 64 , enableGlibcxxDebug ? false , enablePapi ? stdenv.hostPlatform == stdenv.buildPlatform # Disabled when cross-compiling , useGit ? false , gitUrl ? "ssh://git@bscpm04.bsc.es/nanos6/nanos6" , gitBranch ? "master" , gitCommit ? "f82762b66c82b5174a8eaad33f6c2f335ac759b4" }: assert enableJemalloc -> (jemallocNanos6 != null); with lib; let release = rec { version = "4.3"; src = fetchFromGitHub { owner = "bsc-pm"; repo = "nanos6"; rev = "version-${version}"; hash = "sha256-/c6WiKBsAo/01uvMRmjv0PMucbrgvaGmbxlPE6q+dfE="; }; }; git = rec { version = src.shortRev; src = builtins.fetchGit { url = gitUrl; ref = gitBranch; rev = gitCommit; }; }; source = if (useGit) then git else release; isCross = stdenv.hostPlatform != stdenv.buildPlatform; in stdenv.mkDerivation (source // { pname = "nanos6"; prePatch = '' patchShebangs scripts/generate_config.sh patchShebangs autogen.sh ''; enableParallelBuilding = true; preConfigure = '' export CACHELINE_WIDTH=${toString cachelineBytes} ./autogen.sh '' + lib.optionalString (useGit) '' export NANOS6_GIT_VERSION=${gitCommit} export NANOS6_GIT_BRANCH=${gitBranch} ''; configureFlags = [ "--with-hwloc=${hwloc}" "--disable-all-instrumentations" "--enable-ovni-instrumentation" "--with-ovni=${ovni}" "--with-boost=${boost.dev}" ] ++ (optional enableJemalloc "--with-jemalloc=${jemallocNanos6}") ++ (optional enableGlibcxxDebug "CXXFLAGS=-D_GLIBCXX_DEBUG") ++ # Most nanos6 api symbols are resolved at runtime, so prefer # ifunc by default (optional isCross "--with-symbol-resolution=ifunc"); postConfigure = lib.optionalString (!enableDebug) '' # Disable debug sed -i 's/\([a-zA-Z0-9_]*nanos6_debug[a-zA-Z0-9_]*\)\s*[+]\?=.*/\1 =/g' Makefile.am ''; # The "bindnow" flags are incompatible with ifunc resolution mechanism. We # disable all by default, which includes bindnow. hardeningDisable = [ "all" ]; # Keep debug symbols in the debug variant of the library dontStrip = enableDebug; separateDebugInfo = true; nativeBuildInputs = [ autoconf automake libtool pkg-config # TODO: papi_version is needed for configure: # ./configure: line 27378: papi_version: command not found # This probably breaks cross-compilation ] ++ lib.optionals enablePapi [ papi ]; buildInputs = [ boost numactl hwloc ovni ] ++ lib.optionals enablePapi [ papi ]; # Create a script that sets NANOS6_HOME postInstall = '' mkdir -p $out/nix-support echo "export NANOS6_HOME=$out" >> $out/nix-support/setup-hook ''; meta = with lib; { homepage = "https://github.com/bsc-pm/nanos6"; description = "Nanos6 runtime for OmpSs-2" + optionalString (enableDebug) " (with debug symbols)"; maintainers = with maintainers.bsc; [ rarias ]; platforms = platforms.linux; license = licenses.gpl3; }; })