Merge pull request #25232 from obsidiansystems/cross-binutils

Cross binutils
This commit is contained in:
John Ericson 2017-05-17 16:34:56 -04:00 committed by GitHub
commit bec5ffee15
13 changed files with 119 additions and 71 deletions

View file

@ -83,6 +83,9 @@ rec {
solaris = { execFormat = elf; families = { inherit unix; }; };
windows = { execFormat = pe; families = { }; };
} // { # aliases
# TODO(@Ericson2314): Handle these Darwin version suffixes more generally.
darwin10 = kernels.darwin;
darwin14 = kernels.darwin;
win32 = kernels.windows;
};

View file

@ -78,6 +78,9 @@ let version = "4.5.4";
withArch +
withCpu +
withAbi +
# Ensure that -print-prog-name is able to find the correct programs.
" --with-as=${binutils}/bin/${cross.config}-as" +
" --with-ld=${binutils}/bin/${cross.config}-ld" +
(if crossMingw && crossStageStatic then
" --with-headers=${libcCross}/include" +
" --with-gcc" +

View file

@ -143,6 +143,9 @@ let version = "4.8.5";
withFpu +
withFloat +
withMode +
# Ensure that -print-prog-name is able to find the correct programs.
" --with-as=${binutils}/bin/${cross.config}-as" +
" --with-ld=${binutils}/bin/${cross.config}-ld" +
(if crossMingw && crossStageStatic then
" --with-headers=${libcCross}/include" +
" --with-gcc" +
@ -169,10 +172,6 @@ let version = "4.8.5";
(if crossDarwin then " --with-sysroot=${libcCross.out}/share/sysroot"
else " --with-headers=${libcCross.dev}/include") +
# Ensure that -print-prog-name is able to find the correct programs.
(stdenv.lib.optionalString (crossMingw || crossDarwin) (
" --with-as=${binutils}/bin/${cross.config}-as" +
" --with-ld=${binutils}/bin/${cross.config}-ld"
)) +
" --enable-__cxa_atexit" +
" --enable-long-long" +
(if crossMingw then

View file

@ -145,6 +145,9 @@ let version = "4.9.4";
withFpu +
withFloat +
withMode +
# Ensure that -print-prog-name is able to find the correct programs.
" --with-as=${binutils}/bin/${cross.config}-as" +
" --with-ld=${binutils}/bin/${cross.config}-ld" +
(if crossMingw && crossStageStatic then
" --with-headers=${libcCross}/include" +
" --with-gcc" +
@ -169,11 +172,6 @@ let version = "4.9.4";
else
(if crossDarwin then " --with-sysroot=${libcCross.out}/share/sysroot"
else " --with-headers=${libcCross.dev}/include") +
# Ensure that -print-prog-name is able to find the correct programs.
(stdenv.lib.optionalString (crossMingw || crossDarwin) (
" --with-as=${binutils}/bin/${cross.config}-as" +
" --with-ld=${binutils}/bin/${cross.config}-ld"
)) +
" --enable-__cxa_atexit" +
" --enable-long-long" +
(if crossMingw then

View file

@ -149,6 +149,9 @@ let version = "5.4.0";
withFpu +
withFloat +
withMode +
# Ensure that -print-prog-name is able to find the correct programs.
" --with-as=${binutils}/bin/${cross.config}-as" +
" --with-ld=${binutils}/bin/${cross.config}-ld" +
(if crossMingw && crossStageStatic then
" --with-headers=${libcCross}/include" +
" --with-gcc" +
@ -173,11 +176,6 @@ let version = "5.4.0";
else
(if crossDarwin then " --with-sysroot=${getLib libcCross}/share/sysroot"
else " --with-headers=${getDev libcCross}/include") +
# Ensure that -print-prog-name is able to find the correct programs.
(stdenv.lib.optionalString (crossMingw || crossDarwin) (
" --with-as=${binutils}/bin/${cross.config}-as" +
" --with-ld=${binutils}/bin/${cross.config}-ld"
)) +
" --enable-__cxa_atexit" +
" --enable-long-long" +
(if crossMingw then

View file

@ -145,6 +145,9 @@ let version = "6.3.0";
withFpu +
withFloat +
withMode +
# Ensure that -print-prog-name is able to find the correct programs.
" --with-as=${binutils}/bin/${cross.config}-as" +
" --with-ld=${binutils}/bin/${cross.config}-ld" +
(if crossMingw && crossStageStatic then
" --with-headers=${libcCross}/include" +
" --with-gcc" +
@ -169,11 +172,6 @@ let version = "6.3.0";
else
(if crossDarwin then " --with-sysroot=${getLib libcCross}/share/sysroot"
else " --with-headers=${getDev libcCross}/include") +
# Ensure that -print-prog-name is able to find the correct programs.
(stdenv.lib.optionalString (crossMingw || crossDarwin) (
" --with-as=${binutils}/bin/${cross.config}-as" +
" --with-ld=${binutils}/bin/${cross.config}-ld"
)) +
" --enable-__cxa_atexit" +
" --enable-long-long" +
(if crossMingw then

View file

@ -145,6 +145,9 @@ let version = "7-20170409";
withFpu +
withFloat +
withMode +
# Ensure that -print-prog-name is able to find the correct programs.
" --with-as=${binutils}/bin/${cross.config}-as" +
" --with-ld=${binutils}/bin/${cross.config}-ld" +
(if crossMingw && crossStageStatic then
" --with-headers=${libcCross}/include" +
" --with-gcc" +
@ -170,10 +173,6 @@ let version = "7-20170409";
(if crossDarwin then " --with-sysroot=${getLib libcCross}/share/sysroot"
else " --with-headers=${getDev libcCross}/include") +
# Ensure that -print-prog-name is able to find the correct programs.
(stdenv.lib.optionalString (crossMingw || crossDarwin) (
" --with-as=${binutils}/bin/${cross.config}-as" +
" --with-ld=${binutils}/bin/${cross.config}-ld"
)) +
" --enable-__cxa_atexit" +
" --enable-long-long" +
(if crossMingw then

View file

@ -7,7 +7,7 @@ let basename = "binutils-2.28"; in
let inherit (stdenv.lib) optional optionals optionalString; in
stdenv.mkDerivation rec {
name = basename + optionalString (cross != null) "-${cross.config}";
name = optionalString (cross != null) "${cross.config}-" + basename;
src = fetchurl {
url = "mirror://gnu/binutils/${basename}.tar.bz2";
@ -40,6 +40,7 @@ stdenv.mkDerivation rec {
./no-plugins.patch
];
# TODO: all outputs on all platform
outputs = [ "out" ]
++ optional (cross == null && !stdenv.isDarwin) "lib" # problems in Darwin stdenv
++ [ "info" ]
@ -75,7 +76,7 @@ stdenv.mkDerivation rec {
configureFlags =
[ "--enable-shared" "--enable-deterministic-archives" "--disable-werror" ]
++ 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" ]
++ optional (stdenv.system == "i686-linux") "--enable-targets=x86_64-linux-gnu";

View file

@ -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 {
name = "cctools-binutils-darwin";
name = "${prefix}cctools-binutils-darwin";
buildCommand = ''
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:
# - ld: binutils doesn't provide it on darwin
@ -18,11 +32,11 @@ stdenv.mkDerivation {
# - strip: the binutils one seems to break mach-o files
# - lipo: gcc build assumes it exists
# - 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"
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)"
done

View file

@ -1,11 +1,25 @@
{ stdenv, fetchFromGitHub, autoconf, automake, libtool_2
{ stdenv, fetchFromGitHub, makeWrapper, autoconf, automake, libtool_2
, 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
baseParams = rec {
name = "cctools-port-${version}";
name = "${prefix}cctools-port-${version}";
version = "895";
src = fetchFromGitHub {
@ -26,7 +40,14 @@ let
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 = ''
sed -i -e 's/addStandardLibraryDirectories = true/addStandardLibraryDirectories = false/' cctools/ld64/src/ld/Options.cpp
@ -69,33 +90,26 @@ let
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 = {
homepage = "http://www.opensource.apple.com/source/cctools/";
description = "Mac OS X Compiler Tools (cross-platform port)";
license = stdenv.lib.licenses.apsl20;
};
};
in {
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
'';
});
}
in stdenv.mkDerivation baseParams

View file

@ -146,11 +146,11 @@ rec {
build =
pkgs.buildPackages.stdenv.mkDerivation {
pkgs.stdenv.mkDerivation {
name = "stdenv-bootstrap-tools-cross";
crossConfig = pkgs.hostPlatform.config;
buildInputs = [
nativeBuildInputs = [
pkgs.buildPackages.nukeReferences
pkgs.buildPackages.cpio
pkgs.buildPackages.binutils
@ -285,7 +285,7 @@ rec {
allowedReferences = [];
};
dist = pkgs.buildPackages.stdenv.mkDerivation {
dist = pkgs.stdenv.mkDerivation {
name = "stdenv-bootstrap-tools-cross";
buildCommand = ''

View file

@ -6411,7 +6411,10 @@ with pkgs;
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 {
# FHS sys dirs presumably only have stuff for the build platform
@ -11462,17 +11465,13 @@ with pkgs;
darwin = let
apple-source-releases = callPackage ../os-specific/darwin/apple-source-releases { };
in apple-source-releases // rec {
cctools_cross = callPackage (forcedNativePackages.callPackage ../os-specific/darwin/cctools/port.nix {}).cross {
cross = assert targetPlatform != buildPlatform; targetPlatform;
cctools = callPackage ../os-specific/darwin/cctools/port.nix {
inherit libobjc;
stdenv = if stdenv.isDarwin then stdenv else libcxxStdenv;
inherit maloader;
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 {
inherit (apple-source-releases) CF;
inherit osx_private_sdk;

View file

@ -1,5 +1,8 @@
{ # The platforms for which we build Nixpkgs.
supportedSystems ? [ builtins.currentSystem ]
/* This file defines some basic smoke tests for cross compilation.
*/
{ # The platforms *from* which we cross compile.
supportedSystems ? [ "x86_64-linux" "x86_64-darwin" ]
, # Strip most of attributes when evaluating to spare memory usage
scrubJobs ? true
}:
@ -83,6 +86,25 @@ in
guile = nativePlatforms;
};
darwinToAarch64 = let
crossSystem = {
config = "aarch64-apple-darwin14";
arch = "arm64";
libc = "libSystem";
};
in mapTestOnCross crossSystem {
buildPackages.binutils = darwin;
};
darwinToArm = let
crossSystem = {
config = "arm-apple-darwin10";
arch = "armv7-a";
libc = "libSystem";
};
in mapTestOnCross crossSystem {
buildPackages.binutils = darwin;
};
/* Test some cross builds to the Sheevaplug */
crossSheevaplugLinux = let