cmake_minimum_required(VERSION 3.15) project(FxLibc VERSION 1.5.0 LANGUAGES C ASM) set(CMAKE_INSTALL_MESSAGE LAZY) # Options # * -DFXLIBC_TARGET= 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 ") # Also the ranlib rule (useless because ar is passed the s flag anyway) set(CMAKE_C_ARCHIVE_FINISH "${CMAKE_C_COMPILER_RANLIB} ") endif() if(FXLIBC_ARCH STREQUAL sh) add_compile_options( "$<$:-m3;-mb>" "$<$:-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 src/stdlib/target/gint/free.c src/stdlib/target/gint/malloc.c src/stdlib/target/gint/realloc.c # time src/time/target/gint/clock.c src/time/target/gint/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()