# Copyright 2012 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# main.scons for google-tv-pairing-protocol cpp library 

import os
import platform
import sys

GTEST_INCLUDES = ['%s/include' % os.environ['GTEST_DIR']]
Export('GTEST_INCLUDES')
GMOCK_INCLUDES = ['%s/include' % os.environ['GMOCK_DIR']]
Export('GMOCK_INCLUDES')
OPENSSL_INCLUDES = ['%s/include' % os.environ['OPENSSL_DIR']]
Export('OPENSSL_INCLUDES')

GTEST_LIBS = ['%s/lib/.libs' % os.environ['GTEST_DIR']]
Export('GTEST_LIBS')
GMOCK_LIBS = ['%s/lib/.libs' % os.environ['GMOCK_DIR']]
Export('GMOCK_LIBS')
OPENSSL_LIBS = [os.environ['OPENSSL_DIR']]
Export('OPENSSL_LIBS')

build_environments = []

root_env = Environment(
  tools = ['component_setup'],
  BUILD_SCONSCRIPTS = [
    'src/polo',
    'tests/polo',
  ],
  CPPPATH=['$MAIN_DIR/src'],
)

# Detect 64-bit build platform
DeclareBit('arch_64', 'Target platform is 64-bit')
DeclareBit('64bit', 'Target environment is 64-bit')
if platform.architecture()[0] == '64bit':
    root_env.SetBits('arch_64')

# Setup the linux environment
linux_env = root_env.Clone(tools = ['target_platform_linux'])

linux_env.Append(
  LINKFLAGS = ['-static', '-pthread'],
  CCFLAGS = ['-fPIC'],
)

linux_32_env = linux_env.Clone()
linux_32_env.Append(
  CCFLAGS = ['-m32'],
  LINKFLAGS = ['-m32'],
  LIBPATH = [
    #'/usr/lib32',
  ]
)

linux_dbg_32_env = linux_32_env.Clone(
  BUILD_TYPE = 'dbg',
  BUILD_TYPE_DESCRIPTION = 'Linux 32-bit Debug Build',
  tools = ['target_debug'],
)
build_environments.append(linux_dbg_32_env)


linux_opt_32_env = linux_32_env.Clone(
  BUILD_TYPE = 'opt',
  BUILD_TYPE_DESCRIPTION = 'Linux 32-bit Release Build',
  tools = ['target_optimized']
)
linux_opt_32_env.Append(
  CCFLAGS = ['-O2'],
  LINKFLAGS = ['--strip-all', '-s'],
)
build_environments.append(linux_opt_32_env)

#  Add 64-bit linux environment if supported by build platform
if linux_env.Bit('arch_64'):
  linux_64_env = linux_env.Clone()
  linux_64_env.Append(
    CCFLAGS = ['-m64'],
    LINKFLAGS = ['-m64'],
    LIBPATH = [
      #'/usr/lib64',
    ]
  )

  linux_dbg_64_env = linux_64_env.Clone(
    BUILD_TYPE = 'dbg64',
    BUILD_TYPE_DESCRIPTION = 'Linux 64-bit Debug Build',
    BUILD_GROUPS = ['default'],
    tools = ['target_debug'],
  )
  linux_dbg_64_env.SetBits('64bit')
  build_environments.append(linux_dbg_64_env)

  linux_opt_64_env = linux_64_env.Clone(
    BUILD_TYPE = 'opt64',
    BUILD_TYPE_DESCRIPTION = 'Linux 64-bit Release Build',
    tools = ['target_optimized']
  )
  linux_opt_64_env.Append(
    CCFLAGS = ['-O2'],
    LINKFLAGS = ['--strip-all'],
  )
  linux_opt_64_env.SetBits('64bit')
  build_environments.append(linux_opt_64_env)

# Mac OSX Build Environment
mac_env = root_env.Clone(tools = ['target_platform_mac'])
mac_env.Append(
  CCFLAGS = [
    '-arch', 'i386',
    '-fPIC',
  ],
  CPPDEFINES = [
    'OSX',
    'XP_MACOSX',
  ],
  FRAMEWORKS = [
    'CoreFoundation',
    'IOKit',
  ],
  LIBS = [
    'pthread',
  ],
  LINKFLAGS = [
    '-arch', 'i386',
    '-Wl,-search_paths_first',
  ],
)

mac_opt_env = mac_env.Clone(
  BUILD_TYPE = 'opt',
  BUILD_TYPE_DESCRIPTIONS = 'Mac Release Build',
)

mac_opt_env.Append(
  CCFLAGS = [
    '-O2',
  ],
  LINKFLAGS = ['--string-all', '-s'],
  tools = ['target_optimized'],
)
build_environments.append(mac_opt_env)

mac_dbg_env = mac_env.Clone(
  BUILD_TYPE = 'dbg',
  BUILD_TYPE_DESCRIPTION = 'Mac Debug Build',
)

mac_dbg_env.Append(
  CCFLAGS = ['-O0'],
  tools = ['target_debug'],
)
build_environments.append(mac_dbg_env)


# Windows Build Environment
win_env = root_env.Clone(tools = ['target_platform_windows'])

win_env.Append(
  CCFLAGS = [
    '/EHsc',
  ],
  CPPDEFINES = [
    'OS_WINDOWS',
    'WIN32',
    '_WINDOWS',
    '_WIN32_WINNT=0x0501',
    'WINVER=0x0501',
    'WIN32_LEAN_AND_MEAN',
    'GOOGLE_GLOG_DLL_DECL=',
    'NOGDI',
    'BOOST_ALL_NO_LIB',
    'BOOST_THREAD_BUILD_LIB',
    '_X86_',
    'X86',
  ],
)

# We need perl and nasm to be in the path.
if sys.platform == 'win32':
  win_env['ENV']['PATH'] = os.environ['PRESCONS_PATH']
  win_env['ENV']['INCLUDE'] = os.environ['INCLUDE']
  win_env['ENV']['LIB'] = os.environ['LIB']

win_opt_env = win_env.Clone(
  BUILD_TYPE = 'opt',
  BUILD_TYPE_DESCRIPTION = 'Windows Release Build',
)

win_opt_env.Append(
  CCFLAGS = [
    '/O1',
    '/GS',
    '/GL',
    '/MT',
  ],
  CPPDEFINES = [
    'NDEBUG',
  ],
  ARFLAGS = [
    '/LTCG',
  ],
  LINKFLAGS = [
    '/incremental:no',
    '/LTCG',
    '/opt:icf=32',
    '/opt:ref',
  ]
)
build_environments.append(win_opt_env)

win_dbg_env = win_env.Clone(
  BUILD_TYPE = 'dbg',
  BUILD_TYPE_DESCRIPTION = 'Windows Debug Build',
  BUILD_GROUPS = ['default'],
)

win_dbg_env.Append(
  CCFLAGS = [
    '/Fd$OBJ_ROOT/vc80.pdb',
    '/MTd',
    '/Od',
    '/Z7',
  ],
  CPPDEFINES = [
    'DEBUG',
    '_DEBUG',
  ],
)
build_environments.append(win_dbg_env)

BuildEnvironments(build_environments)
