]> granicus.if.org Git - clang/commitdiff
Provide a common set of routines in Version.h that return Subversion
authorDouglas Gregor <dgregor@apple.com>
Mon, 5 Oct 2009 20:33:49 +0000 (20:33 +0000)
committerDouglas Gregor <dgregor@apple.com>
Mon, 5 Oct 2009 20:33:49 +0000 (20:33 +0000)
branch/revision information. Use that information in the driver,
rather than one-off branch/revision computation.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83321 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/Version.h
lib/Basic/CMakeLists.txt
lib/Basic/Makefile
lib/Basic/Version.cpp
lib/Driver/Driver.cpp
lib/Driver/Makefile

index 3c1ef2bb592c3ee509951140b581765cba65ce18..120d5a4210d01b3a9a129e8b873069e615332c13 100644 (file)
@@ -7,7 +7,8 @@
 //
 //===----------------------------------------------------------------------===//
 //
-// This header defines version macros for Clang.
+// This header defines version macros and version-related utility functions 
+// for Clang.
 //
 //===----------------------------------------------------------------------===//
 
   CLANG_MAKE_VERSION_STRING(CLANG_VERSION_MAJOR,CLANG_VERSION_MINOR)
 #endif
 
+namespace clang {
+  /// \brief Retrieves the Subversion path that identifies the particular 
+  /// Clang branch, tag, or trunk from which this Clang was built.
+  const char *getClangSubversionPath();
+  
+  /// \brief Retrieves the Subversion revision number from which this Clang
+  /// was built.
+  unsigned getClangSubversionRevision();
+}
+
 #endif // LLVM_CLANG_BASIC_VERSION_H
index e0e9a10e51958049988dffdfb84945a70a43dcf7..527ebf965934b4de53343079d13bb7504e837dc5 100644 (file)
@@ -11,8 +11,19 @@ add_clang_library(clangBasic
   TargetInfo.cpp
   Targets.cpp
   TokenKinds.cpp
+  Version.cpp
   )
 
+# Determine Subversion revision.
+# FIXME: This only gets updated when CMake is run, so this revision number
+# may be out-of-date!
+find_package(Subversion)
+if (Subversion_FOUND)
+  Subversion_WC_INFO(${CLANG_SOURCE_DIR} CLANG)
+  set_source_files_properties(Version.cpp
+    PROPERTIES COMPILE_DEFINITIONS "SVN_REVISION=\"${CLANG_WC_REVISION}\"")
+endif()
+
 add_dependencies(clangBasic 
                  ClangDiagnosticAnalysis
                  ClangDiagnosticAST
index a81f03b4f71dea8bbe1935dd65f790f689a9199d..46c725998c918c2eff7d68e79b2345995af4e4e5 100644 (file)
@@ -23,3 +23,14 @@ CPPFLAGS += -I$(PROJ_SRC_DIR)/../../include -I$(PROJ_OBJ_DIR)/../../include
 
 include $(LEVEL)/Makefile.common
 
+SVN_REVISION := $(shell cd $(PROJ_SRC_DIR)/../.. && svnversion)
+
+CPP.Defines += -I$(PROJ_SRC_DIR)/../../include -I$(PROJ_OBJ_DIR)/../../include \
+         -DSVN_REVISION='"$(SVN_REVISION)"'
+
+$(ObjDir)/.ver-svn .ver: $(ObjDir)/.dir
+       @if [ '$(SVN_REVISION)' != '$(shell cat $(ObjDir)/.ver-svn 2>/dev/null)' ]; then\
+               echo '$(SVN_REVISION)' > $(ObjDir)/.ver-svn;                    \
+       fi
+$(ObjDir)/.ver-svn: .ver
+$(ObjDir)/Version.o: $(ObjDir)/.ver-svn
index 3a51ccb5e72bb2e72dc30353ffcf2b9bcda1ef0b..9699ee416be5c0d279328a484fd01f70171d39a2 100644 (file)
@@ -39,24 +39,10 @@ const char *getClangSubversionPath() {
 
 unsigned getClangSubversionRevision() {
 #ifndef SVN_REVISION
+  // Subversion was not available at build time?
   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;
+  return strtol(SVN_REVISION, 0, 10);
 #endif
 }
 
index fd2eb61f75b07db19bad2da120ebee5d80d682c0..ab948552d92361ed168196dd26726432834a3a99 100644 (file)
@@ -410,24 +410,13 @@ void Driver::PrintHelp(bool ShowHidden) const {
 }
 
 void Driver::PrintVersion(const Compilation &C, llvm::raw_ostream &OS) const {
-  static char buf[] = "$URL$";
-  char *zap = strstr(buf, "/lib/Driver");
-  if (zap)
-    *zap = 0;
-  zap = strstr(buf, "/clang/tools/clang");
-  if (zap)
-    *zap = 0;
-  const char *vers = buf+6;
-  // FIXME: Add cmake support and remove #ifdef
-#ifdef SVN_REVISION
-  const char *revision = SVN_REVISION;
-#else
-  const char *revision = "";
-#endif
   // FIXME: The following handlers should use a callback mechanism, we don't
   // know what the client would like to do.
   OS << "clang version " CLANG_VERSION_STRING " ("
-     << vers << " " << revision << ")" << '\n';
+     << getClangSubversionPath();
+  if (unsigned Revision = getClangSubversionRevision())
+    OS << " " << Revision;
+  OS << ")" << '\n';
 
   const ToolChain &TC = C.getDefaultToolChain();
   OS << "Target: " << TC.getTripleString() << '\n';
index b709436491a9bc34a342208ce3235d7b19f9f62e..6a31e5fb886fea45a5b8bacec7d54be96fd897d4 100644 (file)
@@ -15,16 +15,6 @@ CXXFLAGS = -fno-rtti
 # Don't install Clang libraries
 NO_INSTALL = 1
 
-include $(LEVEL)/Makefile.common
-
-SVN_REVISION := $(shell cd $(PROJ_SRC_DIR)/../.. && svnversion)
+CPPFLAGS += -I$(PROJ_SRC_DIR)/../../include -I$(PROJ_OBJ_DIR)/../../include
 
-CPP.Defines += -I$(PROJ_SRC_DIR)/../../include -I$(PROJ_OBJ_DIR)/../../include \
-         -DSVN_REVISION='"$(SVN_REVISION)"'
-
-$(ObjDir)/.ver-svn .ver: $(ObjDir)/.dir
-       @if [ '$(SVN_REVISION)' != '$(shell cat $(ObjDir)/.ver-svn 2>/dev/null)' ]; then\
-               echo '$(SVN_REVISION)' > $(ObjDir)/.ver-svn;                    \
-       fi
-$(ObjDir)/.ver-svn: .ver
-$(ObjDir)/Driver.o: $(ObjDir)/.ver-svn
+include $(LEVEL)/Makefile.common