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

MAJOR_VERSION = 614;
MINOR_VERSION = 1;
TINY_VERSION = 2;
MICRO_VERSION = 0;
NANO_VERSION = 0;
FULL_VERSION = $(MAJOR_VERSION).$(MINOR_VERSION).$(TINY_VERSION);

// The bundle version and short version string are set based on the current build configuration, see below.
BUNDLE_VERSION = $(BUNDLE_VERSION_$(CONFIGURATION));
SHORT_VERSION_STRING = $(SHORT_VERSION_STRING_$(CONFIGURATION))

// The system version prefix is based on the current system version.
SYSTEM_VERSION_PREFIX = $(SYSTEM_VERSION_PREFIX_$(PLATFORM_NAME)_$(TARGET_MAC_OS_X_VERSION_MAJOR));
SYSTEM_VERSION_PREFIX_macosx_101400 = 14;
SYSTEM_VERSION_PREFIX_macosx_101500 = 15;
SYSTEM_VERSION_PREFIX_macosx_110000 = 16;
SYSTEM_VERSION_PREFIX_macosx_120000 = 17;
SYSTEM_VERSION_PREFIX_macosx_130000 = 18;
SYSTEM_VERSION_PREFIX[sdk=iphone*] = 8;

// The production build always uses the full version with a system version prefix.
BUNDLE_VERSION_Production = $(SYSTEM_VERSION_PREFIX)$(FULL_VERSION);
BUNDLE_VERSION_ = $(BUNDLE_VERSION_Production);

// The production build always uses the major version with a system version prefix
SHORT_VERSION_STRING_Production = $(SYSTEM_VERSION_PREFIX)$(MAJOR_VERSION);
SHORT_VERSION_STRING_ = $(SHORT_VERSION_STRING_Production);

// Local builds are the full version with a plus suffix.
BUNDLE_VERSION_Release = $(FULL_VERSION)+;
BUNDLE_VERSION_Debug = $(BUNDLE_VERSION_Release);

// Local builds use the major version with a plus suffix
SHORT_VERSION_STRING_Release = $(MAJOR_VERSION)+;
SHORT_VERSION_STRING_Debug = $(SHORT_VERSION_STRING_Release);

DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = $(FULL_VERSION);
