From: Douglas Gregor Date: Mon, 5 Oct 2009 20:33:49 +0000 (+0000) Subject: Provide a common set of routines in Version.h that return Subversion X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b8d1191fdeb4eec9bc5cf9bf4b027add0fb467b3;p=clang Provide a common set of routines in Version.h that return Subversion 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 --- diff --git a/include/clang/Basic/Version.h b/include/clang/Basic/Version.h index 3c1ef2bb59..120d5a4210 100644 --- a/include/clang/Basic/Version.h +++ b/include/clang/Basic/Version.h @@ -7,7 +7,8 @@ // //===----------------------------------------------------------------------===// // -// This header defines version macros for Clang. +// This header defines version macros and version-related utility functions +// for Clang. // //===----------------------------------------------------------------------===// @@ -45,4 +46,14 @@ 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 diff --git a/lib/Basic/CMakeLists.txt b/lib/Basic/CMakeLists.txt index e0e9a10e51..527ebf9659 100644 --- a/lib/Basic/CMakeLists.txt +++ b/lib/Basic/CMakeLists.txt @@ -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 diff --git a/lib/Basic/Makefile b/lib/Basic/Makefile index a81f03b4f7..46c725998c 100644 --- a/lib/Basic/Makefile +++ b/lib/Basic/Makefile @@ -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 diff --git a/lib/Basic/Version.cpp b/lib/Basic/Version.cpp index 3a51ccb5e7..9699ee416b 100644 --- a/lib/Basic/Version.cpp +++ b/lib/Basic/Version.cpp @@ -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 } diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index fd2eb61f75..ab948552d9 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -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'; diff --git a/lib/Driver/Makefile b/lib/Driver/Makefile index b709436491..6a31e5fb88 100644 --- a/lib/Driver/Makefile +++ b/lib/Driver/Makefile @@ -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