// Copyright (C) 2022-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? "../../Internal/Configurations/HaveInternalSDK.xcconfig"
#include? "<DEVELOPER_DIR>/AppleInternal/XcodeConfig/PlatformSupport.xcconfig"
#include "Sanitizers.xcconfig"
#include "SDKVariant.xcconfig"
#include "WebKitProjectPaths.xcconfig"
#include "SDKAdditions.xcconfig"

// Prefix Definitions
//
// WK_COMMON_ prefix is used to define variables in CommonBase.xcconfig
// that may be used in project xcconfig files when $(inherited) is not
// used.
// Examples: WK_COMMON_OTHER_{CFLAGS,CPLUSPLUSFLAGS,LDFLAGS}.
//
// WK_DEFAULT_ prefix is used in Base.xcconfig project files for
// single-value variables that may be overridden in CommonBase.xcconfig.
// Example: WK_DEFAULT_GCC_OPTIMIZATION_LEVEL.

GCC_OPTIMIZATION_LEVEL = $(WK_GCC_OPTIMIZATION_LEVEL_SANITIZER_OVERRIDE_$(WK_ANY_SANITIZER_ENABLED));
WK_GCC_OPTIMIZATION_LEVEL_SANITIZER_OVERRIDE_NO = $(WK_DEFAULT_GCC_OPTIMIZATION_LEVEL);
WK_GCC_OPTIMIZATION_LEVEL_SANITIZER_OVERRIDE_YES = $(WK_SANITIZER_GCC_OPTIMIZATION_LEVEL);

WK_COMMON_OTHER_CFLAGS = $(WK_SANITIZER_OTHER_CFLAGS);
OTHER_CFLAGS = $(inherited) $(WK_COMMON_OTHER_CFLAGS);

WK_COMMON_OTHER_CPLUSPLUSFLAGS = $(WK_LIBCPP_ASSERTIONS_CFLAGS) $(WK_SANITIZER_OTHER_CPLUSPLUSFLAGS);
OTHER_CPLUSPLUSFLAGS = $(inherited) $(WK_COMMON_OTHER_CPLUSPLUSFLAGS);

WK_COMMON_OTHER_LDFLAGS = $(WK_SANITIZER_OTHER_LDFLAGS);
OTHER_LDFLAGS = $(inherited) $(WK_COMMON_OTHER_LDFLAGS);

WK_COMMON_OTHER_TAPI_FLAGS = -x objective-c++ -std=c++2b -fno-rtti $(WK_SANITIZER_OTHER_TAPI_FLAGS);
OTHER_TAPI_FLAGS = $(inherited) $(WK_COMMON_OTHER_TAPI_FLAGS);

WK_COMMON_WARNING_CFLAGS = -Wall -Wc99-designator -Wconditional-uninitialized -Wextra -Wdeprecated-enum-enum-conversion -Wdeprecated-enum-float-conversion -Wenum-float-conversion -Wfinal-dtor-non-final-class -Wformat=2 -Wmisleading-indentation -Wreorder-init-list -Wundef -Wvla;
WARNING_CFLAGS = $(inherited) $(WK_COMMON_WARNING_CFLAGS) $(WK_SANITIZER_WARNING_CFLAGS);

CLANG_CXX_STANDARD_LIBRARY_HARDENING = extensive;

// Setting CLANG_CXX_STANDARD_LIBRARY_HARDENING is sufficient in recent XCode versions but we want to keep
// the libcpp assertion enabled on downlevels so use `-D_LIBCPP_ENABLE_ASSERTIONS=1` as well.
WK_LIBCPP_ASSERTIONS_CFLAGS = $(WK_LIBCPP_ASSERTIONS_CFLAGS_$(WK_PLATFORM_NAME));
WK_LIBCPP_ASSERTIONS_CFLAGS_iphoneos = $(WK_LIBCPP_ASSERTIONS_CFLAGS$(WK_IOS_17)$(WK_IOS_18));
WK_LIBCPP_ASSERTIONS_CFLAGS_iphonesimulator = $(WK_LIBCPP_ASSERTIONS_CFLAGS$(WK_IOS_17)$(WK_IOS_18));
WK_LIBCPP_ASSERTIONS_CFLAGS_IOS_SINCE_17_IOS_BEFORE_18 = -D_LIBCPP_ENABLE_ASSERTIONS=1;
WK_LIBCPP_ASSERTIONS_CFLAGS_maccatalyst = $(WK_LIBCPP_ASSERTIONS_CFLAGS$(WK_MACCATALYST_14)$(WK_MACCATALYST_15));
WK_LIBCPP_ASSERTIONS_CFLAGS_MACCATALYST_SINCE_14_MACCATALYST_BEFORE_15 = -D_LIBCPP_ENABLE_ASSERTIONS=1;
WK_LIBCPP_ASSERTIONS_CFLAGS_macosx = $(WK_LIBCPP_ASSERTIONS_CFLAGS$(WK_MACOS_1400)$(WK_MACOS_1500));
WK_LIBCPP_ASSERTIONS_CFLAGS_MACOS_SINCE_1400_MACOS_BEFORE_1500 = -D_LIBCPP_ENABLE_ASSERTIONS=1;
WK_LIBCPP_ASSERTIONS_CFLAGS_appletvos = $(WK_LIBCPP_ASSERTIONS_CFLAGS$(WK_TVOS_17)$(WK_TVOS_18));
WK_LIBCPP_ASSERTIONS_CFLAGS_appletvsimulator = $(WK_LIBCPP_ASSERTIONS_CFLAGS$(WK_TVOS_17)$(WK_TVOS_18));
WK_LIBCPP_ASSERTIONS_CFLAGS_TVOS_SINCE_17_TVOS_BEFORE_18 = -D_LIBCPP_ENABLE_ASSERTIONS=1;
WK_LIBCPP_ASSERTIONS_CFLAGS_watchos = $(WK_LIBCPP_ASSERTIONS_CFLAGS$(WK_WATCHOS_10)$(WK_WATCHOS_11));
WK_LIBCPP_ASSERTIONS_CFLAGS_watchsimulator = $(WK_LIBCPP_ASSERTIONS_CFLAGS$(WK_WATCHOS_10)$(WK_WATCHOS_11));
WK_LIBCPP_ASSERTIONS_CFLAGS_WATCHOS_SINCE_10_WATCHOS_BEFORE_11 = -D_LIBCPP_ENABLE_ASSERTIONS=1;

