// Copyright (C) 2009, 2013 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 "Base.xcconfig"
#include? "../../../../LocalOverrides.xcconfig"

ONLY_ACTIVE_ARCH = YES;

CODE_SIGN_IDENTITY[sdk=macosx*] = $(CODE_SIGN_IDENTITY_$(USE_INTERNAL_SDK));
CODE_SIGN_IDENTITY_ = $(CODE_SIGN_IDENTITY_NO);
CODE_SIGN_IDENTITY_NO = -;
CODE_SIGN_IDENTITY_YES = $(WK_ENGINEERING_CODE_SIGN_IDENTITY);

SDKROOT = $(SDKROOT_$(USE_INTERNAL_SDK));
SDKROOT_ = macosx;
SDKROOT_YES = macosx.internal;

VALIDATE_DEPENDENCIES = $(VALIDATE_DEPENDENCIES_INTERNAL_$(USE_INTERNAL_SDK));
VALIDATE_DEPENDENCIES_INTERNAL_ = $(VALIDATE_DEPENDENCIES_NATIVE_TARGET_$(WK_NOT_$(WK_EMPTY_$(PRODUCT_TYPE))));
VALIDATE_DEPENDENCIES_INTERNAL_YES = $(WK_VALIDATE_DEPENDENCIES);
VALIDATE_DEPENDENCIES_NATIVE_TARGET_YES = $(WK_VALIDATE_DEPENDENCIES);

WK_CCACHE_DIR = $(SRCROOT)/../ccache;
#include "../../../ccache/ccache.xcconfig"
