cmake_minimum_required(VERSION 3.20) project(NXST LANGUAGES CXX VERSION 0.1.0 ) # ── C++ standard and flags ──────────────────────────────────────────────────── # Arch/linker/libnx flags are already injected by the Switch.cmake toolchain. set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS ON) # gnu++17 add_compile_options( -fno-rtti -fno-exceptions -O2 -g -D_GNU_SOURCE=1 ) # Export compilation database (enables clangd / clang-tidy on the host) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # ── Sources ─────────────────────────────────────────────────────────────────── file(GLOB_RECURSE NXST_SOURCES src/app/*.cpp src/domain/*.cpp src/infra/net/*.cpp src/infra/fs/*.cpp src/infra/sys/*.cpp src/service/*.cpp src/ui/*.cpp ) add_executable(NXST ${NXST_SOURCES}) # ── Include paths ───────────────────────────────────────────────────────────── target_include_directories(NXST PRIVATE include) # ── pkg-config (uses aarch64-none-elf-pkg-config set by Switch.cmake) ───────── find_package(PkgConfig REQUIRED) set(NXST_PKG_MODULES SDL2_ttf SDL2_gfx SDL2_image SDL2_mixer freetype2 harfbuzz minizip libpng libjpeg libwebp glesv2 egl glapi zlib ) pkg_check_modules(PORTLIBS REQUIRED IMPORTED_TARGET ${NXST_PKG_MODULES}) target_include_directories(NXST PRIVATE ${PORTLIBS_INCLUDE_DIRS}) # ── Plutonium ───────────────────────────────────────────────────────────────── include(ExternalProject) set(LIBPU_A ${CMAKE_SOURCE_DIR}/lib/Plutonium/lib/libpu.a) ExternalProject_Add(plutonium_ep SOURCE_DIR ${CMAKE_SOURCE_DIR}/lib/Plutonium CONFIGURE_COMMAND "" BUILD_COMMAND make -j -C ${CMAKE_SOURCE_DIR}/lib/Plutonium INSTALL_COMMAND "" BUILD_IN_SOURCE 1 BUILD_BYPRODUCTS ${LIBPU_A} ) add_library(plutonium STATIC IMPORTED GLOBAL) add_dependencies(plutonium plutonium_ep) set_target_properties(plutonium PROPERTIES IMPORTED_LOCATION ${LIBPU_A} INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/lib/Plutonium/include ) # ── Link libraries ──────────────────────────────────────────────────────────── # Order matters for static linking: put most dependent libs first. # drm_nouveau, harfbuzz, freetype, z appended explicitly after pkg-config output # to fix the freetype→harfbuzz static link order (see build notes from libnx update). target_link_libraries(NXST PRIVATE plutonium PkgConfig::PORTLIBS drm_nouveau harfbuzz freetype z ) # ── NACP + NRO ──────────────────────────────────────────────────────────────── set(NXST_NACP ${CMAKE_CURRENT_BINARY_DIR}/NXST.nacp) nx_generate_nacp( OUTPUT ${NXST_NACP} NAME "NXST" AUTHOR "DragonSpirit" VERSION "04.26.2026" ) nx_create_nro(NXST OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/NXST.nro ICON ${CMAKE_SOURCE_DIR}/icon.png NACP ${NXST_NACP} ) # ── Convenience targets ──────────────────────────────────────────────────────── find_program(NXLINK_EXE nxlink HINTS ${DEVKITPRO}/tools/bin) if(NXLINK_EXE) add_custom_target(send COMMAND ${NXLINK_EXE} ${CMAKE_CURRENT_BINARY_DIR}/NXST.nro DEPENDS NXST_nro COMMENT "Sending NXST.nro via nxlink" ) add_custom_target(debug COMMAND ${NXLINK_EXE} -s ${CMAKE_CURRENT_BINARY_DIR}/NXST.nro DEPENDS NXST_nro COMMENT "Sending NXST.nro with stdio bridge" ) endif()