diff --git a/.gitignore b/.gitignore index e3ec9bcd5..ae1151009 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ build/bin build/obj-* +build/prerequisites build/tests # IDE related files @@ -25,3 +26,11 @@ cscope.* # ctags and ID database tags ID + +# Prerequisites +.prerequisites +third-party/STM32F3-Discovery_FW_V1.1.0 +third-party/STM32F4-Discovery_FW_V1.1.0 +third-party/nuttx +third-party/vera++ +third-party/cppcheck diff --git a/Makefile b/Makefile index f246f15d7..0cc3f45cf 100644 --- a/Makefile +++ b/Makefile @@ -102,6 +102,7 @@ export CHECK_TARGETS = $(foreach __TARGET,$(JERRY_LINUX_TARGETS),$(__TARGET).che export FLASH_TARGETS = $(foreach __TARGET,$(JERRY_STM32F3_TARGETS) $(JERRY_STM32F4_TARGETS),$(__TARGET).flash) export OUT_DIR = ./build/bin +export PREREQUISITES_STATE_DIR = ./build/prerequisites export SHELL=/bin/bash @@ -138,7 +139,7 @@ export SHELL=/bin/bash all: precommit -$(BUILD_DIRS_NATIVE): +$(BUILD_DIRS_NATIVE): prerequisites @ arch=`uname -m`; \ if [ "$$arch" == "armv7l" ]; \ then \ @@ -149,7 +150,7 @@ $(BUILD_DIRS_NATIVE): cmake -DENABLE_VALGRIND=$(VALGRIND) -DENABLE_LTO=$(LTO) -DCMAKE_TOOLCHAIN_FILE=build/configs/toolchain_linux_$$arch.cmake ../../.. &>cmake.log || \ (echo "CMake run failed. See "`pwd`"/cmake.log for details."; exit 1;) -$(BUILD_DIRS_NUTTX): +$(BUILD_DIRS_NUTTX): prerequisites @ [ "$(EXTERNAL_LIBS_INTERFACE)" != "" ] && [ -x `which $(EXTERNAL_C_COMPILER)` ] && [ -x `which $(EXTERNAL_CXX_COMPILER)` ] || \ (echo "Wrong external arguments."; \ echo "EXTERNAL_LIBS_INTERFACE='$(EXTERNAL_LIBS_INTERFACE)'"; \ @@ -167,13 +168,13 @@ $(BUILD_DIRS_NUTTX): ../../.. &>cmake.log || \ (echo "CMake run failed. See "`pwd`"/cmake.log for details."; exit 1;) -$(BUILD_DIRS_STM32F3): +$(BUILD_DIRS_STM32F3): prerequisites @ mkdir -p $@ && \ cd $@ && \ cmake -DENABLE_VALGRIND=$(VALGRIND) -DENABLE_LTO=$(LTO) -DCMAKE_TOOLCHAIN_FILE=build/configs/toolchain_mcu_stm32f3.cmake ../../.. &>cmake.log || \ (echo "CMake run failed. See "`pwd`"/cmake.log for details."; exit 1;) -$(BUILD_DIRS_STM32F4): +$(BUILD_DIRS_STM32F4): prerequisites @ mkdir -p $@ && \ cd $@ && \ cmake -DENABLE_VALGRIND=$(VALGRIND) -DENABLE_LTO=$(LTO) -DCMAKE_TOOLCHAIN_FILE=build/configs/toolchain_mcu_stm32f4.cmake ../../.. &>cmake.log || \ @@ -279,7 +280,7 @@ pull: ./tools/git-scripts/pull.sh log: ./tools/git-scripts/log.sh @ ./tools/git-scripts/log.sh -precommit: clean +precommit: clean prerequisites @ ./tools/precommit.sh "$(MAKE)" "$(OUT_DIR)" "$(PRECOMMIT_CHECK_TARGETS_LIST)" unittests_run: unittests @@ -291,4 +292,17 @@ unittests_run: unittests clean: @ rm -rf $(BUILD_DIR_PREFIX)* $(OUT_DIR) -.PHONY: clean build unittests_run $(BUILD_DIRS_ALL) $(JERRY_TARGETS) $(FLASH_TARGETS) +prerequisites: $(PREREQUISITES_STATE_DIR)/.prerequisites + +$(PREREQUISITES_STATE_DIR)/.prerequisites: + @ echo "Setting up prerequisites... (log file: $(PREREQUISITES_STATE_DIR)/prerequisites.log)" + @ mkdir -p $(PREREQUISITES_STATE_DIR) + @ ./tools/prerequisites.sh $(PREREQUISITES_STATE_DIR)/.prerequisites >&$(PREREQUISITES_STATE_DIR)/prerequisites.log || \ + (echo "Prerequisites setup failed. See $(PREREQUISITES_STATE_DIR)/prerequisites.log for details."; exit 1;) + @ echo "Prerequisites setup succeeded" + +prerequisites_clean: + @ ./tools/prerequisites.sh $(PREREQUISITES_STATE_DIR)/.prerequisites clean + @ rm -rf $(PREREQUISITES_STATE_DIR) + +.PHONY: prerequisites_clean prerequisites clean build unittests_run $(BUILD_DIRS_ALL) $(JERRY_TARGETS) $(FLASH_TARGETS) diff --git a/tools/prerequisites.sh b/tools/prerequisites.sh new file mode 100755 index 000000000..ad4c4dd2d --- /dev/null +++ b/tools/prerequisites.sh @@ -0,0 +1,267 @@ +#!/bin/bash + +# 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. + +FLAG_FILE="$1" +shift + +rm -f $FLAG_FILE + +if [ "$1" == "clean" ] +then + CLEAN_MODE=yes +else + CLEAN_MODE=no +fi + +trap clean_on_exit INT + +function clean_on_exit() { + rm -rf $TMP_DIR + + [[ $1 == "OK" ]] || exit 1 + exit 0 +} + +function fail_msg() { + echo "$1" + + clean_on_exit "FAIL" +} + +function remove_gitignore_files_at() { + DEST="$1" + gitignore_files_list=`find "$DEST" -name .gitignore` + [ $? -eq 0 ] || fail_msg "Failed to search for .gitignore in '$DEST'." + + rm -rf $gitignore_files_list || fail_msg "Failed to remove .gitignore files from '$DEST'." +} + +function setup_from_zip() { + NAME="$1" + shift + + DEST=$(pwd)/"$1" + shift + + URL="$1" + shift + + CHECKSUM="$1" + shift + + LIST="$*" + + FAIL_MSG="Failed to setup '$NAME' prerequisite" + + if [ -e "$DEST" ] + then + chmod -R u+w "$DEST" || fail_msg "$FAIL_MSG. Failed to add write permission to '$DEST' directory contents." + rm -rf "$DEST" || fail_msg "$FAIL_MSG. Cannot remove '$DEST' directory." + fi + + if [ "$CLEAN_MODE" == "yes" ] + then + return 0 + fi + + wget -O "$TMP_DIR/$NAME.zip" "$URL" || fail_msg "$FAIL_MSG. Cannot download '$URL' zip archive." + + echo "$CHECKSUM $TMP_DIR/$NAME.zip" | sha256sum --check --strict || fail_msg "$FAIL_MSG. Archive's checksum doesn't match." + + unzip "$TMP_DIR/$NAME.zip" -d "$TMP_DIR/$NAME" || fail_msg "$FAIL_MSG. Failed to unpack zip archive." + mkdir "$DEST" || fail_msg "$FAIL_MSG. Failed to create '$DEST' directory." + + for part in "$LIST" + do + mv "$TMP_DIR/$NAME"/$part "$DEST" || fail_msg "$FAIL_MSG. Failed to move '$part' to '$DEST'." + done + + remove_gitignore_files_at "$DEST" + chmod -R u-w "$DEST" || fail_msg "$FAIL_MSG. Failed to remove write permission from '$DEST' directory contents." +} + +function setup_nuttx_headers() { + NAME="$1" + shift + + DEST=$(pwd)/"$1" + shift + + URL="$1" + shift + + REVISION="$1" + shift + + FAIL_MSG="Failed to setup '$NAME' prerequisite" + + if [ -e "$DEST" ] + then + chmod -R u+w "$DEST" || fail_msg "$FAIL_MSG. Failed to add write permission to '$DEST' directory contents." + rm -rf "$DEST" || fail_msg "$FAIL_MSG. Cannot remove '$DEST' directory." + fi + + if [ "$CLEAN_MODE" == "yes" ] + then + return 0 + fi + + git clone "$URL" "$TMP_DIR/$NAME" || fail_msg "$FAIL_MSG. Failed to checkout Nuttx." + ( + cd "$TMP_DIR/$NAME" || exit 1 + git checkout $REVISION || exit 1 + cd nuttx/tools || exit 1 + ./configure.sh stm32f429i-disco/usbnsh || exit 1 + cd .. || exit 1 + make include/nuttx/config.h || exit 1 + make include/arch || exit 1 + make include/arch/chip || exit 1 + ) || fail_msg "$FAIL_MSG. Failed to prepare nuttx headers" + + mkdir "./third-party/nuttx" || fail_msg "Failed to create '$DEST' directory." + cp -L -r "$TMP_DIR/$NAME/nuttx/include" "$DEST" || fail_msg "Failed to copy Nuttx headers to '$DEST' directory" + + remove_gitignore_files_at "$DEST" + chmod -R u-w "$DEST" || fail_msg "$FAIL_MSG. Failed to remove write permission from '$DEST' directory contents." +} + +function setup_cppcheck() { + NAME="$1" + shift + + DEST=$(pwd)/"$1" + shift + + URL="$1" + shift + + CHECKSUM="$1" + shift + + FAIL_MSG="Failed to setup '$NAME' prerequisite" + + if [ -e "$DEST" ] + then + chmod -R u+w "$DEST" || fail_msg "$FAIL_MSG. Failed to add write permission to '$DEST' directory contents." + rm -rf "$DEST" || fail_msg "$FAIL_MSG. Cannot remove '$DEST' directory." + fi + + if [ "$CLEAN_MODE" == "yes" ] + then + return 0 + fi + + wget -O "$TMP_DIR/$NAME.tar.bz2" "$URL" || fail_msg "$FAIL_MSG. Cannot download '$URL' archive." + + echo "$CHECKSUM $TMP_DIR/$NAME.tar.bz2" | sha256sum --check --strict || fail_msg "$FAIL_MSG. Archive's checksum doesn't match." + + tar xjvf "$TMP_DIR/$NAME.tar.bz2" -C "$TMP_DIR" || fail_msg "$FAIL_MSG. Failed to unpack archive." + + ( + cd "$TMP_DIR/$NAME" || exit 1 + make -j HAVE_RULES=yes CFGDIR="$DEST/cfg" || exit 1 + ) || fail_msg "$FAIL_MSG. Failed to build cppcheck 1.66." + + mkdir "$DEST" || fail_msg "$FAIL_MSG. Failed to create '$DEST' directory." + mkdir "$DEST/cfg" || fail_msg "$FAIL_MSG. Failed to create '$DEST/cfg' directory." + + cp "$TMP_DIR/$NAME/cppcheck" "$DEST" || fail_msg "$FAIL_MSG. Failed to copy cppcheck to '$DEST' directory." + cp "$TMP_DIR/$NAME/cfg/std.cfg" "$DEST/cfg" || fail_msg "$FAIL_MSG. Failed to copy cfg/std.cfg to '$DEST/cfg' directory." + + remove_gitignore_files_at "$DEST" + chmod -R u-w "$DEST" || fail_msg "$FAIL_MSG. Failed to remove write permission from '$DEST' directory contents." +} + +function setup_vera() { + NAME="$1" + shift + + DEST=$(pwd)/"$1" + shift + + URL="$1" + shift + + CHECKSUM="$1" + shift + + FAIL_MSG="Failed to setup '$NAME' prerequisite" + + if [ -e "$DEST" ] + then + chmod -R u+w "$DEST" || fail_msg "$FAIL_MSG. Failed to add write permission to '$DEST' directory contents." + rm -rf "$DEST" || fail_msg "$FAIL_MSG. Cannot remove '$DEST' directory." + fi + + if [ "$CLEAN_MODE" == "yes" ] + then + return 0 + fi + + wget -O "$TMP_DIR/$NAME.tar.gz" "$URL" || fail_msg "$FAIL_MSG. Cannot download '$URL' archive." + + echo "$CHECKSUM $TMP_DIR/$NAME.tar.gz" | sha256sum --check --strict || fail_msg "$FAIL_MSG. Archive's checksum doesn't match." + + tar xzvf "$TMP_DIR/$NAME.tar.gz" -C "$TMP_DIR" || fail_msg "$FAIL_MSG. Failed to unpack archive." + + ( + cd "$TMP_DIR/$NAME" || exit 1 + mkdir build || exit 1 + cd build || exit 1 + cmake .. -DCMAKE_INSTALL_PREFIX="$DEST" || exit 1 + make -j || exit 1 + make install || exit 1 + ) || fail_msg "$FAIL_MSG. Failed to build vera++ 1.2.1." + + remove_gitignore_files_at "$DEST" + chmod -R u-w "$DEST" || fail_msg "$FAIL_MSG. Failed to remove write permission from '$DEST' directory contents." +} + +TMP_DIR=`mktemp -d --tmpdir=./` + +setup_from_zip "stm32f3" \ + "./third-party/STM32F3-Discovery_FW_V1.1.0" \ + "http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware/stm32f3discovery_fw.zip" \ + "cf81efd07d627adb58adc20653eecb415878b6585310b77b0ca54a34837b3855" \ + "STM32F3-Discovery_FW_V1.1.0/*" + +setup_from_zip "stm32f4" \ + "./third-party/STM32F4-Discovery_FW_V1.1.0" \ + "http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware/stsw-stm32068.zip" \ + "8e67f7b930c6c02bd7f89a266c8d1cae3b530510b7979fbfc0ee0d57e7f88b81" \ + "STM32F4-Discovery_FW_V1.1.0/*" + +setup_nuttx_headers "nuttx" \ + "./third-party/nuttx" \ + "git://git.code.sf.net/p/nuttx/git" \ + "36a655eddec29754cc93631b6083fe6409817861" + +setup_cppcheck "cppcheck-1.66" \ + "./third-party/cppcheck" \ + "http://downloads.sourceforge.net/project/cppcheck/cppcheck/1.66/cppcheck-1.66.tar.bz2" \ + "9469c23d39df5f03301fb0f9c29d75e9d63ed80d486cc6633145e3c95293c1b7" + +setup_vera "vera++-1.2.1" \ + "./third-party/vera++" \ + "https://bitbucket.org/verateam/vera/downloads/vera++-1.2.1.tar.gz" \ + "99b123c8f6d0f4fe9ee90397c461179066a36ed0d598d95e015baf2d3b56956b" + +if [ "$CLEAN_MODE" == "no" ] +then + touch $FLAG_FILE || fail_msg "Failed to create flag file '$FLAG_FILE'." +fi + +clean_on_exit "OK"