cmake_minimum_required(VERSION 3.14.0)
project(VideoCore VERSION 1.9)

include(cmake/verstring.cmake)
get_verstring(VERSTRING)

if(NOT TARGET devicetree)
    add_subdirectory(devicetree.resource EXCLUDE_FROM_ALL)
endif()
if(NOT TARGET unicam)
    add_subdirectory(unicam.resource EXCLUDE_FROM_ALL)
endif()

add_executable(VideoCore.card
    src/main.c
    src/mbox.c
    src/vc4.c
    src/vc6.c
    src/support.c
    src/debug.c
    src/end.c
    src/unicam.c
    src/buddyalloc.c
    src/overlay.c
    src/scanlines.c
    src/window.c
)

target_include_directories(VideoCore.card PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_compile_options(VideoCore.card PRIVATE -Os -m68040 -fomit-frame-pointer)

# VERSION_STRING and CARD_NAME come from a generated header rather than -D
# defines. The Amiga version string contains '$', spaces, ':' and parentheses,
# which do not survive cmd.exe quoting when building with Ninja on Windows -
# the compiler sees -DCARD_NAME=VideoCore.card and fails with "'VideoCore'
# undeclared". A header sidesteps the shell. Same strings, portable build.
set(CARD_NAME_STR "VideoCore.card")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/version_gen.h.in
               ${CMAKE_CURRENT_BINARY_DIR}/version_gen.h @ONLY)
target_include_directories(VideoCore.card PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
target_compile_options(VideoCore.card PRIVATE
                       -include ${CMAKE_CURRENT_BINARY_DIR}/version_gen.h)

target_link_options(VideoCore.card PRIVATE -ffreestanding -nostdlib -nostartfiles -Wl,-e,__start)
target_link_libraries(VideoCore.card devicetree amiga unicam)

install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/VideoCore.card DESTINATION VideoCore/)
