10ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#!/usr/bin/env python
20ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#
30ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# Copyright 2008, Google Inc.
40ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# All rights reserved.
50ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#
60ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# Redistribution and use in source and binary forms, with or without
70ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# modification, are permitted provided that the following conditions are
80ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# met:
90ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#
100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#     * Redistributions of source code must retain the above copyright
110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# notice, this list of conditions and the following disclaimer.
120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#     * Redistributions in binary form must reproduce the above
130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# copyright notice, this list of conditions and the following disclaimer
140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# in the documentation and/or other materials provided with the
150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# distribution.
160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#     * Neither the name of Google Inc. nor the names of its
170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# contributors may be used to endorse or promote products derived from
180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# this software without specific prior written permission.
190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#
200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""A script to prepare version informtion for use the gtest Info.plist file.
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  This script extracts the version information from the configure.ac file and
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uses it to generate a header file containing the same information. The
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  #defines in this header file will be included in during the generation of
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  the Info.plist of the framework, giving the correct value to the version
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  shown in the Finder.
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  This script makes the following assumptions (these are faults of the script,
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  not problems with the Autoconf):
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    1. The AC_INIT macro will be contained within the first 1024 characters
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       of configure.ac
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    2. The version string will be 3 integers separated by periods and will be
450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson       surrounded by squre brackets, "[" and "]" (e.g. [1.0.1]). The first
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       segment represents the major version, the second represents the minor
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       version and the third represents the fix version.
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    3. No ")" character exists between the opening "(" and closing ")" of
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       AC_INIT, including in comments and character strings.
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport sys
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport re
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Read the command line argument (the output directory for Version.h)
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleif (len(sys.argv) < 3):
570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  print "Usage: versiongenerate.py input_dir output_dir"
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  sys.exit(1)
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleelse:
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  input_dir = sys.argv[1]
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  output_dir = sys.argv[2]
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Read the first 1024 characters of the configure.ac file
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconfig_file = open("%s/configure.ac" % input_dir, 'r')
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillebuffer_size = 1024
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleopening_string = config_file.read(buffer_size)
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconfig_file.close()
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Extract the version string from the AC_INIT macro
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#   The following init_expression means:
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     Extract three integers separated by periods and surrounded by squre
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     brackets(e.g. "[1.0.1]") between "AC_INIT(" and ")". Do not be greedy
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     (*? is the non-greedy flag) since that would pull in everything between
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     the first "(" and the last ")" in the file.
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleversion_expression = re.compile(r"AC_INIT\(.*?\[(\d+)\.(\d+)\.(\d+)\].*?\)",
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                re.DOTALL)
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleversion_values = version_expression.search(opening_string)
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillemajor_version = version_values.group(1)
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleminor_version = version_values.group(2)
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefix_version = version_values.group(3)
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Write the version information to a header file to be included in the
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Info.plist file.
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefile_data = """//
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DO NOT MODIFY THIS FILE (but you can delete it)
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This file is autogenerated by the versiongenerate.py script. This script
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// is executed in a "Run Script" build phase when creating gtest.framework. This
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// header file is not used during compilation of C-source. Rather, it simply
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// defines some version strings for substitution in the Info.plist. Because of
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this, we are not not restricted to C-syntax nor are we using include guards.
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GTEST_VERSIONINFO_SHORT %s.%s
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GTEST_VERSIONINFO_LONG %s.%s.%s
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville""" % (major_version, minor_version, major_version, minor_version, fix_version)
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleversion_file = open("%s/Version.h" % output_dir, 'w')
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleversion_file.write(file_data)
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleversion_file.close()
101