diff --git a/.gitignore b/.gitignore index 19945e0..7a8654b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ -build +/build*/ *.txt +!CMakeLists.txt script diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..f8da321 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,130 @@ +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/) + +# Install + +# TODO: Install in compiler vs. in another folder + +install(TARGETS fxlibc DESTINATION lib/) diff --git a/cmake/toolchain-sh.cmake b/cmake/toolchain-sh.cmake new file mode 100644 index 0000000..fcd1714 --- /dev/null +++ b/cmake/toolchain-sh.cmake @@ -0,0 +1,28 @@ +# fxSDK toolchain file for Casio graphing calculators +# Target triplet: sh-elf (custom sh3eb-elf supporting sh3 and sh4-nofpu) + +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_VERSION 1) +set(CMAKE_SYSTEM_PROCESSOR sh) + +set(CMAKE_C_COMPILER sh-elf-gcc) +set(CMAKE_CXX_COMPILER sh-elf-g++) + +set(CMAKE_C_FLAGS_INIT "") +set(CMAKE_CXX_FLAGS_INIT "") + +add_compile_options(-nostdlib) +add_link_options(-nostdlib) +link_libraries(-lgcc) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + +# Determine compiler install path +execute_process( + COMMAND ${CMAKE_C_COMPILER} --print-file-name=. + OUTPUT_VARIABLE FXSDK_COMPILER_INSTALL + OUTPUT_STRIP_TRAILING_WHITESPACE +) diff --git a/src/setjmp/longjmp.S b/src/libc/setjmp/target/sh-generic/longjmp.S similarity index 100% rename from src/setjmp/longjmp.S rename to src/libc/setjmp/target/sh-generic/longjmp.S diff --git a/src/setjmp/setjmp.S b/src/libc/setjmp/target/sh-generic/setjmp.S similarity index 100% rename from src/setjmp/setjmp.S rename to src/libc/setjmp/target/sh-generic/setjmp.S diff --git a/src/signal/arch/vhex/kill.S b/src/libc/signal/target/vhex-sh/kill.S similarity index 100% rename from src/signal/arch/vhex/kill.S rename to src/libc/signal/target/vhex-sh/kill.S diff --git a/src/signal/arch/vhex/signal.S b/src/libc/signal/target/vhex-sh/signal.S similarity index 100% rename from src/signal/arch/vhex/signal.S rename to src/libc/signal/target/vhex-sh/signal.S diff --git a/src/stdio/dprintf.c b/src/libc/stdio/dprintf.c similarity index 100% rename from src/stdio/dprintf.c rename to src/libc/stdio/dprintf.c diff --git a/src/stdio/internal/printf.h b/src/libc/stdio/internal/printf.h similarity index 100% rename from src/stdio/internal/printf.h rename to src/libc/stdio/internal/printf.h diff --git a/src/stdio/internal/printf_actions.c b/src/libc/stdio/internal/printf_actions.c similarity index 98% rename from src/stdio/internal/printf_actions.c rename to src/libc/stdio/internal/printf_actions.c index 80dc7ad..96733a3 100644 --- a/src/stdio/internal/printf_actions.c +++ b/src/libc/stdio/internal/printf_actions.c @@ -1,8 +1,7 @@ #include // internal depency -// TODO: update path detection -#include "../src/stdio/internal/printf.h" +#include "printf.h" // Define all actions static void action_str(struct printf_opt *op, char n); diff --git a/src/stdio/internal/printf_common.c b/src/libc/stdio/internal/printf_common.c similarity index 93% rename from src/stdio/internal/printf_common.c rename to src/libc/stdio/internal/printf_common.c index 1ae504f..fbe5880 100644 --- a/src/stdio/internal/printf_common.c +++ b/src/libc/stdio/internal/printf_common.c @@ -1,8 +1,7 @@ #include // internal depency -// TODO: update path detection -#include "../src/stdio/internal/printf.h" +#include "printf.h" //TODO: precision handling int printf_common(struct printf_opt *opt, const char *restrict format) diff --git a/src/stdio/internal/printf_options.c b/src/libc/stdio/internal/printf_options.c similarity index 97% rename from src/stdio/internal/printf_options.c rename to src/libc/stdio/internal/printf_options.c index db9b735..5f38303 100644 --- a/src/stdio/internal/printf_options.c +++ b/src/libc/stdio/internal/printf_options.c @@ -1,8 +1,7 @@ #include // internal depency -// TODO: update path detection -#include "../src/stdio/internal/printf.h" +#include "printf.h" static int get_flags(struct printf_opt *opt, const char *restrict format) { diff --git a/src/stdio/printf.c b/src/libc/stdio/printf.c similarity index 100% rename from src/stdio/printf.c rename to src/libc/stdio/printf.c diff --git a/src/stdio/putc.c b/src/libc/stdio/putc.c similarity index 100% rename from src/stdio/putc.c rename to src/libc/stdio/putc.c diff --git a/src/stdio/puts.c b/src/libc/stdio/puts.c similarity index 100% rename from src/stdio/puts.c rename to src/libc/stdio/puts.c diff --git a/src/stdio/snprintf.c b/src/libc/stdio/snprintf.c similarity index 100% rename from src/stdio/snprintf.c rename to src/libc/stdio/snprintf.c diff --git a/src/stdio/sprintf.c b/src/libc/stdio/sprintf.c similarity index 100% rename from src/stdio/sprintf.c rename to src/libc/stdio/sprintf.c diff --git a/src/stdio/vdprintf.c b/src/libc/stdio/vdprintf.c similarity index 94% rename from src/stdio/vdprintf.c rename to src/libc/stdio/vdprintf.c index 8051221..516fa79 100644 --- a/src/stdio/vdprintf.c +++ b/src/libc/stdio/vdprintf.c @@ -2,8 +2,7 @@ #include // internal depency -// TODO: update path detection -#include "../src/stdio/internal/printf.h" +#include "internal/printf.h" // FIXME: // if the writte syscall do not return the same diff --git a/src/stdio/vsnprintf.c b/src/libc/stdio/vsnprintf.c similarity index 93% rename from src/stdio/vsnprintf.c rename to src/libc/stdio/vsnprintf.c index abc4607..4182aef 100644 --- a/src/stdio/vsnprintf.c +++ b/src/libc/stdio/vsnprintf.c @@ -1,8 +1,7 @@ #include // internal depency -// TODO: update path detection -#include "../src/stdio/internal/printf.h" +#include "internal/printf.h" static void disp_char(struct printf_opt *opt, char n) { diff --git a/src/stdio/vsprintf.c b/src/libc/stdio/vsprintf.c similarity index 100% rename from src/stdio/vsprintf.c rename to src/libc/stdio/vsprintf.c diff --git a/src/stdlib/calloc.c b/src/libc/stdlib/calloc.c similarity index 100% rename from src/stdlib/calloc.c rename to src/libc/stdlib/calloc.c diff --git a/src/stdlib/reallocarray.c b/src/libc/stdlib/reallocarray.c similarity index 100% rename from src/stdlib/reallocarray.c rename to src/libc/stdlib/reallocarray.c diff --git a/src/stdlib/arch/vhex/free.S b/src/libc/stdlib/target/vhex-sh/free.S similarity index 100% rename from src/stdlib/arch/vhex/free.S rename to src/libc/stdlib/target/vhex-sh/free.S diff --git a/src/stdlib/arch/vhex/malloc.S b/src/libc/stdlib/target/vhex-sh/malloc.S similarity index 100% rename from src/stdlib/arch/vhex/malloc.S rename to src/libc/stdlib/target/vhex-sh/malloc.S diff --git a/src/stdlib/arch/vhex/realloc.S b/src/libc/stdlib/target/vhex-sh/realloc.S similarity index 100% rename from src/stdlib/arch/vhex/realloc.S rename to src/libc/stdlib/target/vhex-sh/realloc.S diff --git a/src/string/memcpy.c b/src/libc/string/memcpy.c similarity index 100% rename from src/string/memcpy.c rename to src/libc/string/memcpy.c diff --git a/src/string/memset.c b/src/libc/string/memset.c similarity index 100% rename from src/string/memset.c rename to src/libc/string/memset.c diff --git a/src/string/strcat.c b/src/libc/string/strcat.c similarity index 100% rename from src/string/strcat.c rename to src/libc/string/strcat.c diff --git a/src/string/strchr.c b/src/libc/string/strchr.c similarity index 100% rename from src/string/strchr.c rename to src/libc/string/strchr.c diff --git a/src/string/strcmp.c b/src/libc/string/strcmp.c similarity index 100% rename from src/string/strcmp.c rename to src/libc/string/strcmp.c diff --git a/src/string/strcpy.c b/src/libc/string/strcpy.c similarity index 100% rename from src/string/strcpy.c rename to src/libc/string/strcpy.c diff --git a/src/string/strdup.c b/src/libc/string/strdup.c similarity index 100% rename from src/string/strdup.c rename to src/libc/string/strdup.c diff --git a/src/string/strlen.c b/src/libc/string/strlen.c similarity index 100% rename from src/string/strlen.c rename to src/libc/string/strlen.c diff --git a/src/threads/atomic.S b/src/libc/threads/atomic.S similarity index 100% rename from src/threads/atomic.S rename to src/libc/threads/atomic.S diff --git a/src/threads/mutex.c b/src/libc/threads/mutex.c similarity index 100% rename from src/threads/mutex.c rename to src/libc/threads/mutex.c diff --git a/src/fcntl/arch/vhex/open.S b/src/posix/fcntl/target/vhex-sh/open.S similarity index 100% rename from src/fcntl/arch/vhex/open.S rename to src/posix/fcntl/target/vhex-sh/open.S diff --git a/src/sys/wait/arch/vhex/wait.S b/src/posix/sys/wait/target/vhex-sh/wait.S similarity index 100% rename from src/sys/wait/arch/vhex/wait.S rename to src/posix/sys/wait/target/vhex-sh/wait.S diff --git a/src/sys/wait/arch/vhex/waitpid.S b/src/posix/sys/wait/target/vhex-sh/waitpid.S similarity index 100% rename from src/sys/wait/arch/vhex/waitpid.S rename to src/posix/sys/wait/target/vhex-sh/waitpid.S diff --git a/src/unistd/arch/fx9860g/close.S b/src/posix/unistd/target/casiowin-fx/close.S similarity index 100% rename from src/unistd/arch/fx9860g/close.S rename to src/posix/unistd/target/casiowin-fx/close.S diff --git a/src/unistd/arch/vhex/close.S b/src/posix/unistd/target/vhex-sh/close.S similarity index 100% rename from src/unistd/arch/vhex/close.S rename to src/posix/unistd/target/vhex-sh/close.S diff --git a/src/unistd/arch/vhex/fork_execve.S b/src/posix/unistd/target/vhex-sh/fork_execve.S similarity index 100% rename from src/unistd/arch/vhex/fork_execve.S rename to src/posix/unistd/target/vhex-sh/fork_execve.S diff --git a/src/unistd/arch/vhex/getpgid.S b/src/posix/unistd/target/vhex-sh/getpgid.S similarity index 100% rename from src/unistd/arch/vhex/getpgid.S rename to src/posix/unistd/target/vhex-sh/getpgid.S diff --git a/src/unistd/arch/vhex/getpid.S b/src/posix/unistd/target/vhex-sh/getpid.S similarity index 100% rename from src/unistd/arch/vhex/getpid.S rename to src/posix/unistd/target/vhex-sh/getpid.S diff --git a/src/unistd/arch/vhex/getppid.S b/src/posix/unistd/target/vhex-sh/getppid.S similarity index 100% rename from src/unistd/arch/vhex/getppid.S rename to src/posix/unistd/target/vhex-sh/getppid.S diff --git a/src/unistd/arch/vhex/lseek.S b/src/posix/unistd/target/vhex-sh/lseek.S similarity index 100% rename from src/unistd/arch/vhex/lseek.S rename to src/posix/unistd/target/vhex-sh/lseek.S diff --git a/src/unistd/arch/vhex/read.S b/src/posix/unistd/target/vhex-sh/read.S similarity index 100% rename from src/unistd/arch/vhex/read.S rename to src/posix/unistd/target/vhex-sh/read.S diff --git a/src/unistd/arch/vhex/setpgid.S b/src/posix/unistd/target/vhex-sh/setpgid.S similarity index 100% rename from src/unistd/arch/vhex/setpgid.S rename to src/posix/unistd/target/vhex-sh/setpgid.S diff --git a/src/unistd/arch/vhex/write.S b/src/posix/unistd/target/vhex-sh/write.S similarity index 100% rename from src/unistd/arch/vhex/write.S rename to src/posix/unistd/target/vhex-sh/write.S