cmake_minimum_required(VERSION 3.16)
project(canokey-qemu C)
include(GNUInstallDirs)

set(CMAKE_C_STANDARD 11)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -fno-omit-frame-pointer")

option(QEMU_DEBUG_OUTPUT "Control ENABLE_DEBUG_OUTPUT in core" OFF)

set(VIRTCARD ON CACHE BOOL "Enable VIRTCARD in core" FORCE)
set(ENABLE_DUMB_DONGLE ON CACHE BOOL "Skip user-presence tests in core" FORCE)
if(NOT QEMU_DEBUG_OUTPUT)
    set(ENABLE_DEBUG_OUTPUT OFF CACHE BOOL "Disable ENABLE_DEBUG_OUTPUT in core" FORCE)
endif()
set(USBD_PRODUCT_STRING "CanoKey QEMU")
add_subdirectory(canokey-core EXCLUDE_FROM_ALL)

set(LIBCANOKEY_QEMU_SO_VERSION 1)
set(LIBCANOKEY_QEMU_PREFIX ${CMAKE_INSTALL_PREFIX})
set(LIBCANOKEY_QEMU_LIBDIR ${CMAKE_INSTALL_LIBDIR})
set(LIBCANOKEY_QEMU_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR})

set(QEMU_VIRT_SRCS
    canokey-core/virt-card/device-sim.c
    canokey-core/virt-card/fabrication.c
    canokey-core/littlefs/bd/lfs_filebd.c
)
file(GLOB_RECURSE SRC Src/*.c)

if(APPLE)
    add_library(canokey-qemu STATIC ${SRC} ${QEMU_VIRT_SRCS})
else()
    add_library(canokey-qemu SHARED ${SRC} ${QEMU_VIRT_SRCS})
endif()
set_target_properties(canokey-qemu PROPERTIES
    PUBLIC_HEADER Inc/canokey-qemu.h
    SOVERSION ${LIBCANOKEY_QEMU_SO_VERSION}
)
target_include_directories(canokey-qemu SYSTEM PRIVATE Inc canokey-core/virt-card canokey-core)
target_compile_definitions(canokey-qemu PRIVATE HW_VARIANT_NAME="CanoKey QEMU")
target_link_libraries(canokey-qemu PRIVATE canokey-core)
add_dependencies(canokey-qemu gitrev)

install(TARGETS canokey-qemu
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)

if(APPLE)
    configure_file(canokey-qemu_mac.pc.in canokey-qemu.pc @ONLY)
    install(FILES
        ${CMAKE_BINARY_DIR}/canokey-core/canokey-crypto/libcanokey-crypto.a
        ${CMAKE_BINARY_DIR}/canokey-core/canokey-crypto/tf-psa-crypto/core/libtfpsacrypto.a
        ${CMAKE_BINARY_DIR}/canokey-core/libcanokey-core.a
        DESTINATION ${CMAKE_INSTALL_LIBDIR}
    )
else()
    configure_file(canokey-qemu.pc.in canokey-qemu.pc @ONLY)
endif()
install(FILES ${CMAKE_BINARY_DIR}/canokey-qemu.pc
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
)
