diff --git a/compiler/cpp/Makefile.am b/compiler/cpp/Makefile.am index d7c708561..2dcdb5e1d 100644 --- a/compiler/cpp/Makefile.am +++ b/compiler/cpp/Makefile.am @@ -1,4 +1,5 @@ AM_YFLAGS = -d +BUILT_SOURCES = bin_PROGRAMS = thrift @@ -80,3 +81,31 @@ EXTRA_DIST = README clean-local: $(RM) thriftl.cc thrifty.cc thrifty.h + +src/main.cc: version.h + +# Adding this to BUILT_SOURCES will cause version.h to be +# regenerated on every "make all" or "make check", which is +# necessary because it changes whenever we "svn up" or similar. +# Ideally, we would like this to be regenerated whenever the +# compiler is rebuilt, but every way we could think of to do +# that caused unnecessary rebuilds of the compiler. +BUILT_SOURCES += regen_version_h + +THRIFT_VERSION=$(shell /bin/sh $(top_srcdir)/print_version.sh -v) +THRIFT_REVISION=$(shell /bin/sh $(top_srcdir)/print_version.sh -r) + +regen_version_h: + @echo -n "Regenerating version.h... " + @TMPFILE=`mktemp ./version_h.tmp_XXXXXX` ; \ + echo "// AUTOGENERATED, DO NOT EDIT" > $$TMPFILE ; \ + echo '#define THRIFT_VERSION "$(THRIFT_VERSION)"\n' >> $$TMPFILE ; \ + echo '#define THRIFT_REVISION "$(THRIFT_REVISION)"\n' >> $$TMPFILE ; \ + if cmp $$TMPFILE version.h >/dev/null ; \ + then \ + rm -f $$TMPFILE ; \ + echo "No changes." ; \ + else \ + mv $$TMPFILE version.h ; \ + echo "Updated." ; \ + fi diff --git a/compiler/cpp/src/main.cc b/compiler/cpp/src/main.cc index c6a848b53..8c3903a30 100644 --- a/compiler/cpp/src/main.cc +++ b/compiler/cpp/src/main.cc @@ -40,6 +40,8 @@ #include "generate/t_xsd_generator.h" #include "generate/t_erl_generator.h" +#include "version.h" + using namespace std; /** @@ -588,12 +590,20 @@ void generate_all_fingerprints(t_program* program) { */ } +/** + * Prints the version number + */ +void version() { + printf("Thrift version %s-%s\n", THRIFT_VERSION, THRIFT_REVISION); +} + /** * Diplays the usage message and then exits with an error code. */ void usage() { fprintf(stderr, "Usage: thrift [options] file\n"); fprintf(stderr, "Options:\n"); + fprintf(stderr, " -version Print the compiler version\n"); fprintf(stderr, " -php Generate PHP output files\n"); fprintf(stderr, " -phpi Generate PHP inlined files\n"); fprintf(stderr, " -phps Generate PHP server stubs (with -php)\n"); @@ -937,7 +947,10 @@ int main(int argc, char** argv) { ++arg; } - if (strcmp(arg, "-debug") == 0) { + if (strcmp(arg, "-version") == 0) { + version(); + exit(1); + } else if (strcmp(arg, "-debug") == 0) { g_debug = 1; } else if (strcmp(arg, "-nowarn") == 0) { g_warn = 0; @@ -1051,6 +1064,12 @@ int main(int argc, char** argv) { } } + // if you're asking for version, you have a right not to pass a file + if (strcmp(argv[argc-1], "-version") == 0) { + version(); + exit(1); + } + // TODO(dreiss): Delete these when everyone is using the new hotness. if (gen_cpp) { pwarning(1, "-cpp is deprecated. Use --gen cpp"); diff --git a/print_version.sh b/print_version.sh new file mode 100755 index 000000000..92d1a2df4 --- /dev/null +++ b/print_version.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +cd "`dirname "$0"`" + +# Computing both the version and the revision on every invocation is wasteful, +# but it is cheap and avoids the use of nonportable shell functions. + +VERSION=`sed -ne 's/^AC_INIT(\[thrift\], \[\(.*\)\])$/\1/p' configure.ac` + +if test -d .svn ; then + REVISION="r`svnversion`" +elif test -d .git ; then + SHA1=`git rev-list --max-count=1 --grep='^git-svn-id:' HEAD` + REVISION=`git cat-file commit $SHA1 | sed -ne 's/^git-svn-id:[^@]*@\([0-9][0-9]*\).*/r\1/p'` + OFFSET=`git rev-list ^$SHA1 HEAD | wc -l` + if test $OFFSET != 0 ; then + REVISION="$REVISION-$OFFSET-`git rev-parse --verify HEAD | cut -c 1-7`" + fi +else + REVISION="exported" +fi + +case "$1" in + -v) echo $VERSION ;; + -r) echo $REVISION ;; + -a) echo "$VERSION-$REVISION" ;; + *) echo "Usage: $0 -v|-r|-a"; exit 1;; +esac