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

# Append platform specific sources to a list of sources.
macro(LIBCEF_APPEND_PLATFORM_SOURCES name_of_list)
  if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin" AND ${name_of_list}_MACOSX)
    list(APPEND ${name_of_list} ${${name_of_list}_MACOSX})
  endif()
  if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND ${name_of_list}_LINUX)
    list(APPEND ${name_of_list} ${${name_of_list}_LINUX})
  endif()
  if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows" AND ${name_of_list}_WINDOWS)
    list(APPEND ${name_of_list} ${${name_of_list}_WINDOWS})
  endif()
endmacro()

set(CEF_TARGET libcef_dll_wrapper)

{{
  'prefix': 'libcef',
  'library': '${CEF_TARGET}',
  'append_macro': 'LIBCEF_APPEND_PLATFORM_SOURCES',
  'includes': [
    'includes_common',
    'includes_common_capi',
    'autogen_cpp_includes',
    'includes_capi',
    'autogen_capi_includes',
    'includes_wrapper',
    'includes_wrapper_mac:MACOSX',
    'includes_win:WINDOWS',
    'includes_win_capi:WINDOWS',
    'includes_mac:MACOSX',
    'includes_mac_capi:MACOSX',
    'includes_linux:LINUX',
    'includes_linux_capi:LINUX',
    'libcef_dll_wrapper_sources_base',
    'libcef_dll_wrapper_sources_common',
    'libcef_dll_wrapper_sources_mac:MACOSX',
    'autogen_client_side',
  ],
}}
SET_LIBRARY_TARGET_PROPERTIES(${CEF_TARGET})

# Creating the CEF wrapper library. Do not define this for dependent targets.
target_compile_definitions(${CEF_TARGET} PRIVATE -DWRAPPING_CEF_SHARED)

# Remove the default "lib" prefix from the resulting library.
set_target_properties(${CEF_TARGET} PROPERTIES PREFIX "")
