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

project = SM.HL2Project(builder, 'sourcemod')
project.sources += [
  'MenuStyle_Valve.cpp',
  'logic_bridge.cpp',
  'smn_entities.cpp',
  'sm_stringutil.cpp',
  'MenuVoting.cpp',
  'smn_events.cpp',
  'smn_menus.cpp',
  'CDataPack.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',
  'LibrarySys.cpp',
  'PlayerManager.cpp',
  'TimerSys.cpp',
  'CoreConfig.cpp',
  'Logger.cpp',
  'smn_halflife.cpp',
  'smn_console.cpp',
  'UserMessages.cpp',
  'MenuManager.cpp',
  'smn_core.cpp',
  'smn_hudtext.cpp',
  'smn_usermsgs.cpp',
  'MenuStyle_Base.cpp',
  'smn_keyvalues.cpp',
  'smn_vector.cpp',
  'EventManager.cpp',
  'MenuStyle_Radio.cpp',
  'sm_autonatives.cpp',
  'sm_srvcmds.cpp',
  'ConsoleDetours.cpp'
]

for sdk_name in SM.sdks:
  sdk = SM.sdks[sdk_name]
  binary_name = 'sourcemod.' + sdk.ext

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

  if sdk.name == 'csgo':
    # Protobuf 2.3 headers have some signed/unsigned compares. I believe that it's fixed in later versions, but Valve.
    if compiler.cxx.behavior == 'gcc':
      compiler.cflags += ['-Wno-sign-compare']
    compiler.cxxincludes += [
      os.path.join(sdk.path, 'common', 'protobuf-2.3.0', 'src'),
      os.path.join(sdk.path, 'public', 'engine', 'protobuf'),
      os.path.join(sdk.path, 'public', 'game', 'shared', 'csgo', 'protobuf')
    ]
  elif sdk.name == 'dota':
    compiler.cxxincludes += [
      os.path.join(sdk.path, 'common', 'protobuf-2.4.1', 'src'),
      os.path.join(sdk.path, 'public', 'engine', 'protobuf'),
      os.path.join(sdk.path, 'public', 'game', 'shared', 'protobuf'),
      os.path.join(sdk.path, 'public', 'game', 'shared', 'dota', 'protobuf')
    ]

  if builder.target_platform == 'linux':
    compiler.postlink += ['-lpthread', '-lrt']

  if sdk.name == 'csgo' or sdk.name == 'dota':
    if builder.target_platform == 'linux':
      lib_path = os.path.join(sdk.path, 'lib', 'linux32', 'release', 'libprotobuf.a')
    elif builder.target_platform == 'mac':
      lib_path = os.path.join(sdk.path, 'lib', 'osx32', 'release', 'libprotobuf.a')
    elif builder.target_platform == 'windows':
      msvc_ver = compiler.version
      vs_year = ''
      if msvc_ver == 1800:
        vs_year = '2013'
      elif msvc_ver == 1700:
        vs_year = '2012'
      elif msvc_ver == 1600:
        vs_year = '2010'
      else:
        raise Exception('Cannot find libprotobuf for MSVC version "' + compiler.version + '"')

      if 'DEBUG' in compiler.defines:
        lib_path = os.path.join(sdk.path, 'lib', 'win32', 'debug', 'vs' + vs_year, 'libprotobuf.lib')
      else:
        lib_path = os.path.join(sdk.path, 'lib', 'win32', 'release', 'vs' + vs_year, 'libprotobuf.lib')
    compiler.linkflags.insert(0, binary.Dep(lib_path))
  
  if sdk.name in ['csgo', 'dota']:
    binary.sources += ['smn_protobuf.cpp']
  else:
    binary.sources += ['smn_bitbuffer.cpp']

  if sdk.name == 'csgo':
    binary.sources += [
      os.path.join(sdk.path, 'public', 'engine', 'protobuf', 'netmessages.pb.cc'),
      os.path.join(sdk.path, 'public', 'game', 'shared', 'csgo', 'protobuf', 'cstrike15_usermessages.pb.cc'),
      os.path.join(sdk.path, 'public', 'game', 'shared', 'csgo', 'protobuf', 'cstrike15_usermessage_helpers.cpp'),
    ]
  elif sdk.name == 'dota':
    binary.sources += [
      os.path.join(sdk.path, 'public', 'engine', 'protobuf', 'networkbasetypes.pb.cc'),
      os.path.join(sdk.path, 'public', 'engine', 'protobuf', 'netmessages.pb.cc'),
      os.path.join(sdk.path, 'public', 'game', 'shared', 'protobuf', 'ai_activity.pb.cc'),
      os.path.join(sdk.path, 'public', 'game', 'shared', 'protobuf', 'usermessages.pb.cc'),
      os.path.join(sdk.path, 'public', 'game', 'shared', 'dota', 'protobuf', 'dota_commonmessages.pb.cc'),
      os.path.join(sdk.path, 'public', 'game', 'shared', 'dota', 'protobuf', 'dota_usermessages.pb.cc'),
      os.path.join(sdk.path, 'public', 'game', 'shared', 'dota', 'protobuf', 'dota_usermessage_helpers.cpp'),
    ]

SM.binaries += builder.Add(project)

