/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
 * Copyright (c) 2014, Regents of the University of California.
 *
 * This file is part of NDNS (Named Data Networking Domain Name Service).
 * See AUTHORS.md for complete list of NDNS authors and contributors.
 *
 * NDNS is free software: you can redistribute it and/or modify it under the terms
 * of the GNU General Public License as published by the Free Software Foundation,
 * either version 3 of the License, or (at your option) any later version.
 *
 * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 * PURPOSE.  See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * NDNS, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef NDNS_VERSION_HPP
#define NDNS_VERSION_HPP

namespace ndn {
namespace ndns {

/** NDNS version follows Semantic Versioning 2.0.0 specification
 *  http://semver.org/
 */

// To change version number, modify VERSION variable in top-level wscript.

/** \brief NDNS version represented as an integer
 *
 *  MAJOR*1000000 + MINOR*1000 + PATCH
 */
#define NDNS_VERSION @VERSION@

/** \brief NDNS version represented as a string
 *
 *  MAJOR.MINOR.PATCH
 */
#define NDNS_VERSION_STRING "@VERSION_STRING@"

/** \brief NDNS version string, including git commit information, if NDNS is build from
 *         specific git commit
 *
 * NDNS_VERSION_BUILD_STRING is obtained using the following command (`NDNS-` prefix is
 * afterwards removed):
 *
 *    `git describe --match 'ndns-*'`
 *
 * When NDNS is built not from git, NDNS_VERSION_BUILD_STRING equals NDNS_VERSION_STRING
 *
 * MAJOR.MINOR.PATCH(-release-candidate-tag)(-(number-of-commits-since-tag)-COMMIT-HASH)
 *
 * Example, 0.1.0-rc1-1-g5c86570
 */
#define NDNS_VERSION_BUILD_STRING "@VERSION_BUILD@"

/// MAJOR version
#define NDNS_VERSION_MAJOR @VERSION_MAJOR@
/// MINOR version
#define NDNS_VERSION_MINOR @VERSION_MINOR@
/// PATCH version
#define NDNS_VERSION_PATCH @VERSION_PATCH@

} // namespace ndns
} // namespace ndn

#endif // NDNS_VERSION_HPP
