nshell/CMakeLists.txt

139 lines
2.8 KiB
CMake

# Configure with [fxsdk build-fx] or [fxsdk build-cg], which provide the
# toolchain file and module path of the fxSDK
cmake_minimum_required(VERSION 3.18)
# replace this with your project's name
project(unshell C ASM)
include(GenerateG1A)
include(GenerateG3A)
include(Fxconv)
find_package(Gint 2.6.0 REQUIRED)
# include directories, put your .h files in those folders
include_directories(include)
include_directories(wren/include)
include_directories("${FXSDK_COMPILER_INSTALL}/include/openlibm")
# source files
set(SOURCES
src/main.c
src/term.c
src/ui.c
src/battery.c
src/syscalls.S
src/job.c
src/wren_utils.c
src/utf8.c
src/vfs/vfs.c
)
set(SOURCES_WREN
wren/src/wren_compiler.c
wren/src/wren_core.c
wren/src/wren_debug.c
wren/src/wren_primitive.c
wren/src/wren_utils.c
wren/src/wren_value.c
wren/src/wren_vm.c
wren/src/wren_opt_meta.c
wren/src/wren_opt_random.c
)
set(SOURCES_PRINTF
src/printf.c
)
# shared assets
set(ASSETS
# ...
)
# fx-9860G-only assets (monochrome)
set(ASSETS_fx
assets-fx/example.png
# ...
)
# fx-CG-50-only assets (polychrome)
set(ASSETS_cg
assets-cg/example.png
assets-cg/uf5x7
# ...
)
# Compile flags
set(FLAGS
# C standard, other values: c89, c99
-std=c11
# general warnings
-Wall -Wextra -pedantic
# enable this flag to stop compilation on warnings
#-Werror
# specific warnings
# variable shadowing
-Wshadow
# switch/case safety
-Wswitch-default -Wswitch-enum
# unreachable code, bad 99% of the time
-Wunreachable-code
# prototypes warnings
-Wstrict-prototypes -Wmissing-prototypes
# function declaration
-Werror-implicit-function-declaration
-fstack-protector
# optimisation level
# -Os: like -O2 without space-expensive optimizations
# -O2: good speed/size tradeoff
# -O3: gotta go fast
-Os
-m4a-nofpu
-flto -ffat-lto-objects
)
set(FLAGS_WREN
-std=c11
-Os
-m4a-nofpu
-flto -ffat-lto-objects
)
set(FLAGS_PRINTF
-std=c11
-Ofast
-m4a-nofpu
-flto -ffat-lto-objects
)
set(CMAKE_ASM_FLAGS "-x assembler-with-cpp")
add_link_options(
-flto
-Wl,--print-memory-usage
)
add_library(Printf ${SOURCES_PRINTF})
target_compile_options(Printf PRIVATE ${FLAGS_PRINTF})
add_library(Wren ${SOURCES_WREN})
target_compile_options(Wren PRIVATE ${FLAGS_WREN})
target_link_libraries(Wren Printf Gint::Gint)
fxconv_declare_assets(${ASSETS} ${ASSETS_fx} ${ASSETS_cg} WITH_METADATA)
add_executable(Main ${SOURCES} ${ASSETS} ${ASSETS_${FXSDK_PLATFORM}})
target_compile_options(Main PRIVATE ${FLAGS})
target_link_libraries(Main Printf Wren Gint::Gint)
if("${FXSDK_PLATFORM_LONG}" STREQUAL fx9860G)
generate_g1a(
TARGET Main
OUTPUT "${PROJECT_NAME}.g1a"
NAME "${PROJECT_NAME}"
ICON assets-fx/icon.png)
elseif("${FXSDK_PLATFORM_LONG}" STREQUAL fxCG50)
generate_g3a(
TARGET Main
OUTPUT "${PROJECT_NAME}.g3a"
NAME "${PROJECT_NAME}"
ICONS assets-cg/icon-uns.png assets-cg/icon-sel.png)
endif()