5ca88bfbb9
GitOrigin-RevId: 9f918d616c5321ad374ae6cb5ea89c9e04bf3e58
99 lines
2.9 KiB
Nix
99 lines
2.9 KiB
Nix
{
|
|
lib,
|
|
stdenvNoCC,
|
|
appleDerivation',
|
|
gnused,
|
|
python3,
|
|
unifdef,
|
|
}:
|
|
|
|
appleDerivation' stdenvNoCC {
|
|
nativeBuildInputs = [ unifdef ];
|
|
|
|
patches = [ ./0001-Support-setting-an-upper-bound-on-versions.patch ];
|
|
|
|
buildPhase = ''
|
|
runHook preBuild
|
|
|
|
declare -a unifdef_sources=(
|
|
os_availability.modulemap
|
|
os_availability_private.modulemap
|
|
AvailabilityPrivate.modulemap
|
|
)
|
|
unifdef -x2 -UBUILD_FOR_DRIVERKIT -m $(for x in "''${unifdef_sources[@]}"; do echo templates/$x; done)
|
|
|
|
runHook postBuild
|
|
'';
|
|
|
|
installPhase = ''
|
|
runHook preInstall
|
|
|
|
mkdir -p "$out/bin" "$out/libexec" "$out/share/availability"
|
|
|
|
cp -r availability.dsl templates "$out/share/availability/"
|
|
|
|
substitute availability "$out/libexec/availability" \
|
|
--replace-fail '/usr/bin/env python3' '${lib.getBin python3}/bin/python3' \
|
|
--replace-fail 'f"{os.path.abspath(os.path.dirname(sys.argv[0]))}/' "\"$out/share/availability/"
|
|
chmod a+x "$out/libexec/availability"
|
|
|
|
cat <<SCRIPT > "$out/bin/gen-headers"
|
|
#!/usr/bin/env bash
|
|
set -eu
|
|
|
|
declare -a headers=(
|
|
Availability.h
|
|
AvailabilityInternal.h
|
|
AvailabilityInternalLegacy.h
|
|
AvailabilityMacros.h
|
|
AvailabilityVersions.h
|
|
os/availability.h
|
|
)
|
|
|
|
dest=\$2
|
|
threshold=\$1
|
|
|
|
for header in "\''${headers[@]}"; do
|
|
header_src=\''${header/\//_}
|
|
mkdir -p "\$(dirname "\$dest/include/\$header")"
|
|
"$out/libexec/availability" \\
|
|
--threshold "\$threshold" \\
|
|
--preprocess "$out/share/availability/templates/\$header_src" "\$dest/include/\$header"
|
|
done
|
|
|
|
# `__ENVIRONMENT_OS_VERSION_MIN_REQUIRED__` is only defined by clang 17+, so define it for older versions.
|
|
${lib.getExe gnused} -E '/#ifndef __MAC_OS_X_VERSION_MIN_REQUIRED/{
|
|
i#ifndef __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__
|
|
i#define __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__ __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
|
|
i#endif
|
|
}' \\
|
|
-i "\$dest/include/AvailabilityInternal.h"
|
|
|
|
# Remove macros from newer SDKs because they can confuse some programs about the SDK version.
|
|
declare -a versionParts=(\''${threshold//./ })
|
|
if [ "\''${versionParts[0]}" == "10" ]; then
|
|
sdkMajor=\''${versionParts[1]}
|
|
sdkMinor=\''${versionParts[2]:-0}
|
|
for minor in \$(seq \$(("\$sdkMinor" + 1)) 9); do
|
|
${lib.getExe gnused} \\
|
|
-E "/VERSION_10_\''${sdkMajor}_\$minor/,/#endif/c\\ */" \\
|
|
-i "\$dest/include/AvailabilityMacros.h"
|
|
done
|
|
for major in \$(seq \$(("\$sdkMajor" + 1)) 15); do
|
|
${lib.getExe gnused} \\
|
|
-E "/VERSION_10_\$major/,/#endif/c\\ */" \\
|
|
-i "\$dest/include/AvailabilityMacros.h"
|
|
done
|
|
fi
|
|
|
|
cp "$out/share/availability/templates/os_availability.modulemap" "\$dest/include/"
|
|
SCRIPT
|
|
chmod a+x "$out/bin/gen-headers"
|
|
|
|
patchShebangs "$out/bin"
|
|
|
|
runHook postInstall
|
|
'';
|
|
|
|
meta.mainProgram = "gen-headers";
|
|
}
|