# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os
import re
import sys

def GlibMarshalEmitter(target, source, env):
  """ Inputs:
          target: unused
          source: list containing the source .list file
          env: the scons environment in which we are compiling
      Outputs:
          target: the list of targets we'll emit
          source: the list of sources we'll process"""
  output = str(source[0])
  output = output[0:output.rfind('.list')]
  target = [
    output + '.glibmarshal.c',
    output + '.glibmarshal.h'
  ]
  return target, source

def GlibMarshalGenerator(source, target, env, for_signature):
  """ Inputs:
          source: list of sources to process
          target: list of targets to generate
          env: scons environment in which we are working
          for_signature: unused
      Outputs: a list of commands to execute to generate the targets from
               the sources."""
  commands = []
  for target_file in target:
    if str(target_file).endswith('.glibmarshal.h'):
      mode_flag = '--header '
    else:
      mode_flag = '--body '
    cmd = '/usr/bin/glib-genmarshal %s --prefix=marshal ' \
          '%s > %s' % (mode_flag, str(source[0]), str(target_file))
    commands.append(cmd)
  return commands

glib_marshal_builder = Builder(generator = GlibMarshalGenerator,
                               emitter = GlibMarshalEmitter,
                               single_source = 1,
                               suffix = 'glibmarshal.c')

base_env = Environment()
base_env['BUILDERS']['GlibMarshal'] = glib_marshal_builder
for key in Split('CC CXX AR RANLIB LD NM CFLAGS CCFLAGS LINKFLAGS'):
  value = os.environ.get(key)
  if value != None:
    base_env[key] = Split(value)
pkgconfig = os.environ.get('PKG_CONFIG', 'pkg-config')

# Fix issue with scons not passing some vars through the environment.
for key in Split('PKG_CONFIG_LIBDIR PKG_CONFIG_PATH SYSROOT'):
  if os.environ.has_key(key):
    base_env['ENV'][key] = os.environ[key]

# Append these after pulling in the stuff from the environment so they
# don't get overwritten.
base_env.Append(CPPPATH=Split('. ..'))
base_env.Append(CCFLAGS=Split('-ggdb -fPIC -fno-exceptions -Wall -Werror'))
base_env.Append(LINKFLAGS=Split('-fPIC'))

SOURCES = Split('''\
  chromeos_network.cc
  marshal.glibmarshal.c
  version_check.cc
''')

env = base_env.Clone()

BASE_VER = os.environ.get('BASE_VER', '85268')

# glib and dbus environment
env.ParseConfig('%s --cflags --libs dbus-1 glib-2.0 dbus-glib-1 '
                'libchrome-%s libchromeos-%s libpcrecpp x11' %
                (pkgconfig, BASE_VER, BASE_VER))

env.GlibMarshal('marshal.glibmarshal.c', 'marshal.list')

Default(env.SharedLibrary('cros', SOURCES))

env_test = base_env.Clone()
env_test.Append(LIBS=['nss3'])

env_test.ParseConfig('%s --cflags --libs gobject-2.0 dbus-glib-1 dbus-1 '
                     'libchrome-%s nss' % (pkgconfig, BASE_VER))
env_test.Append(CCFLAGS=['-DOS_CHROMEOS'])

env_gtest = env_test.Clone()
env_gtest.Append(LIBS=['gtest'])

env_gtest_main = env_test.Clone()
env_gtest_main.Append(LIBS=['gtest', 'gtest_main'])
env_gtest_main.ParseConfig('%s --cflags --libs libchrome-%s libchromeos-%s '
                           'libpcrecpp x11' % (pkgconfig, BASE_VER, BASE_VER))

env_network_monitor = env_test.Clone()
env_network_monitor.ParseConfig('%s --cflags --libs dbus-glib-1' % pkgconfig)

env_load = base_env.Clone()
env_load.ParseConfig('%s --cflags --libs dbus-glib-1 libchrome-%s'
                     % (pkgconfig, BASE_VER))
Load = env_load.Object('load.cc')

# Tests that do require libcros.so.
tests = [
  env_network_monitor.Program('monitor_sms', ['monitor_sms.cc', Load]),
]
test_alias = Alias('test', tests)
AlwaysBuild(test_alias)

Alias('crosapi', env_load.StaticLibrary('crosapi', Load), CCFLAGS='-ggdb')
