Merge pull request #240433 from reckenrode/darwin-stdenv-rework

darwin.stdenv: Darwin stdenv rework
This commit is contained in:
Weijia Wang 2023-07-05 13:03:24 +03:00 committed by GitHub
commit f0a11a54be
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 1507 additions and 648 deletions

View file

@ -0,0 +1,11 @@
--- a/CoreFoundation/RunLoop.subproj/CFMessagePort.c 1969-12-31 19:00:01.000000000 -0500
+++ b/CoreFoundation/RunLoop.subproj/CFMessagePort.c 2023-06-09 20:25:28.599209755 -0400
@@ -28,6 +28,8 @@
#endif
#endif
+#include <bootstrap.h>
+
extern pid_t getpid(void);
#define __kCFMessagePortMaxNameLengthMax 255

View file

@ -0,0 +1,25 @@
diff -u a/CoreFoundation/URL.subproj/CFURLComponents.c b/CoreFoundation/URL.subproj/CFURLComponents.c
--- a/CoreFoundation/URL.subproj/CFURLComponents.c 1969-12-31 19:00:01.000000000 -0500
+++ b/CoreFoundation/URL.subproj/CFURLComponents.c 2023-06-09 20:36:52.995514573 -0400
@@ -66,7 +66,8 @@
return CFRetain(CFSTR("A really nice CFURLComponents object"));
}
-CF_CROSS_PLATFORM_EXPORT void __CFURLComponentsDeallocate(CFURLComponentsRef instance) {
+CF_CROSS_PLATFORM_EXPORT void __CFURLComponentsDeallocate(CFTypeRef cf) {
+ CFURLComponentsRef instance = (CFURLComponentsRef)cf;
__CFGenericValidateType(instance, _CFURLComponentsGetTypeID());
if (instance->_urlString) CFRelease(instance->_urlString);
diff -u a/CoreFoundation/URL.subproj/CFURLComponents.h b/CoreFoundation/URL.subproj/CFURLComponents.h
--- a/CoreFoundation/URL.subproj/CFURLComponents.h 1969-12-31 19:00:01.000000000 -0500
+++ b/CoreFoundation/URL.subproj/CFURLComponents.h 2023-06-09 20:39:36.967857713 -0400
@@ -38,7 +38,7 @@
CF_EXPORT CFTypeID _CFURLComponentsGetTypeID(void);
-CF_CROSS_PLATFORM_EXPORT void __CFURLComponentsDeallocate(CFURLComponentsRef);
+CF_CROSS_PLATFORM_EXPORT void __CFURLComponentsDeallocate(CFTypeRef);
// URLComponents are always mutable.
CF_EXPORT _Nullable CFURLComponentsRef _CFURLComponentsCreate(CFAllocatorRef alloc);

View file

@ -0,0 +1,66 @@
--- a/CoreFoundation/CMakeLists.txt 1969-12-31 19:00:01.000000000 -0500
+++ b/CoreFoundation/CMakeLists.txt 2023-06-29 18:52:49.096019700 -0400
@@ -129,7 +129,7 @@
Base.subproj/CFByteOrder.h
Base.subproj/CFUUID.h
Base.subproj/CFUtilities.h
- Base.subproj/SwiftRuntime/CoreFoundation.h
+ Base.subproj/CoreFoundation.h # The SwiftRuntime version of this file causes linker errors and is not correct for standalone CF.
Base.subproj/SwiftRuntime/TargetConditionals.h
# Collections
Collections.subproj/CFArray.h
@@ -245,6 +245,8 @@
# RunLoop
RunLoop.subproj/CFRunLoop.c
RunLoop.subproj/CFSocket.c
+ RunLoop.subproj/CFMachPort.c # These files are missing from the upstream `CMakeLists.txt` but required to build on Darwin.
+ RunLoop.subproj/CFMessagePort.c
# Stream
Stream.subproj/CFConcreteStreams.c
Stream.subproj/CFSocketStream.c
@@ -336,6 +338,11 @@
target_include_directories(CoreFoundation
PRIVATE
${CURL_INCLUDE_DIRS})
+elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
+ find_package(CURL REQUIRED)
+ target_include_directories(CoreFoundation PRIVATE ${CURL_INCLUDE_DIRS})
+ find_package(LibXml2 REQUIRED)
+ target_include_directories(CoreFoundation PRIVATE ${LIBXML2_INCLUDE_DIR})
else()
target_include_directories(CoreFoundation
PRIVATE
@@ -365,6 +372,10 @@
PRIVATE
${CURL_LIBRARIES}
${LIBXML2_LIBRARIES})
+elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
+ target_link_libraries(CoreFoundation PRIVATE
+ ${CURL_LIBRARIES}
+ ${LIBXML2_LIBRARIES})
else()
target_link_libraries(CoreFoundation
PRIVATE
@@ -398,9 +400,19 @@
target_link_libraries(CoreFoundation
PRIVATE
icucore)
- set_target_properties(CoreFoundation
- PROPERTIES LINK_FLAGS
- -Xlinker;-alias_list;-Xlinker;Base.subproj/DarwinSymbolAliases;-twolevel_namespace;-sectcreate;__UNICODE;__csbitmaps;CharacterSets/CFCharacterSetBitmaps.bitmap;-sectcreate;__UNICODE;__properties;CharacterSets/CFUniCharPropertyDatabase.data;-sectcreate;__UNICODE;__data;CharacterSets/CFUnicodeData-L.mapping;-segprot;__UNICODE;r;r)
+ target_link_options(CoreFoundation
+ PUBLIC
+ "LINKER:-alias_list,../Base.subproj/DarwinSymbolAliases"
+ "LINKER:-twolevel_namespace"
+ "LINKER:-sectcreate,__UNICODE,__csbitmaps,../CharacterSets/CFCharacterSetBitmaps.bitmap"
+ "LINKER:-sectcreate,__UNICODE,__properties,../CharacterSets/CFUniCharPropertyDatabase.data"
+ "LINKER:-sectcreate,__UNICODE,__data,../CharacterSets/CFUnicodeData-L.mapping"
+ "LINKER:-segprot,__UNICODE,r,r"
+ "LINKER:-current_version,1454.90.0"
+ "LINKER:-compatibility_version,150.0.0"
+ "LINKER:-init,___CFInitialize")
+ set(CMAKE_SHARED_LIBRARY_PREFIX "")
+ set(CMAKE_SHARED_LIBRARY_SUFFIX "")
endif()
install(TARGETS

View file

@ -0,0 +1,23 @@
diff -u aa/CoreFoundation/CMakeLists.txt b/CoreFoundation/CMakeLists.txt
--- a/CoreFoundation/CMakeLists.txt 1969-12-31 19:00:01.000000000 -0500
+++ b/CoreFoundation/CMakeLists.txt 2023-06-29 18:59:19.492601179 -0400
@@ -424,16 +424,11 @@
set(CMAKE_SHARED_LIBRARY_SUFFIX "")
endif()
-install(TARGETS
- CoreFoundation
- DESTINATION
- "${CMAKE_INSTALL_FULL_LIBDIR}")
install(DIRECTORY
${CoreFoundation_FRAMEWORK_DIRECTORY}
DESTINATION
- ${CMAKE_INSTALL_PREFIX}/System/Library/Frameworks
- USE_SOURCE_PERMISSIONS
- PATTERN PrivateHeaders EXCLUDE)
+ ${CMAKE_INSTALL_PREFIX}/Library/Frameworks
+ USE_SOURCE_PERMISSIONS)
# TODO(compnerd) formalize this

View file

@ -0,0 +1,84 @@
diff -u a/CoreFoundation/CMakeLists.txt b/CoreFoundation/CMakeLists.txt
--- a/CoreFoundation/CMakeLists.txt 1969-12-31 19:00:01.000000000 -0500
+++ b/CoreFoundation/CMakeLists.txt 2023-06-29 18:59:08.659632504 -0400
@@ -1,5 +1,5 @@
-cmake_minimum_required(VERSION 3.4.3)
+cmake_minimum_required(VERSION 3.14)
list(APPEND CMAKE_MODULE_PATH
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")
@@ -45,6 +45,8 @@
${FRAMEWORK_LIBRARY_TYPE}
FRAMEWORK_DIRECTORY
CoreFoundation_FRAMEWORK_DIRECTORY
+ VERSION
+ A
MODULE_MAP
Base.subproj/module.modulemap
PRIVATE_HEADERS
diff -u a/CoreFoundation/cmake/modules/CoreFoundationAddFramework.cmake b/CoreFoundation/cmake/modules/CoreFoundationAddFramework.cmake
--- a/CoreFoundation/cmake/modules/CoreFoundationAddFramework.cmake 1969-12-31 19:00:01.000000000 -0500
+++ b/CoreFoundation/cmake/modules/CoreFoundationAddFramework.cmake 2023-06-29 18:57:55.792860996 -0400
@@ -3,7 +3,7 @@
function(add_framework NAME)
set(options STATIC SHARED)
- set(single_value_args MODULE_MAP FRAMEWORK_DIRECTORY)
+ set(single_value_args MODULE_MAP FRAMEWORK_DIRECTORY VERSION)
set(multiple_value_args PRIVATE_HEADERS PUBLIC_HEADERS SOURCES)
cmake_parse_arguments(AF "${options}" "${single_value_args}" "${multiple_value_args}" ${ARGN})
@@ -14,26 +14,32 @@
set(AF_TYPE SHARED)
endif()
+ file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/${NAME}.framework/Versions/${AF_VERSION})
+ file(CREATE_LINK ${AF_VERSION} ${CMAKE_BINARY_DIR}/${NAME}.framework/Versions/Current SYMBOLIC)
+
if(AF_MODULE_MAP)
file(COPY
${AF_MODULE_MAP}
DESTINATION
- ${CMAKE_BINARY_DIR}/${NAME}.framework/Modules
+ ${CMAKE_BINARY_DIR}/${NAME}.framework/Versions/Current/Modules
NO_SOURCE_PERMISSIONS)
+ file(CREATE_LINK Versions/Current/Modules ${CMAKE_BINARY_DIR}/${NAME}.framework/Modules SYMBOLIC)
endif()
if(AF_PUBLIC_HEADERS)
file(COPY
${AF_PUBLIC_HEADERS}
DESTINATION
- ${CMAKE_BINARY_DIR}/${NAME}.framework/Headers
+ ${CMAKE_BINARY_DIR}/${NAME}.framework/Versions/Current/Headers
NO_SOURCE_PERMISSIONS)
+ file(CREATE_LINK Versions/Current/Headers ${CMAKE_BINARY_DIR}/${NAME}.framework/Headers SYMBOLIC)
endif()
if(AF_PRIVATE_HEADERS)
file(COPY
${AF_PRIVATE_HEADERS}
DESTINATION
- ${CMAKE_BINARY_DIR}/${NAME}.framework/PrivateHeaders
+ ${CMAKE_BINARY_DIR}/${NAME}.framework/Versions/Current/PrivateHeaders
NO_SOURCE_PERMISSIONS)
+ file(CREATE_LINK Versions/Current/PrivateHeaders ${CMAKE_BINARY_DIR}/${NAME}.framework/PrivateHeaders SYMBOLIC)
endif()
add_custom_target(${NAME}_POPULATE_HEADERS
DEPENDS
@@ -51,13 +57,15 @@
set_target_properties(${NAME}
PROPERTIES
LIBRARY_OUTPUT_DIRECTORY
- ${CMAKE_BINARY_DIR}/${NAME}.framework)
+ ${CMAKE_BINARY_DIR}/${NAME}.framework/Versions/Current)
target_compile_options(${NAME}
PRIVATE
-F;${CMAKE_BINARY_DIR}
-I;${CMAKE_BINARY_DIR}/${NAME}.framework/PrivateHeaders)
add_dependencies(${NAME} ${NAME}_POPULATE_HEADERS)
+ file(CREATE_LINK Versions/Current/${NAME} ${CMAKE_BINARY_DIR}/${NAME}.framework/${NAME} SYMBOLIC)
+
if(AF_FRAMEWORK_DIRECTORY)
set(${AF_FRAMEWORK_DIRECTORY} ${CMAKE_BINARY_DIR}/${NAME}.framework PARENT_SCOPE)
endif()

View file

@ -0,0 +1,31 @@
diff -ur d/CoreFoundation/CMakeLists.txt e/CoreFoundation/CMakeLists.txt
--- d/CoreFoundation/CMakeLists.txt 1969-12-31 19:00:01.000000000 -0500
+++ e/CoreFoundation/CMakeLists.txt 2023-06-29 19:13:15.561253229 -0400
@@ -343,6 +343,7 @@
elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
find_package(CURL REQUIRED)
target_include_directories(CoreFoundation PRIVATE ${CURL_INCLUDE_DIRS})
+ find_package(ICU COMPONENTS uc i18n data REQUIRED)
find_package(LibXml2 REQUIRED)
target_include_directories(CoreFoundation PRIVATE ${LIBXML2_INCLUDE_DIR})
else()
@@ -377,6 +378,9 @@
elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
target_link_libraries(CoreFoundation PRIVATE
${CURL_LIBRARIES}
+ ICU::uc
+ ICU::i18n
+ ICU::data
${LIBXML2_LIBRARIES})
else()
target_link_libraries(CoreFoundation
@@ -408,9 +412,6 @@
PROPERTIES LINK_FLAGS
-Xlinker;@${CMAKE_SOURCE_DIR}/linux.ld;-Bsymbolic)
elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
- target_link_libraries(CoreFoundation
- PRIVATE
- icucore)
target_link_options(CoreFoundation
PUBLIC
"LINKER:-alias_list,../Base.subproj/DarwinSymbolAliases"

View file

@ -0,0 +1,46 @@
diff -u a/CoreFoundation/CMakeLists.txt b/CoreFoundation/CMakeLists.txt
--- a/CoreFoundation/CMakeLists.txt 1969-12-31 19:00:01.000000000 -0500
+++ b/CoreFoundation/CMakeLists.txt 2023-06-29 19:39:30.074449222 -0400
@@ -104,7 +104,6 @@
# URL
URL.subproj/CFURL.inc.h
URL.subproj/CFURLPriv.h
- URL.subproj/CFURLSessionInterface.h
PUBLIC_HEADERS
# FIXME: PrivateHeaders referenced by public headers
Base.subproj/CFKnownLocations.h
@@ -120,7 +119,6 @@
String.subproj/CFRegularExpression.h
String.subproj/CFRunArray.h
URL.subproj/CFURLPriv.h
- URL.subproj/CFURLSessionInterface.h
# AppServices
AppServices.subproj/CFNotificationCenter.h
@@ -280,8 +278,7 @@
URL.subproj/CFURL.c
URL.subproj/CFURLAccess.c
URL.subproj/CFURLComponents.c
- URL.subproj/CFURLComponents_URIParser.c
- URL.subproj/CFURLSessionInterface.c)
+ URL.subproj/CFURLComponents_URIParser.c)
if(CMAKE_SYSTEM_NAME STREQUAL Linux OR CMAKE_SYSTEM_NAME STREQUAL Android)
target_compile_definitions(CoreFoundation
PRIVATE
@@ -341,8 +338,6 @@
PRIVATE
${CURL_INCLUDE_DIRS})
elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
- find_package(CURL REQUIRED)
- target_include_directories(CoreFoundation PRIVATE ${CURL_INCLUDE_DIRS})
find_package(ICU COMPONENTS uc i18n data REQUIRED)
find_package(LibXml2 REQUIRED)
target_include_directories(CoreFoundation PRIVATE ${LIBXML2_INCLUDE_DIR})
@@ -377,7 +372,6 @@
${LIBXML2_LIBRARIES})
elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
target_link_libraries(CoreFoundation PRIVATE
- ${CURL_LIBRARIES}
ICU::uc
ICU::i18n
ICU::data

View file

@ -1,4 +1,4 @@
{ lib, stdenv, fetchFromGitHub, fetchurl, makeSetupHook, ninja, python3, curl, libxml2, objc4, ICU }:
{ lib, stdenv, fetchFromGitHub, fetchurl, makeSetupHook, cmake, ninja, pkg-config, launchd, libdispatch, python3, libxml2, objc4, icu }:
let
# 10.12 adds a new sysdir.h that our version of CF in the main derivation depends on, but
@ -21,29 +21,39 @@ stdenv.mkDerivation {
sha256 = "17kpql0f27xxz4jjw84vpas5f5sn4vdqwv10g151rc3rswbwln1z";
};
nativeBuildInputs = [ ninja python3 ];
buildInputs = [ curl libxml2 objc4 ICU ];
nativeBuildInputs = [ cmake ninja pkg-config python3 ];
buildInputs = [ (lib.getDev launchd) libdispatch libxml2 objc4 icu ];
patches = [ ./0001-Add-missing-TARGET_OS_-defines.patch ];
patches = [
./0001-Add-missing-TARGET_OS_-defines.patch
# CFMessagePort.h uses `bootstrap_check_in` without declaring it, which is defined in the launchd headers.
./0002-Add-missing-launchd-header.patch
# CFURLComponents fails to build with clang 16 due to an invalid pointer conversion. This is fixed upstream.
./0003-Fix-incompatible-pointer-conversion.patch
# Fix `CMakeLists.txt` to allow it to be used instead of `build.py` to build on Darwin.
./0004-Fix-Darwin-cmake-build.patch
# Install CF framework in `$out/Library/Frameworks` instead of `$out/System/Frameworks`.
./0005-Fix-framework-installation-path.patch
# Build a framework that matches the contents of the system CoreFoundation. This patch adds
# versioning and drops the prefix and suffix, so the dynamic library is named `CoreFoundation`
# instead of `libCoreFoundation.dylib`.
./0006-System-CF-framework-compatibility.patch
# Link against the nixpkgs ICU instead of using Apples vendored version.
./0007-Use-nixpkgs-icu.patch
# Dont link against libcurl. This breaks a cycle between CF and curl, which depends on CF and
# uses the SystemConfiguration framework to support NAT64.
# This is safe because the symbols provided in CFURLSessionInterface are not provided by the
# system CoreFoundation. They are meant to be used by the implementation of `NSURLSession` in
# swift-corelibs-foundation, which is not built because it is not fully compatible with the
# system Foundation used on Darwin.
./0008-Dont-link-libcurl.patch
];
postPatch = ''
cd CoreFoundation
cp ${sysdir-free-system-directories} Base.subproj/CFSystemDirectories.c
# In order, since I can't comment individual lines:
# 1. Disable dispatch support for now
# 2. For the linker too
# 3. Use the legit CoreFoundation.h, not the one telling you not to use it because of Swift
substituteInPlace build.py \
--replace "cf.CFLAGS += '-DDEPLOYMENT" '#' \
--replace "cf.LDFLAGS += '-ldispatch" '#'
# Fix sandbox impurities.
substituteInPlace ../lib/script.py \
--replace '/bin/cp' cp
patchShebangs --build ../configure
# Includes xpc for some initialization routine that they don't define anyway, so no harm here
substituteInPlace PlugIn.subproj/CFBundlePriv.h \
--replace '#if (TARGET_OS_MAC' '#if (0'
@ -55,55 +65,27 @@ stdenv.mkDerivation {
# The MIN macro doesn't seem to be defined sensibly for us. Not sure if our stdenv or their bug
substituteInPlace Base.subproj/CoreFoundation_Prefix.h \
--replace '#if DEPLOYMENT_TARGET_WINDOWS || DEPLOYMENT_TARGET_LINUX' '#if 1'
# Somehow our ICU doesn't have this, probably because it's too old (we'll update it soon when we update the rest of the SDK)
substituteInPlace Locale.subproj/CFLocale.c \
--replace '#if U_ICU_VERSION_MAJOR_NUM' '#if 0 //'
'';
BUILD_DIR = "./Build";
CFLAGS = "-DINCLUDE_OBJC -I${libxml2.dev}/include/libxml2"; # They seem to assume we include objc in some places and not in others, make a PR; also not sure why but libxml2 include path isn't getting picked up from buildInputs
env.NIX_CFLAGS_COMPILE = toString [
# Silence warnings regarding other targets
"-Wno-error=undef-prefix"
# Avoid redefinitions when including objc headers
"-DINCLUDE_OBJC=1"
];
# I'm guessing at the version here. https://github.com/apple/swift-corelibs-foundation/commit/df3ec55fe6c162d590a7653d89ad669c2b9716b1 imported "high sierra"
# and this version is a version from there. No idea how accurate it is.
LDFLAGS = "-current_version 1454.90.0 -compatibility_version 150.0.0 -init ___CFInitialize";
configurePhase = ''
../configure release --sysroot UNUSED
'';
cmakeFlags = [
"-DBUILD_SHARED_LIBS=ON"
"-DCF_ENABLE_LIBDISPATCH=OFF"
];
enableParallelBuilding = true;
buildPhase = ''
runHook preBuild
postInstall = ''
install_name_tool -id '@rpath/CoreFoundation.framework/Versions/A/CoreFoundation' \
"$out/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation"
ninja -j $NIX_BUILD_CORES
runHook postBuild
mkdir -p "$out/nix-support"
substituteAll ${./pure-corefoundation-hook.sh} "$out/nix-support/setup-hook"
'';
# TODO: their build system sorta kinda can do this, but it doesn't seem to work right now
# Also, this includes a bunch of private headers in the framework, which is not what we want
installPhase = ''
base="$out/Library/Frameworks/CoreFoundation.framework"
mkdir -p $base/Versions/A/{Headers,PrivateHeaders,Modules}
cp ./Build/CoreFoundation/libCoreFoundation.dylib $base/Versions/A/CoreFoundation
# Note that this could easily live in the ldflags above as `-install_name @rpath/...` but
# https://github.com/NixOS/nixpkgs/issues/46434 thwarts that, so for now I'm hacking it up
# after the fact.
install_name_tool -id '@rpath/CoreFoundation.framework/Versions/A/CoreFoundation' $base/Versions/A/CoreFoundation
cp ./Build/CoreFoundation/usr/include/CoreFoundation/*.h $base/Versions/A/Headers
cp ./Build/CoreFoundation/usr/include/CoreFoundation/module.modulemap $base/Versions/A/Modules
ln -s A $base/Versions/Current
for i in CoreFoundation Headers Modules; do
ln -s Versions/Current/$i $base/$i
done
'';
darwinEnvHook = makeSetupHook { name = "darwin-env-hook"; } ./pure-corefoundation-hook.sh;
}

View file

@ -0,0 +1,26 @@
# Darwin stdenv design goals
There are two more goals worth calling out explicitly:
1. The standard environment should build successfully with sandboxing enabled on Darwin. It is
fine if a package requires a `sandboxProfile` to build, but it should not be necessary to
disable the sandbox to build the stdenv successfully; and
2. The output should depend weakly on the bootstrap tools. Historically, Darwin required updating
the bootstrap tools prior to updating the version of LLVM used in the standard environment.
By not depending on a specific version, the LLVM used on Darwin can be updated simply by
bumping the definition of llvmPackages in `all-packages.nix`.
# Updating the stdenv
There are effectively two steps when updating the standard environment:
1. Update the definition of llvmPackages in `all-packages.nix` for Darwin to match the value of
llvmPackages.latest in `all-packages.nix`. Timing-wise, this done currently using the spring
release of LLVM and once llvmPackages.latest has been updated to match. If the LLVM project
has announced a release schedule of patch updates, wait until those are in nixpkgs. Otherwise,
the LLVM updates will have to go through staging instead of being merged into master; and
2. Fix the resulting breakage. Most things break due to additional warnings being turned into
errors or additional strictness applied by LLVM. Fixes may come in the form of disabling those
new warnings or by fixing the actual source (e.g., with a patch or update upstream). If the
fix is trivial (e.g., adding a missing int to an implicit declaration), it is better to fix
the problem instead of silencing the warning.

File diff suppressed because it is too large Load diff

View file

@ -28,7 +28,7 @@ let
# the GNU C compiler, and so on.
stagesLinux = import ./linux args;
inherit (import ./darwin args) stagesDarwin;
stagesDarwin = import ./darwin args;
stagesCross = import ./cross args;

View file

@ -100,7 +100,7 @@ impure-cmds // appleSourcePackages // chooseLibs // {
bintools = self.binutils-unwrapped;
};
cctools = self.cctools-port;
cctools = self.cctools-llvm;
cctools-apple = callPackage ../os-specific/darwin/cctools/apple.nix {
stdenv = if stdenv.isDarwin then stdenv else pkgs.libcxxStdenv;