Merge pull request #132597 from sternenseemann/boost-separate-b2
boost: use b2 from boost-build for building
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
{ lib
|
||||
, callPackage
|
||||
, boost-build
|
||||
, fetchurl
|
||||
}:
|
||||
|
||||
let
|
||||
# for boost 1.55 we need to use 1.56's b2
|
||||
# since 1.55's build system is not working
|
||||
# with our derivation
|
||||
useBoost156 = rec {
|
||||
version = "1.56.0";
|
||||
src = fetchurl {
|
||||
url = "mirror://sourceforge/boost/boost_${lib.replaceStrings ["."] ["_"] version}.tar.bz2";
|
||||
sha256 = "07gz62nj767qzwqm3xjh11znpyph8gcii0cqhnx7wvismyn34iqk";
|
||||
};
|
||||
};
|
||||
|
||||
makeBoost = file:
|
||||
lib.fix (self:
|
||||
callPackage file {
|
||||
boost-build = boost-build.override {
|
||||
# useBoost allows us passing in src and version from
|
||||
# the derivation we are building to get a matching b2 version.
|
||||
useBoost =
|
||||
if lib.versionAtLeast self.version "1.56"
|
||||
then self
|
||||
else useBoost156; # see above
|
||||
};
|
||||
}
|
||||
);
|
||||
in {
|
||||
boost155 = makeBoost ./1.55.nix;
|
||||
boost159 = makeBoost ./1.59.nix;
|
||||
boost160 = makeBoost ./1.60.nix;
|
||||
boost165 = makeBoost ./1.65.nix;
|
||||
boost166 = makeBoost ./1.66.nix;
|
||||
boost167 = makeBoost ./1.67.nix;
|
||||
boost168 = makeBoost ./1.68.nix;
|
||||
boost169 = makeBoost ./1.69.nix;
|
||||
boost170 = makeBoost ./1.70.nix;
|
||||
boost171 = makeBoost ./1.71.nix;
|
||||
boost172 = makeBoost ./1.72.nix;
|
||||
boost173 = makeBoost ./1.73.nix;
|
||||
boost174 = makeBoost ./1.74.nix;
|
||||
boost175 = makeBoost ./1.75.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 gcc : cross : ${stdenv.cc.targetPrefix}c++ ;
|
||||
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++
|
||||
: <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
|
||||
@@ -173,13 +192,14 @@ stdenv.mkDerivation {
|
||||
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 +211,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
|
||||
'';
|
||||
|
||||
@@ -2,18 +2,36 @@
|
||||
, stdenv
|
||||
, fetchFromGitHub
|
||||
, bison
|
||||
# boost derivation to use for the src and version.
|
||||
# This is used by the boost derivation to build
|
||||
# a b2 matching their version (by overriding this
|
||||
# argument). Infinite recursion is not an issue
|
||||
# since we only look at src and version of boost.
|
||||
, useBoost ? {}
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "boost-build";
|
||||
version = "4.4.1";
|
||||
let
|
||||
defaultVersion = "4.4.1";
|
||||
in
|
||||
|
||||
src = fetchFromGitHub {
|
||||
stdenv.mkDerivation {
|
||||
pname = "boost-build";
|
||||
version =
|
||||
if useBoost ? version
|
||||
then "boost-${useBoost.version}"
|
||||
else defaultVersion;
|
||||
|
||||
src = useBoost.src or (fetchFromGitHub {
|
||||
owner = "boostorg";
|
||||
repo = "build";
|
||||
rev = version;
|
||||
rev = defaultVersion;
|
||||
sha256 = "1r4rwlq87ydmsdqrik4ly5iai796qalvw7603mridg2nwcbbnf54";
|
||||
};
|
||||
});
|
||||
|
||||
# b2 is in a subdirectory of boost source tarballs
|
||||
postUnpack = lib.optionalString (useBoost ? src) ''
|
||||
sourceRoot="$sourceRoot/tools/build"
|
||||
'';
|
||||
|
||||
patches = [
|
||||
# Upstream defaults to gcc on darwin, but we use clang.
|
||||
@@ -32,8 +50,13 @@ stdenv.mkDerivation rec {
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
./b2 install --prefix="$out"
|
||||
ln -s b2 "$out/bin/bjam"
|
||||
|
||||
# older versions of b2 created this symlink,
|
||||
# which we want to support building via useBoost.
|
||||
test -e "$out/bin/bjam" || ln -s b2 "$out/bin/bjam"
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
|
||||
|
||||
@@ -14891,22 +14891,25 @@ with pkgs;
|
||||
|
||||
boolstuff = callPackage ../development/libraries/boolstuff { };
|
||||
|
||||
boost155 = callPackage ../development/libraries/boost/1.55.nix { };
|
||||
boost159 = callPackage ../development/libraries/boost/1.59.nix { };
|
||||
inherit (callPackage ../development/libraries/boost { inherit (buildPackages) boost-build; })
|
||||
boost155
|
||||
boost159
|
||||
boost160
|
||||
boost165
|
||||
boost166
|
||||
boost167
|
||||
boost168
|
||||
boost169
|
||||
boost170
|
||||
boost171
|
||||
boost172
|
||||
boost173
|
||||
boost174
|
||||
boost175
|
||||
;
|
||||
|
||||
boost15x = boost159;
|
||||
boost160 = callPackage ../development/libraries/boost/1.60.nix { };
|
||||
boost165 = callPackage ../development/libraries/boost/1.65.nix { };
|
||||
boost166 = callPackage ../development/libraries/boost/1.66.nix { };
|
||||
boost167 = callPackage ../development/libraries/boost/1.67.nix { };
|
||||
boost168 = callPackage ../development/libraries/boost/1.68.nix { };
|
||||
boost169 = callPackage ../development/libraries/boost/1.69.nix { };
|
||||
boost16x = boost169;
|
||||
boost170 = callPackage ../development/libraries/boost/1.70.nix { };
|
||||
boost171 = callPackage ../development/libraries/boost/1.71.nix { };
|
||||
boost172 = callPackage ../development/libraries/boost/1.72.nix { };
|
||||
boost173 = callPackage ../development/libraries/boost/1.73.nix { };
|
||||
boost174 = callPackage ../development/libraries/boost/1.74.nix { };
|
||||
boost175 = callPackage ../development/libraries/boost/1.75.nix { };
|
||||
boost17x = boost175;
|
||||
boost = boost16x;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user