# vim: ft=python

#  Copyright (C) 2003-2006 Sam Jansen
#
#  This program is free software; you can redistribute it and/or modify it
#  under the terms of the GNU General Public License as published by the Free
#  Software Foundation; either version 2 of the License, or (at your option)
#  any later version.
#
#  This program is distributed in the hope that it will be useful, but WITHOUT
#  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
#  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
#  more details.
#
#  You should have received a copy of the GNU General Public License along
#  with this program; if not, write to the Free Software Foundation, Inc., 59
#  Temple Place, Suite 330, Boston, MA 02111-1307 USA


def filter_globalised(target, source, env):
  """Used by the globaliser builder to remove already globalised files.

  This is required because the suffix for globalised files is still the same as
  the original files (both have .c at the end). We use '.globalised.c' to
  indicate files that have been globalised, so if the source has this string in
  it, we return empty lists to inform SCons that there is no action to be
  taken.
  """
  if len(source) > 1 or len(target) > 1:
    return ([], [])
  if str(source[0]).find('.globalised.') != -1:
    return ([], [])
  env.Depends(target, '#' + env['GLOBALISER'])
  return (target, source)

# -----------------------------------------------------------------------------
# The globaliser action is configured as follows:
#   single_source=True -- This means that if the action is given a list of
#     source files, it will be invoked once for each source file
#   emitter=filter_globalised -- This filtered out alread-globalised files. See
#     the docstring of filter_globalised
#   source_scanner=SourceFileScanner -- Use the default scanner to find
#     dependencies of the source files. This means that the source list will go
#     through the normal C dependency scanning.
globaliser_action = '$CC $CCFLAGS $GLB_CCFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS ' \
    + ' -E $SOURCE -o - | $GLOBALISER $GLB_FLAGS $GLB_LIST >$TARGET'
globaliser_builder = Builder(action=globaliser_action,
                             src_suffix='.c',
                             suffix='.globalised.c',
                             single_source=True,
                             emitter=filter_globalised,
                             source_scanner=SourceFileScanner)

default_env = Environment(GLOBALISER='./globaliser', GLB_FLAGS='-v')
default_env.Append(BUILDERS = {'Globaliser' : globaliser_builder})
Export('default_env')

SConscript('SConscript')
