diff --git a/CMakeLists.txt b/CMakeLists.txt index c7161317d..60f563263 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,7 +80,8 @@ project (Jerry CXX C ASM) set(PLATFORM_EXT "NUTTX") set(EXTERNAL_BUILD TRUE) - set(EXTERNAL_LIBC_INTERFACE "UNDEFINED" CACHE STRING "Path to external libc's include directory") + set(EXTERNAL_LIBC_INTERFACE "UNDEFINED" CACHE STRING "Path to external libc include directory") + set(EXTERNAL_LIBS_INTERFACE "UNDEFINED" CACHE STRING "Path to external libraries' include directory") else() message(FATAL_ERROR "Platform is not supported") endif() @@ -91,17 +92,33 @@ project (Jerry CXX C ASM) # Should we use external libc? if(NOT DEFINED EXTERNAL_LIBC_INTERFACE OR EXTERNAL_LIBC_INTERFACE STREQUAL "UNDEFINED") - set(USE_EXTERNAL_LIBC FALSE) + set(USE_JERRY_LIBC TRUE) - if(${EXTERNAL_BUILD}) - message(FATAL_ERROR "Currently, external build with Jerry's libc is not supported") - endif() + # Jerry's libc doesn't support Nuttx platform + if(${PLATFORM} STREQUAL "NUTTX") + message(FATAL_ERROR "Nuttx build doesn't support Jerry's libc implementation") + endif() else() - if (NOT EXISTS "${EXTERNAL_LIBC_INTERFACE}") - message(FATAL_ERROR "External libc interface directory doesn't exist: ${EXTERNAL_LIBC_INTERFACE}") + set(USE_JERRY_LIBC FALSE) + + if(NOT EXISTS "${EXTERNAL_LIBC_INTERFACE}/stdlib.h") + message(FATAL_ERROR "It seems that external libc interface '${EXTERNAL_LIBC_INTERFACE}' doesn't provide stdlib.h header") endif() - set(USE_EXTERNAL_LIBC TRUE) + set(INCLUDE_LIBC_INTERFACE ${EXTERNAL_LIBC_INTERFACE}) + endif() + +# Are there any interfaces for external libraries, other than libc, that should be registered? + if(DEFINED EXTERNAL_LIBS_INTERFACE AND NOT EXTERNAL_LIBS_INTERFACE STREQUAL "UNDEFINED") + set(INCLUDE_EXTERNAL_LIBS_INTERFACE ) + + foreach(EXTERNAL_LIB_INTERFACE ${EXTERNAL_LIBS_INTERFACE}) + if (NOT EXISTS "${EXTERNAL_LIB_INTERFACE}") + message(FATAL_ERROR "Interface directory of the external library doesn't exist: ${EXTERNAL_LIB_INTERFACE}") + endif() + + set(INCLUDE_EXTERNAL_LIBS_INTERFACE ${INCLUDE_EXTERNAL_LIBS_INTERFACE} ${EXTERNAL_LIB_INTERFACE}) + endforeach() endif() # Build modes @@ -163,9 +180,9 @@ project (Jerry CXX C ASM) "COMPACT_PROFILE" "COMPACT_PROFILE_MINIMAL") - # Nuttx - set(MODIFIERS_LISTS_NUTTX - ${MODIFIERS_LISTS_LINUX}) + # Nuttx + set(MODIFIERS_LISTS_NUTTX + ${MODIFIERS_LISTS_LINUX}) # Compiler / Linker flags set(COMPILE_FLAGS_JERRY "-fno-builtin") @@ -278,10 +295,8 @@ project (Jerry CXX C ASM) # Component targets # Jerry's libc - if(NOT ${USE_EXTERNAL_LIBC}) + if(${USE_JERRY_LIBC}) add_subdirectory(jerry-libc) - else() - set(INCLUDE_LIBC_INTERFACE ${EXTERNAL_LIBC_INTERFACE}) endif() # Jerry's Core @@ -327,6 +342,7 @@ project (Jerry CXX C ASM) 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_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${INCLUDE_EXTERNAL_LIBS_INTERFACE}) target_link_libraries(${TARGET_NAME} ${PLUGINS_TARGET_NAME} ${CORE_TARGET_NAME} ${LIBC_TARGET_NAME} ${PREFIX_IMPORTED_LIB}libgcc ${PREFIX_IMPORTED_LIB}libgcc_eh) @@ -357,6 +373,7 @@ project (Jerry CXX C ASM) target_compile_definitions(${MAIN_MODULE_TARGET_NAME} PRIVATE ${DEFINES_JERRY}) target_include_directories(${MAIN_MODULE_TARGET_NAME} PRIVATE ${INCLUDE_CORE_INTERFACE}) target_include_directories(${MAIN_MODULE_TARGET_NAME} SYSTEM PRIVATE ${INCLUDE_LIBC_INTERFACE}) + target_include_directories(${MAIN_MODULE_TARGET_NAME} SYSTEM PRIVATE ${INCLUDE_EXTERNAL_LIBS_INTERFACE}) add_custom_target(${TARGET_NAME} ALL) add_dependencies(${TARGET_NAME} ${MAIN_MODULE_TARGET_NAME} ${PLUGINS_TARGET_NAME} ${CORE_TARGET_NAME}) @@ -369,11 +386,7 @@ project (Jerry CXX C ASM) $ $ > ${CMAKE_BINARY_DIR}/${TARGET_NAME}/list) - if(NOT ${USE_EXTERNAL_LIBC}) - if(${PLATFORM} STREQUAL "NUTTX") - message(Nuttx build doesn't support Jerry's libc implementation) - endif() - + if(${USE_JERRY_LIBC}) add_dependencies(${TARGET_NAME} ${LIBC_TARGET_NAME}) endif() diff --git a/Makefile b/Makefile index eec8d7fd8..5c77ad274 100644 --- a/Makefile +++ b/Makefile @@ -63,7 +63,11 @@ endif # External build configuration - EXTERNAL_LIBS_INTERFACE ?= $(shell pwd)/third-party/nuttx/include + # List of include paths for external libraries (semicolon-separated) + EXTERNAL_LIBS_INTERFACE ?= + # External libc interface + EXTERNAL_LIBC_INTERFACE ?= $(shell pwd)/third-party/nuttx/include + # Compiler to use for external build EXTERNAL_C_COMPILER ?= arm-none-eabi-gcc EXTERNAL_CXX_COMPILER ?= arm-none-eabi-g++ @@ -151,8 +155,9 @@ $(BUILD_DIRS_NATIVE): prerequisites (echo "CMake run failed. See "`pwd`"/cmake.log for details."; exit 1;) $(BUILD_DIRS_NUTTX): prerequisites - @ [ "$(EXTERNAL_LIBS_INTERFACE)" != "" ] && [ -x `which $(EXTERNAL_C_COMPILER)` ] && [ -x `which $(EXTERNAL_CXX_COMPILER)` ] || \ + @ [ "$(EXTERNAL_LIBC_INTERFACE)" != "" ] && [ -x `which $(EXTERNAL_C_COMPILER)` ] && [ -x `which $(EXTERNAL_CXX_COMPILER)` ] || \ (echo "Wrong external arguments."; \ + echo "EXTERNAL_LIBC_INTERFACE='$(EXTERNAL_LIBC_INTERFACE)'"; \ echo "EXTERNAL_LIBS_INTERFACE='$(EXTERNAL_LIBS_INTERFACE)'"; \ echo "EXTERNAL_C_COMPILER='$(EXTERNAL_C_COMPILER)'"; \ echo "EXTERNAL_CXX_COMPILER='$(EXTERNAL_CXX_COMPILER)'"; \ @@ -162,9 +167,10 @@ $(BUILD_DIRS_NUTTX): prerequisites cmake \ -DENABLE_VALGRIND=$(VALGRIND) -DENABLE_LTO=$(LTO) \ -DCMAKE_TOOLCHAIN_FILE=build/configs/toolchain_external.cmake \ - -DEXTERNAL_LIBC_INTERFACE=${EXTERNAL_LIBS_INTERFACE} \ - -DEXTERNAL_CMAKE_C_COMPILER=${EXTERNAL_C_COMPILER} \ - -DEXTERNAL_CMAKE_CXX_COMPILER=${EXTERNAL_CXX_COMPILER} \ + -DEXTERNAL_LIBC_INTERFACE="${EXTERNAL_LIBC_INTERFACE}" \ + -DEXTERNAL_LIBS_INTERFACE="${EXTERNAL_LIBS_INTERFACE}" \ + -DEXTERNAL_CMAKE_C_COMPILER="${EXTERNAL_C_COMPILER}" \ + -DEXTERNAL_CMAKE_CXX_COMPILER="${EXTERNAL_CXX_COMPILER}" \ ../../.. &>cmake.log || \ (echo "CMake run failed. See "`pwd`"/cmake.log for details."; exit 1;) diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 574defc87..a26e7260d 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -63,8 +63,7 @@ project (Jerry_Plugins CXX ASM) ${CMAKE_SOURCE_DIR}/third-party/STM32F4-Discovery_FW_V1.1.0) # Nuttx - set(INCLUDE_THIRD_PARTY_NUTTX - ${EXTERNAL_LIBC_INTERFACE}) + set(INCLUDE_THIRD_PARTY_NUTTX ) # Sources file(GLOB SOURCE_PLUGINS @@ -108,6 +107,7 @@ project (Jerry_Plugins CXX ASM) 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}) + target_include_directories(${TARGET_NAME}.lib SYSTEM PRIVATE ${INCLUDE_EXTERNAL_LIBS_INTERFACE}) add_dependencies(plugins-all ${TARGET_NAME}.lib) # Third-party MCU library @@ -117,6 +117,7 @@ project (Jerry_Plugins CXX ASM) 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_include_directories(${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB} SYSTEM PRIVATE ${INCLUDE_EXTERNAL_LIBS_INTERFACE}) target_link_libraries(${TARGET_NAME}.lib ${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB}) endif()