diff --git a/CMakeLists.txt b/CMakeLists.txt index e5c5e8d35..8c7a14d8d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,10 +47,6 @@ project (Jerry CXX C ASM) add_custom_target(static_check) add_dependencies(static_check cppcheck) -# Disable _FORTIFY_SOURCE - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -U_FORTIFY_SOURCE") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -U_FORTIFY_SOURCE") - # Architecture-specific compile/link flags foreach(FLAG ${FLAGS_COMMON_ARCH}) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAG}") @@ -77,6 +73,11 @@ project (Jerry CXX C ASM) option(STRIP_RELEASE_BINARY "Strip symbols from release binaries" OFF) set(MCU_SCRIPT_FILE "tests/blinky.js" CACHE STRING "Script to run on MCU") + elseif("${PLATFORM}" STREQUAL "EXTERNAL") + set(PLATFORM_EXT "EXTERNAL") + set(EXTERNAL_BUILD TRUE) + + set(EXTERNAL_LIBC_INTERFACE "UNDEFINED" CACHE STRING "Path to external libc's include directory") else() message(FATAL_ERROR "Platform is not supported") endif() @@ -85,6 +86,13 @@ project (Jerry CXX C ASM) # Script to run on MCU set(MCU_SCRIPT_GENERATED_HEADER ${CMAKE_BINARY_DIR}/generated.h) +# Should we use external libc? + if(NOT DEFINED EXTERNAL_LIBC_INTERFACE AND NOT EXTERNAL_LIBC_INTERFACE EQUAL "UNDEFINED") + set(USE_EXTERNAL_LIBC FALSE) + else() + set(USE_EXTERNAL_LIBC TRUE) + endif() + # Build modes # Debug set(BUILD_MODE_PREFIX_DEBUG debug) @@ -225,12 +233,16 @@ project (Jerry CXX C ASM) set(SOURCE_JERRY_STANDALONE_MAIN ${SOURCE_JERRY_STANDALONE_MAIN_${PLATFORM_EXT}}) # Component targets + # Jerry's libc + if(NOT ${USE_EXTERNAL_LIBC}) + add_subdirectory(jerry-libc) + else() + set(INCLUDE_LIBC_INTERFACE ${EXTERNAL_LIBC_INTERFACE}) + endif() + # Jerry's Core add_subdirectory(jerry-core) - # Jerry's libc - add_subdirectory(jerry-libc) - # Plugins add_subdirectory(plugins) @@ -268,6 +280,7 @@ project (Jerry CXX C ASM) PROPERTY LINK_FLAGS "${COMPILE_FLAGS_JERRY} ${CXX_FLAGS_JERRY} ${FLAGS_COMMON_${BUILD_MODE}} ${LINKER_FLAGS_COMMON} ${LINKER_FLAGS_STATIC}") target_compile_definitions(${TARGET_NAME} PRIVATE ${DEFINES_JERRY}) target_include_directories(${TARGET_NAME} PRIVATE ${INCLUDE_CORE_INTERFACE}) + target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${INCLUDE_LIBC_INTERFACE}) target_link_libraries(${TARGET_NAME} ${PLUGINS_TARGET_NAME} ${CORE_TARGET_NAME} ${LIBC_TARGET_NAME} ${PREFIX_IMPORTED_LIB}libgcc) add_cppcheck_target(${TARGET_NAME}) diff --git a/jerry-core/CMakeLists.txt b/jerry-core/CMakeLists.txt index 70d8a120f..2407afb25 100644 --- a/jerry-core/CMakeLists.txt +++ b/jerry-core/CMakeLists.txt @@ -144,6 +144,7 @@ project (JerryCore CXX C ASM) PROPERTY COMPILE_FLAGS "${COMPILE_FLAGS_JERRY} ${CXX_FLAGS_JERRY} ${FLAGS_COMMON_${BUILD_MODE}}") target_compile_definitions(${TARGET_NAME}.jerry-core PRIVATE ${DEFINES_JERRY}) target_include_directories(${TARGET_NAME}.jerry-core PRIVATE ${INCLUDE_CORE}) + target_include_directories(${TARGET_NAME}.jerry-core SYSTEM PRIVATE ${INCLUDE_LIBC_INTERFACE}) if("${BUILD_MODE}" STREQUAL "UNITTESTS") target_compile_definitions(${TARGET_NAME}.jerry-core INTERFACE ${DEFINES_JERRY}) diff --git a/jerry-core/jrt/jrt-libc-includes.h b/jerry-core/jrt/jrt-libc-includes.h index b0e2aef7e..f694b52c3 100644 --- a/jerry-core/jrt/jrt-libc-includes.h +++ b/jerry-core/jrt/jrt-libc-includes.h @@ -21,33 +21,4 @@ #include #include -/* Ensuring no macro implementation of functions declared in the headers are used */ -#undef isspace -#undef isalpha -#undef islower -#undef isupper -#undef isdigit -#undef isxdigit -#undef memset -#undef memcmp -#undef memcpy -#undef memmove -#undef strcmp -#undef strncmp -#undef strncpy -#undef strlen -#undef putchar -#undef puts -#undef exit -#undef fopen -#undef rewind -#undef fclose -#undef fseek -#undef ftell -#undef fread -#undef fwrite -#undef vfprintf -#undef fprintf -#undef printf - #endif /* !JRT_LIBC_INCLUDES_H */ diff --git a/jerry-libc/CMakeLists.txt b/jerry-libc/CMakeLists.txt index 94d3929e8..24ef95f7d 100644 --- a/jerry-libc/CMakeLists.txt +++ b/jerry-libc/CMakeLists.txt @@ -44,7 +44,9 @@ set(COMPILE_FLAGS_LIBC "${COMPILE_FLAGS_JERRY} ${C_FLAGS_JERRY}") set(DEFINES_LIBC_MCU_STM32F4 __TARGET_MCU_STM32F4) # Include directories - set(INCLUDE_LIBC .) + set(INCLUDE_LIBC ${CMAKE_SOURCE_DIR}/jerry-libc) + set(INCLUDE_LIBC_INTERFACE ${CMAKE_SOURCE_DIR}/jerry-libc/include) + set(INCLUDE_LIBC_INTERFACE ${INCLUDE_LIBC_INTERFACE} PARENT_SCOPE) # Platform-specific # Linux @@ -124,6 +126,7 @@ set(COMPILE_FLAGS_LIBC "${COMPILE_FLAGS_JERRY} ${C_FLAGS_JERRY}") PROPERTY COMPILE_FLAGS "${COMPILE_FLAGS_LIBC} ${FLAGS_COMMON_${BUILD_MODE}}") target_compile_definitions(${TARGET_NAME}.lib PRIVATE ${DEFINES_LIBC}) target_include_directories(${TARGET_NAME}.lib PRIVATE ${INCLUDE_LIBC}) + target_include_directories(${TARGET_NAME}.lib SYSTEM PRIVATE ${INCLUDE_LIBC_INTERFACE}) add_dependencies(jerry-libc-all ${TARGET_NAME}.lib) # Third-party MCU library @@ -132,6 +135,8 @@ set(COMPILE_FLAGS_LIBC "${COMPILE_FLAGS_JERRY} ${C_FLAGS_JERRY}") set_property(TARGET ${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB} PROPERTY COMPILE_FLAGS "${FLAGS_COMMON_${BUILD_MODE}}") target_include_directories(${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB} PRIVATE ${INCLUDE_THIRD_PARTY_${PLATFORM_EXT}}) + target_include_directories(${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB} SYSTEM PRIVATE ${INCLUDE_LIBC_INTERFACE}) + target_link_libraries(${TARGET_NAME}.lib ${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB}) target_link_libraries(${TARGET_NAME}.lib ${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB}) endif() diff --git a/jerry-libc/include/ctype.h b/jerry-libc/include/ctype.h new file mode 100644 index 000000000..c7d196b89 --- /dev/null +++ b/jerry-libc/include/ctype.h @@ -0,0 +1,32 @@ +/* Copyright 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef JERRY_LIBC_CTYPE_H +#define JERRY_LIBC_CTYPE_H + +#ifdef __cplusplus +# define EXTERN_C "C" +#else /* !__cplusplus */ +# define EXTERN_C +#endif /* !__cplusplus */ + +extern EXTERN_C int isxdigit (int c); +extern EXTERN_C int isalpha (int c); +extern EXTERN_C int isdigit (int c); +extern EXTERN_C int islower (int c); +extern EXTERN_C int isspace (int c); +extern EXTERN_C int isupper (int c); + +#endif /* !JERRY_LIBC_CTYPE_H */ diff --git a/jerry-libc/include/stdio.h b/jerry-libc/include/stdio.h new file mode 100644 index 000000000..fbef311d1 --- /dev/null +++ b/jerry-libc/include/stdio.h @@ -0,0 +1,63 @@ +/* Copyright 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef JERRY_LIBC_STDIO_H +#define JERRY_LIBC_STDIO_H + +#include +#include + +#ifdef __cplusplus +# define EXTERN_C "C" +#else /* !__cplusplus */ +# define EXTERN_C +#endif /* !__cplusplus */ + +/** + * File descriptor type + */ +typedef void FILE; + +/** + * Standard file descriptors + */ +extern FILE *stdin; +extern FILE *stdout; +extern FILE *stderr; + +/** + * fseek's 'whence' argument values + */ +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 + +/** + * I/O routines + */ +extern EXTERN_C int vfprintf (FILE *stream, const char *format, va_list ap); +extern EXTERN_C int puts (const char *s); +extern EXTERN_C FILE *fopen (const char *path, const char *mode); +extern EXTERN_C int fclose (FILE *fp); +extern EXTERN_C size_t fread (void *ptr, size_t size, size_t nmemb, FILE *stream); +extern EXTERN_C size_t fwrite (const void *ptr, size_t size, size_t nmemb, FILE *stream); +extern EXTERN_C int fseek (FILE *stream, long offset, int whence); +extern EXTERN_C long ftell (FILE *stream); +extern EXTERN_C int printf (const char *format, ...); +extern EXTERN_C void rewind (FILE *stream); +extern EXTERN_C int fprintf (FILE *stream, const char *format, ...); +extern EXTERN_C int putchar (int c); + +#endif /* !JERRY_LIBC_STDIO_H */ diff --git a/jerry-libc/include/stdlib.h b/jerry-libc/include/stdlib.h new file mode 100644 index 000000000..c88e5a765 --- /dev/null +++ b/jerry-libc/include/stdlib.h @@ -0,0 +1,27 @@ +/* Copyright 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef JERRY_LIBC_STDLIB_H +#define JERRY_LIBC_STDLIB_H + +#ifdef __cplusplus +# define EXTERN_C "C" +#else /* !__cplusplus */ +# define EXTERN_C +#endif /* !__cplusplus */ + +extern EXTERN_C void __attribute__ ((noreturn)) exit (int); + +#endif /* !JERRY_LIBC_STDLIB_H */ diff --git a/jerry-libc/include/string.h b/jerry-libc/include/string.h new file mode 100644 index 000000000..5d3d6cd78 --- /dev/null +++ b/jerry-libc/include/string.h @@ -0,0 +1,36 @@ +/* Copyright 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef JERRY_LIBC_STRING_H +#define JERRY_LIBC_STRING_H + +#include + +#ifdef __cplusplus +# define EXTERN_C "C" +#else /* !__cplusplus */ +# define EXTERN_C +#endif /* !__cplusplus */ + +extern EXTERN_C int memcmp (const void *s1, const void *s2, size_t n); +extern EXTERN_C void* memcpy (void *dest, const void *src, size_t n); +extern EXTERN_C void* memset (void *s, int c, size_t n); +extern EXTERN_C int strcmp (const char *s1, const char *s2); +extern EXTERN_C size_t strlen (const char *s); +extern EXTERN_C void* memmove (void *dest, const void *src, size_t n); +extern EXTERN_C int strncmp (const char *s1, const char *s2, size_t n); +extern EXTERN_C char* strncpy (char *dest, const char *src, size_t n); + +#endif /* !JERRY_LIBC_STRING_H */ diff --git a/jerry-libc/jerry-libc-defs.h b/jerry-libc/jerry-libc-defs.h index 08f0106d1..a3ed58950 100644 --- a/jerry-libc/jerry-libc-defs.h +++ b/jerry-libc/jerry-libc-defs.h @@ -19,7 +19,6 @@ #include #include #include -#include /** * Attributes @@ -69,49 +68,10 @@ libc_fatal (const char *msg, * but referenced from third-party libraries. */ #define LIBC_UNREACHABLE_STUB_FOR(...) \ +extern __VA_ARGS__; \ __attr_used___ __VA_ARGS__ \ { \ LIBC_UNREACHABLE (); \ } -/** - * Libc redefinitions - */ - -/* Ensuring no macro implementation of variables / functions are in effect */ -#undef vfprintf -#undef fprintf -#undef printf -#undef isspace -#undef isalpha -#undef islower -#undef isupper -#undef isdigit -#undef isxdigit -#undef memset -#undef memcmp -#undef memcpy -#undef memmove -#undef strcmp -#undef strncmp -#undef strncpy -#undef strlen -#undef putchar -#undef puts -#undef exit -#undef fopen -#undef rewind -#undef fclose -#undef fseek -#undef ftell -#undef fread -#undef fwrite -#undef stdin -#undef stdout -#undef stderr - -extern FILE* stdin; -extern FILE* stdout; -extern FILE* stderr; - #endif /* !DEFS_H */ diff --git a/jerry-libc/jerry-libc-fatals.c b/jerry-libc/jerry-libc-fatals.c index 8b4e6edbe..eb2f11c7f 100644 --- a/jerry-libc/jerry-libc-fatals.c +++ b/jerry-libc/jerry-libc-fatals.c @@ -18,6 +18,7 @@ */ #include +#include #include "jerry-libc-defs.h" diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index abc477c4b..6d1317dcd 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -99,6 +99,7 @@ project (Jerry_Plugins CXX ASM) PROPERTY COMPILE_FLAGS "${COMPILE_FLAGS_PLUGINS} ${FLAGS_COMMON_${BUILD_MODE}}") target_compile_definitions(${TARGET_NAME}.lib PRIVATE ${DEFINES_PLUGINS}) target_include_directories(${TARGET_NAME}.lib PRIVATE ${INCLUDE_PLUGINS} ${INCLUDE_CORE_INTERFACE}) + target_include_directories(${TARGET_NAME}.lib SYSTEM PRIVATE ${INCLUDE_LIBC_INTERFACE}) add_dependencies(plugins-all ${TARGET_NAME}.lib) # Third-party MCU library @@ -107,6 +108,7 @@ project (Jerry_Plugins CXX ASM) set_property(TARGET ${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB} PROPERTY COMPILE_FLAGS "${FLAGS_COMMON_${BUILD_MODE}}") target_include_directories(${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB} PRIVATE ${INCLUDE_PLUGINS}) + target_include_directories(${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB} SYSTEM PRIVATE ${INCLUDE_LIBC_INTERFACE}) target_link_libraries(${TARGET_NAME}.lib ${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB}) endif()