mirror of
https://git.planet-casio.com/Vhex-Kernel-Core/fxlibc.git
synced 2024-12-28 20:43:38 +01:00
09610f59de
This was due to the few base __scanf() functions, used by strto*() and co. to share their framework with scanf() specifiers, being in the main scanf() file. Not sure why it ended up pulling the entire file even with LTO, but now that it's separate there's no issue anymore. Pulling in the entirety of scanf() is mostly expensive because it contains specifiers(), including strtod(), which itself computes on floating point numbers, leading to many libm functions being linked in, some of them with their internal data tables. In the end you'd call atoi() and get a 24-kB size increase. Which is not ✨great✨ :)
327 lines
7.9 KiB
CMake
327 lines
7.9 KiB
CMake
cmake_minimum_required(VERSION 3.15)
|
|
project(FxLibc VERSION 1.5.1 LANGUAGES C ASM)
|
|
|
|
set(CMAKE_INSTALL_MESSAGE LAZY)
|
|
|
|
# Options
|
|
# * -DFXLIBC_TARGET=<vhex-sh, vhex-x86, casiowin-fx, casiowin-cg, gint>
|
|
|
|
set(TARGET_FOLDERS ${FXLIBC_TARGET})
|
|
# Install paths
|
|
set(LIBDIR "lib")
|
|
set(INCDIR "include")
|
|
|
|
if(FXLIBC_TARGET STREQUAL vhex-sh)
|
|
list(APPEND TARGET_FOLDERS vhex sh-generic)
|
|
set(FXLIBC_ARCH sh)
|
|
add_definitions(-D__SUPPORT_VHEX_KERNEL)
|
|
set(CMAKE_INSTALL_PREFIX "${VXSDK_COMPILER_INSTALL}" CACHE PATH "..." FORCE)
|
|
set(INCDIR "${VXSDK_COMPILER_INSTALL}/include")
|
|
set(LIBDIR "${VXSDK_COMPILER_INSTALL}/lib")
|
|
endif()
|
|
|
|
if(FXLIBC_TARGET STREQUAL gint)
|
|
list(APPEND TARGET_FOLDERS sh-generic)
|
|
set(FXLIBC_ARCH sh)
|
|
set(FXLIBC_LTO 1)
|
|
add_definitions(-D__SUPPORT_GINT)
|
|
|
|
# Default to fxSDK install path
|
|
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
|
set(FXLIBC_PREFIX_IS_FXSDK 1 CACHE PATH "..." FORCE)
|
|
endif()
|
|
|
|
if(FXLIBC_PREFIX_IS_FXSDK)
|
|
# Use the fxSDK paths; these variables are uncached so we are always up-to-
|
|
# date, even if the compiler is upgraded without removing the fxlibc build
|
|
# folder (which happens with GiteaPC)
|
|
execute_process(
|
|
COMMAND fxsdk path include
|
|
OUTPUT_VARIABLE INCDIR
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
execute_process(
|
|
COMMAND fxsdk path lib
|
|
OUTPUT_VARIABLE LIBDIR
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
endif()
|
|
endif()
|
|
|
|
if(sh-generic IN_LIST TARGET_FOLDERS)
|
|
add_definitions(-D__SUPPORT_ARCH_SH)
|
|
endif()
|
|
|
|
# TODO: Preprocessor definitions for configuration
|
|
# configure_file()
|
|
|
|
# libc.{a,so} libfxlibc.{a,so}
|
|
|
|
add_compile_options(-Wall -Wextra -std=c11 -ffreestanding -Os)
|
|
if(FXLIBC_PIC)
|
|
add_compile_options(-fpic)
|
|
endif()
|
|
if(FXLIBC_LTO)
|
|
add_compile_options(-flto -ffat-lto-objects)
|
|
# Generate the archive with gcc-ar instead of ar as it will load the LTO
|
|
# plugin which is required to generate a usable archive.
|
|
set(CMAKE_C_ARCHIVE_CREATE "${CMAKE_C_COMPILER_AR} qcs <TARGET> <OBJECTS>")
|
|
# Also the ranlib rule (useless because ar is passed the s flag anyway)
|
|
set(CMAKE_C_ARCHIVE_FINISH "${CMAKE_C_COMPILER_RANLIB} <TARGET>")
|
|
endif()
|
|
|
|
if(FXLIBC_ARCH STREQUAL sh)
|
|
add_compile_options(
|
|
"$<$<COMPILE_LANGUAGE:C>:-m3;-mb>"
|
|
"$<$<COMPILE_LANGUAGE:ASM>:-m4-nofpu;-mb>" -Wa,--dsp)
|
|
endif()
|
|
|
|
# Building
|
|
|
|
set(SOURCES
|
|
# 3rdparty
|
|
3rdparty/grisu2b_59_56/grisu2b_59_56.c
|
|
3rdparty/tinymt32/rand.c
|
|
3rdparty/tinymt32/tinymt32.c
|
|
# C++ API details
|
|
src/dso.c
|
|
# assert
|
|
src/assert/assert.c
|
|
# ctype
|
|
src/ctype/isalnum.c
|
|
src/ctype/isalpha.c
|
|
src/ctype/isblank.c
|
|
src/ctype/iscntrl.c
|
|
src/ctype/isdigit.c
|
|
src/ctype/isgraph.c
|
|
src/ctype/islower.c
|
|
src/ctype/isprint.c
|
|
src/ctype/ispunct.c
|
|
src/ctype/isspace.c
|
|
src/ctype/isupper.c
|
|
src/ctype/isxdigit.c
|
|
src/ctype/tolower.c
|
|
src/ctype/toupper.c
|
|
# errno
|
|
src/errno/errno.c
|
|
# inttypes
|
|
src/inttypes/imaxabs.c
|
|
src/inttypes/imaxdiv.c
|
|
src/inttypes/strtoimax.c
|
|
src/inttypes/strtoumax.c
|
|
# locale
|
|
src/locale/setlocale.c
|
|
src/locale/localeconv.c
|
|
# signal
|
|
src/signal/signal.c
|
|
src/signal/raise.c
|
|
# stdio
|
|
src/stdio/asprintf.c
|
|
src/stdio/clearerr.c
|
|
src/stdio/dprintf.c
|
|
src/stdio/fclose.c
|
|
src/stdio/fdopen.c
|
|
src/stdio/ferror.c
|
|
src/stdio/feof.c
|
|
src/stdio/fflush.c
|
|
src/stdio/fgetc.c
|
|
src/stdio/fgetpos.c
|
|
src/stdio/fgets.c
|
|
src/stdio/fileno.c
|
|
src/stdio/fileutil.c
|
|
src/stdio/fopen.c
|
|
src/stdio/fprintf.c
|
|
src/stdio/fputc.c
|
|
src/stdio/fputs.c
|
|
src/stdio/fread.c
|
|
src/stdio/freopen.c
|
|
src/stdio/fscanf.c
|
|
src/stdio/fseek.c
|
|
src/stdio/fsetpos.c
|
|
src/stdio/ftell.c
|
|
src/stdio/fwrite.c
|
|
src/stdio/getc.c
|
|
src/stdio/getchar.c
|
|
src/stdio/gets.c
|
|
src/stdio/getline.c
|
|
src/stdio/getdelim.c
|
|
src/stdio/perror.c
|
|
src/stdio/printf.c
|
|
src/stdio/printf/format_fixed.c
|
|
src/stdio/printf/format_fp.c
|
|
src/stdio/printf/format_usual.c
|
|
src/stdio/printf/print.c
|
|
src/stdio/printf/util.c
|
|
src/stdio/putc.c
|
|
src/stdio/putchar.c
|
|
src/stdio/puts.c
|
|
src/stdio/remove.c
|
|
src/stdio/rewind.c
|
|
src/stdio/scanf.c
|
|
src/stdio/scanf/scan.c
|
|
src/stdio/scanf/scan_base.c
|
|
src/stdio/setbuf.c
|
|
src/stdio/setvbuf.c
|
|
src/stdio/snprintf.c
|
|
src/stdio/sprintf.c
|
|
src/stdio/sscanf.c
|
|
src/stdio/streams.c
|
|
src/stdio/ungetc.c
|
|
src/stdio/vasprintf.c
|
|
src/stdio/vdprintf.c
|
|
src/stdio/vfprintf.c
|
|
src/stdio/vfscanf.c
|
|
src/stdio/vprintf.c
|
|
src/stdio/vscanf.c
|
|
src/stdio/vsnprintf.c
|
|
src/stdio/vsprintf.c
|
|
src/stdio/vsscanf.c
|
|
# stdlib
|
|
src/stdlib/abort.c
|
|
src/stdlib/abs.c
|
|
src/stdlib/atexit.c
|
|
src/stdlib/atof.c
|
|
src/stdlib/atoi.c
|
|
src/stdlib/atol.c
|
|
src/stdlib/atoll.c
|
|
src/stdlib/calloc.c
|
|
src/stdlib/div.c
|
|
src/stdlib/exit.c
|
|
src/stdlib/labs.c
|
|
src/stdlib/ldiv.c
|
|
src/stdlib/llabs.c
|
|
src/stdlib/lldiv.c
|
|
src/stdlib/qsort.c
|
|
src/stdlib/reallocarray.c
|
|
src/stdlib/strto_fp.c
|
|
src/stdlib/strto_int.c
|
|
src/stdlib/strtod.c
|
|
src/stdlib/strtof.c
|
|
src/stdlib/strtol.c
|
|
src/stdlib/strtold.c
|
|
src/stdlib/strtoll.c
|
|
src/stdlib/strtoul.c
|
|
src/stdlib/strtoull.c
|
|
# unistd
|
|
src/unistd/_exit.c
|
|
# string
|
|
src/string/memchr.c
|
|
src/string/memcmp.c
|
|
src/string/memcpy.c
|
|
src/string/memmove.c
|
|
src/string/memrchr.c
|
|
src/string/memset.c
|
|
src/string/strcasecmp.c
|
|
src/string/strcasestr.c
|
|
src/string/strcat.c
|
|
src/string/strchr.c
|
|
src/string/strchrnul.c
|
|
src/string/strcmp.c
|
|
src/string/strcoll.c
|
|
src/string/strcpy.c
|
|
src/string/strcspn.c
|
|
src/string/strdup.c
|
|
src/string/strerror.c
|
|
src/string/strlen.c
|
|
src/string/strncasecmp.c
|
|
src/string/strncat.c
|
|
src/string/strncmp.c
|
|
src/string/strncpy.c
|
|
src/string/strndup.c
|
|
src/string/strnlen.c
|
|
src/string/strpbrk.c
|
|
src/string/strrchr.c
|
|
src/string/strspn.c
|
|
src/string/strstr.c
|
|
src/string/strstr_base.c
|
|
src/string/strtok.c
|
|
src/string/strxfrm.c
|
|
# time
|
|
src/time/asctime.c
|
|
src/time/ctime.c
|
|
src/time/difftime.c
|
|
src/time/gmtime.c
|
|
src/time/localtime.c
|
|
src/time/mktime.c
|
|
src/time/strftime.c)
|
|
|
|
# Silence extended warnings on Grisu2b code
|
|
set_source_files_properties(3rdparty/grisu2b_59_56/grisu2b_59_56.c PROPERTIES
|
|
COMPILE_OPTIONS "-Wno-all;-Wno-extra")
|
|
|
|
if(vhex-sh IN_LIST TARGET_FOLDERS)
|
|
list(APPEND SOURCES
|
|
src/stdlib/target/vhex-sh/free.c
|
|
src/stdlib/target/vhex-sh/malloc.c
|
|
src/stdlib/target/vhex-sh/realloc.c
|
|
)
|
|
endif()
|
|
|
|
if(sh-generic IN_LIST TARGET_FOLDERS)
|
|
list(APPEND SOURCES
|
|
src/setjmp/target/sh-generic/setjmp.S
|
|
src/setjmp/target/sh-generic/longjmp.S
|
|
src/string/target/sh-generic/memchr.S
|
|
src/string/target/sh-generic/memcmp.S
|
|
src/string/target/sh-generic/memcpy.S
|
|
src/string/target/sh-generic/memmove.S
|
|
src/string/target/sh-generic/memset.S
|
|
src/string/target/sh-generic/strlen.S
|
|
src/target/sh-generic/cpucap.c)
|
|
endif()
|
|
|
|
if(gint IN_LIST TARGET_FOLDERS)
|
|
list(APPEND SOURCES
|
|
# stdlib HAL
|
|
src/stdlib/fxlibc_hal_malloc.c
|
|
src/stdlib/free.c
|
|
src/stdlib/malloc.c
|
|
src/stdlib/realloc.c
|
|
# time HAL
|
|
src/time/fxlibc_hal_time.c
|
|
src/time/clock.c
|
|
src/time/time.c)
|
|
endif()
|
|
|
|
|
|
|
|
|
|
#---
|
|
# Handle "target-specific" fxlibc output format
|
|
#---
|
|
|
|
if(FXLIBC_TARGET STREQUAL vhex-sh)
|
|
set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)
|
|
add_library(fxlibcStatic STATIC ${SOURCES})
|
|
add_library(fxlibcShared SHARED ${SOURCES})
|
|
set(FXLIBC_TARGET_LIBS "fxlibcStatic;fxlibcShared")
|
|
else()
|
|
add_library(fxlibcStatic STATIC ${SOURCES})
|
|
set(FXLIBC_TARGET_LIBS "fxlibcStatic")
|
|
endif()
|
|
|
|
|
|
foreach(FXLIBC_LIB IN LISTS FXLIBC_TARGET_LIBS)
|
|
|
|
target_include_directories(${FXLIBC_LIB} PRIVATE include/)
|
|
foreach(FOLDER IN LISTS TARGET_FOLDERS)
|
|
target_include_directories(${FXLIBC_LIB} PRIVATE include/target/${FOLDER}/)
|
|
endforeach()
|
|
|
|
set_target_properties(${FXLIBC_LIB} PROPERTIES OUTPUT_NAME "c")
|
|
|
|
install(TARGETS ${FXLIBC_LIB} DESTINATION ${LIBDIR})
|
|
endforeach()
|
|
|
|
|
|
|
|
|
|
#---
|
|
# Do not forget to install headers
|
|
#---
|
|
|
|
install(DIRECTORY include/ DESTINATION ${INCDIR} PATTERN "target" EXCLUDE)
|
|
|
|
foreach(FOLDER IN LISTS TARGET_FOLDERS)
|
|
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/include/target/${FOLDER}")
|
|
install(DIRECTORY include/target/${FOLDER}/ DESTINATION ${INCDIR})
|
|
endif()
|
|
endforeach()
|