| //===- Version.cpp - Clang Version Number -----------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines several version-related utility functions for Clang. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "clang/Basic/Version.h" |
| #include "llvm/Support/raw_ostream.h" |
| #include <cstring> |
| #include <cstdlib> |
| |
| using namespace std; |
| |
| namespace clang { |
| |
| llvm::StringRef getClangRepositoryPath() { |
| #ifdef SVN_REPOSITORY |
| if (SVN_REPOSITORY[0] != '\0') { |
| static const char URL[] = SVN_REPOSITORY; |
| const char *URLEnd = URL + strlen(URL) - 1; |
| |
| // Strip off version from a build from an integration branch. |
| const char *End = strstr(URL, "/src/tools/clang"); |
| if (End) |
| URLEnd = End; |
| |
| const char *Begin = strstr(URL, "cfe/"); |
| if (Begin) |
| return llvm::StringRef(Begin + 4, URLEnd - Begin - 4); |
| |
| return llvm::StringRef(URL, URLEnd - URL); |
| } |
| #endif |
| return ""; |
| } |
| |
| llvm::StringRef getClangRevision() { |
| #ifdef SVN_REVISION |
| if (SVN_REVISION[0] != '\0') { |
| std::string revision; |
| llvm::raw_string_ostream OS(revision); |
| OS << strtol(SVN_REVISION, 0, 10); |
| return OS.str(); |
| } |
| #endif |
| return ""; |
| } |
| |
| std::string getClangFullRepositoryVersion() { |
| std::string buf; |
| llvm::raw_string_ostream OS(buf); |
| const llvm::StringRef &Path = getClangRepositoryPath(); |
| const llvm::StringRef &Revision = getClangRevision(); |
| if (!Path.empty()) |
| OS << Path; |
| if (!Revision.empty()) { |
| if (!Path.empty()) |
| OS << ' '; |
| OS << Revision; |
| } |
| return OS.str(); |
| } |
| |
| std::string getClangFullVersion() { |
| std::string buf; |
| llvm::raw_string_ostream OS(buf); |
| #ifdef CLANG_VENDOR |
| OS << CLANG_VENDOR; |
| #endif |
| OS << "clang version " CLANG_VERSION_STRING " (" |
| << getClangFullRepositoryVersion() << ')'; |
| return OS.str(); |
| } |
| |
| } // end namespace clang |