cmake_minimum_required(VERSION 3.18)
project(easy_connect VERSION 0.3.1 LANGUAGES C)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
option(EASY_CONNECT_POCKETBOOK "Build the InkView device interface" OFF)
if(EASY_CONNECT_POCKETBOOK)
  # The package carries no shared libcrypto; use the SDK's ARM static archive.
  set(OPENSSL_USE_STATIC_LIBS TRUE)
  set(CMAKE_SKIP_RPATH TRUE)
endif()
find_package(OpenSSL REQUIRED COMPONENTS Crypto)
find_package(CURL REQUIRED)
find_package(ZLIB REQUIRED)
find_package(Python3 REQUIRED COMPONENTS Interpreter)
execute_process(COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/pocketbook_platform.py
  --header ${CMAKE_CURRENT_BINARY_DIR}/ec_platform.h RESULT_VARIABLE EC_PROFILE_STATUS)
if(NOT EC_PROFILE_STATUS EQUAL 0)
  message(FATAL_ERROR "Could not generate the shared PocketBook profile")
endif()
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS config/pocketbook.json tools/pocketbook_platform.py)
add_library(ec_core src/config.c src/doctor.c src/services.c src/credentials.c src/device.c src/background.c
  src/update_manifest.c src/update_files.c src/update_package.c src/update_install.c src/update_transfer.c)
target_link_libraries(ec_core PUBLIC OpenSSL::Crypto CURL::libcurl ZLIB::ZLIB)
if(EASY_CONNECT_POCKETBOOK)
  target_link_options(ec_core INTERFACE -Wl,--exclude-libs,ALL)
endif()
target_include_directories(ec_core PUBLIC src ${CMAKE_CURRENT_BINARY_DIR})
target_compile_definitions(ec_core PRIVATE _GNU_SOURCE _FILE_OFFSET_BITS=64)
target_compile_options(ec_core PRIVATE -Wall -Wextra -Werror -Wformat=2)
add_executable(easy-connect src/main.c)
target_link_libraries(easy-connect PRIVATE ec_core)
set(EC_UI_SOURCES src/ui.c src/ui_view.c src/ui_layout.c src/ui_library.c src/ui_update.c)
if(EASY_CONNECT_POCKETBOOK)
  add_executable(easy-connect-ui ${EC_UI_SOURCES})
  find_path(INKVIEW_INCLUDE_DIR inkview.h REQUIRED)
  find_library(INKVIEW_LIBRARY inkview REQUIRED)
  target_include_directories(easy-connect-ui PRIVATE ${INKVIEW_INCLUDE_DIR})
  target_link_libraries(easy-connect-ui PRIVATE ec_core ${INKVIEW_LIBRARY})
  set_target_properties(easy-connect-ui PROPERTIES OUTPUT_NAME easy-connect.app)
endif()
include(CTest)
option(EASY_CONNECT_RUNTIME_PROBES "Build the core driver for firmware runtime tests" OFF)
if(EASY_CONNECT_RUNTIME_PROBES AND CMAKE_CROSSCOMPILING)
  add_executable(ec-runtime-test tests/core_driver.c)
  target_compile_definitions(ec-runtime-test PRIVATE _GNU_SOURCE)
  target_link_libraries(ec-runtime-test PRIVATE ec_core)
  add_executable(ec-update-runtime-test tests/update_driver.c)
  target_link_libraries(ec-update-runtime-test PRIVATE ec_core)
endif()
if(BUILD_TESTING AND NOT CMAKE_CROSSCOMPILING)
  find_package(Python3 REQUIRED COMPONENTS Interpreter)
  add_test(NAME controller COMMAND ${Python3_EXECUTABLE}
    ${CMAKE_SOURCE_DIR}/tests/test_controller.py $<TARGET_FILE:easy-connect>)
  add_executable(ec-device-test tests/test_device.c)
  target_link_libraries(ec-device-test PRIVATE ec_core)
  target_compile_options(ec-device-test PRIVATE -UNDEBUG -Wall -Wextra -Werror)
  add_test(NAME shared-device COMMAND ec-device-test)
  add_executable(ec-core-test tests/core_driver.c)
  target_compile_definitions(ec-core-test PRIVATE _GNU_SOURCE)
  target_link_libraries(ec-core-test PRIVATE ec_core)
  target_compile_options(ec-core-test PRIVATE -Wall -Wextra -Werror)
  add_test(NAME core COMMAND ${Python3_EXECUTABLE}
    ${CMAKE_SOURCE_DIR}/tests/test_core.py $<TARGET_FILE:ec-core-test>)
  add_test(NAME tools COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tests/test_tools.py)
  add_executable(ec-layout-test tests/test_ui_layout.c src/ui_layout.c)
  target_include_directories(ec-layout-test PRIVATE src)
  target_compile_options(ec-layout-test PRIVATE -Wall -Wextra -Werror)
  add_test(NAME ui-layout COMMAND ec-layout-test)
  add_executable(ec-ui-test ${EC_UI_SOURCES} tests/inkview_stub.c)
  target_compile_definitions(ec-ui-test PRIVATE EC_UI_TEST=1)
  target_include_directories(ec-ui-test PRIVATE tests/inkview)
  target_link_libraries(ec-ui-test PRIVATE ec_core)
  target_compile_options(ec-ui-test PRIVATE -Wall -Wextra -Werror)
  add_test(NAME device-ui COMMAND ${Python3_EXECUTABLE}
    ${CMAKE_SOURCE_DIR}/tests/test_ui.py $<TARGET_FILE:ec-ui-test>)
  add_executable(ec-update-test tests/update_driver.c)
  target_link_libraries(ec-update-test PRIVATE ec_core)
  target_compile_options(ec-update-test PRIVATE -Wall -Wextra -Werror)
  add_test(NAME updater COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tests/test_update.py $<TARGET_FILE:ec-update-test>)
  set_tests_properties(updater controller core tools ui-layout device-ui shared-device PROPERTIES TIMEOUT 120)
endif()
