// Copyright (C) 2023 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.

#include "WebKitTargetConditionals.xcconfig"

// FIXME: Add unversioned sparse SDKs for headers and framework stubs that we can share between OS versions.
//WK_HAS_UNVERSIONED_SDK_ADDITIONS = ;

WK_HAS_VERSIONED_SDK_ADDITIONS = $(WK_NOT_$(USE_INTERNAL_SDK));

WK_ADDITIONAL_SDKS = $(WK_ADDITIONAL_SDKS_UNVERSIONED_$(WK_HAS_UNVERSIONED_SDK_ADDITIONS)_VERSIONED_$(WK_HAS_VERSIONED_SDK_ADDITIONS));
WK_ADDITIONAL_SDKS_UNVERSIONED__VERSIONED_ = ;
WK_ADDITIONAL_SDKS_UNVERSIONED__VERSIONED_YES = $(WK_VERSIONED_SDK_ADDITIONS_PATH);
WK_ADDITIONAL_SDKS_UNVERSIONED_YES_VERSIONED_ = $(WK_UNVERSIONED_SDK_ADDITIONS_PATH);
WK_ADDITIONAL_SDKS_UNVERSIONED_YES_VERSIONED_YES = $(WK_UNVERSIONED_SDK_ADDITIONS_PATH) $(WK_VERSIONED_SDK_ADDITIONS_PATH);

// The SDK directory where private frameworks are expected to be. Set to the base SDK when building
// internally or on macOS, and the additions SDK otherwise.
WK_PRIVATE_SDK_DIR = $(WK_PRIVATE_SDK_DIR_$(USE_INTERNAL_SDK));
WK_PRIVATE_SDK_DIR_ = $(SDK_DIR_WebKitSDKAdditions_$(PLATFORM_NAME));
WK_PRIVATE_SDK_DIR_[sdk=macos*] = $(SDK_DIR);
WK_PRIVATE_SDK_DIR_YES = $(SDK_DIR);
