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(ToolName: "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