// Copyright (C) 2019-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 "DeploymentTargets.xcconfig"

WK_AND__ = NO
WK_AND_NO_NO = NO
WK_AND__NO = NO
WK_AND_NO_ = NO
WK_AND_YES_ = NO
WK_AND__YES = NO
WK_AND_YES_NO = NO
WK_AND_NO_YES = NO
WK_AND_YES_YES = YES

WK_EMPTY_ = YES;
WK_NOT_ = YES;
WK_NOT_NO = YES;
WK_NOT_YES = NO;

WK_OR__ = NO
WK_OR_NO_NO = NO
WK_OR__NO = NO
WK_OR_NO_ = NO
WK_OR_YES_ = YES
WK_OR__YES = YES
WK_OR_YES_NO = YES
WK_OR_NO_YES = YES
WK_OR_YES_YES = YES

USE_INTERNAL_SDK = $(USE_INTERNAL_SDK_$(CONFIGURATION));
USE_INTERNAL_SDK_Production = YES;
USE_INTERNAL_SDK_Debug = $(HAVE_INTERNAL_SDK);
USE_INTERNAL_SDK_Release = $(HAVE_INTERNAL_SDK);

WK_DEFAULT_PLATFORM_NAME = $(WK_DEFAULT_PLATFORM_NAME_$(WK_EMPTY_$(FALLBACK_PLATFORM_NAME)));
WK_DEFAULT_PLATFORM_NAME_YES = $(PLATFORM_NAME);
WK_DEFAULT_PLATFORM_NAME_ = $(FALLBACK_PLATFORM_NAME);
WK_DEFAULT_PLATFORM_NAME_[sdk=xr*.internal] = $(PLATFORM_NAME);

WK_ALTERNATE_FRAMEWORKS_DIR = $(WK_ALTERNATE_FRAMEWORKS_DIR_$(SDK_VARIANT));
WK_ALTERNATE_FRAMEWORKS_DIR_iosmac = /System/iOSSupport;
WK_USE_ALTERNATE_FRAMEWORKS_DIR = $(WK_NOT_$(WK_EMPTY_$(WK_ALTERNATE_FRAMEWORKS_DIR)));

WK_ALTERNATE_PLATFORM_NAME = $(WK_ALTERNATE_PLATFORM_NAME_$(SDK_VARIANT));
WK_ALTERNATE_PLATFORM_NAME_iosmac = maccatalyst;
WK_USE_ALTERNATE_PLATFORM_NAME = $(WK_NOT_$(WK_EMPTY_$(WK_ALTERNATE_PLATFORM_NAME)));

WK_CHECK_CATALYST = $(WK_CHECK_CATALYST_$(SDK_VARIANT));
WK_CHECK_CATALYST_iosmac = YES;
WK_IS_CATALYST = $(WK_NOT_$(WK_EMPTY_$(WK_CHECK_CATALYST)));

WK_ALTERNATE_WEBKIT_SDK_PATH = $(WK_ALTERNATE_WEBKIT_SDK_PATH_$(WK_USE_ALTERNATE_FRAMEWORKS_DIR));
WK_ALTERNATE_WEBKIT_SDK_PATH_YES = $(WK_ALTERNATE_FRAMEWORKS_DIR);

WK_PLATFORM_NAME = $(WK_PLATFORM_NAME_ALTERNATE_$(WK_USE_ALTERNATE_PLATFORM_NAME));
WK_PLATFORM_NAME_ALTERNATE_YES = $(WK_ALTERNATE_PLATFORM_NAME);
WK_PLATFORM_NAME_ALTERNATE_NO = $(WK_DEFAULT_PLATFORM_NAME);

EFFECTIVE_PLATFORM_NAME = $(EFFECTIVE_PLATFORM_NAME_ALTERNATE_$(WK_USE_ALTERNATE_PLATFORM_NAME));
EFFECTIVE_PLATFORM_NAME_ALTERNATE_YES = -$(WK_ALTERNATE_PLATFORM_NAME);
EFFECTIVE_PLATFORM_NAME_ALTERNATE_NO = $(EFFECTIVE_PLATFORM_NAME);

WK_COCOA_TOUCH = $(WK_COCOA_TOUCH_$(WK_PLATFORM_NAME));
WK_COCOA_TOUCH_iphoneos = cocoatouch;
WK_COCOA_TOUCH_iphonesimulator = cocoatouch;
WK_COCOA_TOUCH_maccatalyst = cocoatouch;
WK_COCOA_TOUCH_watchos = cocoatouch;
WK_COCOA_TOUCH_watchsimulator = cocoatouch;
WK_COCOA_TOUCH_appletvos = cocoatouch;
WK_COCOA_TOUCH_appletvsimulator = cocoatouch;
WK_COCOA_TOUCH_xros = cocoatouch;
WK_COCOA_TOUCH_xrsimulator = cocoatouch;
WK_IS_COCOA_TOUCH = $(WK_NOT_$(WK_EMPTY_$(WK_COCOA_TOUCH)));

WK_FRAMEWORK_VERSION_PREFIX[sdk=macosx*] = Versions/A/;

// FIXME: These need to be made consistent.
TARGET_MAC_OS_X_VERSION_MAJOR = $(MACOSX_DEPLOYMENT_TARGET:base:base)0000;
WK_TARGET_IOS_VERSION_MAJOR = $(IPHONEOS_DEPLOYMENT_TARGET:base); // e.g. iOS 9.3 => 9
WK_TARGET_TVOS_VERSION_MAJOR = $(TVOS_DEPLOYMENT_TARGET:base);
WK_TARGET_WATCHOS_VERSION_MAJOR = $(WATCHOS_DEPLOYMENT_TARGET:base);

// For at-desk macOS builds, deploy to the host OS version or SDK version,
// whichever is lower. Other platforms default to the SDK version.
WK_MACOSX_DEPLOYMENT_TARGET[config=Debug] = $(_MACOSX_DEPLOYMENT_TARGET_FOR_MINOR_VERSION_$(MAC_OS_X_VERSION_MINOR));
WK_MACOSX_DEPLOYMENT_TARGET[config=Release] = $(_MACOSX_DEPLOYMENT_TARGET_FOR_MINOR_VERSION_$(MAC_OS_X_VERSION_MINOR));
MACOSX_DEPLOYMENT_TARGET = $(WK_MACOSX_DEPLOYMENT_TARGET:default=$(inherited));

WK_IS_INSTALLHDRS = $(WK_IS_INSTALLHDRS_$(ACTION):default=NO);
WK_IS_INSTALLHDRS_installhdrs = YES;
