# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python:
import os

project = builder.LibraryProject('sourcemod')

project.sources += [
  'MenuStyle_Valve.cpp',
  'logic_bridge.cpp',
  'smn_entities.cpp',
  'sm_stringutil.cpp',
  'MenuVoting.cpp',
  'smn_events.cpp',
  'frame_hooks.cpp',
  'smn_nextmap.cpp',
  'sourcemm_api.cpp',
  'ChatTriggers.cpp',
  'smn_player.cpp',
  'sourcemod.cpp',
  'concmd_cleaner.cpp',
  'HalfLife2.cpp',
  'NextMap.cpp',
  'ConCmdManager.cpp',
  'ConVarManager.cpp',
  'PlayerManager.cpp',
  'TimerSys.cpp',
  'CoreConfig.cpp',
  'Logger.cpp',
  'smn_halflife.cpp',
  'smn_console.cpp',
  'UserMessages.cpp',
  'MenuManager.cpp',
  'smn_hudtext.cpp',
  'smn_usermsgs.cpp',
  'MenuStyle_Base.cpp',
  'smn_keyvalues.cpp',
  'smn_vector.cpp',
  'EventManager.cpp',
  'MenuStyle_Radio.cpp',
  'sm_autonatives.cpp',
  'ConsoleDetours.cpp',
  'smn_commandline.cpp',
  'GameHooks.cpp',
]

# SDK name to shipping gamedir
pb_gamedir_map = {
  'csgo': 'csgo',
  'blade': 'berimbau',
  'mcv': 'vietnam',
}

# SDK name to source code gamedir
pb_gamesrcdir_map = {
  'csgo': 'cstrike15',
  'blade': 'berimbau',
  'mcv': 'vietnam',
}

for sdk_target in SM.sdk_targets:
  sdk = sdk_target.sdk
  cxx = sdk_target.cxx

  binary_name = 'sourcemod.' + sdk['extension']
  needs_protobuf = sdk['name'] in ['csgo', 'blade', 'mcv']

  binary = SM.HL2Config(project, builder, cxx, binary_name, sdk)
  SM.ConfigureForExtension(builder, binary.compiler)

  compiler = binary.compiler
  compiler.cxxincludes += [
    builder.sourcePath
  ]

  if needs_protobuf:
    compiler.cxxincludes += [
      os.path.join(sdk['path'], 'common', 'protobuf-2.5.0', 'src'),
      os.path.join(sdk['path'], 'public', 'engine', 'protobuf'),
      os.path.join(sdk['path'], 'public', 'game', 'shared', pb_gamedir_map[sdk['name']], 'protobuf')
    ]
  
  if compiler.like('msvc'):
    compiler.defines += ['_ALLOW_KEYWORD_MACROS']
  if cxx.target.platform == 'linux':
    compiler.postlink += ['-lpthread', '-lrt']

  if needs_protobuf:
    if compiler.target.platform == 'linux':
      if compiler.target.arch == 'x86':
        lib_path = os.path.join(sdk['path'], 'lib', 'linux32', 'release', 'libprotobuf.a')
      elif compiler.target.arch == 'x86_64':
        lib_path = os.path.join(sdk['path'], 'lib', 'linux64', 'release', 'libprotobuf.a')
      compiler.linkflags += ['-Wl,--exclude-libs=libprotobuf.a']
    elif compiler.target.platform == 'mac':
      if compiler.target.arch == 'x86':
        lib_path = os.path.join(sdk['path'], 'lib', 'osx32', 'release', 'libprotobuf.a')
      elif compiler.target.arch == 'x86_64':
        lib_path = os.path.join(sdk['path'], 'lib', 'osx64', 'release', 'libprotobuf.a')
    elif compiler.target.platform == 'windows':
      msvc_ver = compiler.version
      vs_year = ''
      platform = ''
      if compiler.target.arch == 'x86':
        platform = 'win32'
      elif compiler.target.arch == 'x86_64':
        platform = 'win64'
      
      if 1900 <= msvc_ver < 2000:
        vs_year = '2015'
      else:
        raise Exception('Cannot find libprotobuf for MSVC version "' + str(compiler.version) + '"')

      if 'DEBUG' in compiler.defines:
        lib_path = os.path.join(sdk['path'], 'lib', platform, 'debug', 'vs' + vs_year, 'libprotobuf.lib')
      else:
        lib_path = os.path.join(sdk['path'], 'lib', platform, 'release', 'vs' + vs_year, 'libprotobuf.lib')
    compiler.linkflags.insert(0, lib_path)

  if needs_protobuf:
    binary.sources += ['smn_protobuf.cpp']
  else:
    binary.sources += ['smn_bitbuffer.cpp']

  if sdk['name'] != 'blade':
    binary.sources += [
      'vprof_tool.cpp',
    ]

  if needs_protobuf:
    binary.sources += [
      os.path.join(sdk['path'], 'public', 'engine', 'protobuf', 'netmessages.pb.cc'),
      os.path.join(sdk['path'], 'public', 'game', 'shared', pb_gamedir_map[sdk['name']], 'protobuf', pb_gamesrcdir_map[sdk['name']] + '_usermessages.pb.cc'),
      os.path.join(sdk['path'], 'public', 'game', 'shared', pb_gamedir_map[sdk['name']], 'protobuf', pb_gamesrcdir_map[sdk['name']] + '_usermessage_helpers.cpp'),
    ]
    if sdk['name'] == 'mcv':
      binary.sources += [
        os.path.join(sdk['path'], 'public', 'game', 'shared', pb_gamedir_map[sdk['name']], 'protobuf', pb_gamesrcdir_map[sdk['name']] + '_gcmessages.pb.cc'),
        os.path.join(sdk['path'], 'public', 'engine', 'protobuf', 'engine_gcmessages.pb.cc'),
      ]

SM.binaries += builder.Add(project)