binutils on darwin: Clean up the rats nest
- No more *Cross duplication for binutils on darwin either. `cctools_cross` is merged into plain `cctools`, so `buildPackages` chains alone are used to disambiguate. - Always use a mashup of cctools and actual GNU Binutils as `binutils`. Previously, this was only done in the native case as nobody had bothered to implement the masher in the cross case. Implemented it basically consisted of extending the wrapper to deal with prefixed binaries.
This commit is contained in:
parent
bfa8f30499
commit
88ea6463a3
@ -40,6 +40,7 @@ stdenv.mkDerivation rec {
|
|||||||
./no-plugins.patch
|
./no-plugins.patch
|
||||||
];
|
];
|
||||||
|
|
||||||
|
# TODO: all outputs on all platform
|
||||||
outputs = [ "out" ]
|
outputs = [ "out" ]
|
||||||
++ optional (cross == null && !stdenv.isDarwin) "lib" # problems in Darwin stdenv
|
++ optional (cross == null && !stdenv.isDarwin) "lib" # problems in Darwin stdenv
|
||||||
++ [ "info" ]
|
++ [ "info" ]
|
||||||
@ -75,7 +76,7 @@ stdenv.mkDerivation rec {
|
|||||||
configureFlags =
|
configureFlags =
|
||||||
[ "--enable-shared" "--enable-deterministic-archives" "--disable-werror" ]
|
[ "--enable-shared" "--enable-deterministic-archives" "--disable-werror" ]
|
||||||
++ optional (stdenv.system == "mips64el-linux") "--enable-fix-loongson2f-nop"
|
++ optional (stdenv.system == "mips64el-linux") "--enable-fix-loongson2f-nop"
|
||||||
++ optional (cross != null) "--target=${cross.config}"
|
++ optional (cross != null) "--target=${cross.config}" # TODO: make this unconditional
|
||||||
++ optionals gold [ "--enable-gold" "--enable-plugins" ]
|
++ optionals gold [ "--enable-gold" "--enable-plugins" ]
|
||||||
++ optional (stdenv.system == "i686-linux") "--enable-targets=x86_64-linux-gnu";
|
++ optional (stdenv.system == "i686-linux") "--enable-targets=x86_64-linux-gnu";
|
||||||
|
|
||||||
|
@ -1,11 +1,25 @@
|
|||||||
{ stdenv, binutils-raw, cctools }:
|
{ stdenv, binutils-raw, cctools
|
||||||
|
, hostPlatform, targetPlatform
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
prefix = stdenv.lib.optionalString
|
||||||
|
(targetPlatform != hostPlatform)
|
||||||
|
"${targetPlatform.config}-";
|
||||||
|
|
||||||
|
cmds = [
|
||||||
|
"ar" "ranlib" "as" "dsymutil" "install_name_tool"
|
||||||
|
"ld" "strip" "otool" "lipo" "nm" "strings" "size"
|
||||||
|
];
|
||||||
|
in
|
||||||
|
|
||||||
|
# TODO loop over prefixed binaries too
|
||||||
stdenv.mkDerivation {
|
stdenv.mkDerivation {
|
||||||
name = "cctools-binutils-darwin";
|
name = "cctools-binutils-darwin";
|
||||||
buildCommand = ''
|
buildCommand = ''
|
||||||
mkdir -p $out/bin $out/include
|
mkdir -p $out/bin $out/include
|
||||||
|
|
||||||
ln -s ${binutils-raw.out}/bin/c++filt $out/bin/c++filt
|
ln -s ${binutils-raw.out}/bin/${prefix}c++filt $out/bin/${prefix}c++filt
|
||||||
|
|
||||||
# We specifically need:
|
# We specifically need:
|
||||||
# - ld: binutils doesn't provide it on darwin
|
# - ld: binutils doesn't provide it on darwin
|
||||||
@ -18,11 +32,11 @@ stdenv.mkDerivation {
|
|||||||
# - strip: the binutils one seems to break mach-o files
|
# - strip: the binutils one seems to break mach-o files
|
||||||
# - lipo: gcc build assumes it exists
|
# - lipo: gcc build assumes it exists
|
||||||
# - nm: the gnu one doesn't understand many new load commands
|
# - nm: the gnu one doesn't understand many new load commands
|
||||||
for i in ar ranlib as dsymutil install_name_tool ld strip otool lipo nm strings size; do
|
for i in ${stdenv.lib.concatStringsSep " " (builtins.map (e: prefix + e) cmds)}; do
|
||||||
ln -sf "${cctools}/bin/$i" "$out/bin/$i"
|
ln -sf "${cctools}/bin/$i" "$out/bin/$i"
|
||||||
done
|
done
|
||||||
|
|
||||||
for i in ${binutils-raw.dev}/include/*.h; do
|
for i in ${binutils-raw.dev or binutils-raw.out}/include/*.h; do
|
||||||
ln -s "$i" "$out/include/$(basename $i)"
|
ln -s "$i" "$out/include/$(basename $i)"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
@ -1,8 +1,22 @@
|
|||||||
{ stdenv, fetchFromGitHub, autoconf, automake, libtool_2
|
{ stdenv, fetchFromGitHub, makeWrapper, autoconf, automake, libtool_2
|
||||||
, llvm, libcxx, libcxxabi, clang, libuuid
|
, llvm, libcxx, libcxxabi, clang, libuuid
|
||||||
, libobjc ? null
|
, libobjc ? null, maloader ? null, xctoolchain ? null
|
||||||
|
, buildPlatform, hostPlatform, targetPlatform
|
||||||
}:
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (stdenv.lib.systems.parse) isDarwin;
|
||||||
|
|
||||||
|
prefix = stdenv.lib.optionalString
|
||||||
|
(targetPlatform != hostPlatform)
|
||||||
|
"${targetPlatform.config}-";
|
||||||
|
in
|
||||||
|
|
||||||
|
assert isDarwin targetPlatform.parsed;
|
||||||
|
|
||||||
|
# Non-Darwin alternatives
|
||||||
|
assert (!isDarwin hostPlatform.parsed) -> (maloader != null && xctoolchain != null);
|
||||||
|
|
||||||
let
|
let
|
||||||
baseParams = rec {
|
baseParams = rec {
|
||||||
name = "cctools-port-${version}";
|
name = "cctools-port-${version}";
|
||||||
@ -26,7 +40,14 @@ let
|
|||||||
|
|
||||||
enableParallelBuilding = true;
|
enableParallelBuilding = true;
|
||||||
|
|
||||||
configureFlags = stdenv.lib.optionals (!stdenv.isDarwin) [ "CXXFLAGS=-I${libcxx}/include/c++/v1" ];
|
configureFlags = stdenv.lib.optionals (!stdenv.isDarwin) [
|
||||||
|
"CXXFLAGS=-I${libcxx}/include/c++/v1"
|
||||||
|
] ++ stdenv.lib.optionals (targetPlatform != buildPlatform) [
|
||||||
|
# TODO make unconditional next hash break
|
||||||
|
"--build=${buildPlatform.config}"
|
||||||
|
"--host=${hostPlatform.config}"
|
||||||
|
"--target=${targetPlatform.config}"
|
||||||
|
];
|
||||||
|
|
||||||
postPatch = ''
|
postPatch = ''
|
||||||
sed -i -e 's/addStandardLibraryDirectories = true/addStandardLibraryDirectories = false/' cctools/ld64/src/ld/Options.cpp
|
sed -i -e 's/addStandardLibraryDirectories = true/addStandardLibraryDirectories = false/' cctools/ld64/src/ld/Options.cpp
|
||||||
@ -69,33 +90,26 @@ let
|
|||||||
popd
|
popd
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
postInstall =
|
||||||
|
if isDarwin hostPlatform.parsed
|
||||||
|
then ''
|
||||||
|
cat >$out/bin/dsymutil << EOF
|
||||||
|
#!${stdenv.shell}
|
||||||
|
EOF
|
||||||
|
chmod +x $out/bin/dsymutil
|
||||||
|
''
|
||||||
|
else ''
|
||||||
|
for tool in dyldinfo dwarfdump dsymutil; do
|
||||||
|
${makeWrapper}/bin/makeWrapper "${maloader}/bin/ld-mac" "$out/bin/${targetPlatform.config}-$tool" \
|
||||||
|
--add-flags "${xctoolchain}/bin/$tool"
|
||||||
|
ln -s "$out/bin/${targetPlatform.config}-$tool" "$out/bin/$tool"
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
|
||||||
meta = {
|
meta = {
|
||||||
homepage = "http://www.opensource.apple.com/source/cctools/";
|
homepage = "http://www.opensource.apple.com/source/cctools/";
|
||||||
description = "Mac OS X Compiler Tools (cross-platform port)";
|
description = "Mac OS X Compiler Tools (cross-platform port)";
|
||||||
license = stdenv.lib.licenses.apsl20;
|
license = stdenv.lib.licenses.apsl20;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
in {
|
in stdenv.mkDerivation baseParams
|
||||||
native = stdenv.mkDerivation (baseParams // {
|
|
||||||
# A hack for now...
|
|
||||||
postInstall = ''
|
|
||||||
cat >$out/bin/dsymutil << EOF
|
|
||||||
#!${stdenv.shell}
|
|
||||||
EOF
|
|
||||||
chmod +x $out/bin/dsymutil
|
|
||||||
'';
|
|
||||||
});
|
|
||||||
|
|
||||||
cross =
|
|
||||||
{ cross, maloader, makeWrapper, xctoolchain}: stdenv.mkDerivation (baseParams // {
|
|
||||||
configureFlags = baseParams.configureFlags ++ [ "--target=${cross.config}" ];
|
|
||||||
|
|
||||||
postInstall = ''
|
|
||||||
for tool in dyldinfo dwarfdump dsymutil; do
|
|
||||||
${makeWrapper}/bin/makeWrapper "${maloader}/bin/ld-mac" "$out/bin/${cross.config}-$tool" \
|
|
||||||
--add-flags "${xctoolchain}/bin/$tool"
|
|
||||||
ln -s "$out/bin/${cross.config}-$tool" "$out/bin/$tool"
|
|
||||||
done
|
|
||||||
'';
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
@ -6396,7 +6396,10 @@ with pkgs;
|
|||||||
|
|
||||||
bin_replace_string = callPackage ../development/tools/misc/bin_replace_string { };
|
bin_replace_string = callPackage ../development/tools/misc/bin_replace_string { };
|
||||||
|
|
||||||
binutils = if stdenv.isDarwin then darwin.binutils else binutils-raw;
|
binutils =
|
||||||
|
if lib.systems.parse.isDarwin targetPlatform.parsed
|
||||||
|
then darwin.binutils
|
||||||
|
else binutils-raw;
|
||||||
|
|
||||||
binutils-raw = callPackage ../development/tools/misc/binutils {
|
binutils-raw = callPackage ../development/tools/misc/binutils {
|
||||||
# FHS sys dirs presumably only have stuff for the build platform
|
# FHS sys dirs presumably only have stuff for the build platform
|
||||||
@ -11444,17 +11447,13 @@ with pkgs;
|
|||||||
darwin = let
|
darwin = let
|
||||||
apple-source-releases = callPackage ../os-specific/darwin/apple-source-releases { };
|
apple-source-releases = callPackage ../os-specific/darwin/apple-source-releases { };
|
||||||
in apple-source-releases // rec {
|
in apple-source-releases // rec {
|
||||||
cctools_cross = callPackage (forcedNativePackages.callPackage ../os-specific/darwin/cctools/port.nix {}).cross {
|
cctools = callPackage ../os-specific/darwin/cctools/port.nix {
|
||||||
cross = assert targetPlatform != buildPlatform; targetPlatform;
|
inherit libobjc;
|
||||||
|
stdenv = if stdenv.isDarwin then stdenv else libcxxStdenv;
|
||||||
inherit maloader;
|
inherit maloader;
|
||||||
xctoolchain = xcode.toolchain;
|
xctoolchain = xcode.toolchain;
|
||||||
};
|
};
|
||||||
|
|
||||||
cctools = (callPackage ../os-specific/darwin/cctools/port.nix {
|
|
||||||
inherit libobjc;
|
|
||||||
stdenv = if stdenv.isDarwin then stdenv else libcxxStdenv;
|
|
||||||
}).native;
|
|
||||||
|
|
||||||
cf-private = callPackage ../os-specific/darwin/cf-private {
|
cf-private = callPackage ../os-specific/darwin/cf-private {
|
||||||
inherit (apple-source-releases) CF;
|
inherit (apple-source-releases) CF;
|
||||||
inherit osx_private_sdk;
|
inherit osx_private_sdk;
|
||||||
|
Loading…
Reference in New Issue
Block a user