diff --git a/Makefile b/Makefile index 7830afc16..0f3a5817d 100644 --- a/Makefile +++ b/Makefile @@ -22,9 +22,12 @@ # 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): +# Target system and modifiers part (after first dot): # linux - target system is linux -# stm32f{4} - target is STM32F{4} board +# stm32f{4} - target is STM32F{4} board +# +# Modifiers can be added after '-' sign. +# For list of modifiers for PC target - see TARGET_PC_MODS, for MCU target - TARGET_MCU_MODS. # # Target action part (optional, after second dot): # check - run cppcheck on src folder, unit and other tests @@ -41,12 +44,21 @@ export TARGET_MODES = 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) + +export TARGET_PC_MODS = libc_raw musl sanitize valgrind \ + libc_raw-sanitize libc_raw-valgrind \ + musl-valgrind + +export TARGET_MCU_MODS = + +export TARGET_SYSTEMS = $(TARGET_PC_SYSTEMS) \ + $(TARGET_MCU_SYSTEMS) \ + $(foreach __MOD,$(TARGET_PC_MODS),$(foreach __SYSTEM,$(TARGET_PC_SYSTEMS),$(__SYSTEM)-$(__MOD))) \ + $(foreach __MOD,$(TARGET_MCU_MODS),$(foreach __SYSTEM,$(TARGET_MCU_SYSTEMS),$(__SYSTEM)-$(__MOD))) # Target list export JERRY_TARGETS = $(foreach __MODE,$(TARGET_MODES),$(foreach __SYSTEM,$(TARGET_SYSTEMS),$(__MODE).$(__SYSTEM))) export TESTS_TARGET = unittests -export PARSER_TESTS_TARGET = testparser export CHECK_TARGETS = $(foreach __TARGET,$(JERRY_TARGETS),$(__TARGET).check) export FLASH_TARGETS = $(foreach __TARGET,$(foreach __MODE,$(TARGET_MODES),$(foreach __SYSTEM,$(TARGET_MCU_SYSTEMS),$(__MODE).$(__SYSTEM))),$(__TARGET).flash) @@ -60,16 +72,51 @@ export echo export todo export fixme export color -export sanitize -export valgrind -export musl -export libc_raw -all: clean $(TESTS_TARGET) $(CHECK_TARGETS) +build: clean $(JERRY_TARGETS) -$(JERRY_TARGETS) $(TESTS_TARGET) $(PARSER_TESTS_TARGET) $(FLASH_TARGETS) $(CHECK_TARGETS): - @echo $@ - @$(MAKE) -f Makefile.mk TARGET=$@ $@ +all: clean $(JERRY_TARGETS) $(TESTS_TARGET) $(CHECK_TARGETS) + +.SILENT: commit + +GIT_STATUS_NOT_CLEAN_MSG="Git status of current directory is not clean" +GIT_STATUS_CONSIDER_CLEAN_MSG="Consider removing all untracked files and locally commiting all changes and running \'make precommit\' again" +PRECOMMIT_CHECK_TARGETS_LIST= debug.linux-sanitize.check \ + debug.linux-valgrind.check \ + debug_release.linux-sanitize.check \ + debug_release.linux-valgrind.check \ + release.linux-sanitize.check \ + release.linux-musl-valgrind.check \ + release.linux-libc_raw-valgrind.check + +git_status_pre_test_check: + @ clear + @ if [ "`git status --porcelain 2>&1 | wc -l`" != "0" ]; \ + then \ + echo -e "\n \e[1;90m$(GIT_STATUS_NOT_CLEAN_MSG):\n"; \ + git status ; \ + echo -e "\n\n $(GIT_STATUS_CONSIDER_CLEAN_MSG).\e[0m\n"; \ + fi + +precommit: clean git_status_pre_test_check build + @ echo -e "\n================ Build completed successfully. Running precommit tests ================\n" + @ echo -e "All targets were built successfully. Starting unit tests' build and run.\n" + @ $(MAKE) -s unittests TESTS_OPTS="--silent" + @ echo -e "Unit tests completed successfully. Starting parse-only testing.\n" + @ $(MAKE) -s $(PRECOMMIT_CHECK_TARGETS_LIST) TESTS_DIR=./tests/jerry TESTS_OPTS="--parse-only" OUTPUT_TO_LOG=enable + @ echo -e "\e[0;31mFIXME:\e[0m './benchmarks/jerry parse-only' testing skipped.\n"; # $(MAKE) -s $(PRECOMMIT_CHECK_TARGETS_LIST) TESTS_DIR=./benchmarks/jerry TESTS_OPTS="--parse-only" OUTPUT_TO_LOG=enable + @ echo -e "Parse-only testing completed successfully. Starting full tests run.\n" + @ echo -e "\e[0;31mFIXME:\e[0m Full testing skipped.\n"; # $(MAKE) -s $(PRECOMMIT_CHECK_TARGETS_LIST) TESTS_DIR=./tests/jerry OUTPUT_TO_LOG=enable + @ echo -e "Full testing completed successfully\n\n================\n\n" + @ if [ "`git status --porcelain 2>&1 | grep -v -e '^?? out/$' | wc -l`" == "0" ]; \ + then \ + echo -e "\e[0;32m OK to push\e[0m"; \ + else \ + echo -e "\e[1;33m $(GIT_STATUS_NOT_CLEAN_MSG). $(GIT_STATUS_CONSIDER_CLEAN_MSG).\e[0m\n"; \ + fi; + +$(JERRY_TARGETS) $(TESTS_TARGET) $(FLASH_TARGETS) $(CHECK_TARGETS): + @$(MAKE) -s -f Makefile.mk TARGET=$@ $@ clean: - rm -rf $(OUT_DIR) + @ rm -rf $(OUT_DIR) diff --git a/Makefile.mk b/Makefile.mk index 65d3cdb8f..138bc11b6 100644 --- a/Makefile.mk +++ b/Makefile.mk @@ -18,29 +18,33 @@ LNK_SCRIPT_STM32F4 = ./third-party/stm32f4.ld # Parsing target # '.' -> ' ' -TARGET_SPACED = $(subst ., ,$(TARGET)) +TARGET_SPACED := $(subst ., ,$(TARGET)) # extract target mode part -TARGET_MODE = $(word 1,$(TARGET_SPACED)) +TARGET_MODE := $(word 1,$(TARGET_SPACED)) +# extract target system part with modifiers +TARGET_SYSTEM_AND_MODS := $(word 2,$(TARGET_SPACED)) +TARGET_SYSTEM_AND_MODS_SPACED := $(subst -, ,$(TARGET_SYSTEM_AND_MODS)) + # extract target system part -TARGET_SYSTEM = $(word 2,$(TARGET_SPACED)) +TARGET_SYSTEM := $(word 1,$(TARGET_SYSTEM_AND_MODS_SPACED)) + +# extract modifiers +TARGET_MODS := $(wordlist 2, $(words $(TARGET_SYSTEM_AND_MODS_SPACED)), $(TARGET_SYSTEM_AND_MODS_SPACED)) + # extract optional action part -TARGET_ACTION = $(word 3,$(TARGET_SPACED)) +TARGET_ACTION := $(word 3,$(TARGET_SPACED)) # Target used as dependency of an action (check, flash, etc.) -TARGET_OF_ACTION = $(TARGET_MODE).$(TARGET_SYSTEM) - -# target folder name in $(OUT_DIR) -TARGET_DIR=$(OUT_DIR)/$(TARGET_MODE).$(TARGET_SYSTEM) +TARGET_OF_ACTION := $(TARGET_MODE).$(TARGET_SYSTEM_AND_MODS) # unittests mode -> linux system ifeq ($(TARGET_MODE),$(TESTS_TARGET)) - TARGET_SYSTEM = linux + TARGET_SYSTEM := linux + TARGET_SYSTEM_AND_MODS := $(TARGET_SYSTEM) endif -# parse-only mode -> linux system -ifeq ($(TARGET_MODE),$(PARSER_TESTS_TARGET)) - TARGET_SYSTEM = linux -endif +# target folder name in $(OUT_DIR) +TARGET_DIR=$(OUT_DIR)/$(TARGET_MODE).$(TARGET_SYSTEM_AND_MODS) # # Options setup @@ -73,6 +77,13 @@ else OPTION_ECHO := disable endif +# -fdiagnostics-color=always +ifeq ($(color),1) + OPTION_COLOR := enable +else + OPTION_COLOR := disable +endif + # JERRY_NDEBUG, debug symbols ifeq ($(TARGET_MODE),release) OPTION_NDEBUG = enable @@ -98,13 +109,13 @@ else OPTION_MCU = disable endif -ifeq ($(musl),1) +ifeq ($(filter musl,$(TARGET_MODS)), musl) OPTION_LIBC_MUSL := enable else OPTION_LIBC_MUSL := disable endif -ifeq ($(libc_raw),1) +ifeq ($(filter libc_raw,$(TARGET_MODS)), libc_raw) ifeq ($(OPTION_LIBC_MUSL),enable) $(error LIBC_RAW and LIBC_MUSL are mutually exclusive) endif @@ -114,13 +125,7 @@ else OPTION_LIBC_RAW := disable endif -ifeq ($(color),1) - OPTION_COLOR := enable -else - OPTION_COLOR := disable -endif - -ifeq ($(sanitize),1) +ifeq ($(filter sanitize,$(TARGET_MODS)), sanitize) ifeq ($(OPTION_LIBC_MUSL),enable) $(error ASAN and LIBC_MUSL are mutually exclusive) endif @@ -130,7 +135,7 @@ else OPTION_SANITIZE := disable endif -ifeq ($(valgrind),1) +ifeq ($(filter valgrind,$(TARGET_MODS)), valgrind) OPTION_VALGRIND := enable ifeq ($(OPTION_SANITIZE),enable) @@ -306,7 +311,7 @@ ifeq ($(OPTION_FIXME),enable) endif ifeq ($(OPTION_VALGRIND),enable) - VALGRIND_CMD := "valgrind --track-origins=yes" + VALGRIND_CMD := "valgrind --error-exitcode=254 --track-origins=yes" else VALGRIND_CMD := DEFINES_JERRY += -DJERRY_NVALGRIND @@ -351,11 +356,8 @@ all: clean $(JERRY_TARGETS) $(JERRY_TARGETS): @rm -rf $(TARGET_DIR) - @echo "=== Running cppcheck ===" - @cppcheck $(DEFINES_JERRY) `find $(UNITTESTS_SRC_DIR) -name *.[c]` $(SOURCES_JERRY_C) $(INCLUDES_JERRY) $(INCLUDES_THIRDPARTY) \ + @cppcheck $(DEFINES_JERRY) $(SOURCES_JERRY_C) $(INCLUDES_JERRY) $(INCLUDES_THIRDPARTY) \ --error-exitcode=1 --std=c99 --enable=all --suppress=missingIncludeSystem --suppress=unusedFunction 1>/dev/null - @echo Done - @echo @mkdir -p $(TARGET_DIR) @mkdir -p $(TARGET_DIR)/obj @source_index=0; \ @@ -387,6 +389,8 @@ $(TESTS_TARGET): @rm -rf $(TARGET_DIR) @mkdir -p $(TARGET_DIR) @mkdir -p $(TARGET_DIR)/obj + @cppcheck $(DEFINES_JERRY) `find $(UNITTESTS_SRC_DIR) -name *.[c]` $(SOURCES_JERRY_C) $(INCLUDES_JERRY) $(INCLUDES_THIRDPARTY) \ + --error-exitcode=1 --std=c99 --enable=all --suppress=missingIncludeSystem --suppress=unusedFunction 1>/dev/null @source_index=0; \ for jerry_src in $(SOURCES_JERRY); \ do \ @@ -406,28 +410,30 @@ $(TESTS_TARGET): if [ $$? -ne 0 ]; then echo Failed "'$$cmd'"; exit 1; fi; \ done @ rm -rf $(TARGET_DIR)/obj - @ echo "=== Running unit tests ===" - @ VALGRIND=$(VALGRIND_CMD) ./tools/jerry_unittest.sh $(TARGET_DIR) - @ echo Done - @ echo + @ VALGRIND=$(VALGRIND_CMD) ./tools/jerry_unittest.sh $(TARGET_DIR) $(TESTS_OPTS) -$(PARSER_TESTS_TARGET): debug_release.$(TARGET_SYSTEM) +$(CHECK_TARGETS): + @ if [ ! -f $(TARGET_DIR)/$(ENGINE_NAME) ]; then echo $(TARGET_OF_ACTION) is not built yet; exit 1; fi; + @ if [ ! -d "$(TESTS_DIR)" ]; then echo \"$(TESTS_DIR)\" is not a directory; exit 1; fi; + @ rm -rf $(TARGET_DIR)/check @ mkdir -p $(TARGET_DIR)/check - @ echo "=== Running parser tests ===" - @ if [ -f $(TARGET_DIR)/$(ENGINE_NAME) ]; then \ - VALGRIND=$(VALGRIND_CMD) ./tools/jerry_test.sh $(TARGET_DIR)/$(ENGINE_NAME) $(TARGET_DIR)/check --parse-only; \ - fi + @ if [ "$(OUTPUT_TO_LOG)" = "enable" ]; \ + then \ + ADD_OPTS="--output-to-log"; \ + fi; \ + VALGRIND=$(VALGRIND_CMD) ./tools/jerry_test.sh $(TARGET_DIR)/$(ENGINE_NAME) $(TARGET_DIR)/check $(TESTS_DIR) $(TESTS_OPTS) $$ADD_OPTS; \ + status_code=$$?; \ + if [ $$status_code -ne 0 ]; \ + then \ + echo $(TARGET) failed; \ + if [ "$(OUTPUT_TO_LOG)" = "enable" ]; \ + then \ + echo See log in $(TARGET_DIR)/check directory for details.; \ + fi; \ + \ + exit $$status_code; \ + fi; -$(CHECK_TARGETS): $(TARGET_OF_ACTION) - @ make unittests testparser - @ mkdir -p $(TARGET_DIR)/check - @ echo "=== Running js tests ===" - @ if [ -f $(TARGET_DIR)/$(ENGINE_NAME) ]; then \ - VALGRIND=$(VALGRIND_CMD) ./tools/jerry_test.sh $(TARGET_DIR)/$(ENGINE_NAME) $(TARGET_DIR)/check; \ - fi - - @echo Done - @echo $(FLASH_TARGETS): $(TARGET_OF_ACTION) st-flash write $(OUT_DIR)/$(TARGET_OF_ACTION)/jerry.bin 0x08000000 || exit $$? diff --git a/tools/jerry_unittest.sh b/tools/jerry_unittest.sh index 471765a09..080eeec22 100755 --- a/tools/jerry_unittest.sh +++ b/tools/jerry_unittest.sh @@ -15,6 +15,18 @@ #!/bin/bash DIR="$1" +shift + +OPTION_SILENT=disable +while (( "$#" )) +do + if [ "$1" = "--silent" ] + then + OPTION_SILENT=enable + fi + + shift +done rm -f $DIR/unit_tests_run.log @@ -22,7 +34,7 @@ UNITTESTS=$(ls $DIR) for unit_test in $UNITTESTS; do - echo -n "Running $unit_test... "; + [ $OPTION_SILENT = "enable" ] || echo -n "Running $unit_test... "; $VALGRIND $DIR/$unit_test >&$DIR/unit_tests_run.log.tmp; status_code=$? @@ -31,9 +43,9 @@ do if [ $status_code -eq 0 ]; then - echo OK; + [ $OPTION_SILENT = "enable" ] || echo OK; else - echo FAILED; + [ $OPTION_SILENT = "enable" ] || echo FAILED; exit 1; fi; done