CXX_LIBRARY_COMPILER_FLAGS = []
REACT_LIBRARY_EXTRA_COMPILER_FLAGS = []
if THIS_IS_FBOBJC:
  inherited_buck_flags = buck_flags(STATIC_LIBRARY_IOS_FLAGS)
  CXX_LIBRARY_COMPILER_FLAGS = inherited_buck_flags.combined_flags_as_dict()['compiler_flags']
  REACT_LIBRARY_EXTRA_COMPILER_FLAGS = ['-Wno-shadow', '-Wno-missing-prototypes', '-Wno-global-constructors']

def kwargs_add(base_kwargs, **new_kwargs):
  ret_kwargs = dict(base_kwargs)
  for name, add_value in new_kwargs.iteritems():
    if name in ret_kwargs:
      # Don't use +=, it will modify base_kwargs
      ret_kwargs[name] = ret_kwargs[name] + add_value
    else:
      ret_kwargs[name] = add_value
  return ret_kwargs

if THIS_IS_FBANDROID:
  include_defs('//ReactAndroid/DEFS')

  def react_library(**kwargs):
    kwargs = kwargs_add(
      kwargs,
      # We depend on JSC, support the same platforms
      supported_platforms_regex = '^android-(armv7|x86)$',
      compiler_flags = [
        '-Wno-pessimizing-move',
      ],
      deps = [
        '//xplat/folly:molly',
      ])

    cxx_library(
      name = 'bridge',
      **kwargs_add(
        kwargs,
        preprocessor_flags = [
          '-DWITH_JSC_EXTRA_TRACING=1',
          '-DWITH_JSC_MEMORY_PRESSURE=1',
          '-DWITH_REACT_INTERNAL_SETTINGS=1',
          '-DWITH_FB_MEMORY_PROFILING=1',
        ],
        deps = JSC_DEPS
      )
    )

elif THIS_IS_FBOBJC:
  def react_library(**kwargs):
    ios_library(
      name = 'bridge',
      header_path_prefix = "cxxreact",
      inherited_buck_flags = buck_flags(STATIC_LIBRARY_IOS_FLAGS),
      frameworks = [
        '$SDKROOT/System/Library/Frameworks/JavaScriptCore.framework',
      ],
      **kwargs_add(
        kwargs,
        preprocessor_flags = DEBUG_PREPROCESSOR_FLAGS,
        deps = [
          '//xplat/folly:molly',
        ]
      )
    )

cxx_library(
  name = 'module',
  force_static = True,
  compiler_flags = CXX_LIBRARY_COMPILER_FLAGS,
  exported_headers = [
    'CxxModule.h',
    'FollySupport.h',
    'JsArgumentHelpers.h',
    'JsArgumentHelpers-inl.h',
  ],
  header_namespace = 'cxxreact',
  deps = [
    '//xplat/folly:molly',
  ],
  visibility = [
    'PUBLIC',
  ],
)

cxx_library(
  name = 'samplemodule',
  soname = 'libxplat_react_module_samplemodule.so',
  srcs = ['SampleCxxModule.cpp'],
  exported_headers = ['SampleCxxModule.h'],
  header_namespace = '',
  compiler_flags = CXX_LIBRARY_COMPILER_FLAGS + [
    '-fno-omit-frame-pointer',
    '-Wall',
    '-Werror',
    '-std=c++11',
    '-fexceptions',
  ],
  deps = [
    ':module',
    '//xplat/folly:molly',
  ],
  visibility = [
    'PUBLIC',
  ],
)

react_library(
  soname = 'libreactnativefb.so',
  header_namespace = 'cxxreact',
  force_static = True,
  srcs = [
    'CxxMessageQueue.cpp',
    'CxxNativeModule.cpp',
    'Executor.cpp',
    'Instance.cpp',
    'JSCExecutor.cpp',
    'JSCHelpers.cpp',
    'JSCLegacyProfiler.cpp',
    'JSCLegacyTracing.cpp',
    'JSCMemory.cpp',
    'JSCPerfStats.cpp',
    'JSCSamplingProfiler.cpp',
    'JSCTracing.cpp',
    'JSCWebWorker.cpp',
    'MethodCall.cpp',
    'ModuleRegistry.cpp',
    'NativeToJsBridge.cpp',
    'Platform.cpp',
    'Value.cpp',
  ],
  headers = [
    'JSCLegacyProfiler.h',
    'JSCLegacyTracing.h',
    'JSCMemory.h',
    'JSCPerfStats.h',
    'JSCSamplingProfiler.h',
    'JSCTracing.h',
  ],
  exported_headers = [
    'CxxMessageQueue.h',
    'CxxNativeModule.h',
    'Executor.h',
    'ExecutorToken.h',
    'ExecutorTokenFactory.h',
    'Instance.h',
    'JSCExecutor.h',
    'JSCHelpers.h',
    'JSCWebWorker.h',
    'JSModulesUnbundle.h',
    'MessageQueueThread.h',
    'MethodCall.h',
    'ModuleRegistry.h',
    'NativeModule.h',
    'NativeToJsBridge.h',
    'noncopyable.h',
    'Platform.h',
    'SystraceSection.h',
    'Value.h',
  ],
  preprocessor_flags = [
    '-DLOG_TAG="ReactNative"',
    '-DWITH_FBSYSTRACE=1',
  ],
  compiler_flags = [
    '-Wall',
    '-fexceptions',
    '-fvisibility=hidden',
    '-frtti',
  ] + REACT_LIBRARY_EXTRA_COMPILER_FLAGS,
  deps = [
    ':module',
    '//xplat/fbsystrace:fbsystrace',
    react_native_xplat_target('microprofiler:microprofiler'),
  ],
  visibility = [ 'PUBLIC' ],
)