depot/third_party/nixpkgs/pkgs/by-name/li/libtapi/package.nix

185 lines
6.2 KiB
Nix
Raw Normal View History

{
lib,
stdenv,
fetchFromGitHub,
fetchpatch,
cmake,
ninja,
python3,
zlib,
}:
let
# libtapi is only supported building against Apples LLVM fork pinned to a specific revision.
# It cant be built against upstream LLVM because it uses APIs that are specific to Apples fork.
# See: https://github.com/apple-oss-distributions/tapi/blob/main/Readme.md
# Apples LLVM fork uses its own versioning scheme.
# See: https://en.wikipedia.org/wiki/Xcode#Toolchain_versions
# Note: Cant use a sparse checkout because the Darwin stdenv bootstrap cant depend on fetchgit.
appleLlvm = {
version = "15.0.0"; # As reported by upstreams `tapi --version`.
rev = "2b5ff47e44b059c03de5779479d01a133ab4d581"; # Per the TAPI repo.
hash = "sha256-X37zBbpSEWmqtdTXsd1t++gp+0ggA8YtB73fGKNaiR0=";
};
in
stdenv.mkDerivation (finalAttrs: {
pname = "libtapi";
version = "1500.0.12.3";
outputs = [
"out"
"bin"
"dev"
];
srcs = [
(fetchFromGitHub {
name = "tapi-src";
owner = "apple-oss-distributions";
repo = "tapi";
rev = "tapi-${finalAttrs.version}";
hash = "sha256-YeaA2OeSY1fXYJHPJJ0TrVC1brspSvutBtPMPGX6Y1o=";
})
# libtapi cant avoid pulling the whole repo even though it needs only a couple of folders because
# `fetchgit` cant be used in the Darwin bootstrap.
(fetchFromGitHub {
name = "apple-llvm-src";
owner = "apple";
repo = "llvm-project";
inherit (appleLlvm) rev hash;
})
];
patches = [
# Older versions of ld64 may not support `-no_exported_symbols`, so use it only
# when the linker supports it.
# Note: This can be dropped once the bootstrap tools are updated after the ld64 update.
./0001-Check-for-no_exported_symbols-linker-support.patch
# The recommended upstream revision of Apples LLVM fork needs this patch, or
# `tapi stubify` will crash when generating stubs.
(fetchpatch {
url = "https://github.com/apple/llvm-project/commit/455bf3d1ccd6a52df5e38103532c1b8f49924edc.patch";
hash = "sha256-ujZcfdAls20JPIvjvO2Xv8st8cNTY/XTEQusICKBKSA";
})
# Updates `JSONReaderWriter` to work with the API change in the above patch.
./0002-Pass-fileType-to-writeToStream.patch
# Fix build on Linux. GCC is more picky than clang about the field order.
./0003-Match-designator-order-with-declaration-order.patch
];
postPatch =
''
# Enable building on non-Darwin platforms
substituteInPlace tapi/CMakeLists.txt \
--replace-fail 'message(FATAL_ERROR "Unsupported configuration.")' ""
# Remove the client limitation on linking to libtapi.dylib.
substituteInPlace tapi/tools/libtapi/CMakeLists.txt \
--replace-fail '-allowable_client ld' ""
# Replace hard-coded installation paths with standard ones.
declare -A installdirs=(
[bin]=BINDIR
[include]=INCLUDEDIR
[lib]=LIBDIR
[local/bin]=BINDIR
[local/share/man]=MANDIR
[share/man]=MANDIR
)
for dir in "''${!installdirs[@]}"; do
cmakevar=CMAKE_INSTALL_''${installdirs[$dir]}
for cmakelist in $(grep -rl "DESTINATION $dir" tapi); do
substituteInPlace "$cmakelist" \
--replace-fail "DESTINATION $dir" "DESTINATION \''${$cmakevar}"
done
done
# Doesnt seem to exist publically.
substituteInPlace tapi/test/CMakeLists.txt \
--replace-fail tapi-configs ""
''
+ lib.optionalString stdenv.hostPlatform.isLinux ''
# Remove Darwin-specific versioning flags.
substituteInPlace tapi/tools/libtapi/CMakeLists.txt \
--replace-fail '-current_version ''${DYLIB_VERSION} -compatibility_version 1' ""
'';
preUnpack = ''
mkdir source
'';
sourceRoot = "source";
postUnpack = ''
chmod -R u+w apple-llvm-src tapi-src
mv apple-llvm-src/{clang,cmake,llvm,utils} source
mv tapi-src source/tapi
'';
strictDeps = true;
buildInputs = [ zlib ]; # Upstream links against zlib in their distribution.
nativeBuildInputs = [
cmake
ninja
python3
];
cmakeDir = "../llvm";
cmakeFlags = [
(lib.cmakeFeature "LLVM_ENABLE_PROJECTS" "clang;tapi")
(lib.cmakeFeature "LLVM_EXTERNAL_PROJECTS" "tapi")
(lib.cmakeBool "TAPI_INCLUDE_DOCS" true)
# Matches the version string format reported by upstream `tapi`.
(lib.cmakeFeature "TAPI_REPOSITORY_STRING" "tapi-${finalAttrs.version}")
(lib.cmakeFeature "TAPI_FULL_VERSION" appleLlvm.version)
# Match the versioning used by Apples LLVM fork (primarily used for .so versioning).
(lib.cmakeFeature "LLVM_VERSION_MAJOR" (lib.versions.major appleLlvm.version))
(lib.cmakeFeature "LLVM_VERSION_MINOR" (lib.versions.minor appleLlvm.version))
(lib.cmakeFeature "LLVM_VERSION_PATCH" (lib.versions.patch appleLlvm.version))
(lib.cmakeFeature "LLVM_VERSION_SUFFIX" "")
# Upstream `tapi` does not link against ncurses. Disable it explicitly to make sure
# it is not detected incorrectly from the bootstrap tools tarball.
(lib.cmakeBool "LLVM_ENABLE_TERMINFO" false)
# Disabling the benchmarks avoids a failure during the configure phase because
# the sparse checkout does not include the benchmarks.
(lib.cmakeBool "LLVM_INCLUDE_BENCHMARKS" false)
# tapis tests expect to target macOS 13.0 and build both x86_64 and universal
# binaries regardless of the host platform.
(lib.cmakeBool "LLVM_INCLUDE_TESTS" false)
(lib.cmakeBool "TAPI_INCLUDE_TESTS" false)
];
ninjaFlags = [
"libtapi"
"tapi-sdkdb"
"tapi"
];
installTargets = [
"install-libtapi"
"install-tapi-docs"
"install-tapi-headers"
"install-tapi-sdkdb"
"install-tapi"
];
postInstall = ''
# The man page is installed for these, but theyre not included in the source release.
rm $bin/share/man/man1/tapi-analyze.1 $bin/share/man/man1/tapi-api-verify.1
'';
meta = {
description = "Replaces the Mach-O Dynamic Library Stub files in Apple's SDKs to reduce the size";
homepage = "https://github.com/apple-oss-distributions/tapi/";
license = lib.licenses.ncsa;
mainProgram = "tapi";
maintainers = with lib.maintainers; [
matthewbauer
reckenrode
];
platforms = lib.platforms.unix;
};
})