# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.
add_link_options(LINKER:--build-id=none)

cmake_minimum_required(VERSION 3.18.1)
project("vice")

add_definitions(-DIDE_COMPILE -DHAVE_UNISTD_H -DANDROID_COMPILE -DUNIX_COMPILE -DVIC_DUPLICATES_PIXELS -DHAVE_COMMON_SO -DCONFIG_VERSION=\"master\" -DDUMP_LEAKS )
add_compile_options(-funwind-tables)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-builtin-macro-redefined -D'__FILE__=__FILE_NAME__'")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-builtin-macro-redefined -D'__FILE__=__FILE_NAME__'")

set (RELEASE_COMPILE_OPTIONS -O3 -fno-signed-zeros -freciprocal-math -menable-unsafe-fp-math )

# Declares and names the project.
set(ROOT .)


include_directories (
        ${ROOT}
        ${ROOT}/arch/android/jnibindings
        ${ROOT}/arch/android/soundarch
        ${ROOT}/arch/android/oboe/include
        ${ROOT}/arch/shared
        ${ROOT}/arch/android
        ${ROOT}/c128
        ${ROOT}/c64
        ${ROOT}/c64dtv
        ${ROOT}/c64/cart
        ${ROOT}/core
        ${ROOT}/raster
        ${ROOT}/datasette
        ${ROOT}/drive
        ${ROOT}/drive/iec
        ${ROOT}/drive/iec/c64exp
        ${ROOT}/drive/ieee
        ${ROOT}/drive/tcbm
        ${ROOT}/lib/p64
        ${ROOT}/video
        ${ROOT}/vdrive
        ${ROOT}/imagecontents
        ${ROOT}/userport
        ${ROOT}/platform
        ${ROOT}/monitor
        ${ROOT}/fsdevice
        ${ROOT}/tapeport
        ${ROOT}/joyport
        ${ROOT}/tape
        ${ROOT}/vic20
        ${ROOT}/vic20/cart
        ${ROOT}/gen
        ${ROOT}/rs232drv
        ${ROOT}/platform
        ${ROOT}/imagecontents
        ${ROOT}/vdrive
        ${ROOT}/lib/p64
        ${ROOT}/platform
        ${ROOT}/diskimage
        ${ROOT}/c64/cart
        ${ROOT}/joyport
        ${ROOT}/drive
        ${ROOT}/rtc
        ${ROOT}/sid
        ${ROOT}/diag
        ${ROOT}/samplerdrv
        ${ROOT}/vicii
        ${ROOT}/crtc
        ${ROOT}/arch/android/jnibindings
        ${ROOT}/quickjs
        ${ROOT}/vdc
)

