113481Sgiacomo.travaglini@arm.com#!/usr/bin/env python
213481Sgiacomo.travaglini@arm.com#
313481Sgiacomo.travaglini@arm.com# Copyright 2008, Google Inc.
413481Sgiacomo.travaglini@arm.com# All rights reserved.
513481Sgiacomo.travaglini@arm.com#
613481Sgiacomo.travaglini@arm.com# Redistribution and use in source and binary forms, with or without
713481Sgiacomo.travaglini@arm.com# modification, are permitted provided that the following conditions are
813481Sgiacomo.travaglini@arm.com# met:
913481Sgiacomo.travaglini@arm.com#
1013481Sgiacomo.travaglini@arm.com#     * Redistributions of source code must retain the above copyright
1113481Sgiacomo.travaglini@arm.com# notice, this list of conditions and the following disclaimer.
1213481Sgiacomo.travaglini@arm.com#     * Redistributions in binary form must reproduce the above
1313481Sgiacomo.travaglini@arm.com# copyright notice, this list of conditions and the following disclaimer
1413481Sgiacomo.travaglini@arm.com# in the documentation and/or other materials provided with the
1513481Sgiacomo.travaglini@arm.com# distribution.
1613481Sgiacomo.travaglini@arm.com#     * Neither the name of Google Inc. nor the names of its
1713481Sgiacomo.travaglini@arm.com# contributors may be used to endorse or promote products derived from
1813481Sgiacomo.travaglini@arm.com# this software without specific prior written permission.
1913481Sgiacomo.travaglini@arm.com#
2013481Sgiacomo.travaglini@arm.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2113481Sgiacomo.travaglini@arm.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2213481Sgiacomo.travaglini@arm.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2313481Sgiacomo.travaglini@arm.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2413481Sgiacomo.travaglini@arm.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2513481Sgiacomo.travaglini@arm.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2613481Sgiacomo.travaglini@arm.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2713481Sgiacomo.travaglini@arm.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2813481Sgiacomo.travaglini@arm.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2913481Sgiacomo.travaglini@arm.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3013481Sgiacomo.travaglini@arm.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3113481Sgiacomo.travaglini@arm.com
3213481Sgiacomo.travaglini@arm.com"""A script to prepare version informtion for use the gtest Info.plist file.
3313481Sgiacomo.travaglini@arm.com
3413481Sgiacomo.travaglini@arm.com  This script extracts the version information from the configure.ac file and
3513481Sgiacomo.travaglini@arm.com  uses it to generate a header file containing the same information. The
3613481Sgiacomo.travaglini@arm.com  #defines in this header file will be included in during the generation of
3713481Sgiacomo.travaglini@arm.com  the Info.plist of the framework, giving the correct value to the version
3813481Sgiacomo.travaglini@arm.com  shown in the Finder.
3913481Sgiacomo.travaglini@arm.com
4013481Sgiacomo.travaglini@arm.com  This script makes the following assumptions (these are faults of the script,
4113481Sgiacomo.travaglini@arm.com  not problems with the Autoconf):
4213481Sgiacomo.travaglini@arm.com    1. The AC_INIT macro will be contained within the first 1024 characters
4313481Sgiacomo.travaglini@arm.com       of configure.ac
4413481Sgiacomo.travaglini@arm.com    2. The version string will be 3 integers separated by periods and will be
4513481Sgiacomo.travaglini@arm.com       surrounded by squre brackets, "[" and "]" (e.g. [1.0.1]). The first
4613481Sgiacomo.travaglini@arm.com       segment represents the major version, the second represents the minor
4713481Sgiacomo.travaglini@arm.com       version and the third represents the fix version.
4813481Sgiacomo.travaglini@arm.com    3. No ")" character exists between the opening "(" and closing ")" of
4913481Sgiacomo.travaglini@arm.com       AC_INIT, including in comments and character strings.
5013481Sgiacomo.travaglini@arm.com"""
5113481Sgiacomo.travaglini@arm.com
5213481Sgiacomo.travaglini@arm.comimport sys
5313481Sgiacomo.travaglini@arm.comimport re
5413481Sgiacomo.travaglini@arm.com
5513481Sgiacomo.travaglini@arm.com# Read the command line argument (the output directory for Version.h)
5613481Sgiacomo.travaglini@arm.comif (len(sys.argv) < 3):
5713481Sgiacomo.travaglini@arm.com  print "Usage: versiongenerate.py input_dir output_dir"
5813481Sgiacomo.travaglini@arm.com  sys.exit(1)
5913481Sgiacomo.travaglini@arm.comelse:
6013481Sgiacomo.travaglini@arm.com  input_dir = sys.argv[1]
6113481Sgiacomo.travaglini@arm.com  output_dir = sys.argv[2]
6213481Sgiacomo.travaglini@arm.com
6313481Sgiacomo.travaglini@arm.com# Read the first 1024 characters of the configure.ac file
6413481Sgiacomo.travaglini@arm.comconfig_file = open("%s/configure.ac" % input_dir, 'r')
6513481Sgiacomo.travaglini@arm.combuffer_size = 1024
6613481Sgiacomo.travaglini@arm.comopening_string = config_file.read(buffer_size)
6713481Sgiacomo.travaglini@arm.comconfig_file.close()
6813481Sgiacomo.travaglini@arm.com
6913481Sgiacomo.travaglini@arm.com# Extract the version string from the AC_INIT macro
7013481Sgiacomo.travaglini@arm.com#   The following init_expression means:
7113481Sgiacomo.travaglini@arm.com#     Extract three integers separated by periods and surrounded by squre
7213481Sgiacomo.travaglini@arm.com#     brackets(e.g. "[1.0.1]") between "AC_INIT(" and ")". Do not be greedy
7313481Sgiacomo.travaglini@arm.com#     (*? is the non-greedy flag) since that would pull in everything between
7413481Sgiacomo.travaglini@arm.com#     the first "(" and the last ")" in the file.
7513481Sgiacomo.travaglini@arm.comversion_expression = re.compile(r"AC_INIT\(.*?\[(\d+)\.(\d+)\.(\d+)\].*?\)",
7613481Sgiacomo.travaglini@arm.com                                re.DOTALL)
7713481Sgiacomo.travaglini@arm.comversion_values = version_expression.search(opening_string)
7813481Sgiacomo.travaglini@arm.commajor_version = version_values.group(1)
7913481Sgiacomo.travaglini@arm.comminor_version = version_values.group(2)
8013481Sgiacomo.travaglini@arm.comfix_version = version_values.group(3)
8113481Sgiacomo.travaglini@arm.com
8213481Sgiacomo.travaglini@arm.com# Write the version information to a header file to be included in the
8313481Sgiacomo.travaglini@arm.com# Info.plist file.
8413481Sgiacomo.travaglini@arm.comfile_data = """//
8513481Sgiacomo.travaglini@arm.com// DO NOT MODIFY THIS FILE (but you can delete it)
8613481Sgiacomo.travaglini@arm.com//
8713481Sgiacomo.travaglini@arm.com// This file is autogenerated by the versiongenerate.py script. This script
8813481Sgiacomo.travaglini@arm.com// is executed in a "Run Script" build phase when creating gtest.framework. This
8913481Sgiacomo.travaglini@arm.com// header file is not used during compilation of C-source. Rather, it simply
9013481Sgiacomo.travaglini@arm.com// defines some version strings for substitution in the Info.plist. Because of
9113481Sgiacomo.travaglini@arm.com// this, we are not not restricted to C-syntax nor are we using include guards.
9213481Sgiacomo.travaglini@arm.com//
9313481Sgiacomo.travaglini@arm.com
9413481Sgiacomo.travaglini@arm.com#define GTEST_VERSIONINFO_SHORT %s.%s
9513481Sgiacomo.travaglini@arm.com#define GTEST_VERSIONINFO_LONG %s.%s.%s
9613481Sgiacomo.travaglini@arm.com
9713481Sgiacomo.travaglini@arm.com""" % (major_version, minor_version, major_version, minor_version, fix_version)
9813481Sgiacomo.travaglini@arm.comversion_file = open("%s/Version.h" % output_dir, 'w')
9913481Sgiacomo.travaglini@arm.comversion_file.write(file_data)
10013481Sgiacomo.travaglini@arm.comversion_file.close()
101