// Copyright (c) 2012 The Bitcoin developers
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.

#include <string>
#include <version.h>

    //
    // Client version number
    //
#ifdef USE_LEVELDB
# define CLIENT_VERSION_SUFFIX   "-leveldb"
#else
# define CLIENT_VERSION_SUFFIX   "-sqlite"
#endif

    //
    // Compiler name
    //
#ifdef __INTEL_COMPILER
    //code specific to intel compiler
    #define CL_NAME   "-icpc"
#elif _MSC_VER
    //code specific to MSVC compiler
    #define CL_NAME   "-msvc"
#elif __clang__
    //code specific to clang compilers
    #define CL_NAME   "-clang"
#elif __GNUC__
    //code for GNU C compiler
    #define CL_NAME   "-gcc"
#elif __MINGW32__
    //code specific to mingw compilers
    #define CL_NAME   "-mingw"
#else
    //others
    #define CL_NAME   "-genericcl"
#endif

    //
    // The following part of the code determines the version::CLIENT_BUILD variable.
    //
    // Several mechanisms are used for this:
    // * first, if HAVE_BUILD_INFO is defined, include build.h, a file that is
    //   generated by the build environment, possibly containing the output
    //   of git-describe in a macro called BUILD_DESC
    // * secondly, if this is an exported version of the code, GIT_ARCHIVE will
    //   be defined (automatically using the export-subst git attribute), and
    //   GIT_COMMIT will contain the commit id.
    // * then, three options exist for determining version::CLIENT_BUILD:
    //   * if BUILD_DESC is defined, use that literally (output of git-describe)
    //   * if not, but GIT_COMMIT is defined, use v[maj].[min].[rev].[build]-g[commit]
    //   * otherwise, use v[maj].[min].[rev].[build]-unk
    // finally CLIENT_VERSION_SUFFIX is added
    //

    // First, include build.h if requested
#ifdef HAVE_BUILD_INFO
#    include "build.h"
#endif

    //
    // git will put "#define GIT_ARCHIVE 1" on the next line inside archives.
    //
#define GIT_ARCHIVE 1
#ifdef GIT_ARCHIVE
#    define GIT_COMMIT_ID "----"
#    define GIT_COMMIT_DATE "Oct-2021"
#endif

#define BUILD_DESC_FROM_COMMIT(maj,min,rev,build,commit) \
    "v" DO_STRINGIZE(maj) "." DO_STRINGIZE(min) "." DO_STRINGIZE(rev) "." DO_STRINGIZE(build) "-g" commit

#define BUILD_DESC_FROM_UNKNOWN(maj,min,rev,build) \
    "v" DO_STRINGIZE(maj) "." DO_STRINGIZE(min) "." DO_STRINGIZE(rev) "." DO_STRINGIZE(build) "-unk"

#ifndef BUILD_DESC
#    ifdef GIT_COMMIT_ID
#        define BUILD_DESC BUILD_DESC_FROM_COMMIT(DISPLAY_VERSION_MAJOR, DISPLAY_VERSION_MINOR, DISPLAY_VERSION_REVISION, GIT_COMMIT_DATE, GIT_COMMIT_ID)
#    else
#        define BUILD_DESC BUILD_DESC_FROM_UNKNOWN(DISPLAY_VERSION_MAJOR, DISPLAY_VERSION_MINOR, DISPLAY_VERSION_REVISION, GIT_COMMIT_DATE)
#    endif
#endif

#ifdef _MSC_VER
    #undef GIT_COMMIT_DATE
#endif

#ifndef BUILD_DATE
#    ifdef GIT_COMMIT_DATE
#        define BUILD_DATE GIT_COMMIT_DATE
#    else
#        define BUILD_DATE __DATE__ ", " __TIME__
#    endif
#endif

namespace version
{
    const std::string CLIENT_BUILD(BUILD_DESC CLIENT_VERSION_SUFFIX CL_NAME);
    const std::string CLIENT_DATE(BUILD_DATE);
}
