cmake_minimum_required(VERSION 3.14)

project(c_examples DESCRIPTION "libmicrovmi C examples" LANGUAGES C)

set(CMAKE_C_STANDARD 99)
if (WIN32)
    set(MICROVMI_FILENAME "microvmi.dll")
else ()
    set(MICROVMI_FILENAME "libmicrovmi.so")
endif ()

# set debug build if not set
if (NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Debug")
endif ()
# CMAKE_BUILD_TYPE is used to determine cargo debug | release build
string(TOLOWER "${CMAKE_BUILD_TYPE}" CARGO_BUILD_TYPE)

if (WIN32)
    # create symlink microvmi.lib -> microvmi.dll.lib in target/debug
    # because link.exe will try to look for microvmi.lib, and cargo uses another
    # naming it seems
    file(CREATE_LINK
        # original
        microvmi.dll.lib
        # link name
        "${CMAKE_CURRENT_SOURCE_DIR}/../target/${CARGO_BUILD_TYPE}/microvmi.lib"
        RESULT LINK_RES
        SYMBOLIC
    )
endif ()


# generate libmicrovmi.h
add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/libmicrovmi.h"
    COMMAND cbindgen --config cbindgen.toml --crate microvmi --output "${CMAKE_CURRENT_BINARY_DIR}/libmicrovmi.h"
    DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/../target/${CARGO_BUILD_TYPE}/${MICROVMI_FILENAME}"
    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.."
    COMMENT "Generating libmicrovmi.h with cbindgen")

# add local libmicrovmi.so library path
link_directories(
    # microvmi.dll and mirovmi.dll.lib are located in target/<debug|release>
    "${CMAKE_CURRENT_SOURCE_DIR}/../target/${CARGO_BUILD_TYPE}"
)
# add headers path
include_directories("${CMAKE_CURRENT_BINARY_DIR}")

add_executable(mem-dump mem-dump.c "${CMAKE_CURRENT_BINARY_DIR}/libmicrovmi.h")
target_link_libraries(mem-dump PRIVATE microvmi)

add_executable(regs-dump regs-dump.c "${CMAKE_CURRENT_BINARY_DIR}/libmicrovmi.h")
target_link_libraries(regs-dump PRIVATE microvmi)

if (NOT WIN32)
    # TODO: libmicrovmi.h DriverType enum conflict with same name in winnt.h
    # disable pause example for windows
    add_executable(pause pause.c "${CMAKE_CURRENT_BINARY_DIR}/libmicrovmi.h")
    target_link_libraries(pause PRIVATE microvmi)
endif ()
