mirror of
https://git.planet-casio.com/Vhex-Kernel-Core/fxlibc.git
synced 2024-12-28 04:23:38 +01:00
6b0ea3f33e
Also set -Wa,--dsp also on C files because the fxSDK sets it globally and LTO complains if -Wa/-Xassembler options are not uniform across all compilation units.
324 lines
7.8 KiB
CMake
324 lines
7.8 KiB
CMake
cmake_minimum_required(VERSION 3.15)
|
|
project(FxLibc VERSION 1.5.0 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
|
|
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()
|