1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#/usr/bin/python
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""A script to prepare version informtion for use the gtest Info.plist file.
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  This script extracts the version information from the configure.ac file and
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uses it to generate a header file containing the same information. The
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  #defines in this header file will be included in during the generation of
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  the Info.plist of the framework, giving the correct value to the version
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  shown in the Finder.
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  This script makes the following assumptions (these are faults of the script,
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  not problems with the Autoconf):
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    1. The AC_INIT macro will be contained within the first 1024 characters
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       of configure.ac
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    2. The version string will be 3 integers separated by periods and will be
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       surrounded by squre brackets, "[" and "]" (e.g. [1.0.1]). The first
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       segment represents the major version, the second represents the minor
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       version and the third represents the fix version.
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    3. No ")" character exists between the opening "(" and closing ")" of
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       AC_INIT, including in comments and character strings.
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport sys
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport re
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Read the command line argument (the output directory for Version.h)
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleif (len(sys.argv) < 3):
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  print "Usage: /usr/bin/python versiongenerate.py input_dir output_dir"
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  sys.exit(1)
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleelse:
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  input_dir = sys.argv[1]
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  output_dir = sys.argv[2]
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Read the first 1024 characters of the configure.ac file
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconfig_file = open("%s/configure.ac" % input_dir, 'r')
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillebuffer_size = 1024
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleopening_string = config_file.read(buffer_size)
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconfig_file.close()
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Extract the version string from the AC_INIT macro
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#   The following init_expression means:
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     Extract three integers separated by periods and surrounded by squre
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     brackets(e.g. "[1.0.1]") between "AC_INIT(" and ")". Do not be greedy
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     (*? is the non-greedy flag) since that would pull in everything between
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     the first "(" and the last ")" in the file.
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleversion_expression = re.compile(r"AC_INIT\(.*?\[(\d+)\.(\d+)\.(\d+)\].*?\)",
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                re.DOTALL)
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleversion_values = version_expression.search(opening_string)
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillemajor_version = version_values.group(1)
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleminor_version = version_values.group(2)
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefix_version = version_values.group(3)
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Write the version information to a header file to be included in the
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Info.plist file.
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefile_data = """//
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DO NOT MODIFY THIS FILE (but you can delete it)
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This file is autogenerated by the versiongenerate.py script. This script
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// is executed in a "Run Script" build phase when creating gtest.framework. This
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// header file is not used during compilation of C-source. Rather, it simply
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// defines some version strings for substitution in the Info.plist. Because of
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this, we are not not restricted to C-syntax nor are we using include guards.
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GTEST_VERSIONINFO_SHORT %s.%s
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GTEST_VERSIONINFO_LONG %s.%s.%s
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville""" % (major_version, minor_version, major_version, minor_version, fix_version)
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleversion_file = open("%s/Version.h" % output_dir, 'w')
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleversion_file.write(file_data)
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleversion_file.close()
72