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 Kadhemstd::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 Kadhemstd::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 Kadhemstd::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 Kadhemstd::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 Kadhemstd::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 Kadhemstd::string getFlangFullVersion() { return getFlangToolFullVersion("flang"); } 87*541f5c4aSHussain Kadhem getFlangToolFullVersion(llvm::StringRef ToolName)88*541f5c4aSHussain Kadhemstd::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