xref: /freebsd/contrib/llvm-project/clang/lib/Basic/Version.cpp (revision 5ffd83dbcc34f10e07f6d3e968ae6365869615f4)
10b57cec5SDimitry Andric //===- Version.cpp - Clang Version Number -----------------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file defines several version-related utility functions for Clang.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #include "clang/Basic/Version.h"
140b57cec5SDimitry Andric #include "clang/Basic/LLVM.h"
150b57cec5SDimitry Andric #include "clang/Config/config.h"
160b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h"
170b57cec5SDimitry Andric #include <cstdlib>
180b57cec5SDimitry Andric #include <cstring>
190b57cec5SDimitry Andric 
200b57cec5SDimitry Andric #ifdef HAVE_VCS_VERSION_INC
210b57cec5SDimitry Andric #include "VCSVersion.inc"
220b57cec5SDimitry Andric #endif
230b57cec5SDimitry Andric 
240b57cec5SDimitry Andric namespace clang {
250b57cec5SDimitry Andric 
260b57cec5SDimitry Andric std::string getClangRepositoryPath() {
270b57cec5SDimitry Andric #if defined(CLANG_REPOSITORY_STRING)
280b57cec5SDimitry Andric   return CLANG_REPOSITORY_STRING;
290b57cec5SDimitry Andric #else
300b57cec5SDimitry Andric #ifdef CLANG_REPOSITORY
31*5ffd83dbSDimitry Andric   return CLANG_REPOSITORY;
320b57cec5SDimitry Andric #else
33*5ffd83dbSDimitry Andric   return "";
340b57cec5SDimitry Andric #endif
350b57cec5SDimitry Andric #endif
360b57cec5SDimitry Andric }
370b57cec5SDimitry Andric 
380b57cec5SDimitry Andric std::string getLLVMRepositoryPath() {
390b57cec5SDimitry Andric #ifdef LLVM_REPOSITORY
40*5ffd83dbSDimitry Andric   return LLVM_REPOSITORY;
410b57cec5SDimitry Andric #else
42*5ffd83dbSDimitry Andric   return "";
430b57cec5SDimitry Andric #endif
440b57cec5SDimitry Andric }
450b57cec5SDimitry Andric 
460b57cec5SDimitry Andric std::string getClangRevision() {
470b57cec5SDimitry Andric #ifdef CLANG_REVISION
480b57cec5SDimitry Andric   return CLANG_REVISION;
490b57cec5SDimitry Andric #else
500b57cec5SDimitry Andric   return "";
510b57cec5SDimitry Andric #endif
520b57cec5SDimitry Andric }
530b57cec5SDimitry Andric 
540b57cec5SDimitry Andric std::string getLLVMRevision() {
550b57cec5SDimitry Andric #ifdef LLVM_REVISION
560b57cec5SDimitry Andric   return LLVM_REVISION;
570b57cec5SDimitry Andric #else
580b57cec5SDimitry Andric   return "";
590b57cec5SDimitry Andric #endif
600b57cec5SDimitry Andric }
610b57cec5SDimitry Andric 
620b57cec5SDimitry Andric std::string getClangFullRepositoryVersion() {
630b57cec5SDimitry Andric   std::string buf;
640b57cec5SDimitry Andric   llvm::raw_string_ostream OS(buf);
650b57cec5SDimitry Andric   std::string Path = getClangRepositoryPath();
660b57cec5SDimitry Andric   std::string Revision = getClangRevision();
670b57cec5SDimitry Andric   if (!Path.empty() || !Revision.empty()) {
680b57cec5SDimitry Andric     OS << '(';
690b57cec5SDimitry Andric     if (!Path.empty())
700b57cec5SDimitry Andric       OS << Path;
710b57cec5SDimitry Andric     if (!Revision.empty()) {
720b57cec5SDimitry Andric       if (!Path.empty())
730b57cec5SDimitry Andric         OS << ' ';
740b57cec5SDimitry Andric       OS << Revision;
750b57cec5SDimitry Andric     }
760b57cec5SDimitry Andric     OS << ')';
770b57cec5SDimitry Andric   }
780b57cec5SDimitry Andric   // Support LLVM in a separate repository.
790b57cec5SDimitry Andric   std::string LLVMRev = getLLVMRevision();
800b57cec5SDimitry Andric   if (!LLVMRev.empty() && LLVMRev != Revision) {
810b57cec5SDimitry Andric     OS << " (";
820b57cec5SDimitry Andric     std::string LLVMRepo = getLLVMRepositoryPath();
830b57cec5SDimitry Andric     if (!LLVMRepo.empty())
840b57cec5SDimitry Andric       OS << LLVMRepo << ' ';
850b57cec5SDimitry Andric     OS << LLVMRev << ')';
860b57cec5SDimitry Andric   }
870b57cec5SDimitry Andric   return OS.str();
880b57cec5SDimitry Andric }
890b57cec5SDimitry Andric 
900b57cec5SDimitry Andric std::string getClangFullVersion() {
910b57cec5SDimitry Andric   return getClangToolFullVersion("clang");
920b57cec5SDimitry Andric }
930b57cec5SDimitry Andric 
940b57cec5SDimitry Andric std::string getClangToolFullVersion(StringRef ToolName) {
950b57cec5SDimitry Andric   std::string buf;
960b57cec5SDimitry Andric   llvm::raw_string_ostream OS(buf);
970b57cec5SDimitry Andric #ifdef CLANG_VENDOR
980b57cec5SDimitry Andric   OS << CLANG_VENDOR;
990b57cec5SDimitry Andric #endif
100*5ffd83dbSDimitry Andric   OS << ToolName << " version " CLANG_VERSION_STRING;
101*5ffd83dbSDimitry Andric 
102*5ffd83dbSDimitry Andric   std::string repo = getClangFullRepositoryVersion();
103*5ffd83dbSDimitry Andric   if (!repo.empty()) {
104*5ffd83dbSDimitry Andric     OS << " " << repo;
105*5ffd83dbSDimitry Andric   }
1060b57cec5SDimitry Andric 
1070b57cec5SDimitry Andric   return OS.str();
1080b57cec5SDimitry Andric }
1090b57cec5SDimitry Andric 
1100b57cec5SDimitry Andric std::string getClangFullCPPVersion() {
1110b57cec5SDimitry Andric   // The version string we report in __VERSION__ is just a compacted version of
1120b57cec5SDimitry Andric   // the one we report on the command line.
1130b57cec5SDimitry Andric   std::string buf;
1140b57cec5SDimitry Andric   llvm::raw_string_ostream OS(buf);
1150b57cec5SDimitry Andric #ifdef CLANG_VENDOR
1160b57cec5SDimitry Andric   OS << CLANG_VENDOR;
1170b57cec5SDimitry Andric #endif
118*5ffd83dbSDimitry Andric   OS << "Clang " CLANG_VERSION_STRING;
119*5ffd83dbSDimitry Andric 
120*5ffd83dbSDimitry Andric   std::string repo = getClangFullRepositoryVersion();
121*5ffd83dbSDimitry Andric   if (!repo.empty()) {
122*5ffd83dbSDimitry Andric     OS << " " << repo;
123*5ffd83dbSDimitry Andric   }
124*5ffd83dbSDimitry Andric 
1250b57cec5SDimitry Andric   return OS.str();
1260b57cec5SDimitry Andric }
1270b57cec5SDimitry Andric 
1280b57cec5SDimitry Andric } // end namespace clang
129