Home | History | Annotate | Line # | Download | only in Basic
      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 
     22 namespace clang {
     23 
     24 std::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 
     36 std::string getLLVMRepositoryPath() {
     37 #ifdef LLVM_REPOSITORY
     38   return LLVM_REPOSITORY;
     39 #else
     40   return "";
     41 #endif
     42 }
     43 
     44 std::string getClangRevision() {
     45 #ifdef CLANG_REVISION
     46   return CLANG_REVISION;
     47 #else
     48   return "";
     49 #endif
     50 }
     51 
     52 std::string getLLVMRevision() {
     53 #ifdef LLVM_REVISION
     54   return LLVM_REVISION;
     55 #else
     56   return "";
     57 #endif
     58 }
     59 
     60 std::string getClangFullRepositoryVersion() {
     61   std::string buf;
     62   llvm::raw_string_ostream OS(buf);
     63   std::string Path = getClangRepositoryPath();
     64   std::string Revision = getClangRevision();
     65   if (!Path.empty() || !Revision.empty()) {
     66     OS << '(';
     67     if (!Path.empty())
     68       OS << Path;
     69     if (!Revision.empty()) {
     70       if (!Path.empty())
     71         OS << ' ';
     72       OS << Revision;
     73     }
     74     OS << ')';
     75   }
     76   // Support LLVM in a separate repository.
     77   std::string LLVMRev = getLLVMRevision();
     78   if (!LLVMRev.empty() && LLVMRev != Revision) {
     79     OS << " (";
     80     std::string LLVMRepo = getLLVMRepositoryPath();
     81     if (!LLVMRepo.empty())
     82       OS << LLVMRepo << ' ';
     83     OS << LLVMRev << ')';
     84   }
     85   return OS.str();
     86 }
     87 
     88 std::string getClangFullVersion() {
     89   return getClangToolFullVersion("clang");
     90 }
     91 
     92 std::string getClangToolFullVersion(StringRef ToolName) {
     93   std::string buf;
     94   llvm::raw_string_ostream OS(buf);
     95 #ifdef CLANG_VENDOR
     96   OS << CLANG_VENDOR;
     97 #endif
     98   OS << ToolName << " version " CLANG_VERSION_STRING;
     99 
    100   std::string repo = getClangFullRepositoryVersion();
    101   if (!repo.empty()) {
    102     OS << " " << repo;
    103   }
    104 
    105   return OS.str();
    106 }
    107 
    108 std::string getClangFullCPPVersion() {
    109   // The version string we report in __VERSION__ is just a compacted version of
    110   // the one we report on the command line.
    111   std::string buf;
    112   llvm::raw_string_ostream OS(buf);
    113 #ifdef CLANG_VENDOR
    114   OS << CLANG_VENDOR;
    115 #endif
    116   OS << "Clang " CLANG_VERSION_STRING;
    117 
    118   std::string repo = getClangFullRepositoryVersion();
    119   if (!repo.empty()) {
    120     OS << " " << repo;
    121   }
    122 
    123   return OS.str();
    124 }
    125 
    126 } // end namespace clang
    127