| //===- Version.cpp - Clang Version Number -----------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines several version-related utility functions for Clang. |
| // |
| //===----------------------------------------------------------------------===// |
| #include <cstring> |
| #include <cstdlib> |
| using namespace std; |
| |
| namespace clang { |
| |
| const char *getClangSubversionPath() { |
| static const char *Path = 0; |
| if (Path) |
| return Path; |
| |
| static char URL[] = "$URL$"; |
| char *End = strstr(URL, "/lib/Basic"); |
| if (End) |
| *End = 0; |
| |
| char *Begin = strstr(URL, "cfe/"); |
| if (Begin) { |
| Path = Begin + 4; |
| return Path; |
| } |
| |
| Path = URL; |
| return Path; |
| } |
| |
| |
| unsigned getClangSubversionRevision() { |
| #ifndef SVN_REVISION |
| return 0; |
| #else |
| // What follows is an evil trick. We can end up getting three different |
| // kinds of results when asking for the Subversion information: |
| // - if SVN_REVISION is a number, we return that number (adding 0 to it is |
| // harmless). |
| // - if SVN_REVISION is "exported" (for an tree without any Subversion |
| // info), we end up referencing the local variable "exported" and adding |
| // zero to it, and we return 0. |
| // - if SVN_REVISION is empty (because "svn info" returned no results), |
| // the "+" turns into a unary "+" operator and we return 0. |
| // |
| // Making this less ugly requires doing more computation in the CMake- and |
| // Makefile-based build systems, with all sorts of checking to make sure we |
| // don't end up breaking this build. It's better this way. Really. |
| const unsigned exported = 0; |
| (void)exported; |
| return SVN_REVISION + 0; |
| #endif |
| } |
| |
| } // end namespace clang |