diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ea3a3e36..a17c94a57 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,9 +37,19 @@ project (Jerry CXX C ASM) set(CMAKE_AR ${DIRECTORY_GCC}/${CMAKE_AR}) set(CMAKE_RANLIB ${DIRECTORY_GCC}/${CMAKE_RANLIB}) +# Imported and third-party targets prefix + set(PREFIX_IMPORTED_LIB imported_) + set(SUFFIX_THIRD_PARTY_LIB .third_party.lib) + +# Static checkers + include(build/static-checkers/add_cppcheck_for_target.cmake) + + add_custom_target(static_check) + add_dependencies(static_check cppcheck) + # Disable _FORTIFY_SOURCE - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -U_FORTIFY_SOURCE") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -U_FORTIFY_SOURCE") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -U_FORTIFY_SOURCE") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -U_FORTIFY_SOURCE") # Architecture-specific compile/link flags foreach(FLAG ${FLAGS_COMMON_ARCH}) @@ -195,18 +205,18 @@ project (Jerry CXX C ASM) # Imported libraries # libc - add_library(imported_libc SHARED IMPORTED) + add_library(${PREFIX_IMPORTED_LIB}libc SHARED IMPORTED) execute_process(COMMAND ${CMAKE_C_COMPILER} ${FLAGS_COMMON_ARCH} -print-file-name=libc.so OUTPUT_VARIABLE IMPORTED_LIBC_LOCATION OUTPUT_STRIP_TRAILING_WHITESPACE) - set_property(TARGET imported_libc + set_property(TARGET ${PREFIX_IMPORTED_LIB}libc PROPERTY IMPORTED_LOCATION ${IMPORTED_LIBC_LOCATION}) # libgcc - add_library(imported_libgcc STATIC IMPORTED) + add_library(${PREFIX_IMPORTED_LIB}libgcc STATIC IMPORTED) execute_process(COMMAND ${CMAKE_C_COMPILER} ${FLAGS_COMMON_ARCH} -print-file-name=libgcc.a OUTPUT_VARIABLE IMPORTED_LIBGCC_LOCATION OUTPUT_STRIP_TRAILING_WHITESPACE) - set_property(TARGET imported_libgcc + set_property(TARGET ${PREFIX_IMPORTED_LIB}libgcc PROPERTY IMPORTED_LOCATION ${IMPORTED_LIBGCC_LOCATION}) # Platform-specific configuration @@ -259,7 +269,9 @@ project (Jerry CXX C ASM) PROPERTY LINK_FLAGS "${COMPILE_FLAGS_JERRY} ${CXX_FLAGS_JERRY} ${FLAGS_COMMON_${BUILD_MODE}} ${LINKER_FLAGS_COMMON} ${LINKER_FLAGS_STATIC}") target_compile_definitions(${TARGET_NAME} PRIVATE ${DEFINES_JERRY}) target_include_directories(${TARGET_NAME} PRIVATE ${INCLUDE_CORE_INTERFACE}) - target_link_libraries(${TARGET_NAME} ${CORE_TARGET_NAME} ${LIBC_TARGET_NAME} imported_libgcc) + target_link_libraries(${TARGET_NAME} ${CORE_TARGET_NAME} ${LIBC_TARGET_NAME} ${PREFIX_IMPORTED_LIB}libgcc) + + add_cppcheck_target(${TARGET_NAME}) if("${PLATFORM}" STREQUAL "MCU") add_dependencies(${TARGET_NAME} mcu_header_with_script_to_run.${TARGET_NAME}) @@ -292,6 +304,7 @@ project (Jerry CXX C ASM) # Unit tests declaration add_custom_target(unittests) + add_custom_target(cppcheck.unittests) foreach(SOURCE_UNIT_TEST_MAIN ${SOURCE_UNIT_TEST_MAIN_MODULES}) get_filename_component(TARGET_NAME ${SOURCE_UNIT_TEST_MAIN} NAME_WE) @@ -305,7 +318,10 @@ project (Jerry CXX C ASM) set_property(TARGET ${TARGET_NAME} PROPERTY LINK_FLAGS "${COMPILE_FLAGS_JERRY} ${CXX_FLAGS_JERRY} ${FLAGS_COMMON_UNITTESTS} ${LINKER_FLAGS_COMMON}") target_include_directories(${TARGET_NAME} PRIVATE ${INCLUDE_CORE_INTERFACE}) - target_link_libraries(${TARGET_NAME} ${CORE_TARGET_NAME} imported_libc imported_libgcc) - + target_link_libraries(${TARGET_NAME} ${CORE_TARGET_NAME} ${PREFIX_IMPORTED_LIB}libc ${PREFIX_IMPORTED_LIB}libgcc) + + add_cppcheck_target(${TARGET_NAME}) + add_dependencies(unittests ${TARGET_NAME}) + add_dependencies(cppcheck.unittests cppcheck.${TARGET_NAME}) endforeach() diff --git a/Makefile b/Makefile index a3b19deeb..0da121b1f 100644 --- a/Makefile +++ b/Makefile @@ -41,6 +41,12 @@ ifneq ($(VALGRIND),ON) VALGRIND := OFF endif + # Static checkers + STATIC_CHECK ?= OFF + + ifneq ($(STATIC_CHECK),ON) + STATIC_CHECK := OFF + endif export TARGET_DEBUG_MODES = debug export TARGET_RELEASE_MODES = release @@ -126,23 +132,35 @@ $(BUILD_DIRS_STM32F4): $(JERRY_LINUX_TARGETS): $(BUILD_DIR)/native @ mkdir -p $(OUT_DIR)/$@ - @ $(MAKE) -C $(BUILD_DIR)/native VERBOSE=1 $@ &>$(OUT_DIR)/$@/make.log + @ [ "$(STATIC_CHECK)" = "OFF" ] || $(MAKE) -C $(BUILD_DIR)/native VERBOSE=1 cppcheck.$@ &>$(OUT_DIR)/$@/cppcheck.log || \ + (echo "cppcheck run failed. See $(OUT_DIR)/$@/cppcheck.log for details."; exit 1;) + @ $(MAKE) -C $(BUILD_DIR)/native VERBOSE=1 $@ &>$(OUT_DIR)/$@/make.log || \ + (echo "Build failed. See $(OUT_DIR)/$@/make.log for details."; exit 1;) @ cp $(BUILD_DIR)/native/$@ $(OUT_DIR)/$@/jerry unittests: $(BUILD_DIR)/native @ mkdir -p $(OUT_DIR)/$@ - @ $(MAKE) -C $(BUILD_DIR)/native VERBOSE=1 $@ &>$(OUT_DIR)/$@/make.log + @ [ "$(STATIC_CHECK)" = "OFF" ] || $(MAKE) -C $(BUILD_DIR)/native VERBOSE=1 cppcheck.$@ &>$(OUT_DIR)/$@/cppcheck.log || \ + (echo "cppcheck run failed. See $(OUT_DIR)/$@/cppcheck.log for details."; exit 1;) + @ $(MAKE) -C $(BUILD_DIR)/native VERBOSE=1 $@ &>$(OUT_DIR)/$@/make.log || \ + (echo "Build failed. See $(OUT_DIR)/$@/make.log for details."; exit 1;) @ cp $(BUILD_DIR)/native/unit_test_* $(OUT_DIR)/$@ $(JERRY_STM32F3_TARGETS): $(BUILD_DIR)/stm32f3 @ mkdir -p $(OUT_DIR)/$@ - @ $(MAKE) -C $(BUILD_DIR)/stm32f3 VERBOSE=1 $@.bin &>$(OUT_DIR)/$@/make.log + @ [ "$(STATIC_CHECK)" = "OFF" ] || $(MAKE) -C $(BUILD_DIR)/stm32f3 VERBOSE=1 cppcheck.$@ &>$(OUT_DIR)/$@/cppcheck.log || \ + (echo "cppcheck run failed. See $(OUT_DIR)/$@/cppcheck.log for details."; exit 1;) + @ $(MAKE) -C $(BUILD_DIR)/stm32f3 VERBOSE=1 $@.bin &>$(OUT_DIR)/$@/make.log || \ + (echo "Build failed. See $(OUT_DIR)/$@/make.log for details."; exit 1;) @ cp $(BUILD_DIR)/stm32f3/$@ $(OUT_DIR)/$@/jerry @ cp $(BUILD_DIR)/stm32f3/$@.bin $(OUT_DIR)/$@/jerry.bin $(JERRY_STM32F4_TARGETS): $(BUILD_DIR)/stm32f4 @ mkdir -p $(OUT_DIR)/$@ - @ $(MAKE) -C $(BUILD_DIR)/stm32f4 VERBOSE=1 $@.bin &>$(OUT_DIR)/$@/make.log + @ [ "$(STATIC_CHECK)" = "OFF" ] || $(MAKE) -C $(BUILD_DIR)/stm32f4 VERBOSE=1 cppcheck.$@ &>$(OUT_DIR)/$@/cppcheck.log || \ + (echo "cppcheck run failed. See $(OUT_DIR)/$@/cppcheck.log for details."; exit 1;) + @ $(MAKE) -C $(BUILD_DIR)/stm32f4 VERBOSE=1 $@.bin &>$(OUT_DIR)/$@/make.log || \ + (echo "Build failed. See $(OUT_DIR)/$@/make.log for details."; exit 1;) @ cp $(BUILD_DIR)/stm32f4/$@ $(OUT_DIR)/$@/jerry @ cp $(BUILD_DIR)/stm32f4/$@.bin $(OUT_DIR)/$@/jerry.bin diff --git a/build/static-checkers/add_cppcheck_for_target.cmake b/build/static-checkers/add_cppcheck_for_target.cmake new file mode 100644 index 000000000..39e802014 --- /dev/null +++ b/build/static-checkers/add_cppcheck_for_target.cmake @@ -0,0 +1,68 @@ +# 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. + +# Cppcheck launcher + set(CMAKE_CPPCHECK ${CMAKE_SOURCE_DIR}/tools/cppcheck.sh) + +# Definition of cppcheck targets + add_custom_target(cppcheck) + + function(add_cppcheck_target TARGET_NAME) + # Get target's parameters + get_target_property(TARGET_DEFINES ${TARGET_NAME} COMPILE_DEFINITIONS) + get_target_property(TARGET_INCLUDES ${TARGET_NAME} INCLUDE_DIRECTORIES) + get_target_property(TARGET_SOURCES ${TARGET_NAME} SOURCES) + get_target_property(TARGET_LIBRARIES ${TARGET_NAME} LINK_LIBRARIES) + + # Build cppcheck's argument strings + set(CPPCHECK_DEFINES_LIST ) + set(CPPCHECK_INCLUDES_LIST ) + set(CPPCHECK_SOURCES_LIST ) + + foreach(DEFINE ${TARGET_DEFINES}) + set(CPPCHECK_DEFINES_LIST ${CPPCHECK_DEFINES_LIST} -D${DEFINE}) + endforeach() + + foreach(INCLUDE ${TARGET_INCLUDES}) + set(CPPCHECK_INCLUDES_LIST ${CPPCHECK_INCLUDES_LIST} -I${INCLUDE}) + endforeach() + + foreach(SOURCE ${TARGET_SOURCES}) + # Add to list if it is C or C++ source + get_filename_component(SOURCE_EXTENSION ${SOURCE} EXT) + if("${SOURCE_EXTENSION}" STREQUAL ".c" OR "${SOURCE_EXTENSION}" STREQUAL ".cpp") + set(CPPCHECK_SOURCES_LIST ${CPPCHECK_SOURCES_LIST} ${SOURCE}) + endif() + endforeach() + + add_custom_target(cppcheck.${TARGET_NAME} + COMMAND ${CMAKE_CPPCHECK} -j8 --error-exitcode=1 --language=c++ --std=c++11 + --enable=warning,style,performance,portability,information + ${CPPCHECK_DEFINES_LIST} ${CPPCHECK_SOURCES_LIST} ${CPPCHECK_INCLUDES_LIST} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) + if(NOT "${TARGET_LIBRARIES}" STREQUAL "TARGET_LIBRARIES-NOTFOUND") + foreach(LIBRARY ${TARGET_LIBRARIES}) + string(REGEX MATCH "^${PREFIX_IMPORTED_LIB}.*|.*${SUFFIX_THIRD_PARTY_LIB}$" MATCHED ${LIBRARY}) + if("${MATCHED}" STREQUAL "") # exclude imported and third-party modules + if(NOT TARGET cppcheck.${LIBRARY}) + add_cppcheck_target(${LIBRARY}) + + add_dependencies(cppcheck.${TARGET_NAME} cppcheck.${LIBRARY}) + endif() + endif() + endforeach() + endif() + + add_dependencies(cppcheck cppcheck.${TARGET_NAME}) + endfunction() diff --git a/jerry-libc/CMakeLists.txt b/jerry-libc/CMakeLists.txt index 85159eb4e..6959e02ee 100644 --- a/jerry-libc/CMakeLists.txt +++ b/jerry-libc/CMakeLists.txt @@ -51,9 +51,9 @@ set(COMPILE_FLAGS_LIBC "${COMPILE_FLAGS_JERRY} ${C_FLAGS_JERRY}") set(INCLUDE_LIBC_LINUX target/linux) # MCU # STM32F3 - set(INCLUDE_LIBC_MCU_STM32F3 target/stm32f3) + set(INCLUDE_LIBC_MCU_STM32F3 target/mcu-stubs) # STM32F4 - set(INCLUDE_LIBC_MCU_STM32F4 target/stm32f4) + set(INCLUDE_LIBC_MCU_STM32F4 target/mcu-stubs) # Third-party # Platform-specific @@ -130,12 +130,12 @@ set(COMPILE_FLAGS_LIBC "${COMPILE_FLAGS_JERRY} ${C_FLAGS_JERRY}") # Third-party MCU library if(DEFINED SOURCE_THIRD_PARTY_${PLATFORM_EXT}) - add_library(${TARGET_NAME}.third_party.lib STATIC ${SOURCE_THIRD_PARTY_${PLATFORM_EXT}}) - set_property(TARGET ${TARGET_NAME}.third_party.lib + add_library(${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB} STATIC ${SOURCE_THIRD_PARTY_${PLATFORM_EXT}}) + set_property(TARGET ${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB} PROPERTY COMPILE_FLAGS "${FLAGS_COMMON_${BUILD_MODE}}") - target_include_directories(${TARGET_NAME}.third_party.lib PRIVATE ${INCLUDE_THIRD_PARTY_${PLATFORM_EXT}}) + target_include_directories(${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB} PRIVATE ${INCLUDE_THIRD_PARTY_${PLATFORM_EXT}}) - target_link_libraries(${TARGET_NAME}.lib ${TARGET_NAME}.third_party.lib) + target_link_libraries(${TARGET_NAME}.lib ${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB}) endif() endfunction() diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 957c2a3e0..f6e545d2f 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -97,12 +97,12 @@ project (Jerry_Plugins CXX ASM) # Third-party MCU library if(DEFINED SOURCE_THIRD_PARTY_${PLATFORM_EXT}) - add_library(${TARGET_NAME}.third_party.lib STATIC ${SOURCE_THIRD_PARTY_${PLATFORM_EXT}}) - set_property(TARGET ${TARGET_NAME}.third_party.lib + add_library(${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB} STATIC ${SOURCE_THIRD_PARTY_${PLATFORM_EXT}}) + set_property(TARGET ${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB} PROPERTY COMPILE_FLAGS "${FLAGS_COMMON_${BUILD_MODE}}") - target_include_directories(${TARGET_NAME}.third_party.lib PRIVATE ${INCLUDE_PLUGINS}) + target_include_directories(${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB} PRIVATE ${INCLUDE_PLUGINS}) - target_link_libraries(${TARGET_NAME}.lib ${TARGET_NAME}.third_party.lib) + target_link_libraries(${TARGET_NAME}.lib ${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB}) endif() endfunction() diff --git a/tools/cppcheck.sh b/tools/cppcheck.sh index b79932876..cf92a56ea 100755 --- a/tools/cppcheck.sh +++ b/tools/cppcheck.sh @@ -14,7 +14,7 @@ #!/bin/bash -BASE=./third-party/tools/cppcheck +BASE=$(dirname $0)/../third-party/tools/cppcheck if [ ! -x $BASE/$(uname -m)/cppcheck ] then diff --git a/tools/precommit.sh b/tools/precommit.sh index 6190594d9..2d7fbc3c4 100755 --- a/tools/precommit.sh +++ b/tools/precommit.sh @@ -27,11 +27,11 @@ PARSE_ONLY_TESTING_PATHS="./tests/benchmarks/jerry" FULL_TESTING_PATHS="./tests/jerry ./tests/jerry-test-suite/precommit_test_list" echo -e "\nBuilding...\n\n" -$MAKE build || exit 1 +$MAKE STATIC_CHECK=ON build || exit 1 echo -e "\n================ Build completed successfully. Running precommit tests ================\n" echo -e "All targets were built successfully. Starting unit tests' run.\n" $MAKE unittests_run || exit 1 -echo -e "Unit tests completed successfully. Starting full testing.\n" +echo -e "\nUnit tests completed successfully. Starting full testing.\n" RUN_IDS=""