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