Merge pull request #25232 from obsidiansystems/cross-binutils
Cross binutils
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user