mirror of
https://git.planet-casio.com/Vhex-Kernel-Core/fxlibc.git
synced 2025-05-30 07:25:13 +02:00
A standard libc would normally use the kernel's syscall interface to connect with the lower level, and this interface would usually imitate POSIX or a similar style. With the statically-linked unikernel design, the syscalls would be functions, but the interface wouldn't change much. However, there are some fundamental differences. For instance, in gint there aren't separate kernel/userspace memory allocators, there's just a unified allocator in the kernel. This makes malloc() conceptually a direct syscall, which pushes the kernel/libc boundary at an unusual location. Having a clearly-marked HAL makes it easier to identify where the boundary is. Code from <time.h> currently has an ad-hoc interface which should be replaced with clock_gettime(2) in the future. The HAL offers default implementations but these aren't used by gint yet, because it's more practical to have undefined references than to end up with the stubs in an executable. These are provided for future completeness. This change does not lift the requirement to recursively link gint with the libc and the libc with gint.
326 lines
7.9 KiB
CMake
326 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)
|
|
# 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/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()
|