Kbuild: enable toolchain newlib library instead of minimal libc

This options allows us to link against newlib instead of the
integrated minimal c library.

Change-Id: I20990354d74c08f2f6348f0aeea452b8f0f4c8e9
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
This commit is contained in:
Anas Nashif 2015-05-18 08:57:17 -04:00
commit 19f0ff2756
6 changed files with 124 additions and 2 deletions

12
Kconfig
View file

@ -15,15 +15,25 @@ config CROSS_COMPILE
default make runs in this kernel build directory. You don't default make runs in this kernel build directory. You don't
need to set this unless you want the configured kernel build need to set this unless you want the configured kernel build
directory to select the cross-compiler automatically. directory to select the cross-compiler automatically.
endmenu
config MINIMAL_LIBC config MINIMAL_LIBC
bool bool
prompt "Build minimal c library" prompt "Build minimal c library"
default y default y
depends on !NEWLIB
help help
Build integrated minimal c library. Build integrated minimal c library.
config TOOLCHAIN_NEWLIB
bool
prompt "Build with newlib c library"
depends on !MINIMAL_LIBC
default n
help
Build with newlib library. The newlib library is expected to be
part of the SDK in this case.
endmenu
menu "Debugging Options" menu "Debugging Options"
config STDOUT_CONSOLE config STDOUT_CONSOLE

View file

@ -630,6 +630,10 @@ libs-y := $(KLIBC_DIR)/
TIMOINCLUDE += -I$(srctree)/lib/libc/minimal/include TIMOINCLUDE += -I$(srctree)/lib/libc/minimal/include
endif endif
ifdef CONFIG_TOOLCHAIN_NEWLIB
libs-y += lib/libc/newlib/
endif
#File that includes all prepare special embedded architecture targets. #File that includes all prepare special embedded architecture targets.
include $(srctree)/scripts/Makefile.preparch include $(srctree)/scripts/Makefile.preparch
sinclude $(srctree)/scripts/Makefile.$(SRCARCH).preparch sinclude $(srctree)/scripts/Makefile.$(SRCARCH).preparch

2
lib/libc/Makefile Normal file
View file

@ -0,0 +1,2 @@
libs-$(CONFIG_MINIMAL_LIBC) += minimal/
libs-$(CONFIG_NEWLIB) += newlib/

1
lib/libc/newlib/Makefile Normal file
View file

@ -0,0 +1 @@
lib-y := libc-hooks.o

View file

@ -0,0 +1,105 @@
#include <errno.h>
#include <stdio.h>
#include <sys/stat.h>
#define HEAP_SIZE 4096
unsigned char heap[HEAP_SIZE];
unsigned int heap_sz = 0;
static int _stdout_hook_default(int c) {
(void)(c); /* Prevent warning about unused argument */
return EOF;
}
static int (*_stdout_hook)(int) = _stdout_hook_default;
void __stdout_hook_install(int (*hook)(int)) {
_stdout_hook = hook;
}
static unsigned char _stdin_hook_default(void) {
return 0;
}
static unsigned char (*_stdin_hook)(void) = _stdin_hook_default;
void __stdin_hook_install(unsigned char (*hook)(void)) {
_stdin_hook = hook;
}
int read( int fd, char *buf, int nbytes) {
int i = 0;
for (i = 0; i < nbytes; i++) {
*(buf + i) = _stdin_hook();
if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
i++;
break;
}
}
return (i);
}
int write(int fd, char *buf, int nbytes) {
int i;
for (i = 0; i < nbytes; i++) {
if (*(buf + i) == '\n') {
_stdout_hook ('\r');
}
_stdout_hook (*(buf + i));
}
return (nbytes);
}
int fstat( int fd, struct stat *buf) {
buf->st_mode = S_IFCHR; /* Always pretend to be a tty */
buf->st_blksize = 0;
return (0);
}
int isatty(int file) {
return 1;
}
int kill(int i, int j) {
return 0;
}
int getpid() {
return 0;
}
int _fstat(int file, struct stat *st) {
st->st_mode = S_IFCHR;
return 0;
}
void exit(int status) {
write(1, "exit", 4);
while (1) {
;
}
}
int close(int file) {
return -1;
}
int lseek(int file, int ptr, int dir) {
return 0;
}
void *sbrk(int count) {
void *ptr = heap + heap_sz;
if ((heap_sz + count) <= HEAP_SIZE) {
heap_sz += count;
return ptr;
} else {
return (void *)-1;
}
}

View file

@ -13,6 +13,6 @@ CROSS_COMPILE_x86=${XTOOLS_TOOLCHAIN_PATH}/${CROSS_COMPILE_TARGET_x86}/bin/${CRO
CROSS_COMPILE= $(CROSS_COMPILE_$(ARCH)) CROSS_COMPILE= $(CROSS_COMPILE_$(ARCH))
TOOLCHAIN_LIBS = gcc TOOLCHAIN_LIBS = gcc c m
export CROSS_COMPILE TOOLCHAIN_LIBS export CROSS_COMPILE TOOLCHAIN_LIBS