diff --git a/Makefile b/Makefile index cfac5dcb0..c37a479e8 100644 --- a/Makefile +++ b/Makefile @@ -12,144 +12,49 @@ # See the License for the specific language governing permissions and # limitations under the License. -TARGET ?= jerry -CROSS_COMPILE ?= arm-none-eabi- -OBJ_DIR = ./obj -OUT_DIR = ./out +# +# Target naming scheme +# +# Main targets: {dev,debug,release,debug_release}.{linux,stm32f{4}}[.{check,flash}] +# +# Target mode part (before dot): +# dev: - JERRY_NDEBUG; - optimizations; + debug symbols; - -Werror | local development build +# debug: - JERRY_NDEBUG; - optimizations; + debug symbols; + -Werror | debug build +# debug_release: - JERRY_NDEBUG; + optimizations; + debug symbols; + -Werror | checked release build +# release: + JERRY_NDEBUG; + optimizations; - debug symbols; + -Werror | release build +# +# Target system part (after first dot): +# linux - target system is linux +# stm32f{4} - target is STM32F{4} board +# +# Target action part (optional, after second dot): +# check - run cppcheck on src folder, unit and other tests +# flash - flash specified mcu target binary +# +# +# Unit test target: unittests +# -MAIN_MODULE_SRC = ./src/main.c -UNITTESTS_SRC_DIR = ./tests/unit +export TARGET_MODES = dev debug debug_release release +export TARGET_PC_SYSTEMS = linux +export TARGET_MCU_SYSTEMS = $(addprefix stm32f,4) # now only stm32f4 is supported, to add, for example, to stm32f3, change to $(addprefix stm32f,3 4) +export TARGET_SYSTEMS = $(TARGET_PC_SYSTEMS) $(TARGET_MCU_SYSTEMS) -LNK_SCRIPT_STM32F4 = ./third-party/stm32f4.ld -SUP_STM32F4 = ./third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/ST/STM32F4xx/Source/Templates/gcc_ride7/startup_stm32f4xx.s +# Target list +export JERRY_TARGETS = $(foreach __MODE,$(TARGET_MODES),$(foreach __SYSTEM,$(TARGET_SYSTEMS),$(__MODE).$(__SYSTEM))) +export TESTS_TARGET = unittests +export CHECK_TARGETS = $(foreach __TARGET,$(JERRY_TARGETS),$(__TARGET).check) +export FLASH_TARGETS = $(foreach __TARGET,$(JERRY_TARGETS),$(__TARGET).flash) +export OBJ_DIR = ./obj +export OUT_DIR = ./out +export UNITTESTS_SRC_DIR = ./tests/unit -# FIXME: -# Place jerry-libc.c, pretty-printer.c to some subdirectory (libruntime?) -# and add them to the SOURCES list through wildcard. -# FIXME: -# Add common-io.c and sensors.c -SOURCES = \ - $(sort \ - $(wildcard ./src/libruntime/*.c) \ - $(wildcard ./src/libperipherals/actuators.c) \ - $(wildcard ./src/libjsparser/*.c) \ - $(wildcard ./src/libecmaobjects/*.c) \ - $(wildcard ./src/libecmaoperations/*.c) \ - $(wildcard ./src/liballocator/*.c) \ - $(wildcard ./src/libcoreint/*.c) ) +all: clean $(JERRY_TARGETS) $(TESTS_TARGET) $(CHECK_TARGETS) -SOURCES_STM32F4 = \ - third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c \ - $(wildcard src/libruntime/target/stm32f4/*) - -SOURCES_LINUX = \ - $(wildcard src/libruntime/target/linux/*) - -HEADERS = \ - $(sort \ - $(wildcard ./src/*.h) \ - $(wildcard ./src/libruntime/*.h) \ - $(wildcard ./src/libperipherals/*.h) \ - $(wildcard ./src/libjsparser/*.h) \ - $(wildcard ./src/libecmaobjects/*.h) \ - $(wildcard ./src/libecmaoperations/*.h) \ - $(wildcard ./src/liballocator/*.h) \ - $(wildcard ./src/libcoreint/*.h) ) - -INCLUDES = \ - -I src \ - -I src/libruntime \ - -I src/libperipherals \ - -I src/libjsparser \ - -I src/libecmaobjects \ - -I src/libecmaoperations \ - -I src/liballocator \ - -I src/libcoreint - -INCLUDES_STM32F4 = \ - -I third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/ST/STM32F4xx/Include \ - -I third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/STM32F4xx_StdPeriph_Driver/inc \ - -I third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/Include - -UNITTESTS = \ - $(sort \ - $(patsubst %.c,%,$(notdir \ - $(wildcard $(UNITTESTS_SRC_DIR)/*)))) - -OBJS = \ - $(sort \ - $(patsubst %.c,./%.o,$(notdir $(MAIN_MODULE_SRC) $(SOURCES)))) - -CC = gcc -LD = ld -OBJDUMP = objdump -OBJCOPY = objcopy -SIZE = size -STRIP = strip - -# General flags -CFLAGS ?= $(INCLUDES) -std=c99 -Werror #-fdiagnostics-color=always -CFLAGS += -Wall -Wextra -Wpedantic -Wlogical-op -Winline -CFLAGS += -Wformat-nonliteral -Winit-self -Wstack-protector -CFLAGS += -Wconversion -Wsign-conversion -Wformat-security -CFLAGS += -Wstrict-prototypes -Wmissing-prototypes - -# Flags for MCU -MCU_CFLAGS += -mlittle-endian -mcpu=cortex-m4 -march=armv7e-m -mthumb -MCU_CFLAGS += -mfpu=fpv4-sp-d16 -mfloat-abi=hard -MCU_CFLAGS += -ffunction-sections -fdata-sections -nostdlib -fno-common - -LDFLAGS = -nostartfiles -T$(LNK_SCRIPT_STM32F4) - -DEBUG_OPTIONS = -g3 -O0 # -fsanitize=address -RELEASE_OPTIONS = -Os -flto -DJERRY_NDEBUG - -DEFINES = -DMEM_HEAP_CHUNK_SIZE=256 -DMEM_HEAP_AREA_SIZE=32768 -DMEM_STATS -TARGET_HOST = -D__HOST -TARGET_MCU = -D__TARGET_MCU - -#-I third-party/STM32F4-Discovery_FW_V1.1.0/Project/Demonstration \ - -.PHONY: all debug debug.stdm32f4 release clean tests check install - -all: clean debug release check - -debug.stdm32f4: clean debug.stdm32f4.bin - -debug.stdm32f4.o: - mkdir -p $(OUT_DIR)/debug.stdm32f4/ - $(CROSS_COMPILE)$(CC) \ - $(SUP_STM32F4) $(SOURCES_STM32F4) $(INCLUDES_STM32F4) \ - $(CFLAGS) $(MCU_CFLAGS) $(DEBUG_OPTIONS) \ - $(DEFINES) $(TARGET_MCU) $(MAIN_MODULE_SRC) -c - -debug.stdm32f4.elf: debug.stdm32f4.o - $(CROSS_COMPILE)$(LD) $(LDFLAGS) -o $(TARGET).elf *.o - rm -f *.o - -debug.stdm32f4.bin: debug.stdm32f4.elf - $(CROSS_COMPILE)$(OBJCOPY) -Obinary $(TARGET).elf $(TARGET).bin - rm -f *.elf - -debug: clean - mkdir -p $(OUT_DIR)/debug.host/ - $(CC) $(CFLAGS) $(DEBUG_OPTIONS) $(DEFINES) $(TARGET_HOST) \ - $(SOURCES) $(SOURCES_LINUX) $(MAIN_MODULE_SRC) -o $(OUT_DIR)/debug.host/$(TARGET) - -release: clean - mkdir -p $(OUT_DIR)/release.host/ - $(CC) $(CFLAGS) $(RELEASE_OPTIONS) $(DEFINES) $(TARGET_HOST) \ - $(SOURCES) $(SOURCES_LINUX) $(MAIN_MODULE_SRC) -o $(OUT_DIR)/release.host/$(TARGET) - $(STRIP) $(OUT_DIR)/release.host/$(TARGET) - -tests: - mkdir -p $(OUT_DIR)/tests.host/ - for unit_test in $(UNITTESTS); \ - do \ - $(CC) -O3 $(CFLAGS) $(DEBUG_OPTIONS) $(DEFINES) $(TARGET_HOST) \ - $(SOURCES) $(SOURCES_LINUX) $(UNITTESTS_SRC_DIR)/"$$unit_test".c -o $(OUT_DIR)/tests.host/"$$unit_test"; \ - done +$(JERRY_TARGETS) $(TESTS_TARGET) $(FLASH_TARGETS) $(CHECK_TARGETS): + @echo $@ + @make -f Makefile.mak TARGET=$@ $@ clean: rm -f $(OBJ_DIR)/*.o *.bin *.o *~ *.log *.log @@ -161,31 +66,3 @@ clean: rm -f $(TARGET).hex rm -f $(TARGET).lst rm -f js.files - -check: tests - @ mkdir -p $(OUT_DIR) - @ cd $(OUT_DIR) - - @ echo "=== Running cppcheck ===" - @ cppcheck $(HEADERS) $(SOURCES) --error-exitcode=1 --enable=all --std=c99 - @ echo Done - @ echo - - @ echo "=== Running unit tests ===" - @ ./tools/jerry_unittest.sh $(OUT_DIR)/tests.host $(UNITTESTS) - @ echo Done - @ echo - - @ echo "=== Running js tests ===" - @ if [ -f $(OUT_DIR)/release.host/$(TARGET) ]; then \ - ./tools/jerry_test.sh $(OUT_DIR)/release.host/$(TARGET);\ - fi - - @ if [ -f $(OUT_DIR)/debug.host/$(TARGET) ]; then \ - ./tools/jerry_test.sh $(OUT_DIR)/debug.host/$(TARGET); \ - fi - @echo Done - @echo - -install: - st-flash write $(TARGET).bin 0x08000000 diff --git a/Makefile.mak b/Makefile.mak new file mode 100644 index 000000000..efbc9e696 --- /dev/null +++ b/Makefile.mak @@ -0,0 +1,275 @@ +ifeq ($(TARGET),) + $(error TARGET not set) +endif + +ENGINE_NAME ?= jerry + +CROSS_COMPILE ?= arm-none-eabi- +CC = gcc +LD = ld +OBJDUMP = objdump +OBJCOPY = objcopy +SIZE = size +STRIP = strip + +MAIN_MODULE_SRC = ./src/main.c + +LNK_SCRIPT_STM32F4 = ./third-party/stm32f4.ld + +# Parsing target +# '.' -> ' ' +TARGET_SPACED = $(subst ., ,$(TARGET)) +# extract target mode part +TARGET_MODE = $(word 1,$(TARGET_SPACED)) +# extract target system part +TARGET_SYSTEM = $(word 2,$(TARGET_SPACED)) +# extract optional action part +TARGET_ACTION = $(word 3,$(TARGET_SPACED)) + +# target folder name in $(OUT_DIR) +TARGET_DIR=$(OUT_DIR)/$(TARGET_MODE).$(TARGET_SYSTEM) + +# unittests mode -> linux system +ifeq ($(TARGET_MODE),$(TESTS_TARGET)) + TARGET_SYSTEM = linux +endif + +# +# Options setup +# + +# JERRY_NDEBUG, debug symbols +ifeq ($(TARGET_MODE),release) + OPTION_NDEBUG = enable + OPTION_DEBUG_SYMS = disable + OPTION_STRIP = enable +else + OPTION_NDEBUG = disable + OPTION_DEBUG_SYMS = enable + OPTION_STRIP = disable +endif + +# Optimizations +ifeq ($(filter-out debug_release release $(TESTS_TARGET),$(TARGET_MODE)),) + OPTION_OPTIMIZE = enable +else + OPTION_OPTIMIZE = disable +endif + +# -Werror +ifeq ($(TARGET_MODE),dev) + OPTION_WERROR = disable +else + OPTION_WERROR = enable +endif + +# Is MCU target? +ifeq ($(filter-out $(TARGET_MCU_SYSTEMS),$(TARGET_SYSTEM)),) + OPTION_MCU = enable +else + OPTION_MCU = disable +endif + +# +# Target CPU +# +TARGET_CPU = $(strip $(if $(filter linux,$(TARGET_SYSTEM)), x64, \ + $(if $(filter stm32f3,$(TARGET_SYSTEM)), cortexm4, \ + $(if $(filter stm32f4,$(TARGET_SYSTEM)), cortexm4, \ + $(error Do not know target CPU for target system '$(TARGET_SYSTEM)'))))) + +# +# Flag blocks +# + +# Warnings +CFLAGS_WARNINGS ?= -Wall -Wextra -Wpedantic -Wlogical-op -Winline \ + -Wformat-nonliteral -Winit-self -Wstack-protector \ + -Wconversion -Wsign-conversion -Wformat-security \ + -Wstrict-prototypes -Wmissing-prototypes +CFLAGS_WERROR ?= -Werror + +# Optimizations +CFLAGS_OPTIMIZE ?= -Os -flto +CFLAGS_NO_OPTIMIZE ?= -O0 +LDFLAGS_OPTIMIZE ?= -flto +LDFLAGS_NO_OPTIMIZE ?= -O0 + +# Debug symbols +CFLAGS_DEBUG_SYMS ?= -g3 + +# Cortex-M4 MCU +CFLAGS_CORTEXM4 ?= -mlittle-endian -mcpu=cortex-m4 -march=armv7e-m -mthumb \ + -mfpu=fpv4-sp-d16 -mfloat-abi=hard + + +# +# Common +# + +CFLAGS_COMMON ?= $(INCLUDES) -std=c99 # -fsanitize=address -fdiagnostics-color=always +CFLAGS_COMMON += -DMEM_HEAP_CHUNK_SIZE=256 -DMEM_HEAP_AREA_SIZE=32768 -DMEM_STATS + +LDFLAGS ?= + +ifeq ($(OPTION_OPTIMIZE),enable) + CFLAGS_COMMON += $(CFLAGS_OPTIMIZE) + LDFLAGS += $(LDFLAGS_OPTIMIZE) +else + CFLAGS_COMMON += $(CFLAGS_NO_OPTIMIZE) + LDFLAGS += $(LDFLAGS_NO_OPTIMIZE) +endif + +ifeq ($(OPTION_DEBUG_SYMS),enable) + CFLAGS_COMMON += $(CFLAGS_DEBUG_SYMS) +endif + +# CPU-specific common +ifeq ($(TARGET_CPU),cortexm4) + CFLAGS_COMMON += $(CFLAGS_CORTEXM4) +endif + +# System-specific common +ifeq ($(TARGET_SYSTEM),stm32f4) + LDFLAGS += -nostartfiles -T$(LNK_SCRIPT_STM32F4) +endif + +ifeq ($(OPTION_MCU),enable) + CC := $(CROSS_COMPILE)$(CC) + LD := $(CROSS_COMPILE)$(LD) + OBJDUMP := $(CROSS_COMPILE)$(OBJDUMP) + OBJCOPY := $(CROSS_COMPILE)$(OBJCOPY) + SIZE := $(CROSS_COMPILE)$(SIZE) + STRIP := $(CROSS_COMPILE)$(STRIP) +endif + +# +# Jerry part sources, headers, includes, cflags, ldflags +# + +CFLAGS_JERRY = $(CFLAGS_COMMON) $(CFLAGS_WARNINGS) + +# FIXME: +# Add common-io.c and sensors.c +SOURCES_JERRY = \ + $(sort \ + $(wildcard ./src/libruntime/*.c) \ + $(wildcard ./src/libperipherals/actuators.c) \ + $(wildcard ./src/libjsparser/*.c) \ + $(wildcard ./src/libecmaobjects/*.c) \ + $(wildcard ./src/libecmaoperations/*.c) \ + $(wildcard ./src/liballocator/*.c) \ + $(wildcard ./src/libcoreint/*.c) ) \ + $(wildcard src/libruntime/target/$(TARGET_SYSTEM)/*) + +INCLUDES_JERRY = \ + -I src \ + -I src/libruntime \ + -I src/libperipherals \ + -I src/libjsparser \ + -I src/libecmaobjects \ + -I src/libecmaoperations \ + -I src/liballocator \ + -I src/libcoreint + +ifeq ($(OPTION_NDEBUG),enable) + CFLAGS_JERRY += -DJERRY_NDEBUG +endif + +ifeq ($(OPTION_WERROR),enable) + CFLAGS_JERRY += $(CFLAGS_WERROR) +endif + +ifeq ($(OPTION_MCU),disable) + CFLAGS_JERRY += -D__HOST +else + CFLAGS_COMMON += -ffunction-sections -fdata-sections -nostdlib + CFLAGS_JERRY += -D__TARGET_MCU +endif + +# +# Third-party sources, headers, includes, cflags, ldflags +# + +SOURCES_THIRDPARTY = +INCLUDES_THIRDPARTY = +CFLAGS_THIRDPARTY = + +ifeq ($(TARGET_SYSTEM),stm32f4) + SOURCES_THIRDPARTY += \ + ./third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c \ + ./third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/ST/STM32F4xx/Source/Templates/gcc_ride7/startup_stm32f4xx.s + + INCLUDES_THIRDPARTY += \ + -I third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/ST/STM32F4xx/Include \ + -I third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/STM32F4xx_StdPeriph_Driver/inc \ + -I third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/Include + +#-I third-party/STM32F4-Discovery_FW_V1.1.0/Project/Demonstration \ + +endif + +# Unit tests + +SOURCES_UNITTESTS = \ + $(sort \ + $(patsubst %.c,%,$(notdir \ + $(wildcard $(UNITTESTS_SRC_DIR)/*)))) + +.PHONY: all clean check install $(JERRY_TARGETS) $(TESTS_TARGET) + +all: clean $(JERRY_TARGETS) + +$(JERRY_TARGETS): + @rm -rf $(TARGET_DIR) + @mkdir -p $(TARGET_DIR) + @rm -rf $(OBJ_DIR) + @mkdir $(OBJ_DIR) + @source_index=0; \ + for jerry_src in $(SOURCES_JERRY) $(MAIN_MODULE_SRC); do \ + cmd="$(CC) -c $(CFLAGS_COMMON) $(CFLAGS_JERRY) $(INCLUDES_JERRY) $(INCLUDES_THIRDPARTY) $$jerry_src -o $(OBJ_DIR)/$$(basename $$jerry_src).$$source_index.o"; \ + $$cmd; \ + if [ $$? -ne 0 ]; then echo Failed "'$$cmd'"; exit 1; fi; \ + source_index=$$(($$source_index+1)); \ + done; \ + for thirdparty_src in $(SOURCES_THIRDPARTY); do \ + cmd="$(CC) -c $(CFLAGS_COMMON) $(CFLAGS_THIRDPARTY) $(INCLUDES_THIRDPARTY) $$thirdparty_src -o $(OBJ_DIR)/$$(basename $$thirdparty_src).$$source_index.o"; \ + $$cmd; \ + if [ $$? -ne 0 ]; then echo Failed "'$$cmd'"; exit 1; fi; \ + source_index=$$(($$source_index+1)); \ + done; \ + cmd="$(CC) $(CFLAGS_COMMON) $(OBJ_DIR)/* $(LDFLAGS) -o $(TARGET_DIR)/$(ENGINE_NAME)"; \ + $$cmd; \ + if [ $$? -ne 0 ]; then echo Failed "'$$cmd'"; exit 1; fi; + @if [ "$(OPTION_STRIP)" = "enable" ]; then $(STRIP) $(TARGET_DIR)/$(ENGINE_NAME) || exit $$?; fi; + @if [ "$(OPTION_MCU)" = "enable" ]; then $(OBJCOPY) -Obinary $(TARGET_DIR)/$(ENGINE_NAME) $(TARGET_DIR)/$(ENGINE_NAME).bin || exit $$?; fi; + +$(TESTS_TARGET): + @echo $@ $(TARGET_DIR) + @mkdir -p $(TARGET_DIR) + @for unit_test in $(SOURCES_UNITTESTS); \ + do \ + $(CC) $(CFLAGS_COMMON) $(CFLAGS_JERRY) \ + $(INCLUDES_JERRY) $(INCLUDES_THIRDPARTY) $(SOURCES_JERRY) $(UNITTESTS_SRC_DIR)/"$$unit_test".c -o $(TARGET_DIR)/"$$unit_test"; \ + done + @ echo "=== Running unit tests ===" + @ ./tools/jerry_unittest.sh $(TARGET_DIR) + @ echo Done + @ echo + +$(CHECK_TARGETS): + @ echo "=== Running cppcheck ===" + @ cppcheck `find src $(UNITTESTS_SRC_DIR) -name *.[ch]` --error-exitcode=1 --enable=all --std=c99 + @ echo Done + @ echo + + @ echo "=== Running js tests ===" + @ if [ -f $(TARGET_DIR)/$(ENGINE_NAME) ]; then \ + ./tools/jerry_test.sh $(TARGET_DIR)/$(ENGINE_NAME);\ + fi + + @echo Done + @echo + +$(FLASH_TARGETS): + st-flash write $(OUT_DIR)/$(TARGET)/jerry.bin 0x08000000 || exit $$? diff --git a/tools/jerry_unittest.sh b/tools/jerry_unittest.sh index 645aef2ce..cb92943d7 100755 --- a/tools/jerry_unittest.sh +++ b/tools/jerry_unittest.sh @@ -15,7 +15,10 @@ #!/bin/bash DIR="$1" -UNITTESTS="${*:2}" + +rm -f $DIR/unit_tests_run.log + +UNITTESTS=$(ls $DIR) for unit_test in $UNITTESTS; do