cmake_minimum_required(VERSION 3.16) project(RISCB C) set(CMAKE_C_STANDARD 23) find_package(PkgConfig REQUIRED) # Allow setting the target platform manually if (NOT DEFINED TARGET_PLATFORM) if (WIN32) set(TARGET_PLATFORM windows) elseif (UNIX) set(TARGET_PLATFORM linux) else () message(FATAL_ERROR "Unsupported platform. Please set TARGET_PLATFORM manually.") endif () endif () message(STATUS "Target platform: ${TARGET_PLATFORM}") # Detect build type and configure SDL2 paths accordingly if (TARGET_PLATFORM STREQUAL "windows") find_package(SDL2 REQUIRED) find_package(SDL2_ttf REQUIRED) include_directories(${SDL2_INCLUDE_DIRS}) link_directories(${SDL2_LIBRARY_DIRS}) add_definitions(${SDL2_CFLAGS_OTHER}) elseif (TARGET_PLATFORM STREQUAL "windows-static") # Cross-compile static Windows build using MinGW set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) set(CMAKE_FIND_ROOT_PATH /usr/local/x86_64-w64-mingw32) # Ensure static linking set(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc -static-libstdc++ -mwindows") include_directories( /usr/local/x86_64-w64-mingw32/include /usr/local/x86_64-w64-mingw32/include/SDL2 ) link_directories( /usr/local/x86_64-w64-mingw32/lib ) add_definitions(-DSDL_MAIN_HANDLED) elseif (TARGET_PLATFORM STREQUAL "mingw") # Cross-compile dynamically linked Windows build set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) find_package(SDL2 REQUIRED) find_package(SDL2_ttf REQUIRED) include_directories(${SDL2_INCLUDE_DIRS}) link_directories(${SDL2_LIBRARY_DIRS}) add_definitions(${SDL2_CFLAGS_OTHER}) elseif (TARGET_PLATFORM STREQUAL "linux") pkg_check_modules(SDL2 REQUIRED sdl2) pkg_check_modules(SDL2_TTF REQUIRED SDL2_ttf) include_directories(${SDL2_INCLUDE_DIRS}) add_definitions(${SDL2_CFLAGS_OTHER}) else () message(FATAL_ERROR "Unsupported TARGET_PLATFORM: ${TARGET_PLATFORM}") endif () # Define source files set(SOURCE_FILES main.c util/font.c util/font.h assembler/assembler.c assembler/assembler.h cpu/memory.c cpu/memory.h cpu/core.c cpu/core.h util/texteditor.c util/texteditor.h util/hexdump.c util/hexdump.h util/cpustatusui.c util/cpustatusui.h peripherals/audio.c peripherals/audio.h peripherals/peripheraldata.c peripherals/peripheraldata.h peripherals/sevenseg.c peripherals/sevenseg.h peripherals/switches.c peripherals/switches.h ) # Build the target executable add_executable(RISCB ${SOURCE_FILES}) # Link libraries if (TARGET_PLATFORM STREQUAL "windows-static") target_link_libraries(RISCB mingw32 SDL2main SDL2 SDL2_ttf freetype -static) else () target_link_libraries(RISCB SDL2 SDL2_ttf m) endif () # Cross-compile Windows executable on Unix if (UNIX AND TARGET_PLATFORM STREQUAL "windows-static") add_executable(RISCB_WIN32 ${SOURCE_FILES}) set_target_properties(RISCB_WIN32 PROPERTIES COMPILE_FLAGS "-mwindows") add_definitions(-DSDL_MAIN_HANDLED) target_link_libraries(RISCB mingw32 /usr/local/x86_64-w64-mingw32/lib/libSDL2main.a /usr/local/x86_64-w64-mingw32/lib/libSDL2.a /usr/local/x86_64-w64-mingw32/lib/libSDL2_ttf.dll.a /usr/local/x86_64-w64-mingw32/lib/libfreetype.a /usr/local/x86_64-w64-mingw32/lib/libSDL2_test.a -static setupapi rpcrt4 imm32 oleaut32 version ole32 winmm ) endif ()