nixpkgs-suyu/pkgs/os-specific/darwin/cctools/port.nix
John Ericson e755a8a27d treewide: Use targetPrefix instead of prefix for platform name prefixes
Certain tools, e.g. compilers, are customarily prefixed with the name of
their target platform so that multiple builds can be used at once
without clobbering each other on the PATH. I was using identifiers named
`prefix` for this purpose, but that conflicts with the standard use of
`prefix` to mean the directory where something is installed. To avoid
conflict and confusion, I renamed those to `targetPrefix`.
2017-11-27 03:15:50 -05:00

125 lines
4 KiB
Nix

{ stdenv, fetchFromGitHub, makeWrapper, autoconf, automake, libtool_2
, llvm, libcxx, libcxxabi, clang, libuuid
, libobjc ? null, maloader ? null, xctoolchain ? null
, hostPlatform, targetPlatform
}:
let
# The targetPrefix prepended to binary names to allow multiple binuntils on the
# PATH to both be usable.
targetPrefix = stdenv.lib.optionalString
(targetPlatform != hostPlatform)
"${targetPlatform.config}-";
in
assert targetPlatform.isDarwin;
# Non-Darwin alternatives
assert (!hostPlatform.isDarwin) -> (maloader != null && xctoolchain != null);
let
baseParams = rec {
name = "${targetPrefix}cctools-port-${version}";
version = "895";
src = fetchFromGitHub {
owner = "tpoechtrager";
repo = "cctools-port";
rev = "2e569d765440b8cd6414a695637617521aa2375b"; # From branch 895-ld64-274.2
sha256 = "0l45mvyags56jfi24rawms8j2ihbc45mq7v13pkrrwppghqrdn52";
};
outputs = [ "out" "dev" ];
nativeBuildInputs = [ autoconf automake libtool_2 ];
buildInputs = [ libuuid ] ++
# Only need llvm and clang if the stdenv isn't already clang-based (TODO: just make a stdenv.cc.isClang)
stdenv.lib.optionals (!stdenv.isDarwin) [ llvm clang ] ++
stdenv.lib.optionals stdenv.isDarwin [ libcxxabi libobjc ];
patches = [
./ld-rpath-nonfinal.patch ./ld-ignore-rpath-link.patch
];
__propagatedImpureHostDeps = [
# As far as I can tell, otool from cctools is the only thing that depends on these two, and we should fix them
"/usr/lib/libobjc.A.dylib"
"/usr/lib/libobjc.dylib"
];
enableParallelBuilding = true;
# TODO(@Ericson2314): Always pass "--target" and always targetPrefix.
configurePlatforms = [ "build" "host" ] ++ stdenv.lib.optional (targetPlatform != hostPlatform) "target";
configureFlags = stdenv.lib.optionals (!stdenv.isDarwin) [
"CXXFLAGS=-I${libcxx}/include/c++/v1"
];
postPatch = ''
sed -i -e 's/addStandardLibraryDirectories = true/addStandardLibraryDirectories = false/' cctools/ld64/src/ld/Options.cpp
# FIXME: there are far more absolute path references that I don't want to fix right now
substituteInPlace cctools/configure.ac \
--replace "-isystem /usr/local/include -isystem /usr/pkg/include" "" \
--replace "-L/usr/local/lib" "" \
substituteInPlace cctools/include/Makefile \
--replace "/bin/" ""
patchShebangs tools
sed -i -e 's/which/type -P/' tools/*.sh
# Workaround for https://www.sourceware.org/bugzilla/show_bug.cgi?id=11157
cat > cctools/include/unistd.h <<EOF
#ifdef __block
# undef __block
# include_next "unistd.h"
# define __block __attribute__((__blocks__(byref)))
#else
# include_next "unistd.h"
#endif
EOF
'' + stdenv.lib.optionalString (!stdenv.isDarwin) ''
sed -i -e 's|clang++|& -I${libcxx}/include/c++/v1|' cctools/autogen.sh
'';
# TODO: this builds an ld without support for LLVM's LTO. We need to teach it, but that's rather
# hairy to handle during bootstrap. Perhaps it could be optional?
preConfigure = ''
cd cctools
sh autogen.sh
'';
preInstall = ''
pushd include
make DSTROOT=$out/include RC_OS=common install
popd
'';
postInstall =
if hostPlatform.isDarwin
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
'';
passthru = {
inherit targetPrefix;
};
meta = {
homepage = http://www.opensource.apple.com/source/cctools/;
description = "MacOS Compiler Tools (cross-platform port)";
license = stdenv.lib.licenses.apsl20;
};
};
in stdenv.mkDerivation baseParams