1 //===- Version.cpp - Clang Version Number -----------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines several version-related utility functions for Clang. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "clang/Basic/Version.h" 15 #include "clang/Basic/LLVM.h" 16 #include "llvm/Support/raw_ostream.h" 17 #include "llvm/Config/config.h" 18 #include <cstring> 19 #include <cstdlib> 20 21 namespace clang { 22 23 std::string getClangRepositoryPath() { 24 #if defined(CLANG_REPOSITORY_STRING) 25 return CLANG_REPOSITORY_STRING; 26 #else 27 #ifdef SVN_REPOSITORY 28 StringRef URL(SVN_REPOSITORY); 29 #else 30 StringRef URL(""); 31 #endif 32 33 // If the SVN_REPOSITORY is empty, try to use the SVN keyword. This helps us 34 // pick up a tag in an SVN export, for example. 35 static StringRef SVNRepository("$URL$"); 36 if (URL.empty()) { 37 URL = SVNRepository.slice(SVNRepository.find(':'), 38 SVNRepository.find("/lib/Basic")); 39 } 40 41 // Strip off version from a build from an integration branch. 42 URL = URL.slice(0, URL.find("/src/tools/clang")); 43 44 // Trim path prefix off, assuming path came from standard cfe path. 45 size_t Start = URL.find("cfe/"); 46 if (Start != StringRef::npos) 47 URL = URL.substr(Start + 4); 48 49 return URL; 50 #endif 51 } 52 53 std::string getClangRevision() { 54 #ifdef SVN_REVISION 55 return SVN_REVISION; 56 #else 57 return ""; 58 #endif 59 } 60 61 std::string getClangFullRepositoryVersion() { 62 std::string buf; 63 llvm::raw_string_ostream OS(buf); 64 std::string Path = getClangRepositoryPath(); 65 std::string Revision = getClangRevision(); 66 if (!Path.empty()) 67 OS << Path; 68 if (!Revision.empty()) { 69 if (!Path.empty()) 70 OS << ' '; 71 OS << Revision; 72 } 73 return OS.str(); 74 } 75 76 std::string getClangFullVersion() { 77 std::string buf; 78 llvm::raw_string_ostream OS(buf); 79 #ifdef CLANG_VENDOR 80 OS << CLANG_VENDOR; 81 #endif 82 OS << "clang version " CLANG_VERSION_STRING " (" 83 << getClangFullRepositoryVersion() << ')'; 84 85 // If vendor supplied, include the base LLVM version as well. 86 #ifdef CLANG_VENDOR 87 OS << " (based on LLVM " << PACKAGE_VERSION << ")"; 88 #endif 89 90 return OS.str(); 91 } 92 93 std::string getClangFullCPPVersion() { 94 // The version string we report in __VERSION__ is just a compacted version of 95 // the one we report on the command line. 96 std::string buf; 97 llvm::raw_string_ostream OS(buf); 98 #ifdef CLANG_VENDOR 99 OS << CLANG_VENDOR; 100 #endif 101 OS << "Clang " CLANG_VERSION_STRING " (" 102 << getClangFullRepositoryVersion() << ')'; 103 return OS.str(); 104 } 105 106 } // end namespace clang 107