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; }; }; solaris = { execFormat = elf; families = { inherit unix; }; };
windows = { execFormat = pe; families = { }; }; windows = { execFormat = pe; families = { }; };
} // { # aliases } // { # aliases
# TODO(@Ericson2314): Handle these Darwin version suffixes more generally.
darwin10 = kernels.darwin;
darwin14 = kernels.darwin;
win32 = kernels.windows; win32 = kernels.windows;
}; };

View File

@ -78,6 +78,9 @@ let version = "4.5.4";
withArch + withArch +
withCpu + withCpu +
withAbi + 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 (if crossMingw && crossStageStatic then
" --with-headers=${libcCross}/include" + " --with-headers=${libcCross}/include" +
" --with-gcc" + " --with-gcc" +

View File

@ -143,6 +143,9 @@ let version = "4.8.5";
withFpu + withFpu +
withFloat + withFloat +
withMode + 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 (if crossMingw && crossStageStatic then
" --with-headers=${libcCross}/include" + " --with-headers=${libcCross}/include" +
" --with-gcc" + " --with-gcc" +
@ -169,10 +172,6 @@ let version = "4.8.5";
(if crossDarwin then " --with-sysroot=${libcCross.out}/share/sysroot" (if crossDarwin then " --with-sysroot=${libcCross.out}/share/sysroot"
else " --with-headers=${libcCross.dev}/include") + else " --with-headers=${libcCross.dev}/include") +
# Ensure that -print-prog-name is able to find the correct programs. # 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-__cxa_atexit" +
" --enable-long-long" + " --enable-long-long" +
(if crossMingw then (if crossMingw then

View File

@ -145,6 +145,9 @@ let version = "4.9.4";
withFpu + withFpu +
withFloat + withFloat +
withMode + 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 (if crossMingw && crossStageStatic then
" --with-headers=${libcCross}/include" + " --with-headers=${libcCross}/include" +
" --with-gcc" + " --with-gcc" +
@ -169,11 +172,6 @@ let version = "4.9.4";
else else
(if crossDarwin then " --with-sysroot=${libcCross.out}/share/sysroot" (if crossDarwin then " --with-sysroot=${libcCross.out}/share/sysroot"
else " --with-headers=${libcCross.dev}/include") + 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-__cxa_atexit" +
" --enable-long-long" + " --enable-long-long" +
(if crossMingw then (if crossMingw then

View File

@ -149,6 +149,9 @@ let version = "5.4.0";
withFpu + withFpu +
withFloat + withFloat +
withMode + 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 (if crossMingw && crossStageStatic then
" --with-headers=${libcCross}/include" + " --with-headers=${libcCross}/include" +
" --with-gcc" + " --with-gcc" +
@ -173,11 +176,6 @@ let version = "5.4.0";
else else
(if crossDarwin then " --with-sysroot=${getLib libcCross}/share/sysroot" (if crossDarwin then " --with-sysroot=${getLib libcCross}/share/sysroot"
else " --with-headers=${getDev libcCross}/include") + 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-__cxa_atexit" +
" --enable-long-long" + " --enable-long-long" +
(if crossMingw then (if crossMingw then

View File

@ -145,6 +145,9 @@ let version = "6.3.0";
withFpu + withFpu +
withFloat + withFloat +
withMode + 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 (if crossMingw && crossStageStatic then
" --with-headers=${libcCross}/include" + " --with-headers=${libcCross}/include" +
" --with-gcc" + " --with-gcc" +
@ -169,11 +172,6 @@ let version = "6.3.0";
else else
(if crossDarwin then " --with-sysroot=${getLib libcCross}/share/sysroot" (if crossDarwin then " --with-sysroot=${getLib libcCross}/share/sysroot"
else " --with-headers=${getDev libcCross}/include") + 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-__cxa_atexit" +
" --enable-long-long" + " --enable-long-long" +
(if crossMingw then (if crossMingw then

View File

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

View File

@ -7,7 +7,7 @@ let basename = "binutils-2.28"; in
let inherit (stdenv.lib) optional optionals optionalString; in let inherit (stdenv.lib) optional optionals optionalString; in
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = basename + optionalString (cross != null) "-${cross.config}"; name = optionalString (cross != null) "${cross.config}-" + basename;
src = fetchurl { src = fetchurl {
url = "mirror://gnu/binutils/${basename}.tar.bz2"; url = "mirror://gnu/binutils/${basename}.tar.bz2";
@ -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";

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 { stdenv.mkDerivation {
name = "cctools-binutils-darwin"; name = "${prefix}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

View File

@ -1,11 +1,25 @@
{ 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 = "${prefix}cctools-port-${version}";
version = "895"; version = "895";
src = fetchFromGitHub { src = fetchFromGitHub {
@ -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
'';
});
}

View File

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

View File

@ -6411,7 +6411,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
@ -11462,17 +11465,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;

View File

@ -1,5 +1,8 @@
{ # The platforms for which we build Nixpkgs. /* This file defines some basic smoke tests for cross compilation.
supportedSystems ? [ builtins.currentSystem ] */
{ # The platforms *from* which we cross compile.
supportedSystems ? [ "x86_64-linux" "x86_64-darwin" ]
, # Strip most of attributes when evaluating to spare memory usage , # Strip most of attributes when evaluating to spare memory usage
scrubJobs ? true scrubJobs ? true
}: }:
@ -83,6 +86,25 @@ in
guile = nativePlatforms; 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 */ /* Test some cross builds to the Sheevaplug */
crossSheevaplugLinux = let crossSheevaplugLinux = let