From 7583b63a6eef61f676cf02c08d52b865f964116a Mon Sep 17 00:00:00 2001 From: Sergio Martinez Date: Tue, 24 May 2016 11:08:15 +0100 Subject: [PATCH] Added target to compile zephyr against jerryscript. This patch contains a project in which you can run a small js test inside the Arduino101. Follows the Nuttx implementation to replicate a command line in the Quark SE Lakemont architecture. Everything is self contained in the targets/arduino_101 folder. It has only been tested with the arduino 101 at the moment. Check the README.md for a more detailed explanation of how to compile and run it. - Command line javascript run test. Use test to get a default test. Write any valid javascript in the shell and get it resolved and executed - Support for qemu - Added extra verbose mode on the demo function - Support to build factory images that can be flashed with dfu-util - Added a few extra examples on the README about commands that work. Small fixes to readme and libc_support.c (#1) - Added a few more instructions to the README.md for arduino_101 - Added the stdint.h include in libc_support.c - Added parameter to check-vera.sh to check a specific folder - Cleared the libc function duplication JerryScript-DCO-1.0-Signed-off-by: Sergio Martinez sergio.martinez.rodriguez@intel.com --- targets/arduino_101/Makefile | 57 +++++++ targets/arduino_101/Makefile.arduino_101 | 183 +++++++++++++++++++++++ targets/arduino_101/README.md | 140 +++++++++++++++++ targets/arduino_101/docs/arduino_101.jpg | Bin 0 -> 22138 bytes targets/arduino_101/prj.conf | 7 + targets/arduino_101/prj.mdef | 5 + targets/arduino_101/src/Makefile | 22 +++ targets/arduino_101/src/jerry-entry.c | 45 ++++++ targets/arduino_101/src/main-zephyr.c | 164 ++++++++++++++++++++ tools/check-vera.sh | 7 +- 10 files changed, 629 insertions(+), 1 deletion(-) create mode 100644 targets/arduino_101/Makefile create mode 100644 targets/arduino_101/Makefile.arduino_101 create mode 100644 targets/arduino_101/README.md create mode 100644 targets/arduino_101/docs/arduino_101.jpg create mode 100644 targets/arduino_101/prj.conf create mode 100644 targets/arduino_101/prj.mdef create mode 100755 targets/arduino_101/src/Makefile create mode 100755 targets/arduino_101/src/jerry-entry.c create mode 100644 targets/arduino_101/src/main-zephyr.c diff --git a/targets/arduino_101/Makefile b/targets/arduino_101/Makefile new file mode 100644 index 0000000000..4ce34c942d --- /dev/null +++ b/targets/arduino_101/Makefile @@ -0,0 +1,57 @@ +# Copyright © 2016 Intel Corporation +# +# 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. + +# use TAB-8 +.DEFAULT_GOAL := all + +ifndef ZEPHYR_BASE +$(error Missing zephyr base) +endif + +# For testing without real hardware use qemu_x86 instead of arduino_101 +BOARD ?= arduino_101 + +O ?= $(PROJECT_BASE)/outdir + +ZEPHYR ?= $(ZEPHYR_BASE) +TYPE ?= release +JERRYHEAP ?= 16 + +ZEPHYRINC = $(ZEPHYR_BASE)/include +ZEPHYRLIB = $(ZEPHYR_BASE)/lib + +SOURCE_DIR = ./targets/arduino_101/src + +export JERRY_INCLUDE = $(CURDIR)/jerry-core/ + +MDEF_FILE = $(realpath $(SOURCE_DIR)/../prj.mdef) +CONF_FILE = $(realpath $(SOURCE_DIR)/../prj.conf) + +ifdef V +$(info Zephyr) +$(info SOURCE_DIR=$(SOURCE_DIR)) +$(info JERRY_INCLUDE=$(JERRY_INCLUDE)) +$(info CONF_FILE =$(CONF_FILE)) +endif + +KERNEL_TYPE = micro + +KBUILD_VERBOSE = $(V) + +APP = main-zephyr.c + +include ${ZEPHYR_BASE}/Makefile.inc + +.PHONY = showconfig + diff --git a/targets/arduino_101/Makefile.arduino_101 b/targets/arduino_101/Makefile.arduino_101 new file mode 100644 index 0000000000..4cea7d18a2 --- /dev/null +++ b/targets/arduino_101/Makefile.arduino_101 @@ -0,0 +1,183 @@ +# Copyright © 2016 Intel Corporation +# +# 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. + +.DEFAULT_GOAL := all + +ifeq ($(.DEFAULT_GOAL),) + $(warning no default goal is set) +endif + +ifeq ($(MAKECMDGOALS),qemu) +BOARD ?= qemu_x86 +else +BOARD ?= arduino_101 +BOARD_NAME ?= arduino_101 +endif + +ifeq ($(BOARD),qemu_x86) +BOARD_NAME ?= qemu_x86 +endif + +TYPE ?= release +JERRYHEAP ?= 16 + +# Include functionality like regular expressions +# check Jerry script documentation +# +# -cp +# -cp_minimal +# -cp_minimal-mem_stats +# -mem_stats +# -mem_stress_test + +ifndef ZEPHYR_BASE +$(error Missing Zephyr base, did you source zephyr-env.sh? ) +endif + +VARIETY ?= -cp_minimal + +INTERM = build/$(BOARD)/obj-$(BOARD) +OUTPUT = build/$(BOARD) + +CC = $(CROSS_COMPILE)gcc + +EXT_CFLAGS := -fno-asynchronous-unwind-tables -fno-omit-frame-pointer +EXT_CFLAGS += -fno-stack-protector -fno-strict-overflow -ffreestanding +EXT_CFLAGS += -fno-reorder-functions -fno-defer-pop -fdata-sections +EXT_CFLAGS += -ffunction-sections -fno-inline-functions + +# TODO @sergioamr Read the arch and cflags from zephyr + +ifeq ($(BOARD),qemu_x86) +CONFIG_TOOLCHAIN_VARIANT = x86 +EXT_CFLAGS += -march=pentium +else +CONFIG_TOOLCHAIN_VARIANT = iamcu +EXT_CFLAGS += -march=lakemont -mtune=lakemont -miamcu -msoft-float +endif + +EXT_CFLAGS += -mpreferred-stack-boundary=2 -mno-sse + +EXT_CFLAGS += -Wall -Wno-format-zero-length -Wno-pointer-sign +EXT_CFLAGS += -Werror=format -Werror=implicit-int -Wno-unused-but-set-variable +EXT_CFLAGS += -Wno-main -Wno-strict-aliasing +EXT_CFLAGS += -Wno-error=format= + +EXT_CFLAGS += $(TOOLCHAIN_CFLAGS) +EXT_CFLAGS += $(LIB_INCLUDE_DIR) +EXT_CFLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include) +EXT_CFLAGS += -isystem $(shell $(CC) -print-file-name=include-fixed) + +-include $(ZEPHYR_BASE)/boards/$(BOARD_NAME)/Makefile.board +-include $(ZEPHYR_BASE)/scripts/Makefile.toolchain.$(ZEPHYR_GCC_VARIANT) + +ZEPHYR_LIBC_INC = $(subst -I,,$(TOOLCHAIN_CFLAGS)) +LIB_INCLUDE_DIR += -L $(CURDIR)/$(OUTPUT) + +EXTERNAL_LIB = $(INTERM)/lib$(TYPE).external$(VARIETY)-entry.a +ZEPHYR_BIN = $(OUTPUT)/zephyr/zephyr.strip + +PREFIX = $(TYPE)$(VARIETY) +LIBS = $(TYPE).external$(VARIETY)-entry $(PREFIX).jerry-core $(PREFIX).jerry-libm.lib $(TOOLCHAIN_LIBS) c + +# TODO @sergioamr Change how we link the library to USER_LDFLAGS +# https://gerrit.zephyrproject.org/r/#/c/2048/ + +BUILD_CONFIG = O="$(OUTPUT)/zephyr" V=$(V) TOOLCHAIN_LIBS="$(LIBS)" LIB_INCLUDE_DIR="$(LIB_INCLUDE_DIR)" + +.PHONY: all +all: jerry zephyr + +$(EXTERNAL_LIB): +ifdef V + @echo "- JERRY SCRIPT -------------------------------------------------" +endif + mkdir -p $(INTERM) + mkdir -p $(OUTPUT) + cmake -B$(INTERM) -H./ \ + -DENABLE_LTO=OFF \ + -DENABLE_VALGRIND=OFF \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_VERBOSE_MAKEFILE=$(V) \ + -DEXTERNAL_CMAKE_C_COMPILER=$(CC) \ + -DEXTERNAL_CMAKE_C_COMPILER_ID=GNU \ + -DEXTERNAL_CMAKE_SYSTEM_PROCESSOR=x86 \ + -DEXTERNAL_MEM_HEAP_SIZE_KB=$(JERRYHEAP) \ + -DEXTERNAL_COMPILE_FLAGS="$(EXT_CFLAGS)" \ + -DEXTERNAL_CMAKE_SYSTEM_PROCESSOR=lakemont \ + -DEXTERNAL_LIBC_INTERFACE="$(ZEPHYR_LIBC_INC)" \ + -DCMAKE_TOOLCHAIN_FILE=build/configs/toolchain_external.cmake \ + -DEXTERNAL_BUILD_ENTRY_FILE=./targets/arduino_101/src/jerry-entry.c + + make -C $(INTERM) $(TYPE).external$(VARIETY) V=1 + cp `cat $(INTERM)/$(TYPE).external$(VARIETY)/list` $(OUTPUT)/. + cp $(EXTERNAL_LIB) $(OUTPUT)/. + +$(ZEPHYR_BIN): +ifdef V + @echo "- ZEPHYR -------------------------------------------------------" +endif + make -f ./targets/arduino_101/Makefile $(BUILD_CONFIG) + @echo "Finished" + @file $(OUTPUT)/zephyr/zephyr.strip + @size $(OUTPUT)/zephyr/zephyr.strip + +jerry: $(EXTERNAL_LIB) + @touch $(EXTERNAL_LIB) + +zephyr: $(EXTERNAL_LIB) $(ZEPHYR_BIN) + @touch $(ZEPHYR_BIN) + +qemu: $(EXTERNAL_LIB) $(ZEPHYR_BIN) + make -f ./targets/arduino_101/Makefile $(BUILD_CONFIG) qemu + +flash: $(EXTERNAL_LIB) $(OUTPUT)/zephyr/zephyr.strip + make -f ./targets/arduino_101/Makefile $(BUILD_CONFIG) flash + +usage: +help: + @echo Usage: + @echo showconfig Show parameters and configuration + @echo flash Flash into board + @echo all Compile jerryscript and zephyr + +showconfig: + @echo "- CONFIGURATION ------------------------------------------------" + @echo "INTERM = $(INTERM)" + @echo "OUTPUT = $(OUTPUT)" + @echo "CC = $(CC) " + @echo "BOARD = $(ZEPHYR_BASE)/boards/$(BOARD)/Makefile.board " + @echo "TOOLCHAIN = $(ZEPHYR_BASE)/scripts/Makefile.toolchain.$(ZEPHYR_GCC_VARIANT) " + @echo "TOOLCHAIN_CFLAGS = $(TOOLCHAIN_CFLAGS) " + @echo "CROSS_COMPILE = $(CROSS_COMPILE) " + @echo "TOOLCHAIN_LIBS = $(TOOLCHAIN_LIBS) " + @echo "LIBS = $(LIBS) " + @echo "LIB_INCLUDE_DIR = $(LIB_INCLUDE_DIR) " + @echo "BUILD_CONFIG = $(BUILD_CONFIG) " + make -f ./targets/arduino_101/Makefile $(BUILD_CONFIG) showconfig + +# TODO @sergioamr Temporal cleanup before finding why Zephyr is ignoring my +# outdir for the project +clean: + @echo "Clearing Jerryscript" + @rm -rf $(OUTPUT) + @rm -rf $(INTERM) + @rm -f ./targets/arduino_101/src/.*.o.cmd + @rm -f ./targets/arduino_101/src/*.o + @echo "Clearing Zephyr" + make -f ./targets/arduino_101/Makefile clean + make -f ./targets/arduino_101/Makefile pristine + +mrproper: + make -f ./targets/arduino_101/Makefile mrproper diff --git a/targets/arduino_101/README.md b/targets/arduino_101/README.md new file mode 100644 index 0000000000..7f4282993f --- /dev/null +++ b/targets/arduino_101/README.md @@ -0,0 +1,140 @@ +### About + +This folder contains files to run JerryScript on Zephyr with +[Arduino 101 / Genuino 101](https://www.arduino.cc/en/Main/ArduinoBoard101) + +Zephyr project arduino 101 +[Zephyr Arduino 101](https://www.zephyrproject.org/doc/board/arduino_101.html) + +### How to build + +#### 1. Preface + +1, Directory structure + +Assume `harmony` as the path to the projects to build. +The folder tree related would look like this. + +``` +harmony + + jerry + | + targets + | + arduino_101 + + zephyr +``` + + +2, Target board + +Assume [Arduino 101 / Genuino 101](https://www.arduino.cc/en/Main/ArduinoBoard101) +as the target board. + + +#### 2. Prepare Zephyr + +Follow [this](https://www.zephyrproject.org/doc/getting_started/getting_started.html) page to get +the Zephyr source and configure the environment. + +Follow "Building a Sample Application" and check that you can flash the Arduino 101 + +Remember to source the zephyr environment. + +``` +source zephyr-env.sh + +export ZEPHYR_GCC_VARIANT=zephyr + +export ZEPHYR_SDK_INSTALL_DIR= +``` + +#### 3. Build JerryScript for Zephyr + +``` +# assume you are in harmony folder +cd jerry +make -f ./targets/arduino_101/Makefile.arduino_101 +``` + +This will generate the following libraries: +``` +./build/arduino_101/librelease-cp_minimal.jerry-core.a +./build/arduino_101/librelease-cp_minimal.jerry-libm.lib.a +./build/arduino_101/librelease.external-cp_minimal-entry.a +``` + +The final Zephyr image will be located here: +``` +./build/arduino_101/zephyr/zephyr.strip +``` + +#### 5. Flashing + +Details on how to flash the image can be found here: +[Flashing image](https://www.zephyrproject.org/doc/board/arduino_101.html) + +To be able to use this demo in hardware you will need the serial console +which will be generating output to Pins 0 & 1 + +Some examples of building the software + +``` +make -f ./targets/arduino_101/Makefile.arduino_101 clean +``` + +- Not using a Jtag and having a factory stock Arduino 101. + +``` +make -f ./targets/arduino_101/Makefile.arduino_101 BOARD=arduino_101_factory +``` + +Follow the Zephyr instructions to flash using the dfu-util command. + + +- Using JTAG + +There is a helper function to flash using the JTAG and Flywatter2 + +![alt tag](docs/arduino_101.jpg?raw=true "Example") +``` +make -f ./targets/arduino_101/Makefile.arduino_101 BOARD=arduino_101 flash + +``` + +- Compiling and running with the emulator +``` +make -f ./targets/arduino_101/Makefile.arduino_101 BOARD=qemu_x86 qemu +``` + + +#### 6. Serial terminal + +Test command line in a serial terminal. + + +You should see something similar to this: +``` +Jerry Compilation May 26 2016 13:37:50 +js> +``` + + +Run the example javascript command test function +``` +js> test +Script [var test=0; for (t=100; t<1000; t++) test+=t; print ('Hi JS World! '+test);] +Hi JS World! 494550 +``` + + +Try more complex functions: +``` +js>function hello(t){t=t*10;return t}; print("result"+hello(10.5)); +``` + + +Help will provide a list of commands +``` +> help +``` + +This program, is built in top of the Zephyr command line, so there is a limit of 10 spaces. \ No newline at end of file diff --git a/targets/arduino_101/docs/arduino_101.jpg b/targets/arduino_101/docs/arduino_101.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b05683c0233a978313e330f7a27e12d61e2bc95a GIT binary patch literal 22138 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 VirnP%Aq+HhMUR8$^H7$5|Jk?76kz}W literal 0 HcmV?d00001 diff --git a/targets/arduino_101/prj.conf b/targets/arduino_101/prj.conf new file mode 100644 index 0000000000..743d94a01f --- /dev/null +++ b/targets/arduino_101/prj.conf @@ -0,0 +1,7 @@ +CONFIG_STDOUT_CONSOLE=y +CONFIG_NEWLIB_LIBC=y +CONFIG_FLOAT=y +CONFIG_CONSOLE_HANDLER=y +CONFIG_CONSOLE_HANDLER_SHELL=y + + diff --git a/targets/arduino_101/prj.mdef b/targets/arduino_101/prj.mdef new file mode 100644 index 0000000000..c64ca80243 --- /dev/null +++ b/targets/arduino_101/prj.mdef @@ -0,0 +1,5 @@ +% Application : JerryScript Sample + +% TASK NAME PRIO ENTRY STACK GROUPS +% ================================== + TASK TASKA 7 main 2048 [EXE] diff --git a/targets/arduino_101/src/Makefile b/targets/arduino_101/src/Makefile new file mode 100755 index 0000000000..4d17eeff24 --- /dev/null +++ b/targets/arduino_101/src/Makefile @@ -0,0 +1,22 @@ +# Copyright © 2016 Intel Corporation +# +# 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. + +ifdef V +$(info Compiling application) +endif + +# Adding path for jerry script APIs +ZEPHYRINCLUDE += -I$(JERRY_INCLUDE) + +obj-y += main-zephyr.o diff --git a/targets/arduino_101/src/jerry-entry.c b/targets/arduino_101/src/jerry-entry.c new file mode 100755 index 0000000000..c75868affb --- /dev/null +++ b/targets/arduino_101/src/jerry-entry.c @@ -0,0 +1,45 @@ +/* Copyright 2016 Intel Corporation + * + * 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. + */ + +#include + +#include "jerry-port.h" + +/** + * Provide log message to filestream implementation for the engine. + */ +int jerry_port_logmsg (FILE *stream, const char *format, ...) +{ + va_list args; + int count; + va_start (args, format); + count = vfprintf (stream, format, args); + va_end (args); + return count; +} /* jerry_port_logmsg */ + + +/** + * Provide error message to console implementation for the engine. + */ +int jerry_port_errormsg (const char *format, ...) +{ + va_list args; + int count; + va_start (args, format); + count = vfprintf (stderr, format, args); + va_end (args); + return count; +} /* jerry_port_errormsg */ diff --git a/targets/arduino_101/src/main-zephyr.c b/targets/arduino_101/src/main-zephyr.c new file mode 100644 index 0000000000..814b829b5e --- /dev/null +++ b/targets/arduino_101/src/main-zephyr.c @@ -0,0 +1,164 @@ +/* Copyright 2016 Intel Corporation + * + * 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. + */ + +#include +#include +#include + +#include +#include +#include + +#include "jerry.h" + +#if defined (CONFIG_STDOUT_CONSOLE) +#include +#define PRINT printf +#else +#include +#define PRINT printk +#endif + +static char *source_buffer = NULL; +static unsigned char flags = 0; + +#define VERBOSE 0x01 + +/** + * Jerryscript simple test loop + */ +int jerryscript_test () +{ + jerry_completion_code_t ret_code; + + const char script[] = + "var test=0; " \ + "for (var t=100; t<1000; t++) test+=t; " \ + "print ('Hi JS World! '+test);"; + + printf ("Script [%s]\n",script); + ret_code = jerry_run_simple ((jerry_api_char_t *) script, + strlen (script), + JERRY_FLAG_EMPTY); + + return ret_code; +} /* jerryscript_test */ + + +static int shell_cmd_verbose (int argc, char *argv[]) +{ + printf ("Enable verbose \n"); + flags |= VERBOSE; + return 0; +} /* shell_cmd_verbose */ + + +static int shell_cmd_syntax_help (int argc, char *argv[]) +{ + printf ("version jerryscript & zephyr versions\n"); + return 0; +} /* shell_cmd_syntax_help */ + + +static int shell_cmd_version (int argc, char *argv[]) +{ + uint32_t version = sys_kernel_version_get (); + + printf ("Jerryscript %s %s %s\n", jerry_branch_name, + jerry_build_date, + jerry_commit_hash); + + printk ("Zephyr version %d.%d.%d\n", SYS_KERNEL_VER_MAJOR (version), + SYS_KERNEL_VER_MINOR (version), + SYS_KERNEL_VER_PATCHLEVEL (version)); + return 0; +} /* shell_cmd_version */ + + +static int shell_cmd_test (int argc, char *argv[]) +{ + return jerryscript_test (); +} /* shell_cmd_test */ + + +static int shell_cmd_handler (int argc, char *argv[]) +{ + if (argc <= 0) + { + return -1; + } + + unsigned int size = 0; + for (int t = 0; t < argc; t++) + { + size += strlen (argv[t]) + 1; + } + + source_buffer = (char *) malloc (size); + + char *d = source_buffer; + unsigned int len; + + for (int t = 0; t < argc; t++) + { + len = strlen (argv[t]); + memcpy (d, argv[t], len); + d += len; + *d = ' '; + d++; + } + + * (d - 1) = '\0'; + + if (flags & VERBOSE) + { + printf ("[%s] %lu\n", source_buffer, strlen (source_buffer)); + } + + jerry_completion_code_t ret_code; + + ret_code = jerry_run_simple ((jerry_api_char_t *) source_buffer, + strlen (source_buffer), + JERRY_FLAG_EMPTY); + + free (source_buffer); + + if (ret_code != JERRY_COMPLETION_CODE_OK) + { + printf ("Failed to run JS\n"); + } + + return 0; +} /* shell_cmd_handler */ + +#define SHELL_COMMAND(name,cmd) { name, cmd } + +const struct shell_cmd commands[] = +{ + SHELL_COMMAND ("syntax", shell_cmd_syntax_help), + SHELL_COMMAND ("version", shell_cmd_version), + SHELL_COMMAND ("test", shell_cmd_test), + SHELL_COMMAND ("verbose", shell_cmd_verbose), + SHELL_COMMAND (NULL, NULL) +}; + + +void main (void) +{ + printf ("Jerry Compilation " __DATE__ " " __TIME__ "\n"); + shell_register_app_cmd_handler (shell_cmd_handler); + shell_init ("js> ", commands); +} /* main */ + diff --git a/tools/check-vera.sh b/tools/check-vera.sh index e83774af3a..5a8f8ddf66 100755 --- a/tools/check-vera.sh +++ b/tools/check-vera.sh @@ -22,6 +22,11 @@ JERRY_LIBM_FILES=`find ./jerry-libm -name "*.c" -or -name "*.h"` JERRY_MAIN_FILES=`find . -maxdepth 1 -name "*.c" -or -name "*.h"` UNIT_TEST_FILES=`find ./tests/unit -name "*.c" -or -name "*.h"` +if [ -n "$1" ] +then +MANUAL_CHECK_FILES=`find $1 -name "*.c" -or -name "*.h"` +fi + vera++ -r tools/vera++ -p jerry \ -e --no-duplicate \ - $JERRY_CORE_FILES $JERRY_PORT_DEFAULT_FILES $JERRY_LIBC_FILES $JERRY_LIBM_FILES $JERRY_MAIN_FILES $UNIT_TEST_FILES + $MANUAL_CHECK_FILES $JERRY_CORE_FILES $JERRY_PORT_DEFAULT_FILES $JERRY_LIBC_FILES $JERRY_LIBM_FILES $JERRY_MAIN_FILES $UNIT_TEST_FILES