16a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek#!/usr/bin/python
26a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek
36a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek# Copyright 2014 Google Inc.
46a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek#
56a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek# Use of this source code is governed by a BSD-style license that can be
66a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek# found in the LICENSE file.
76a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek
86a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek"""Function for generating the SkUserConfig file, customized for Android."""
96a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek
106a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenekimport os
116a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenekimport shutil
126a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek
136a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek
146a34083e9f74a45e2f79c9fab66f177809a5db66Ted KremenekAUTOGEN_WARNING = (
15339b9c27759d7b6a53e2370f83f66e78b3254595Ted Kremenek"""
166a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek///////////////////////////////////////////////////////////////////////////////
176a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek//
18867924dbeca06870573fd58d620032da6994b223Chris Lattner// THIS FILE IS AUTOGENERATED BY GYP_TO_ANDROID.PY. DO NOT EDIT.
193245a0a1c7a4fd74fca845b2edba275bb126d773Chris Lattner//
206a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek// This file contains Skia's upstream include/config/SkUserConfig.h as a
2157df3b950061c73d13d3116f747e79d7955a216aChris Lattner// reference, followed by the actual defines set for Android.
22339b9c27759d7b6a53e2370f83f66e78b3254595Ted Kremenek//
236a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek///////////////////////////////////////////////////////////////////////////////
24a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek
256a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek"""
266a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek)
279402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner
285ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris LattnerBUILD_GUARD = 'SkUserConfig_Android_DEFINED'
295ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner
305ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner
315ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattnerdef generate_user_config(original_sk_user_config, require_sk_user_config,
325ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner                         target_dir, ordered_set):
335ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner  """Generate the SkUserConfig file specific to the Android framework.
345ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner
35f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner  Android needs its #defines in its skia/include/core directory, so that other
36f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner  libraries which use Skia's headers get the right definitions. This function
37a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner  takes the existing sample version of SkUserConfig, checked into Skia, and
38a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner  appends the defines from ordered_set, which is expected to be a
395ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner  vars_dict_lib.OrderedSet containing the defines. The result is written to
4052c29081281955d3db9e11d10573b2d38f709099Chris Lattner  target_dir/SkUserConfig.h
4152c29081281955d3db9e11d10573b2d38f709099Chris Lattner
425ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner  Args:
435ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner      original_sk_user_config: Path to original SkUserConfig.h
442c78b873f4f3823ae859c15674cb3d76c8554113Chris Lattner      require_sk_user_config: If True, raise an AssertionError if
455ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner          SkUserConfig.h does not exist. Either way, if it does exist, copy it
462b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner          into the new file.
472b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner      target_dir: Directory within which the modified SkUserConfig.h will be
485ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner          written. Its name will be the same basename as
495ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner          original_sk_user_config. If None, the new file will be written to the
505ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner          working directory.
515ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner      ordered_set: A vars_dict_lib.OrderedSet, containing a list of defines to
525ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner          be appended to SkUserConfig.
535ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner
545ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner  Raises:
559402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner      AssertionError: If original_sk_user_config does not exist.
56d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar  """
57d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar
585ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner  sk_user_config_exists = os.path.exists(original_sk_user_config)
599402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  if require_sk_user_config:
609402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    assert sk_user_config_exists
619402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner
629402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  dst_filename = os.path.basename(original_sk_user_config)
639402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  if target_dir:
649402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    dst_filename = os.path.join(target_dir, dst_filename)
659402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner
669402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  with open(dst_filename, 'w') as dst:
679402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    dst.write(AUTOGEN_WARNING)
689402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner
699402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    # Copy the original exactly. This is merely for reference. Many of the
709402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    # defines written to the file below, either manually or generated from the
71d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar    # gyp files, have explanations in the original SkUserConfig.h
729402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    if sk_user_config_exists:
739402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner      with open(original_sk_user_config, 'r') as original:
749402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner        shutil.copyfileobj(original, dst)
759402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner
769402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    # Now add the defines specific to Android. Write a custom build guard to
779402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    # ensure they don't get defined more than once.
789402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    dst.write('\n// Android defines:\n')
799402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    dst.write('#ifndef ' + BUILD_GUARD + '\n')
809402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    dst.write('#define ' + BUILD_GUARD + '\n')
819402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner
829402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    # Add conditional defines manually:
839402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner
849402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    # do this build check for other tools that still read this header
859402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    dst.write('#ifdef ANDROID\n')
869402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    dst.write('    #include <utils/misc.h>\n')
879402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    dst.write('#endif\n\n')
889402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner
899402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    dst.write('#if __BYTE_ORDER == __BIG_ENDIAN\n')
90d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar    dst.write('    #define SK_CPU_BENDIAN\n')
919402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    dst.write('    #undef  SK_CPU_LENDIAN\n')
929402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    dst.write('#else\n')
939402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    dst.write('    #define SK_CPU_LENDIAN\n')
949402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    dst.write('    #undef  SK_CPU_BENDIAN\n')
959402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    dst.write('#endif\n\n')
969402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner
979402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    # Now add the defines from the gyp files.
989402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    for item in ordered_set:
995ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner      # Although our defines may have '=' in them, when written to the header
1005ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner      # there should be a space between the macro and what it replaces.
1012b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner      dst.write('#define ' + item.replace('=', ' ') + '\n')
102fa5be3617294f0e3c341f0ecb6b2076478b1b5acTed Kremenek
1036a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek    dst.write('\n#endif // ' + BUILD_GUARD + '\n')
1042b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner