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-exception
6//
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#else
28#ifdef CLANG_REPOSITORY
29  return CLANG_REPOSITORY;
30#else
31  return "";
32#endif
33#endif
34}
35
36std::string getLLVMRepositoryPath() {
37#ifdef LLVM_REPOSITORY
38  return LLVM_REPOSITORY;
39#else
40  return "";
41#endif
42}
43
44std::string getClangRevision() {
45#ifdef CLANG_REVISION
46  return CLANG_REVISION;
47#else
48  return "";
49#endif
50}
51
52std::string getLLVMRevision() {
53#ifdef LLVM_REVISION
54  return LLVM_REVISION;
55#else
56  return "";
57#endif
58}
59
60std::string getClangVendor() {
61#ifdef CLANG_VENDOR
62  return CLANG_VENDOR;
63#else
64  return "";
65#endif
66}
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 of
115  // 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 clang
129