Skip to content

Commit

Permalink
Kbuild: enable toolchain newlib library instead of minimal libc
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
nashif committed Feb 6, 2016
1 parent 3b9199d commit 19f0ff2
Show file tree
Hide file tree
Showing 6 changed files with 124 additions and 2 deletions.
12 changes: 11 additions & 1 deletion Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,25 @@ config CROSS_COMPILE
default make runs in this kernel build directory. You don't
need to set this unless you want the configured kernel build
directory to select the cross-compiler automatically.
endmenu

config MINIMAL_LIBC
bool
prompt "Build minimal c library"
default y
depends on !NEWLIB
help
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"

config STDOUT_CONSOLE
Expand Down
4 changes: 4 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -630,6 +630,10 @@ libs-y := $(KLIBC_DIR)/
TIMOINCLUDE += -I$(srctree)/lib/libc/minimal/include
endif

ifdef CONFIG_TOOLCHAIN_NEWLIB
libs-y += lib/libc/newlib/
endif

#File that includes all prepare special embedded architecture targets.
include $(srctree)/scripts/Makefile.preparch
sinclude $(srctree)/scripts/Makefile.$(SRCARCH).preparch
Expand Down
2 changes: 2 additions & 0 deletions lib/libc/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
libs-$(CONFIG_MINIMAL_LIBC) += minimal/
libs-$(CONFIG_NEWLIB) += newlib/
1 change: 1 addition & 0 deletions lib/libc/newlib/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lib-y := libc-hooks.o
105 changes: 105 additions & 0 deletions lib/libc/newlib/libc-hooks.c
Original file line number Diff line number Diff line change
@@ -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;
}
}
2 changes: 1 addition & 1 deletion scripts/Makefile.toolchain.xtools
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,6 @@ CROSS_COMPILE_x86=${XTOOLS_TOOLCHAIN_PATH}/${CROSS_COMPILE_TARGET_x86}/bin/${CRO

CROSS_COMPILE= $(CROSS_COMPILE_$(ARCH))

TOOLCHAIN_LIBS = gcc
TOOLCHAIN_LIBS = gcc c m

export CROSS_COMPILE TOOLCHAIN_LIBS

0 comments on commit 19f0ff2

Please sign in to comment.