cmake_minimum_required(VERSION 3.6.0)
set(PROJECT_NAME "webcrypto")
project(${PROJECT_NAME} LANGUAGES C CXX)

enable_language(ASM)

# Set as required by android-sources.cmake included below
set(BORINGSSL_ROOT ../third_party/boringssl/)

# Import sources as generated by tool/update-boringssl.py
# This provides variables, and requires BORINGSSL_ROOT to be set.
#  - crypto_sources
#  - crypto_sources_linux_aarch64
#  - crypto_sources_linux_arm
#  - crypto_sources_linux_ppc64le
#  - crypto_sources_linux_x86
#  - crypto_sources_linux_x86_64
include(
  ../third_party/boringssl/sources.cmake
)

# Tradeoff performance for smaller binary size, see:
# https://boringssl.googlesource.com/boringssl/+/HEAD/BUILDING.md#binary-size
add_definitions(-DOPENSSL_SMALL)

# Logic from CMakeLists.txt in BoringSSL
if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64")
  set(ARCH "x86_64")
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "amd64")
  set(ARCH "x86_64")
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64")
  if(CMAKE_SIZEOF_VOID_P EQUAL 8)
    set(ARCH "x86_64")
  else()
    set(ARCH "x86")
  endif()
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86")
  set(ARCH "x86")
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i386")
  set(ARCH "x86")
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i686")
  set(ARCH "x86")
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64")
  set(ARCH "aarch64")
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm64")
  set(ARCH "aarch64")
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm64e")
  set(ARCH "aarch64")
elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^arm*")
  set(ARCH "arm")
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "ppc64le")
  set(ARCH "ppc64le")
else()
  set(ARCH "generic")
endif()

set(PLATFORM "linux")

# If there is no assembly files disable ASM and set empty sources list
if(NOT DEFINED crypto_sources_${PLATFORM}_${ARCH})
  add_definitions(-DOPENSSL_NO_ASM)
  set(crypto_sources_${PLATFORM}_${ARCH})
endif()

add_library(
  webcrypto

  # Build a shared library
  SHARED

  # Source files
  ../src/webcrypto.c
  ../src/symbols.generated.c
  ${crypto_sources}
  ${crypto_sources_${PLATFORM}_${ARCH}}
)

target_include_directories(
  webcrypto

  PRIVATE

  ../third_party/boringssl/src/include/
)

set_target_properties(
  webcrypto

  PROPERTIES

  C_VISIBILITY_PRESET hidden
  VISIBILITY_INLINES_HIDDEN 1
  LINKER_LANGUAGE C
)

# This value is used when generating builds using this plugin, so it must
# not be changed
set(PLUGIN_NAME "webcrypto_plugin")

add_library(${PLUGIN_NAME} SHARED
  "webcrypto_plugin.cc"
)
apply_standard_settings(${PLUGIN_NAME})
set_target_properties(${PLUGIN_NAME} PROPERTIES
  CXX_VISIBILITY_PRESET hidden)
target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL)
target_include_directories(${PLUGIN_NAME} INTERFACE
  "${CMAKE_CURRENT_SOURCE_DIR}/include")
target_link_libraries(${PLUGIN_NAME} PRIVATE flutter)
target_link_libraries(${PLUGIN_NAME} PRIVATE PkgConfig::GTK)

# List of absolute paths to libraries that should be bundled with the plugin
set(webcrypto_bundled_libraries
  "$<TARGET_FILE:webcrypto>"
  PARENT_SCOPE
)
