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