diff options
Diffstat (limited to 'nixpkgs/pkgs/development/libraries/boost/generic.nix')
-rw-r--r-- | nixpkgs/pkgs/development/libraries/boost/generic.nix | 60 |
1 files changed, 41 insertions, 19 deletions
diff --git a/nixpkgs/pkgs/development/libraries/boost/generic.nix b/nixpkgs/pkgs/development/libraries/boost/generic.nix index 1f9bbe5ffcad..2d8d13482eac 100644 --- a/nixpkgs/pkgs/development/libraries/boost/generic.nix +++ b/nixpkgs/pkgs/development/libraries/boost/generic.nix @@ -1,8 +1,9 @@ { lib, stdenv, icu, expat, zlib, bzip2, python ? null, fixDarwinDylibNames, libiconv +, boost-build , fetchpatch , which -, buildPackages , toolset ? /**/ if stdenv.cc.isClang then "clang" + else if stdenv.cc.isGNU then "gcc" else null , enableRelease ? true , enableDebug ? false @@ -67,6 +68,8 @@ let else "$NIX_BUILD_CORES"; + needUserConfig = stdenv.hostPlatform != stdenv.buildPlatform || useMpi || stdenv.isDarwin; + b2Args = concatStringsSep " " ([ "--includedir=$dev/include" "--libdir=$out/lib" @@ -95,7 +98,7 @@ let ++ optional (variant == "release") "debug-symbols=off" ++ optional (toolset != null) "toolset=${toolset}" ++ optional (!enablePython) "--without-python" - ++ optional (useMpi || stdenv.hostPlatform != stdenv.buildPlatform) "--user-config=user-config.jam" + ++ optional needUserConfig "--user-config=user-config.jam" ++ optionals (stdenv.hostPlatform.libc == "msvcrt") [ "threadapi=win32" ] ++ extraB2Args @@ -137,22 +140,39 @@ stdenv.mkDerivation { maintainers = with maintainers; [ peti ]; }; - preConfigure = '' - if test -f tools/build/src/tools/clang-darwin.jam ; then - substituteInPlace tools/build/src/tools/clang-darwin.jam \ - --replace '@rpath/$(<[1]:D=)' "$out/lib/\$(<[1]:D=)"; - fi; - '' + optionalString useMpi '' + preConfigure = optionalString useMpi '' cat << EOF >> user-config.jam using mpi : ${mpi}/bin/mpiCC ; EOF - '' + optionalString (stdenv.hostPlatform != stdenv.buildPlatform) '' + '' + # On darwin we need to add the `$out/lib` to the libraries' rpath explicitly, + # otherwise the dynamic linker is unable to resolve the reference to @rpath + # when the boost libraries want to load each other at runtime. + + optionalString (stdenv.isDarwin && enableShared) '' + cat << EOF >> user-config.jam + using clang-darwin : : ${stdenv.cc.targetPrefix}c++ + : <linkflags>"-rpath $out/lib/" + ; + EOF + '' + # b2 has trouble finding the correct compiler and tools for cross compilation + # since it apparently ignores $CC, $AR etc. Thus we need to set everything + # in user-config.jam. To keep things simple we just set everything in an + # uniform way for clang and gcc (which works thanks to our cc-wrapper). + # We pass toolset later which will make b2 invoke everything in the right + # way -- the other toolset in user-config.jam will be ignored. + + optionalString (stdenv.hostPlatform != stdenv.buildPlatform) '' cat << EOF >> user-config.jam - using gcc : cross : ${stdenv.cc.targetPrefix}c++ ; + using gcc : cross : ${stdenv.cc.targetPrefix}c++ + : <archiver>$AR + <ranlib>$RANLIB + ; + + using clang : cross : ${stdenv.cc.targetPrefix}c++ + : <archiver>$AR + <ranlib>$RANLIB + ; EOF - # Build b2 with buildPlatform CC/CXX. - sed '2i export CC=$CC_FOR_BUILD; export CXX=$CXX_FOR_BUILD' \ - -i ./tools/build/src/engine/build.sh ''; NIX_CFLAGS_LINK = lib.optionalString stdenv.isDarwin @@ -160,9 +180,8 @@ stdenv.mkDerivation { enableParallelBuilding = true; - nativeBuildInputs = [ which ] + nativeBuildInputs = [ which boost-build ] ++ optional stdenv.hostPlatform.isDarwin fixDarwinDylibNames; - depsBuildBuild = [ buildPackages.stdenv.cc ]; buildInputs = [ expat zlib bzip2 libiconv ] ++ optional (stdenv.hostPlatform == stdenv.buildPlatform) icu ++ optional enablePython python @@ -170,16 +189,19 @@ stdenv.mkDerivation { configureScript = "./bootstrap.sh"; configurePlatforms = []; + dontDisableStatic = true; + dontAddStaticConfigureFlags = true; configureFlags = [ "--includedir=$(dev)/include" "--libdir=$(out)/lib" + "--with-bjam=b2" # prevent bootstrapping b2 in configurePhase ] ++ optional enablePython "--with-python=${python.interpreter}" - ++ [ (if stdenv.hostPlatform == stdenv.buildPlatform then "--with-icu=${icu.dev}" else "--without-icu") ] - ++ optional (toolset != null) "--with-toolset=${toolset}"; + ++ optional (toolset != null) "--with-toolset=${toolset}" + ++ [ (if stdenv.hostPlatform == stdenv.buildPlatform then "--with-icu=${icu.dev}" else "--without-icu") ]; buildPhase = '' runHook preBuild - ./b2 ${b2Args} + b2 ${b2Args} runHook postBuild ''; @@ -191,7 +213,7 @@ stdenv.mkDerivation { cp -a tools/boostbook/{xsl,dtd} $dev/share/boostbook/ # Let boost install everything else - ./b2 ${b2Args} install + b2 ${b2Args} install runHook postInstall ''; |