xref: /openbsd-src/gnu/llvm/clang/lib/Basic/Version.cpp (revision 12c855180aad702bbcca06e0398d774beeafb155)
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()24e5dd7070Spatrick std::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()36e5dd7070Spatrick std::string getLLVMRepositoryPath() {
37e5dd7070Spatrick #ifdef LLVM_REPOSITORY
38ec727ea7Spatrick   return LLVM_REPOSITORY;
39e5dd7070Spatrick #else
40ec727ea7Spatrick   return "";
41e5dd7070Spatrick #endif
42e5dd7070Spatrick }
43e5dd7070Spatrick 
getClangRevision()44e5dd7070Spatrick std::string getClangRevision() {
45e5dd7070Spatrick #ifdef CLANG_REVISION
46e5dd7070Spatrick   return CLANG_REVISION;
47e5dd7070Spatrick #else
48e5dd7070Spatrick   return "";
49e5dd7070Spatrick #endif
50e5dd7070Spatrick }
51e5dd7070Spatrick 
getLLVMRevision()52e5dd7070Spatrick std::string getLLVMRevision() {
53e5dd7070Spatrick #ifdef LLVM_REVISION
54e5dd7070Spatrick   return LLVM_REVISION;
55e5dd7070Spatrick #else
56e5dd7070Spatrick   return "";
57e5dd7070Spatrick #endif
58e5dd7070Spatrick }
59e5dd7070Spatrick 
getClangFullRepositoryVersion()60e5dd7070Spatrick std::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()88e5dd7070Spatrick std::string getClangFullVersion() {
89e5dd7070Spatrick   return getClangToolFullVersion("clang");
90e5dd7070Spatrick }
91e5dd7070Spatrick 
getClangToolFullVersion(StringRef ToolName)92e5dd7070Spatrick std::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()108e5dd7070Spatrick std::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