Files
Carsten Teibes 48673531dd Add Nintendo Switch port (#2866)
* Initial Nintendo Switch Port

* Switch: Enable CRT shader

* Switch: Some QOL changes
- hack: make the menu accessible with "+"
- Invert Controller buttons A/B X/Y
- Enable network log only for debug builds
- Enable touchscreen mouse emulation
Also add myself to the credits in README

---------

Co-authored-by: Vadim Grigoruk <grigoruk@gmail.com>
2025-11-23 11:57:51 +01:00

255 lines
7.7 KiB
CMake

################################
# SDL2
################################
if(PREFER_SYSTEM_LIBRARIES)
find_package(SDL2)
if(SDL2_FOUND)
if(NINTENDO_SWITCH)
add_library(SDL2 ALIAS SDL2::SDL2-static)
add_library(SDL2-static ALIAS SDL2::SDL2-static)
else()
add_library(SDL2 ALIAS SDL2::SDL2)
add_library(SDL2-static ALIAS SDL2::SDL2)
endif()
message(STATUS "Use system library: SDL2")
else()
message(WARNING "System library SDL2 not found")
endif()
endif()
if(BUILD_SDL AND NOT EMSCRIPTEN AND NOT RPI AND NOT PREFER_SYSTEM_LIBRARIES)
if(WIN32)
set(HAVE_LIBC TRUE)
endif()
if(ANDROID)
include_directories(${ANDROID_NDK}/sources/android/cpufeatures)
set(SDL_STATIC_PIC ON CACHE BOOL "" FORCE)
endif()
add_subdirectory(${THIRDPARTY_DIR}/sdl2)
if(MSVC)
# CMake policy CMP0079
# This allows linking libraries to targets not built in the current directory.
cmake_policy(SET CMP0079 NEW)
target_link_libraries(SDL2 PRIVATE
libcmt.lib
libvcruntime.lib
libucrt.lib
)
endif()
endif()
################################
# SDL2 standalone cart player
################################
if(BUILD_SDL AND BUILD_PLAYER AND NOT RPI)
add_executable(player-sdl WIN32 ${CMAKE_SOURCE_DIR}/src/system/sdl/player.c)
if (FREEBSD)
target_include_directories(player-sdl PRIVATE ${SYSROOT_PATH}/usr/local/include)
target_link_directories(player-sdl PRIVATE ${SYSROOT_PATH}/usr/local/lib)
endif()
target_include_directories(player-sdl PRIVATE
${THIRDPARTY_DIR}/sdl2/include
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/src)
if(MINGW)
target_link_libraries(player-sdl PRIVATE mingw32)
target_link_options(player-sdl PRIVATE -static)
endif()
target_link_libraries(player-sdl PRIVATE tic80core SDL2main)
if(BUILD_STATIC)
target_link_libraries(player-sdl PRIVATE SDL2-static)
else()
target_link_libraries(player-sdl PRIVATE SDL2)
endif()
endif()
################################
# SDL GPU
################################
if(BUILD_SDLGPU)
set(SDLGPU_DIR ${THIRDPARTY_DIR}/sdl-gpu/src)
set(SDLGPU_SRC
${SDLGPU_DIR}/renderer_GLES_2.c
${SDLGPU_DIR}/SDL_gpu.c
${SDLGPU_DIR}/SDL_gpu_matrix.c
${SDLGPU_DIR}/SDL_gpu_renderer.c
${SDLGPU_DIR}/externals/stb_image/stb_image.c
${SDLGPU_DIR}/externals/stb_image_write/stb_image_write.c
)
if(NOT ANDROID AND NOT NINTENDO_SWITCH)
list(APPEND SDLGPU_SRC
${SDLGPU_DIR}/renderer_GLES_1.c
${SDLGPU_DIR}/renderer_GLES_3.c
${SDLGPU_DIR}/renderer_OpenGL_1.c
${SDLGPU_DIR}/renderer_OpenGL_1_BASE.c
${SDLGPU_DIR}/renderer_OpenGL_2.c
${SDLGPU_DIR}/renderer_OpenGL_3.c
${SDLGPU_DIR}/renderer_OpenGL_4.c
${SDLGPU_DIR}/SDL_gpu_shapes.c
${SDLGPU_DIR}/externals/glew/glew.c
)
endif()
add_library(sdlgpu STATIC ${SDLGPU_SRC})
if(EMSCRIPTEN OR ANDROID OR NINTENDO_SWITCH)
target_compile_definitions(sdlgpu PRIVATE GLEW_STATIC SDL_GPU_DISABLE_GLES_1 SDL_GPU_DISABLE_GLES_3 SDL_GPU_DISABLE_OPENGL)
else()
target_compile_definitions(sdlgpu PRIVATE GLEW_STATIC SDL_GPU_DISABLE_GLES SDL_GPU_DISABLE_OPENGL_3 SDL_GPU_DISABLE_OPENGL_4)
endif()
target_include_directories(sdlgpu PUBLIC ${THIRDPARTY_DIR}/sdl-gpu/include)
target_include_directories(sdlgpu PRIVATE ${THIRDPARTY_DIR}/sdl-gpu/src/externals/glew)
target_include_directories(sdlgpu PRIVATE ${THIRDPARTY_DIR}/sdl-gpu/src/externals/glew/GL)
target_include_directories(sdlgpu PRIVATE ${THIRDPARTY_DIR}/sdl-gpu/src/externals/stb_image)
target_include_directories(sdlgpu PRIVATE ${THIRDPARTY_DIR}/sdl-gpu/src/externals/stb_image_write)
if(WIN32)
target_link_libraries(sdlgpu opengl32)
endif()
if(LINUX)
target_link_libraries(sdlgpu GL)
endif()
if(APPLE)
find_library(OPENGL_LIBRARY OpenGL)
target_link_libraries(sdlgpu ${OPENGL_LIBRARY})
endif()
if(ANDROID)
find_library( ANDROID_LOG_LIBRARY log )
find_library( ANDROID_GLES2_LIBRARY GLESv2 )
find_library( ANDROID_GLES1_LIBRARY GLESv1_CM )
target_link_libraries(sdlgpu
${ANDROID_LOG_LIBRARY}
${ANDROID_GLES2_LIBRARY}
${ANDROID_GLES1_LIBRARY}
)
endif()
if(NINTENDO_SWITCH)
find_package(PkgConfig REQUIRED)
pkg_search_module(GLES2 glesv2 REQUIRED IMPORTED_TARGET)
target_link_libraries(sdlgpu PkgConfig::GLES2)
endif()
if(NOT EMSCRIPTEN)
if(BUILD_STATIC)
target_link_libraries(sdlgpu SDL2-static)
else()
target_link_libraries(sdlgpu SDL2)
endif()
endif()
endif()
################################
# TIC-80 app
################################
if(BUILD_SDL)
set(TIC80_SRC src/system/sdl/main.c)
if(WIN32)
configure_file("${PROJECT_SOURCE_DIR}/build/windows/tic80.rc.in" "${PROJECT_SOURCE_DIR}/build/windows/tic80.rc")
set(TIC80_SRC ${TIC80_SRC} "${PROJECT_SOURCE_DIR}/build/windows/tic80.rc")
add_executable(${TIC80_TARGET} ${SYSTEM_TYPE} ${TIC80_SRC})
elseif(ANDROID)
set(TIC80_SRC ${TIC80_SRC} ${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c)
add_library(${TIC80_TARGET} SHARED ${TIC80_SRC})
else()
add_executable(${TIC80_TARGET} ${TIC80_SRC})
endif()
if(MINGW)
target_link_libraries(${TIC80_TARGET} mingw32)
target_link_options(${TIC80_TARGET} PRIVATE -static -mconsole)
endif()
if(EMSCRIPTEN)
set_target_properties(${TIC80_TARGET} PROPERTIES LINK_FLAGS "-s WASM=1 -s USE_SDL=2 -s ALLOW_MEMORY_GROWTH=1 -s FETCH=1 --pre-js ${CMAKE_SOURCE_DIR}/build/html/prejs.js -lidbfs.js")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s USE_SDL=2")
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s ASSERTIONS=1")
endif()
elseif(NOT ANDROID)
target_link_libraries(${TIC80_TARGET} SDL2main)
endif()
target_link_libraries(${TIC80_TARGET} tic80studio)
if(BUILD_TOUCH_INPUT)
target_compile_definitions(${TIC80_TARGET} PRIVATE TOUCH_INPUT_SUPPORT)
endif()
if (FREEBSD)
target_include_directories(${TIC80_TARGET} PRIVATE ${SYSROOT_PATH}/usr/local/include)
target_link_directories(${TIC80_TARGET} PRIVATE ${SYSROOT_PATH}/usr/local/lib)
endif()
if(RPI)
target_include_directories(${TIC80_TARGET} PRIVATE ${SYSROOT_PATH}/usr/local/include/SDL2)
target_link_directories(${TIC80_TARGET} PRIVATE ${SYSROOT_PATH}/usr/local/lib ${SYSROOT_PATH}/opt/vc/lib)
target_compile_definitions(${TIC80_TARGET} PRIVATE __RPI__)
endif()
if(BUILD_SDLGPU)
target_link_libraries(${TIC80_TARGET} sdlgpu)
else()
if(EMSCRIPTEN)
elseif(RPI)
target_link_libraries(${TIC80_TARGET} libSDL2.a bcm_host pthread)
else()
if(BUILD_STATIC)
target_link_libraries(${TIC80_TARGET} SDL2-static)
else()
target_link_libraries(${TIC80_TARGET} SDL2)
endif()
endif()
endif()
if(LINUX)
configure_file("${PROJECT_SOURCE_DIR}/build/linux/tic80.desktop.in" "${PROJECT_SOURCE_DIR}/build/linux/tic80.desktop")
install(TARGETS ${TIC80_TARGET} DESTINATION bin)
SET(TIC80_DESKTOP_DIR "share/applications/")
SET(TIC80_MIME_DIR "share/mime/packages/")
SET(TIC80_PIXMAPS_DIR "share/icons/")
install (FILES ${PROJECT_SOURCE_DIR}/build/linux/tic80.desktop DESTINATION ${TIC80_DESKTOP_DIR})
install (FILES ${PROJECT_SOURCE_DIR}/build/linux/tic80.xml DESTINATION ${TIC80_MIME_DIR})
install (FILES ${PROJECT_SOURCE_DIR}/build/linux/tic80.png DESTINATION ${TIC80_PIXMAPS_DIR})
endif()
endif()