file (GLOB fastfiles ${ROOT}/resid/*.cc ${ROOT}/sid/resid.cc ${ROOT}/raster/*.c ${ROOT}/video/*.c
        ${ROOT}/sid.c ${ROOT}/sid/*.c)

add_library(
            fast
            STATIC
            ${fastfiles}
            )


target_compile_options(fast PRIVATE
        "$<$<CONFIG:RELEASE>:${RELEASE_COMPILE_OPTIONS}>"
        "$<$<CONFIG:DEBUG>:${RELEASE_COMPILE_OPTIONS}>"
        )

target_compile_definitions(fast PRIVATE
        "$<$<CONFIG:DEBUG>:DEBUG>"
)



target_link_options(fast PRIVATE
        "$<$<CONFIG:RELEASE>:LINKER:${RELEASE_COMPILE_OPTIONS}>"
        )

file(GLOB basefiles ${ROOT}/*.c)
file(GLOB ignorebasefiles ${ROOT}/c1541.c ${ROOT}/mainc64cpu.c ${ROOT}/mainviccpu.c
        ${ROOT}/translate_text.c ${ROOT}/bin2c.c ${ROOT}/cartconv.c ${ROOT}/petcat.c
        ${ROOT}/piacore.c ${ROOT}/ps2mouse.c ${ROOT}/usleep.c ${ROOT}/*core.c ${ROOT}/maincpu.c ${ROOT}/info.c)
list (REMOVE_ITEM basefiles ${ignorebasefiles})
file(GLOB machine_specific_files ${ROOT}/main.c ${ROOT}/machine/*.c)
list (REMOVE_ITEM basefiles ${machine_specific_files})

file(GLOB sources
        ${ROOT}/arch/android/*.c
        ${ROOT}/arch/android/*.cpp
        ${ROOT}/arch/android/soundarch/*.cpp ${ROOT}/arch/android/soundarch/*.c
        ${ROOT}/arch/shared/*.c
        ${ROOT}/arch/shared/*.cpp
        ${ROOT}/core/*.c
        ${ROOT}/datasette/*.c
        ${ROOT}/diag/*.c
        ${ROOT}/diskimage/*.c
        ${ROOT}/drive/*.c
        ${ROOT}/drive/iec/*.c
        ${ROOT}/drive/iec/c64exp/*.c
        ${ROOT}/drive/iecieee/*.c
        ${ROOT}/drive/ieee/*.c
        ${ROOT}/drive/tcbm/*.c
        ${ROOT}/fileio/*.c
        ${ROOT}/fsdevice/*.c
        ${ROOT}/iecbus/*.c
        ${ROOT}/imagecontents/*.c
        ${ROOT}/joyport/*.c
        ${ROOT}/lib/*.c
        ${ROOT}/monitor/*.c
        ${ROOT}/lib/p64/*.c
        ${ROOT}/parallel/*c
        ${ROOT}/platform/*.c
        ${ROOT}/printerdrv/*.c
        ${ROOT}/rs232drv/*.c
        ${ROOT}/rtc/*.c
        ${ROOT}/samplerdrv/*.c
        ${ROOT}/serial/*.c
        ${ROOT}/sid/*.c
        ${ROOT}/sounddrv/sounddummy.c ${ROOT}/sounddrv/sounddump.c ${ROOT}/sounddrv/soundfs.c ${ROOT}/sounddrv/soundiff.c
        ${ROOT}/sounddrv/soundmovie.c ${ROOT}/sounddrv/soundwav.c ${ROOT}/sounddrv/soundaiff.c ${ROOT}/sounddrv/soundvoc.c
        ${ROOT}/tape/*.c
        ${ROOT}/tapeport/*.c
        ${ROOT}/userport/*.c
        ${ROOT}/vdrive/*.c
        ${ROOT}/gfxoutputdrv/*.c
        ${basefiles}
        )

file (GLOB gfixignorefiles
        ${ROOT}/gfxoutputdrv/ffmpegdrv.c ${ROOT}/gfxoutputdrv/ffmpeglib.c
        ${ROOT}/gfxoutputdrv/gifdrv.c ${ROOT}/gfxoutputdrv/jpegdrv.c
        ${ROOT}/gfxoutputdrv/pngdrv.c ${ROOT}/gfxoutputdrv/quicktimedrv.c)

list (REMOVE_ITEM sources ${gfixignorefiles})

file(GLOB quickjs ./quickjs/quickjs.c ./quickjs/libregexp.c ./quickjs/libunicode.c ./quickjs/cutils.c ./quickjs/quickjs-libc.c ./libbf/libbf.c)

add_library(
        viceshared
        SHARED
        ${sources}
        ${quickjs}
)

target_compile_options(viceshared PRIVATE
        "$<$<CONFIG:RELEASE>:${RELEASE_COMPILE_OPTIONS}>"
)

target_compile_definitions(viceshared PRIVATE
        "$<$<CONFIG:DEBUG>:DEBUG>"
)

target_link_options(viceshared PRIVATE
        "$<$<CONFIG:RELEASE>:LINKER:${RELEASE_COMPILE_OPTIONS}>"
)

target_link_libraries(viceshared oboe::oboe jnigraphics log fast)

file (GLOB c64files ${ROOT}/c64/*.c ${ROOT}/arch/android/machine/*.c)
file (GLOB ignorec64files  ${ROOT}/c64/vsid*c ${ROOT}/c64/c64memsc.c ${ROOT}/c64/c64scmodel.c ${ROOT}/c64/psid.c)
list (REMOVE_ITEM c64files ${ignorec64files})

file (GLOB viciifiles ${ROOT}/vicii/*.c ${ROOT}/arch/android/machine/*.c)
file (GLOB viciiignorefiles ${ROOT}/vicii/*dtv*.c ${ROOT}/vicii/vicii-clock-stretch.c)
list (REMOVE_ITEM viciifiles ${viciiignorefiles})

file (GLOB c64cartfiles ${ROOT}/c64/cart/*.c)

add_library(
        x64
        SHARED
        ${c64files}
        ${machine_specific_files}
        ${c64cartfiles}
        ${viciifiles}
)

target_compile_options(x64 PRIVATE
        "$<$<CONFIG:RELEASE>:${RELEASE_COMPILE_OPTIONS}>"
)
target_compile_definitions(x64 PRIVATE
        "$<$<CONFIG:DEBUG>:DEBUG>"
)

target_link_options(x64 PRIVATE
        "$<$<CONFIG:RELEASE>:LINKER:${RELEASE_COMPILE_OPTIONS}>"
)

target_link_libraries(x64 viceshared)

file (GLOB c128files
        ${ROOT}/c128/*.c
        ${ROOT}/arch/android/machine/*.c
        ${ROOT}/vdc/*.c
        ${ROOT}/vicii/vicii-clock-stretch.c
        ${ROOT}/drive/iec128dcr/*.c

)

file (GLOB ignorec128files
        ${ROOT}/c128/z80vms.c
        ${ROOT}/c64/c64-resources.c
        ${ROOT}/c64/c64.c
        ${ROOT}/c64/c64_256k.c
        ${ROOT}/c64/c64cia1.c
        ${ROOT}/c64/c64cpu.c
        ${ROOT}/c64/c64drive.c
        ${ROOT}/c64/c64fastiec.c
        ${ROOT}/c64/c64mem.c
        ${ROOT}/c64/c64memlimit.c
        ${ROOT}/c64/c64rom.c
        ${ROOT}/c64/c64romset.c
        ${ROOT}/c64/c64video.c
        ${ROOT}/c64/plus256k.c
        ${ROOT}/c64/plus60k.c
        ${ROOT}/c64/cart/daa.c
        ${ROOT}/c64/c64-cmdline-options.c
        ${ROOT}/c64/c64-memory-hacks.c
        ${ROOT}/c64/c64-snapshot.c
        ${ROOT}/c64/c64memsnapshot.c
        ${ROOT}/c64/patchrom.c
)

file (GLOB ignore128cartfiles
        ${ROOT}/c64/cart/daa.c
)

list (APPEND c128files ${c64files})
list (REMOVE_ITEM c128files ${ignorec128files})

list (APPEND c128cartfiles ${c64cartfiles})
list (REMOVE_ITEM c128cartfiles ${ignore128cartfiles})

add_library(
        x128
        SHARED
        ${c128files}
        ${viciifiles}
        ${c128cartfiles}
        ${machine_specific_files}
)

target_compile_options(x128 PRIVATE
        "$<$<CONFIG:RELEASE>:${RELEASE_COMPILE_OPTIONS}>"
)

target_compile_definitions(x128 PRIVATE
        "$<$<CONFIG:DEBUG>:DEBUG>"
)

target_link_options(x128 PRIVATE
        "$<$<CONFIG:RELEASE>:LINKER:${RELEASE_COMPILE_OPTIONS}>"
)

target_link_libraries(x128 viceshared)

file (GLOB petfiles ${ROOT}/pet/*.c ${ROOT}/crtc/*.c ${ROOT}/arch/android/machine/*.c)

add_library(
        xpet
        SHARED
        ${petfiles}
        ${machine_specific_files}
)

target_compile_options(xpet PRIVATE
        "$<$<CONFIG:RELEASE>:${RELEASE_COMPILE_OPTIONS}>"
)

target_compile_definitions(xpet PRIVATE
        "$<$<CONFIG:DEBUG>:DEBUG>"
)

target_link_options(xpet PRIVATE
        "$<$<CONFIG:RELEASE>:LINKER:${RELEASE_COMPILE_OPTIONS}>"
)

target_link_libraries(xpet viceshared)

file (GLOB vic20files ${ROOT}/vic20/*.c ${ROOT}/vic20/cart/*.c ${ROOT}/arch/android/machine/*.c)

add_library(
        xvic20
        SHARED
        ${vic20files}
        ${machine_specific_files}
        ${ROOT}/c64/cart/sfx_soundexpander.c
        ${ROOT}/c64/cart/sfx_soundsampler.c
        ${ROOT}/c64/cart/c64acia1.c
        ${ROOT}/c64/cart/digimax.c
        ${ROOT}/c64/cart/georam.c
        ${ROOT}/c64/cart/ds12c887rtc.c
)

target_compile_options(xvic20 PRIVATE
        "$<$<CONFIG:RELEASE>:${RELEASE_COMPILE_OPTIONS}>"
)

target_compile_definitions(xvic20 PRIVATE
        "$<$<CONFIG:DEBUG>:DEBUG>"
)


target_link_options(xvic20 PRIVATE
        "$<$<CONFIG:RELEASE>:LINKER:${RELEASE_COMPILE_OPTIONS}>"
)

target_link_libraries(xvic20 viceshared)



find_package (oboe REQUIRED CONFIG)

file(GLOB jnibindingfiles ${ROOT}/arch/android/jnibindings/*.c)

add_library(
        jni
        MODULE
        ${jnibindingfiles}
)



#find_library( log-lib log)
target_link_libraries(jni
        android
        jnigraphics
        log)
