xref: /freebsd/contrib/llvm-project/clang/lib/Basic/Version.cpp (revision 0eae32dcef82f6f06de6419a0d623d7def0cc8f6)
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 #include "VCSVersion.inc"
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric namespace clang {
230b57cec5SDimitry Andric 
240b57cec5SDimitry Andric std::string getClangRepositoryPath() {
250b57cec5SDimitry Andric #if defined(CLANG_REPOSITORY_STRING)
260b57cec5SDimitry Andric   return CLANG_REPOSITORY_STRING;
270b57cec5SDimitry Andric #else
280b57cec5SDimitry Andric #ifdef CLANG_REPOSITORY
295ffd83dbSDimitry Andric   return CLANG_REPOSITORY;
300b57cec5SDimitry Andric #else
315ffd83dbSDimitry Andric   return "";
320b57cec5SDimitry Andric #endif
330b57cec5SDimitry Andric #endif
340b57cec5SDimitry Andric }
350b57cec5SDimitry Andric 
360b57cec5SDimitry Andric std::string getLLVMRepositoryPath() {
370b57cec5SDimitry Andric #ifdef LLVM_REPOSITORY
385ffd83dbSDimitry Andric   return LLVM_REPOSITORY;
390b57cec5SDimitry Andric #else
405ffd83dbSDimitry Andric   return "";
410b57cec5SDimitry Andric #endif
420b57cec5SDimitry Andric }
430b57cec5SDimitry Andric 
440b57cec5SDimitry Andric std::string getClangRevision() {
450b57cec5SDimitry Andric #ifdef CLANG_REVISION
460b57cec5SDimitry Andric   return CLANG_REVISION;
470b57cec5SDimitry Andric #else
480b57cec5SDimitry Andric   return "";
490b57cec5SDimitry Andric #endif
500b57cec5SDimitry Andric }
510b57cec5SDimitry Andric 
520b57cec5SDimitry Andric std::string getLLVMRevision() {
530b57cec5SDimitry Andric #ifdef LLVM_REVISION
540b57cec5SDimitry Andric   return LLVM_REVISION;
550b57cec5SDimitry Andric #else
560b57cec5SDimitry Andric   return "";
570b57cec5SDimitry Andric #endif
580b57cec5SDimitry Andric }
590b57cec5SDimitry Andric 
600b57cec5SDimitry Andric std::string getClangFullRepositoryVersion() {
610b57cec5SDimitry Andric   std::string buf;
620b57cec5SDimitry Andric   llvm::raw_string_ostream OS(buf);
630b57cec5SDimitry Andric   std::string Path = getClangRepositoryPath();
640b57cec5SDimitry Andric   std::string Revision = getClangRevision();
650b57cec5SDimitry Andric   if (!Path.empty() || !Revision.empty()) {
660b57cec5SDimitry Andric     OS << '(';
670b57cec5SDimitry Andric     if (!Path.empty())
680b57cec5SDimitry Andric       OS << Path;
690b57cec5SDimitry Andric     if (!Revision.empty()) {
700b57cec5SDimitry Andric       if (!Path.empty())
710b57cec5SDimitry Andric         OS << ' ';
720b57cec5SDimitry Andric       OS << Revision;
730b57cec5SDimitry Andric     }
740b57cec5SDimitry Andric     OS << ')';
750b57cec5SDimitry Andric   }
760b57cec5SDimitry Andric   // Support LLVM in a separate repository.
770b57cec5SDimitry Andric   std::string LLVMRev = getLLVMRevision();
780b57cec5SDimitry Andric   if (!LLVMRev.empty() && LLVMRev != Revision) {
790b57cec5SDimitry Andric     OS << " (";
800b57cec5SDimitry Andric     std::string LLVMRepo = getLLVMRepositoryPath();
810b57cec5SDimitry Andric     if (!LLVMRepo.empty())
820b57cec5SDimitry Andric       OS << LLVMRepo << ' ';
830b57cec5SDimitry Andric     OS << LLVMRev << ')';
840b57cec5SDimitry Andric   }
85*0eae32dcSDimitry Andric   return buf;
860b57cec5SDimitry Andric }
870b57cec5SDimitry Andric 
880b57cec5SDimitry Andric std::string getClangFullVersion() {
890b57cec5SDimitry Andric   return getClangToolFullVersion("clang");
900b57cec5SDimitry Andric }
910b57cec5SDimitry Andric 
920b57cec5SDimitry Andric std::string getClangToolFullVersion(StringRef ToolName) {
930b57cec5SDimitry Andric   std::string buf;
940b57cec5SDimitry Andric   llvm::raw_string_ostream OS(buf);
950b57cec5SDimitry Andric #ifdef CLANG_VENDOR
960b57cec5SDimitry Andric   OS << CLANG_VENDOR;
970b57cec5SDimitry Andric #endif
985ffd83dbSDimitry Andric   OS << ToolName << " version " CLANG_VERSION_STRING;
995ffd83dbSDimitry Andric 
1005ffd83dbSDimitry Andric   std::string repo = getClangFullRepositoryVersion();
1015ffd83dbSDimitry Andric   if (!repo.empty()) {
1025ffd83dbSDimitry Andric     OS << " " << repo;
1035ffd83dbSDimitry Andric   }
1040b57cec5SDimitry Andric 
105*0eae32dcSDimitry Andric   return buf;
1060b57cec5SDimitry Andric }
1070b57cec5SDimitry Andric 
1080b57cec5SDimitry Andric std::string getClangFullCPPVersion() {
1090b57cec5SDimitry Andric   // The version string we report in __VERSION__ is just a compacted version of
1100b57cec5SDimitry Andric   // the one we report on the command line.
1110b57cec5SDimitry Andric   std::string buf;
1120b57cec5SDimitry Andric   llvm::raw_string_ostream OS(buf);
1130b57cec5SDimitry Andric #ifdef CLANG_VENDOR
1140b57cec5SDimitry Andric   OS << CLANG_VENDOR;
1150b57cec5SDimitry Andric #endif
1165ffd83dbSDimitry Andric   OS << "Clang " CLANG_VERSION_STRING;
1175ffd83dbSDimitry Andric 
1185ffd83dbSDimitry Andric   std::string repo = getClangFullRepositoryVersion();
1195ffd83dbSDimitry Andric   if (!repo.empty()) {
1205ffd83dbSDimitry Andric     OS << " " << repo;
1215ffd83dbSDimitry Andric   }
1225ffd83dbSDimitry Andric 
123*0eae32dcSDimitry Andric   return buf;
1240b57cec5SDimitry Andric }
1250b57cec5SDimitry Andric 
1260b57cec5SDimitry Andric } // end namespace clang
127