xref: /llvm-project/flang/lib/Common/Version.cpp (revision 541f5c4a6db35870091dd15dfa09dde751229a17)
1*541f5c4aSHussain Kadhem //===- Version.cpp - Flang Version Number -------------------*- Fortran -*-===//
2*541f5c4aSHussain Kadhem //
3*541f5c4aSHussain Kadhem // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*541f5c4aSHussain Kadhem // See https://llvm.org/LICENSE.txt for license information.
5*541f5c4aSHussain Kadhem // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*541f5c4aSHussain Kadhem //
7*541f5c4aSHussain Kadhem //===----------------------------------------------------------------------===//
8*541f5c4aSHussain Kadhem //
9*541f5c4aSHussain Kadhem // This file defines several version-related utility functions for Flang.
10*541f5c4aSHussain Kadhem //
11*541f5c4aSHussain Kadhem //===----------------------------------------------------------------------===//
12*541f5c4aSHussain Kadhem 
13*541f5c4aSHussain Kadhem #include "flang/Common/Version.h"
14*541f5c4aSHussain Kadhem #include "llvm/Support/raw_ostream.h"
15*541f5c4aSHussain Kadhem #include <cstdlib>
16*541f5c4aSHussain Kadhem #include <cstring>
17*541f5c4aSHussain Kadhem 
18*541f5c4aSHussain Kadhem #include "VCSVersion.inc"
19*541f5c4aSHussain Kadhem 
20*541f5c4aSHussain Kadhem namespace Fortran::common {
21*541f5c4aSHussain Kadhem 
getFlangRepositoryPath()22*541f5c4aSHussain Kadhem std::string getFlangRepositoryPath() {
23*541f5c4aSHussain Kadhem #if defined(FLANG_REPOSITORY_STRING)
24*541f5c4aSHussain Kadhem   return FLANG_REPOSITORY_STRING;
25*541f5c4aSHussain Kadhem #else
26*541f5c4aSHussain Kadhem #ifdef FLANG_REPOSITORY
27*541f5c4aSHussain Kadhem   return FLANG_REPOSITORY;
28*541f5c4aSHussain Kadhem #else
29*541f5c4aSHussain Kadhem   return "";
30*541f5c4aSHussain Kadhem #endif
31*541f5c4aSHussain Kadhem #endif
32*541f5c4aSHussain Kadhem }
33*541f5c4aSHussain Kadhem 
getLLVMRepositoryPath()34*541f5c4aSHussain Kadhem std::string getLLVMRepositoryPath() {
35*541f5c4aSHussain Kadhem #ifdef LLVM_REPOSITORY
36*541f5c4aSHussain Kadhem   return LLVM_REPOSITORY;
37*541f5c4aSHussain Kadhem #else
38*541f5c4aSHussain Kadhem   return "";
39*541f5c4aSHussain Kadhem #endif
40*541f5c4aSHussain Kadhem }
41*541f5c4aSHussain Kadhem 
getFlangRevision()42*541f5c4aSHussain Kadhem std::string getFlangRevision() {
43*541f5c4aSHussain Kadhem #ifdef FLANG_REVISION
44*541f5c4aSHussain Kadhem   return FLANG_REVISION;
45*541f5c4aSHussain Kadhem #else
46*541f5c4aSHussain Kadhem   return "";
47*541f5c4aSHussain Kadhem #endif
48*541f5c4aSHussain Kadhem }
49*541f5c4aSHussain Kadhem 
getLLVMRevision()50*541f5c4aSHussain Kadhem std::string getLLVMRevision() {
51*541f5c4aSHussain Kadhem #ifdef LLVM_REVISION
52*541f5c4aSHussain Kadhem   return LLVM_REVISION;
53*541f5c4aSHussain Kadhem #else
54*541f5c4aSHussain Kadhem   return "";
55*541f5c4aSHussain Kadhem #endif
56*541f5c4aSHussain Kadhem }
57*541f5c4aSHussain Kadhem 
getFlangFullRepositoryVersion()58*541f5c4aSHussain Kadhem std::string getFlangFullRepositoryVersion() {
59*541f5c4aSHussain Kadhem   std::string buf;
60*541f5c4aSHussain Kadhem   llvm::raw_string_ostream OS(buf);
61*541f5c4aSHussain Kadhem   std::string Path = getFlangRepositoryPath();
62*541f5c4aSHussain Kadhem   std::string Revision = getFlangRevision();
63*541f5c4aSHussain Kadhem   if (!Path.empty() || !Revision.empty()) {
64*541f5c4aSHussain Kadhem     OS << '(';
65*541f5c4aSHussain Kadhem     if (!Path.empty())
66*541f5c4aSHussain Kadhem       OS << Path;
67*541f5c4aSHussain Kadhem     if (!Revision.empty()) {
68*541f5c4aSHussain Kadhem       if (!Path.empty())
69*541f5c4aSHussain Kadhem         OS << ' ';
70*541f5c4aSHussain Kadhem       OS << Revision;
71*541f5c4aSHussain Kadhem     }
72*541f5c4aSHussain Kadhem     OS << ')';
73*541f5c4aSHussain Kadhem   }
74*541f5c4aSHussain Kadhem   // Support LLVM in a separate repository.
75*541f5c4aSHussain Kadhem   std::string LLVMRev = getLLVMRevision();
76*541f5c4aSHussain Kadhem   if (!LLVMRev.empty() && LLVMRev != Revision) {
77*541f5c4aSHussain Kadhem     OS << " (";
78*541f5c4aSHussain Kadhem     std::string LLVMRepo = getLLVMRepositoryPath();
79*541f5c4aSHussain Kadhem     if (!LLVMRepo.empty())
80*541f5c4aSHussain Kadhem       OS << LLVMRepo << ' ';
81*541f5c4aSHussain Kadhem     OS << LLVMRev << ')';
82*541f5c4aSHussain Kadhem   }
83*541f5c4aSHussain Kadhem   return buf;
84*541f5c4aSHussain Kadhem }
85*541f5c4aSHussain Kadhem 
getFlangFullVersion()86*541f5c4aSHussain Kadhem std::string getFlangFullVersion() { return getFlangToolFullVersion("flang"); }
87*541f5c4aSHussain Kadhem 
getFlangToolFullVersion(llvm::StringRef ToolName)88*541f5c4aSHussain Kadhem std::string getFlangToolFullVersion(llvm::StringRef ToolName) {
89*541f5c4aSHussain Kadhem   std::string buf;
90*541f5c4aSHussain Kadhem   llvm::raw_string_ostream OS(buf);
91*541f5c4aSHussain Kadhem #ifdef FLANG_VENDOR
92*541f5c4aSHussain Kadhem   OS << FLANG_VENDOR;
93*541f5c4aSHussain Kadhem #endif
94*541f5c4aSHussain Kadhem   OS << ToolName << " version " FLANG_VERSION_STRING;
95*541f5c4aSHussain Kadhem 
96*541f5c4aSHussain Kadhem   std::string repo = getFlangFullRepositoryVersion();
97*541f5c4aSHussain Kadhem   if (!repo.empty()) {
98*541f5c4aSHussain Kadhem     OS << " " << repo;
99*541f5c4aSHussain Kadhem   }
100*541f5c4aSHussain Kadhem 
101*541f5c4aSHussain Kadhem   return buf;
102*541f5c4aSHussain Kadhem }
103*541f5c4aSHussain Kadhem 
104*541f5c4aSHussain Kadhem } // end namespace Fortran::common
105