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