1e5dd7070Spatrick //===- Version.cpp - Clang Version Number -----------------------*- C++ -*-===// 2e5dd7070Spatrick // 3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information. 5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e5dd7070Spatrick // 7e5dd7070Spatrick //===----------------------------------------------------------------------===// 8e5dd7070Spatrick // 9e5dd7070Spatrick // This file defines several version-related utility functions for Clang. 10e5dd7070Spatrick // 11e5dd7070Spatrick //===----------------------------------------------------------------------===// 12e5dd7070Spatrick 13e5dd7070Spatrick #include "clang/Basic/Version.h" 14e5dd7070Spatrick #include "clang/Basic/LLVM.h" 15e5dd7070Spatrick #include "clang/Config/config.h" 16e5dd7070Spatrick #include "llvm/Support/raw_ostream.h" 17e5dd7070Spatrick #include <cstdlib> 18e5dd7070Spatrick #include <cstring> 19e5dd7070Spatrick 20e5dd7070Spatrick #include "VCSVersion.inc" 21e5dd7070Spatrick 22e5dd7070Spatrick namespace clang { 23e5dd7070Spatrick getClangRepositoryPath()24e5dd7070Spatrickstd::string getClangRepositoryPath() { 25e5dd7070Spatrick #if defined(CLANG_REPOSITORY_STRING) 26e5dd7070Spatrick return CLANG_REPOSITORY_STRING; 27e5dd7070Spatrick #else 28e5dd7070Spatrick #ifdef CLANG_REPOSITORY 29ec727ea7Spatrick return CLANG_REPOSITORY; 30e5dd7070Spatrick #else 31ec727ea7Spatrick return ""; 32e5dd7070Spatrick #endif 33e5dd7070Spatrick #endif 34e5dd7070Spatrick } 35e5dd7070Spatrick getLLVMRepositoryPath()36e5dd7070Spatrickstd::string getLLVMRepositoryPath() { 37e5dd7070Spatrick #ifdef LLVM_REPOSITORY 38ec727ea7Spatrick return LLVM_REPOSITORY; 39e5dd7070Spatrick #else 40ec727ea7Spatrick return ""; 41e5dd7070Spatrick #endif 42e5dd7070Spatrick } 43e5dd7070Spatrick getClangRevision()44e5dd7070Spatrickstd::string getClangRevision() { 45e5dd7070Spatrick #ifdef CLANG_REVISION 46e5dd7070Spatrick return CLANG_REVISION; 47e5dd7070Spatrick #else 48e5dd7070Spatrick return ""; 49e5dd7070Spatrick #endif 50e5dd7070Spatrick } 51e5dd7070Spatrick getLLVMRevision()52e5dd7070Spatrickstd::string getLLVMRevision() { 53e5dd7070Spatrick #ifdef LLVM_REVISION 54e5dd7070Spatrick return LLVM_REVISION; 55e5dd7070Spatrick #else 56e5dd7070Spatrick return ""; 57e5dd7070Spatrick #endif 58e5dd7070Spatrick } 59e5dd7070Spatrick getClangFullRepositoryVersion()60e5dd7070Spatrickstd::string getClangFullRepositoryVersion() { 61e5dd7070Spatrick std::string buf; 62e5dd7070Spatrick llvm::raw_string_ostream OS(buf); 63e5dd7070Spatrick std::string Path = getClangRepositoryPath(); 64e5dd7070Spatrick std::string Revision = getClangRevision(); 65e5dd7070Spatrick if (!Path.empty() || !Revision.empty()) { 66e5dd7070Spatrick OS << '('; 67e5dd7070Spatrick if (!Path.empty()) 68e5dd7070Spatrick OS << Path; 69e5dd7070Spatrick if (!Revision.empty()) { 70e5dd7070Spatrick if (!Path.empty()) 71e5dd7070Spatrick OS << ' '; 72e5dd7070Spatrick OS << Revision; 73e5dd7070Spatrick } 74e5dd7070Spatrick OS << ')'; 75e5dd7070Spatrick } 76e5dd7070Spatrick // Support LLVM in a separate repository. 77e5dd7070Spatrick std::string LLVMRev = getLLVMRevision(); 78e5dd7070Spatrick if (!LLVMRev.empty() && LLVMRev != Revision) { 79e5dd7070Spatrick OS << " ("; 80e5dd7070Spatrick std::string LLVMRepo = getLLVMRepositoryPath(); 81e5dd7070Spatrick if (!LLVMRepo.empty()) 82e5dd7070Spatrick OS << LLVMRepo << ' '; 83e5dd7070Spatrick OS << LLVMRev << ')'; 84e5dd7070Spatrick } 85*12c85518Srobert return buf; 86e5dd7070Spatrick } 87e5dd7070Spatrick getClangFullVersion()88e5dd7070Spatrickstd::string getClangFullVersion() { 89e5dd7070Spatrick return getClangToolFullVersion("clang"); 90e5dd7070Spatrick } 91e5dd7070Spatrick getClangToolFullVersion(StringRef ToolName)92e5dd7070Spatrickstd::string getClangToolFullVersion(StringRef ToolName) { 93e5dd7070Spatrick std::string buf; 94e5dd7070Spatrick llvm::raw_string_ostream OS(buf); 95e5dd7070Spatrick #ifdef CLANG_VENDOR 96e5dd7070Spatrick OS << CLANG_VENDOR; 97e5dd7070Spatrick #endif 98ec727ea7Spatrick OS << ToolName << " version " CLANG_VERSION_STRING; 99ec727ea7Spatrick 100ec727ea7Spatrick std::string repo = getClangFullRepositoryVersion(); 101ec727ea7Spatrick if (!repo.empty()) { 102ec727ea7Spatrick OS << " " << repo; 103ec727ea7Spatrick } 104e5dd7070Spatrick 105*12c85518Srobert return buf; 106e5dd7070Spatrick } 107e5dd7070Spatrick getClangFullCPPVersion()108e5dd7070Spatrickstd::string getClangFullCPPVersion() { 109e5dd7070Spatrick // The version string we report in __VERSION__ is just a compacted version of 110e5dd7070Spatrick // the one we report on the command line. 111e5dd7070Spatrick std::string buf; 112e5dd7070Spatrick llvm::raw_string_ostream OS(buf); 113e5dd7070Spatrick #ifdef CLANG_VENDOR 114e5dd7070Spatrick OS << CLANG_VENDOR; 115e5dd7070Spatrick #endif 116ec727ea7Spatrick OS << "Clang " CLANG_VERSION_STRING; 117ec727ea7Spatrick 118ec727ea7Spatrick std::string repo = getClangFullRepositoryVersion(); 119ec727ea7Spatrick if (!repo.empty()) { 120ec727ea7Spatrick OS << " " << repo; 121ec727ea7Spatrick } 122ec727ea7Spatrick 123*12c85518Srobert return buf; 124e5dd7070Spatrick } 125e5dd7070Spatrick 126e5dd7070Spatrick } // end namespace clang 127