From d83d8e0b36826f62bd1a8d924dbb39ad81d984c5 Mon Sep 17 00:00:00 2001 From: Ruben Ayrapetyan Date: Thu, 19 Mar 2015 17:12:14 +0300 Subject: [PATCH] Removing build of multiple identical jerry-libc and plugins libraries copies. Fixing parallel build / precommit invocation without using the workaround. --- CMakeLists.txt | 46 ++++++++++++++++----------------- Makefile | 54 ++++++++++++++++++++++++++++++++++++--- jerry-libc/CMakeLists.txt | 41 ++++++++++++----------------- plugins/CMakeLists.txt | 43 ++++++++++++------------------- 4 files changed, 105 insertions(+), 79 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d911a45d1..28cbc9aeb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -146,7 +146,7 @@ project (Jerry CXX C ASM) # Debug information set(COMPILE_FLAGS_JERRY "${COMPILE_FLAGS_JERRY} -g -gdwarf-4") - + # Warnings set(COMPILE_FLAGS_JERRY "${COMPILE_FLAGS_JERRY} -Wall -Wextra -Wpedantic -Wlogical-op") set(COMPILE_FLAGS_JERRY "${COMPILE_FLAGS_JERRY} -Wformat-nonliteral -Winit-self -Wno-stack-protector") @@ -238,8 +238,8 @@ project (Jerry CXX C ASM) function(declare_targets_for_build_mode BUILD_MODE) string(TOLOWER "${PLATFORM_EXT}" PLATFORM_L) set(TARGET_NAME ${BUILD_MODE_PREFIX_${BUILD_MODE}}.${PLATFORM_L}) - set(PLUGINS_TARGET_NAME ${BUILD_MODE_PREFIX_${BUILD_MODE}}.plugins.${PLATFORM_L}) - set(LIBC_TARGET_NAME ${BUILD_MODE_PREFIX_${BUILD_MODE}}.jerry-libc.${PLATFORM_L}) + set(PLUGINS_TARGET_NAME ${BUILD_MODE_PREFIX_${BUILD_MODE}}.plugins.${PLATFORM_L}.lib) + set(LIBC_TARGET_NAME ${BUILD_MODE_PREFIX_${BUILD_MODE}}.jerry-libc.${PLATFORM_L}.lib) function(declare_target_with_modifiers ) # modifiers are passed in ARGN implicit argument set(CORE_TARGET_NAME ${BUILD_MODE_PREFIX_${BUILD_MODE}}) @@ -247,12 +247,8 @@ project (Jerry CXX C ASM) set(TARGET_NAME ${TARGET_NAME}${MODIFIER_SUFFIX_${MODIFIER}}) set(CORE_TARGET_NAME ${CORE_TARGET_NAME}${MODIFIER_SUFFIX_${MODIFIER}}) - set(LIBC_TARGET_NAME ${LIBC_TARGET_NAME}${MODIFIER_SUFFIX_${MODIFIER}}) - set(PLUGINS_TARGET_NAME ${PLUGINS_TARGET_NAME}${MODIFIER_SUFFIX_${MODIFIER}}) endforeach() set(CORE_TARGET_NAME ${CORE_TARGET_NAME}.jerry-core) - set(LIBC_TARGET_NAME ${LIBC_TARGET_NAME}.lib) - set(PLUGINS_TARGET_NAME ${PLUGINS_TARGET_NAME}.lib) set(DEFINES_JERRY ) @@ -306,25 +302,27 @@ project (Jerry CXX C ASM) declare_targets_for_build_mode(RELEASE) # Unit tests declaration - add_custom_target(unittests) - add_custom_target(cppcheck.unittests) + if("${PLATFORM}" STREQUAL "LINUX") + 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) - set(TARGET_NAME unit_${TARGET_NAME}) + foreach(SOURCE_UNIT_TEST_MAIN ${SOURCE_UNIT_TEST_MAIN_MODULES}) + get_filename_component(TARGET_NAME ${SOURCE_UNIT_TEST_MAIN} NAME_WE) + set(TARGET_NAME unit_${TARGET_NAME}) - set(CORE_TARGET_NAME unittests.jerry-core) + set(CORE_TARGET_NAME unittests.jerry-core) - add_executable(${TARGET_NAME} ${SOURCE_UNIT_TEST_MAIN}) - set_property(TARGET ${TARGET_NAME} - PROPERTY COMPILE_FLAGS "${COMPILE_FLAGS_JERRY} ${CXX_FLAGS_JERRY} ${FLAGS_COMMON_UNITTESTS}") - 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} ${PREFIX_IMPORTED_LIB}libc ${PREFIX_IMPORTED_LIB}libgcc) + add_executable(${TARGET_NAME} ${SOURCE_UNIT_TEST_MAIN}) + set_property(TARGET ${TARGET_NAME} + PROPERTY COMPILE_FLAGS "${COMPILE_FLAGS_JERRY} ${CXX_FLAGS_JERRY} ${FLAGS_COMMON_UNITTESTS}") + 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} ${PREFIX_IMPORTED_LIB}libc ${PREFIX_IMPORTED_LIB}libgcc) - add_cppcheck_target(${TARGET_NAME}) + add_cppcheck_target(${TARGET_NAME}) - add_dependencies(unittests ${TARGET_NAME}) - add_dependencies(cppcheck.unittests cppcheck.${TARGET_NAME}) - endforeach() + add_dependencies(unittests ${TARGET_NAME}) + add_dependencies(cppcheck.unittests cppcheck.${TARGET_NAME}) + endforeach() + endif() diff --git a/Makefile b/Makefile index 0da121b1f..a4d9b3344 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ # # Target naming scheme # -# Main targets: {debug,release}.{linux,stm32f{4}}[.{check,flash}] +# Main targets: {debug,release}.{linux,stm32f{4}}[.flash] # # Target mode part (before dot): # debug: - JERRY_NDEBUG; - optimizations; + debug symbols; + -Werror | debug build @@ -23,7 +23,7 @@ # # Target system and modifiers part (after first dot): # linux - target system is linux -# stm32f{4} - target is STM32F{4} board +# mcu_stm32f{3,4} - target is STM32F{3,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. @@ -33,6 +33,12 @@ # # Unit test target: unittests_run # +# Parallel run +# To build all targets in parallel, please, use make build -j +# To run precommit in parallel mode, please, use make precommit -j +# +# Parallel build of several selected targets started manually is not supported. +# # Options # Valgrind @@ -70,7 +76,7 @@ export JERRY_STM32F3_TARGETS = $(foreach __MODE,$(TARGET_RELEASE_MODES),$(foreac export JERRY_STM32F4_TARGETS = $(foreach __MODE,$(TARGET_DEBUG_MODES),$(foreach __SYSTEM,$(TARGET_STM32F4_MODS),$(__MODE).$(__SYSTEM))) \ $(foreach __MODE,$(TARGET_RELEASE_MODES),$(foreach __SYSTEM,$(TARGET_STM32F4_MODS),$(__MODE).$(__SYSTEM))) -export JERRY_TARGETS = $(JERRY_LINUX_TARGETS) $(JERRY_STM32F3_TARGETS) $(JERRY_STM32F4_TARGETS) +export JERRY_TARGETS = $(JERRY_LINUX_TARGETS) $(JERRY_STM32F3_TARGETS) $(JERRY_STM32F4_TARGETS) unittests export CHECK_TARGETS = $(foreach __TARGET,$(JERRY_LINUX_TARGETS),$(__TARGET).check) export FLASH_TARGETS = $(foreach __TARGET,$(JERRY_STM32F3_TARGETS) $(JERRY_STM32F4_TARGETS),$(__TARGET).flash) @@ -105,6 +111,9 @@ export SHELL=/bin/bash # Current BUILD_DIR := ./build/obj$(OPTIONS_STRING) +# "Build all" targets prefix + BUILD_ALL := build_all + all: precommit $(BUILD_DIRS_NATIVE): @@ -146,6 +155,15 @@ unittests: $(BUILD_DIR)/native (echo "Build failed. See $(OUT_DIR)/$@/make.log for details."; exit 1;) @ cp $(BUILD_DIR)/native/unit_test_* $(OUT_DIR)/$@ +$(BUILD_ALL)_native: $(BUILD_DIRS_NATIVE) + @ mkdir -p $(OUT_DIR)/$@ + @ $(MAKE) -C $(BUILD_DIR)/native jerry-libc-all VERBOSE=1 &>$(OUT_DIR)/$@/make.log || \ + (echo "Build failed. See $(OUT_DIR)/$@/make.log for details."; exit 1;) + @ $(MAKE) -C $(BUILD_DIR)/native plugins-all VERBOSE=1 &>$(OUT_DIR)/$@/make.log || \ + (echo "Build failed. See $(OUT_DIR)/$@/make.log for details."; exit 1;) + @ $(MAKE) -C $(BUILD_DIR)/native $(JERRY_LINUX_TARGETS) unittests VERBOSE=1 &>$(OUT_DIR)/$@/make.log || \ + (echo "Build failed. See $(OUT_DIR)/$@/make.log for details."; exit 1;) + $(JERRY_STM32F3_TARGETS): $(BUILD_DIR)/stm32f3 @ mkdir -p $(OUT_DIR)/$@ @ [ "$(STATIC_CHECK)" = "OFF" ] || $(MAKE) -C $(BUILD_DIR)/stm32f3 VERBOSE=1 cppcheck.$@ &>$(OUT_DIR)/$@/cppcheck.log || \ @@ -155,6 +173,15 @@ $(JERRY_STM32F3_TARGETS): $(BUILD_DIR)/stm32f3 @ cp $(BUILD_DIR)/stm32f3/$@ $(OUT_DIR)/$@/jerry @ cp $(BUILD_DIR)/stm32f3/$@.bin $(OUT_DIR)/$@/jerry.bin +$(BUILD_ALL)_stm32f3: $(BUILD_DIRS_STM32F3) + @ mkdir -p $(OUT_DIR)/$@ + @ $(MAKE) -C $(BUILD_DIR)/stm32f3 jerry-libc-all VERBOSE=1 &>$(OUT_DIR)/$@/make.log || \ + (echo "Build failed. See $(OUT_DIR)/$@/make.log for details."; exit 1;) + @ $(MAKE) -C $(BUILD_DIR)/stm32f3 plugins-all VERBOSE=1 &>$(OUT_DIR)/$@/make.log || \ + (echo "Build failed. See $(OUT_DIR)/$@/make.log for details."; exit 1;) + @ $(MAKE) -C $(BUILD_DIR)/stm32f3 $(JERRY_STM32F3_TARGETS) VERBOSE=1 &>$(OUT_DIR)/$@/make.log || \ + (echo "Build failed. See $(OUT_DIR)/$@/make.log for details."; exit 1;) + $(JERRY_STM32F4_TARGETS): $(BUILD_DIR)/stm32f4 @ mkdir -p $(OUT_DIR)/$@ @ [ "$(STATIC_CHECK)" = "OFF" ] || $(MAKE) -C $(BUILD_DIR)/stm32f4 VERBOSE=1 cppcheck.$@ &>$(OUT_DIR)/$@/cppcheck.log || \ @@ -164,7 +191,26 @@ $(JERRY_STM32F4_TARGETS): $(BUILD_DIR)/stm32f4 @ cp $(BUILD_DIR)/stm32f4/$@ $(OUT_DIR)/$@/jerry @ cp $(BUILD_DIR)/stm32f4/$@.bin $(OUT_DIR)/$@/jerry.bin -build: $(JERRY_TARGETS) unittests +$(BUILD_ALL)_stm32f4: $(BUILD_DIRS_STM32F4) + @ mkdir -p $(OUT_DIR)/$@ + @ $(MAKE) -C $(BUILD_DIR)/stm32f4 jerry-libc-all VERBOSE=1 &>$(OUT_DIR)/$@/make.log || \ + (echo "Build failed. See $(OUT_DIR)/$@/make.log for details."; exit 1;) + @ $(MAKE) -C $(BUILD_DIR)/stm32f4 plugins-all VERBOSE=1 &>$(OUT_DIR)/$@/make.log || \ + (echo "Build failed. See $(OUT_DIR)/$@/make.log for details."; exit 1;) + @ $(MAKE) -C $(BUILD_DIR)/stm32f4 $(JERRY_STM32F4_TARGETS) VERBOSE=1 &>$(OUT_DIR)/$@/make.log || \ + (echo "Build failed. See $(OUT_DIR)/$@/make.log for details."; exit 1;) + +build_all: $(BUILD_ALL)_native $(BUILD_ALL)_stm32f3 $(BUILD_ALL)_stm32f4 + +# +# build - build_all, then run cppcheck and copy output to OUT_DIR +# Prebuild is needed to avoid race conditions between make instances running in parallel +# +build: $(BUILD_ALL) + @ mkdir -p $(OUT_DIR)/$@ + @ $(MAKE) VERBOSE=1 $(JERRY_TARGETS) &>$(OUT_DIR)/$@/make.log || \ + (echo "Build failed. See $(OUT_DIR)/$@/make.log for details."; exit 1;) + @ rm -rf $(OUT_DIR)/$(BUILD_ALL)* $(OUT_DIR)/$@ $(FLASH_TARGETS): $(BUILD_DIR)/mcu @$(MAKE) -C $(BUILD_DIR)/mcu VERBOSE=1 $@ 1>/dev/null diff --git a/jerry-libc/CMakeLists.txt b/jerry-libc/CMakeLists.txt index 6959e02ee..94d3929e8 100644 --- a/jerry-libc/CMakeLists.txt +++ b/jerry-libc/CMakeLists.txt @@ -108,6 +108,8 @@ set(COMPILE_FLAGS_LIBC "${COMPILE_FLAGS_JERRY} ${C_FLAGS_JERRY}") set(DEFINES_LIBC ${DEFINES_LIBC} ${DEFINES_LIBC_${PLATFORM}}) # Targets declaration + add_custom_target (jerry-libc-all) + string(TOLOWER ${PLATFORM_EXT} PLATFORM_L) set(TARGET_NAME jerry-libc.${PLATFORM_L}) @@ -116,34 +118,23 @@ set(COMPILE_FLAGS_LIBC "${COMPILE_FLAGS_JERRY} ${C_FLAGS_JERRY}") set(DEFINES_LIBC ${DEFINES_LIBC} ${DEFINES_LIBC_${BUILD_MODE}}) set(INCLUDE_LIBC ${INCLUDE_LIBC} ${INCLUDE_LIBC_${PLATFORM_EXT}}) - function(declare_target_with_modifiers ) # modifiers are passed in ARGN implicit argument - foreach(MODIFIER ${ARGN}) - set(TARGET_NAME ${TARGET_NAME}${MODIFIER_SUFFIX_${MODIFIER}}) - endforeach() + # Jerry + add_library(${TARGET_NAME}.lib STATIC ${SOURCE_LIBC} ${SOURCE_LIBC_${PLATFORM_EXT}}) + set_property(TARGET ${TARGET_NAME}.lib + PROPERTY COMPILE_FLAGS "${COMPILE_FLAGS_LIBC} ${FLAGS_COMMON_${BUILD_MODE}}") + target_compile_definitions(${TARGET_NAME}.lib PRIVATE ${DEFINES_LIBC}) + target_include_directories(${TARGET_NAME}.lib PRIVATE ${INCLUDE_LIBC}) + add_dependencies(jerry-libc-all ${TARGET_NAME}.lib) - # Jerry - add_library(${TARGET_NAME}.lib STATIC ${SOURCE_LIBC} ${SOURCE_LIBC_${PLATFORM_EXT}}) - set_property(TARGET ${TARGET_NAME}.lib - PROPERTY COMPILE_FLAGS "${COMPILE_FLAGS_LIBC} ${FLAGS_COMMON_${BUILD_MODE}}") - target_compile_definitions(${TARGET_NAME}.lib PRIVATE ${DEFINES_LIBC}) - target_include_directories(${TARGET_NAME}.lib PRIVATE ${INCLUDE_LIBC}) - - # Third-party MCU library - if(DEFINED SOURCE_THIRD_PARTY_${PLATFORM_EXT}) - 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}}") + # Third-party MCU library + if(DEFINED SOURCE_THIRD_PARTY_${PLATFORM_EXT}) + 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}${SUFFIX_THIRD_PARTY_LIB} PRIVATE ${INCLUDE_THIRD_PARTY_${PLATFORM_EXT}}) - - target_link_libraries(${TARGET_NAME}.lib ${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB}) - endif() - endfunction() - foreach(MODIFIERS_LIST ${MODIFIERS_LISTS}) - separate_arguments(MODIFIERS_LIST) - - declare_target_with_modifiers(${MODIFIERS_LIST}) - endforeach() + target_link_libraries(${TARGET_NAME}.lib ${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB}) + endif() endfunction() declare_targets_for_build_mode(DEBUG) diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index bcb2807e7..abc477c4b 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -84,6 +84,8 @@ project (Jerry_Plugins CXX ASM) set(INCLUDE_PLUGINS ${INCLUDE_PLUGINS} ${INCLUDE_THIRD_PARTY_${PLATFORM_EXT}}) # Targets declaration + add_custom_target (plugins-all) + string(TOLOWER ${PLATFORM_EXT} PLATFORM_L) set(TARGET_NAME plugins.${PLATFORM_L}) @@ -91,34 +93,23 @@ project (Jerry_Plugins CXX ASM) set(TARGET_NAME ${BUILD_MODE_PREFIX_${BUILD_MODE}}.${TARGET_NAME}) set(DEFINES_PLUGINS ${DEFINES_PLUGINS} ${DEFINES_PLUGINS_${BUILD_MODE}}) - function(declare_target_with_modifiers ) # modifiers are passed in ARGN implicit argument - foreach(MODIFIER ${ARGN}) - set(TARGET_NAME ${TARGET_NAME}${MODIFIER_SUFFIX_${MODIFIER}}) - endforeach() + # Jerry + add_library(${TARGET_NAME}.lib STATIC ${SOURCE_PLUGINS}) + set_property(TARGET ${TARGET_NAME}.lib + PROPERTY COMPILE_FLAGS "${COMPILE_FLAGS_PLUGINS} ${FLAGS_COMMON_${BUILD_MODE}}") + target_compile_definitions(${TARGET_NAME}.lib PRIVATE ${DEFINES_PLUGINS}) + target_include_directories(${TARGET_NAME}.lib PRIVATE ${INCLUDE_PLUGINS} ${INCLUDE_CORE_INTERFACE}) + add_dependencies(plugins-all ${TARGET_NAME}.lib) - # Jerry - add_library(${TARGET_NAME}.lib STATIC ${SOURCE_PLUGINS}) - set_property(TARGET ${TARGET_NAME}.lib - PROPERTY COMPILE_FLAGS "${COMPILE_FLAGS_PLUGINS} ${FLAGS_COMMON_${BUILD_MODE}}") - target_compile_definitions(${TARGET_NAME}.lib PRIVATE ${DEFINES_PLUGINS}) - target_include_directories(${TARGET_NAME}.lib PRIVATE ${INCLUDE_PLUGINS} ${INCLUDE_CORE_INTERFACE}) + # Third-party MCU library + if(DEFINED SOURCE_THIRD_PARTY_${PLATFORM_EXT}) + 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}${SUFFIX_THIRD_PARTY_LIB} PRIVATE ${INCLUDE_PLUGINS}) - # Third-party MCU library - if(DEFINED SOURCE_THIRD_PARTY_${PLATFORM_EXT}) - 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}${SUFFIX_THIRD_PARTY_LIB} PRIVATE ${INCLUDE_PLUGINS}) - - target_link_libraries(${TARGET_NAME}.lib ${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB}) - endif() - endfunction() - - foreach(MODIFIERS_LIST ${MODIFIERS_LISTS}) - separate_arguments(MODIFIERS_LIST) - - declare_target_with_modifiers(${MODIFIERS_LIST}) - endforeach() + target_link_libraries(${TARGET_NAME}.lib ${TARGET_NAME}${SUFFIX_THIRD_PARTY_LIB}) + endif() endfunction() declare_targets_for_build_mode(DEBUG)