cmake_minimum_required(VERSION 3.16) project(FxLibc VERSION 1.0.0 LANGUAGES C ASM) # Options # * -DFXLIBC_TARGET= # * -DSHARED option(SHARED "Build a shared library") option(STANDARD_NAMESPACE "Use libc.a and put headers in global include folder") set(TARGET_FOLDERS ${FXLIBC_TARGET}) if(FXLIBC_TARGET STREQUAL vhex-sh) list(APPEND TARGET_FOLDERS vhex-generic sh-generic) set(FXLIBC_ARCH sh) add_definitions(-D__SUPPORT_VHEX_KERNEL) endif() if(FXLIB_TARGET STREQUAL vhex-x86) list(APPEND TARGET_FOLDERS vhex-generic x86-generic) set(FXLIBC_ARCH x86) add_definitions(-D__SUPPORT_VHEX_KERNEL) endif() if(FXLIBC_TARGET STREQUAL casiowin-fx) list(APPEND TARGET_FOLDERS sh-generic) set(FXLIBC_ARCH sh) add_definitions(-D__SUPPORT_CASIOWIN_FX9860G) endif() if(FXLIBC_TARGET STREQUAL casiowin-cg) list(APPEND TARGET_FOLDERS sh-generic) set(FXLIBC_ARCH sh) add_definitions(-D__SUPPORT_CASIOWIN_FXCG50) endif() if(FXLIBC_TARGET STREQUAL gint) list(APPEND TARGET_FOLDERS sh-generic) set(FXLIBC_ARCH sh) add_definitions(-D__SUPPORT_GINT) 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_ARCH STREQUAL sh) add_compile_options( "$<$:-m3;-mb>" "$<$:-m4-nofpu;-mb;-Wa,--dsp>") endif() # Building set(SOURCES src/libc/stdio/vsnprintf.c src/libc/stdio/sprintf.c src/libc/stdio/dprintf.c src/libc/stdio/snprintf.c src/libc/stdio/puts.c src/libc/stdio/vsprintf.c src/libc/stdio/putc.c src/libc/stdio/internal/printf_actions.c src/libc/stdio/internal/printf_options.c src/libc/stdio/internal/printf_common.c src/libc/stdio/internal/printf.h src/libc/stdio/vdprintf.c src/libc/stdio/printf.c src/libc/stdlib/calloc.c src/libc/stdlib/reallocarray.c src/libc/string/strchr.c src/libc/string/strcpy.c src/libc/string/memcpy.c src/libc/string/strcat.c src/libc/string/memset.c src/libc/string/strcmp.c src/libc/string/strdup.c src/libc/string/strlen.c) if(vhex-generic IN_LIST TARGET_FOLDERS) # TODO endif() if(vhex-sh IN_LIST TARGET_FOLDERS) list(APPEND SOURCES src/libc/signal/target/vhex-sh/kill.S src/libc/signal/target/vhex-sh/signal.S src/libc/stdlib/target/vhex-sh/free.S src/libc/stdlib/target/vhex-sh/malloc.S src/libc/stdlib/target/vhex-sh/realloc.S src/posix/fcntl/target/vhex-sh/open.S src/posix/sys/wait/target/vhex-sh/wait.S src/posix/sys/wait/target/vhex-sh/waitpid.S src/posix/unistd/target/vhex-sh/read.S src/posix/unistd/target/vhex-sh/getppid.S src/posix/unistd/target/vhex-sh/close.S src/posix/unistd/target/vhex-sh/fork_execve.S src/posix/unistd/target/vhex-sh/lseek.S src/posix/unistd/target/vhex-sh/getpid.S src/posix/unistd/target/vhex-sh/getpgid.S src/posix/unistd/target/vhex-sh/setpgid.S src/posix/unistd/target/vhex-sh/write.S) endif() if(sh-generic IN_LIST TARGET_FOLDERS) list(APPEND SOURCES src/libc/setjmp/target/sh-generic/setjmp.S src/libc/setjmp/target/sh-generic/longjmp.S) endif() if(casiowin-fx IN_LIST TARGET_FOLDERS) list(APPEND SOURCES src/posix/unistd/target/casiowin-fx/close.S) endif() # TODO: All targets add_library(fxlibc ${SOURCES}) target_include_directories(fxlibc PRIVATE include/) foreach(FOLDER IN LISTS TARGET_FOLDERS) target_include_directories(fxlibc PRIVATE include/target/${FOLDER}/) endforeach() set_target_properties(fxlibc PROPERTIES OUTPUT_NAME "c") # libc.a # Install install(TARGETS fxlibc DESTINATION lib/) install(DIRECTORY include/ DESTINATION include/ PATTERN "target" EXCLUDE) foreach(FOLDER IN LISTS TARGET_FOLDERS) if(EXISTS include/target/${FOLDER}/) install(DIRECTORY include/target/${FOLDER}/ DESTINATION include/) endif() endforeach()