blob: 1e46af7e7403e4ce58177da8326c2a219fbc72f4 [file] [edit]
#!/usr/bin/env python3
# Copyright (C) 2026 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
"""Generate a clang VFS overlay YAML that swaps the SDK's
<os/availability.h> and <Availability.h> for WebKit-supplied stubs that
defuse availability checks.
"""
import argparse
import json
import sys
from pathlib import Path
ap = argparse.ArgumentParser(description=__doc__)
ap.add_argument("--sdk", type=Path, required=True)
ap.add_argument("--stubs", type=Path, required=True)
ap.add_argument("--out", type=Path, required=True)
args = ap.parse_args()
HEADERS = ("usr/include/os/availability.h", "usr/include/Availability.h")
content = json.dumps({
"version": 0,
"case-sensitive": False,
"roots": [
{"name": str(args.sdk / rel),
"type": "file",
"external-contents": str(args.stubs / rel)}
for rel in HEADERS
],
}, indent=2) + "\n"
# Skip the write when content is unchanged to preserve mtime and avoid
# spurious downstream rebuilds. Writing directly (rather than temp+rename)
# is required for Xcode's user-script sandbox, which only permits writes
# to declared outputPaths.
if args.out.is_file() and args.out.read_text() == content:
sys.exit(0)
args.out.write_text(content)