From d7d7ce7cd67e0abe3f83a10489227d3d29e54d18 Mon Sep 17 00:00:00 2001 From: Liam Beguin Date: Mon, 23 Oct 2023 15:34:06 -0400 Subject: [PATCH 01/14] scripts: xilinx: parallelize build with pattern rules Drop shell for loops in favor of makefile pattern rules so that make can directly run targets in parallel (using -j). This doesn't affect Vivado's own settings. Implicitly, this also fixes missing build dependencies such as: make: *** No rule to make target '../../../library/axi_clkgen/component.xml', needed by 'adrv9009_zcu102.sdk/system_top.xsa'. Stop. As a benchmark: $ lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian Address sizes: 46 bits physical, 48 bits virtual CPU(s): 20 On-line CPU(s) list: 0-19 Thread(s) per core: 1 Core(s) per socket: 14 Socket(s): 1 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 154 Model name: 12th Gen Intel(R) Core(TM) i9-12900H Stepping: 3 CPU MHz: 2900.000 CPU max MHz: 5000.0000 CPU min MHz: 400.0000 BogoMIPS: 5836.80 ... $ make -C projects/adrv9009/zcu102/ clean-all $ time make -C projects/adrv9009/zcu102/ lib ... real 9m27.223s user 9m2.556s sys 0m32.358s $ make -C projects/adrv9009/zcu102/ clean-all $ time make -C projects/adrv9009/zcu102/ -j8 lib ... real 1m54.639s user 16m26.512s sys 1m2.317s i.e. about 5 times faster to build IP core dependencies. Signed-off-by: Liam Beguin --- library/scripts/library.mk | 24 +++++++++++++----------- projects/scripts/project-xilinx.mk | 18 ++++++++---------- quiet.mk | 6 +++--- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/library/scripts/library.mk b/library/scripts/library.mk index e521347a45c..dcdcde7a3e1 100644 --- a/library/scripts/library.mk +++ b/library/scripts/library.mk @@ -51,7 +51,7 @@ CLEAN_TARGET += tb/libraries GENERIC_DEPS += $(HDL_LIBRARY_PATH)../scripts/adi_env.tcl -.PHONY: all intel intel_dep xilinx xilinx_dep clean clean-all +.PHONY: all intel intel_dep xilinx clean clean-all all: intel xilinx @@ -83,22 +83,24 @@ ifneq ($(XILINX_DEPS),) XILINX_DEPS += $(GENERIC_DEPS) XILINX_DEPS += $(HDL_LIBRARY_PATH)scripts/adi_ip_xilinx.tcl -XILINX_DEPS += $(foreach dep,$(XILINX_LIB_DEPS),$(HDL_LIBRARY_PATH)$(dep)/component.xml) +_XILINX_LIB_DEPS = $(foreach dep,$(XILINX_LIB_DEPS),$(HDL_LIBRARY_PATH)$(dep)/component.xml) +_XILINX_INTF_DEPS = $(foreach dep,$(XILINX_INTERFACE_DEPS),$(HDL_LIBRARY_PATH)$(dep)) -xilinx: xilinx_dep component.xml +xilinx: component.xml -component.xml: $(XILINX_DEPS) +component.xml: $(XILINX_DEPS) $(_XILINX_INTF_DEPS) $(_XILINX_LIB_DEPS) -rm -rf $(CLEAN_TARGET) $(call build, \ $(VIVADO) $(LIBRARY_NAME)_ip.tcl, \ $(LIBRARY_NAME)_ip.log, \ $(HL)$(LIBRARY_NAME)$(NC) library) -xilinx_dep: - @for lib in $(XILINX_LIB_DEPS); do \ - $(MAKE) -C $(HDL_LIBRARY_PATH)$${lib} xilinx || exit $$?; \ - done - @for intf in $(XILINX_INTERFACE_DEPS); do \ - $(MAKE) -C $(HDL_LIBRARY_PATH)$${intf} xilinx || exit $$?; \ - done +$(_XILINX_INTF_DEPS): + $(MAKE) -C $(dir $@) $(notdir $@) + +$(_XILINX_LIB_DEPS): + $(MAKE) -C $(dir $@) xilinx + +%.xml: + $(MAKE) -C $(dir $@) $(notdir $@) endif diff --git a/projects/scripts/project-xilinx.mk b/projects/scripts/project-xilinx.mk index 2102d09e02a..209e4b4549e 100644 --- a/projects/scripts/project-xilinx.mk +++ b/projects/scripts/project-xilinx.mk @@ -78,7 +78,8 @@ M_DEPS += $(foreach dep,$(LIB_DEPS),$(HDL_LIBRARY_PATH)$(dep)/component.xml) .PHONY: all lib clean clean-all -all: lib $(PROJECT_NAME).sdk/system_top.xsa +all: $(PROJECT_NAME).sdk/system_top.xsa +lib: $(M_DEPS) clean: -rm -f reference.dcp @@ -115,12 +116,9 @@ $(PROJECT_NAME).sdk/system_top.xsa: $(M_DEPS) $(PROJECT_NAME)_vivado.log, \ $(HL)$(PROJECT_NAME)$(NC) project) -lib: - @for lib in $(LIB_DEPS); do \ - if [ -n "${REQUIRED_VIVADO_VERSION}" ]; then \ - $(MAKE) -C $(HDL_LIBRARY_PATH)$${lib} xilinx REQUIRED_VIVADO_VERSION=${REQUIRED_VIVADO_VERSION} || exit $$?; \ - else \ - $(MAKE) -C $(HDL_LIBRARY_PATH)$${lib} xilinx || exit $$?; \ - fi; \ - done - +$(HDL_LIBRARY_PATH)%/component.xml: + if [ -n "${REQUIRED_VIVADO_VERSION}" ]; then \ + $(MAKE) -C $(dir $@) xilinx REQUIRED_VIVADO_VERSION=${REQUIRED_VIVADO_VERSION} || exit $$?; \ + else \ + $(MAKE) -C $(dir $@) xilinx || exit $$?; \ + fi; diff --git a/quiet.mk b/quiet.mk index 04aad0f1edb..f4e173badb1 100644 --- a/quiet.mk +++ b/quiet.mk @@ -24,12 +24,12 @@ ifneq ($(VERBOSE),1) # $(2): Logfile name # $(3): Textual description of the task define build - @echo -n "Building $(strip $(3)) [$(HL)$(CURDIR)/$(strip $(2))$(NC)] ..." + @echo $(if $(filter -j%,$(MAKEFLAGS)),,-n) "Building $(strip $(3)) [$(HL)$(CURDIR)/$(strip $(2))$(NC)] ..." $(strip $(1)) >> $(strip $(2)) 2>&1; \ (ERR=$$?; if [ $$ERR = 0 ]; then \ - echo " $(GREEN)OK$(NC)"; \ + echo "$(if $(filter -j%,$(MAKEFLAGS)),Building $(strip $(3)) [$(HL)$(CURDIR)/$(strip $(2))$(NC)] ...,) $(GREEN)OK$(NC)"; \ else \ - echo " $(RED)FAILED$(NC)"; \ + echo "$(if $(filter -j%,$(MAKEFLAGS)),Building $(strip $(3)) [$(HL)$(CURDIR)/$(strip $(2))$(NC)] ...,) $(RED)FAILED$(NC)"; \ echo "For details see $(HL)$(CURDIR)/$(strip $(2))$(NC)"; \ echo ""; \ fi; exit $$ERR) From 85e390eba1017b27a4ceb695ab10fa4064cbdb5b Mon Sep 17 00:00:00 2001 From: Liam Beguin Date: Tue, 24 Oct 2023 10:42:26 -0400 Subject: [PATCH 02/14] scripts: xilinx: use an advisory lock on component file During a highly parallelized build, it's possible that multiple identical targets be started simultaneously. This is exacerbated by long target execution time. Add an advisory lock on the component.xml file so that multiple instances of Vivado don't try to overwrite the same file. This doesn't prevent a target from being checked multiple times, but forces it to only be run a single time. DELETE_ON_ERROR is required here because flock will create component.xml even if the target fails breaking dependencies at the project level. Signed-off-by: Liam Beguin --- library/scripts/library.mk | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/library/scripts/library.mk b/library/scripts/library.mk index dcdcde7a3e1..c5310fad42a 100644 --- a/library/scripts/library.mk +++ b/library/scripts/library.mk @@ -88,10 +88,12 @@ _XILINX_INTF_DEPS = $(foreach dep,$(XILINX_INTERFACE_DEPS),$(HDL_LIBRARY_PATH)$( xilinx: component.xml +.DELETE_ON_ERROR: + component.xml: $(XILINX_DEPS) $(_XILINX_INTF_DEPS) $(_XILINX_LIB_DEPS) -rm -rf $(CLEAN_TARGET) $(call build, \ - $(VIVADO) $(LIBRARY_NAME)_ip.tcl, \ + flock component.xml -c "$(VIVADO) $(LIBRARY_NAME)_ip.tcl", \ $(LIBRARY_NAME)_ip.log, \ $(HL)$(LIBRARY_NAME)$(NC) library) From 181d9cce7ad342b616db017d01c7d710eac9a4d9 Mon Sep 17 00:00:00 2001 From: Liam Beguin Date: Tue, 31 Oct 2023 12:20:46 -0400 Subject: [PATCH 03/14] library: parallelize top-level library build Search for all Makefiles under library/ and use the directory name to generate a list of libraries to build. With this scheme, `make lib` can be run in parallel. Signed-off-by: Liam Beguin --- library/Makefile | 253 ++--------------------------------------------- 1 file changed, 9 insertions(+), 244 deletions(-) diff --git a/library/Makefile b/library/Makefile index b088528bcc1..8fa25a61f01 100644 --- a/library/Makefile +++ b/library/Makefile @@ -2,7 +2,6 @@ #################################################################################### ## Copyright (c) 2018 - 2023 Analog Devices, Inc. ### SPDX short identifier: BSD-1-Clause -## Auto-generated, do not modify! #################################################################################### #################################################################################### @@ -11,252 +10,18 @@ include ../quiet.mk .PHONY: all lib clean clean-all all: lib +_LIBS := $(shell find . -mindepth 2 -name Makefile -exec dirname {} \; | sort) -clean: - $(MAKE) -C ad463x_data_capture clean - $(MAKE) -C axi_ad3552r clean - $(MAKE) -C axi_ad4858 clean - $(MAKE) -C axi_ad5766 clean - $(MAKE) -C axi_ad7606x clean - $(MAKE) -C axi_ad7616 clean - $(MAKE) -C axi_ad7768 clean - $(MAKE) -C axi_ad777x clean - $(MAKE) -C axi_ad9122 clean - $(MAKE) -C axi_ad9250 clean - $(MAKE) -C axi_ad9265 clean - $(MAKE) -C axi_ad9361 clean - $(MAKE) -C axi_ad9434 clean - $(MAKE) -C axi_ad9467 clean - $(MAKE) -C axi_ad9625 clean - $(MAKE) -C axi_ad9671 clean - $(MAKE) -C axi_ad9684 clean - $(MAKE) -C axi_ad9739a clean - $(MAKE) -C axi_ad9783 clean - $(MAKE) -C axi_ad9963 clean - $(MAKE) -C axi_adaq8092 clean - $(MAKE) -C axi_adc_decimate clean - $(MAKE) -C axi_adc_trigger clean - $(MAKE) -C axi_adrv9001 clean - $(MAKE) -C axi_clkgen clean - $(MAKE) -C axi_clock_monitor clean - $(MAKE) -C axi_dac_interpolate clean - $(MAKE) -C axi_dmac clean - $(MAKE) -C axi_fan_control clean - $(MAKE) -C axi_fmcadc5_sync clean - $(MAKE) -C axi_generic_adc clean - $(MAKE) -C axi_gpreg clean - $(MAKE) -C axi_hdmi_rx clean - $(MAKE) -C axi_hdmi_tx clean - $(MAKE) -C axi_i2s_adi clean - $(MAKE) -C axi_intr_monitor clean - $(MAKE) -C axi_laser_driver clean - $(MAKE) -C axi_logic_analyzer clean - $(MAKE) -C axi_ltc235x clean - $(MAKE) -C axi_ltc2387 clean - $(MAKE) -C axi_pulse_gen clean - $(MAKE) -C axi_pwm_gen clean - $(MAKE) -C axi_rd_wr_combiner clean - $(MAKE) -C axi_spdif_rx clean - $(MAKE) -C axi_spdif_tx clean - $(MAKE) -C axi_sysid clean - $(MAKE) -C axi_tdd clean - $(MAKE) -C cn0363/cn0363_dma_sequencer clean - $(MAKE) -C cn0363/cn0363_phase_data_sync clean - $(MAKE) -C cordic_demod clean - $(MAKE) -C data_offload clean - $(MAKE) -C intel/adi_jesd204 clean - $(MAKE) -C intel/avl_adxcfg clean - $(MAKE) -C intel/avl_adxcvr clean - $(MAKE) -C intel/avl_adxcvr_octet_swap clean - $(MAKE) -C intel/avl_adxphy clean - $(MAKE) -C intel/avl_dacfifo clean - $(MAKE) -C intel/axi_adxcvr clean - $(MAKE) -C intel/common/intel_mem_asym clean - $(MAKE) -C intel/common/intel_serdes clean - $(MAKE) -C intel/jesd204_phy clean - $(MAKE) -C intel/util_clkdiv clean - $(MAKE) -C jesd204/ad_ip_jesd204_tpl_adc clean - $(MAKE) -C jesd204/ad_ip_jesd204_tpl_dac clean - $(MAKE) -C jesd204/axi_jesd204_common clean - $(MAKE) -C jesd204/axi_jesd204_rx clean - $(MAKE) -C jesd204/axi_jesd204_tx clean - $(MAKE) -C jesd204/jesd204_common clean - $(MAKE) -C jesd204/jesd204_rx clean - $(MAKE) -C jesd204/jesd204_rx_static_config clean - $(MAKE) -C jesd204/jesd204_soft_pcs_rx clean - $(MAKE) -C jesd204/jesd204_soft_pcs_tx clean - $(MAKE) -C jesd204/jesd204_tx clean - $(MAKE) -C jesd204/jesd204_tx_static_config clean - $(MAKE) -C jesd204/jesd204_versal_gt_adapter_rx clean - $(MAKE) -C jesd204/jesd204_versal_gt_adapter_tx clean - $(MAKE) -C spi_engine/axi_spi_engine clean - $(MAKE) -C spi_engine/spi_axis_reorder clean - $(MAKE) -C spi_engine/spi_engine_execution clean - $(MAKE) -C spi_engine/spi_engine_interconnect clean - $(MAKE) -C spi_engine/spi_engine_offload clean - $(MAKE) -C sysid_rom clean - $(MAKE) -C util_adcfifo clean - $(MAKE) -C util_axis_fifo clean - $(MAKE) -C util_axis_fifo_asym clean - $(MAKE) -C util_axis_resize clean - $(MAKE) -C util_axis_upscale clean - $(MAKE) -C util_bsplit clean - $(MAKE) -C util_cdc clean - $(MAKE) -C util_cic clean - $(MAKE) -C util_dacfifo clean - $(MAKE) -C util_dec256sinc24b clean - $(MAKE) -C util_delay clean - $(MAKE) -C util_do_ram clean - $(MAKE) -C util_extract clean - $(MAKE) -C util_fir_dec clean - $(MAKE) -C util_fir_int clean - $(MAKE) -C util_gmii_to_rgmii clean - $(MAKE) -C util_hbm clean - $(MAKE) -C util_i2c_mixer clean - $(MAKE) -C util_mfifo clean - $(MAKE) -C util_mii_to_rmii clean - $(MAKE) -C util_pack/util_cpack2 clean - $(MAKE) -C util_pack/util_upack2 clean - $(MAKE) -C util_pad clean - $(MAKE) -C util_pulse_gen clean - $(MAKE) -C util_rfifo clean - $(MAKE) -C util_sigma_delta_spi clean - $(MAKE) -C util_tdd_sync clean - $(MAKE) -C util_var_fifo clean - $(MAKE) -C util_wfifo clean - $(MAKE) -C xilinx/axi_adcfifo clean - $(MAKE) -C xilinx/axi_adxcvr clean - $(MAKE) -C xilinx/axi_dacfifo clean - $(MAKE) -C xilinx/axi_xcvrlb clean - $(MAKE) -C xilinx/util_adxcvr clean - $(MAKE) -C xilinx/util_clkdiv clean +FORCE: +$(_LIBS): FORCE + $(MAKE) -C $@ $(TARGET) - $(MAKE) -C interfaces clean +clean: TARGET:=clean +clean: $(_LIBS) +clean-all: clean - -clean-all:clean - - -lib: - $(MAKE) -C ad463x_data_capture - $(MAKE) -C axi_ad3552r - $(MAKE) -C axi_ad4858 - $(MAKE) -C axi_ad5766 - $(MAKE) -C axi_ad7606x - $(MAKE) -C axi_ad7616 - $(MAKE) -C axi_ad7768 - $(MAKE) -C axi_ad777x - $(MAKE) -C axi_ad9122 - $(MAKE) -C axi_ad9250 - $(MAKE) -C axi_ad9265 - $(MAKE) -C axi_ad9361 - $(MAKE) -C axi_ad9434 - $(MAKE) -C axi_ad9467 - $(MAKE) -C axi_ad9625 - $(MAKE) -C axi_ad9671 - $(MAKE) -C axi_ad9684 - $(MAKE) -C axi_ad9739a - $(MAKE) -C axi_ad9783 - $(MAKE) -C axi_ad9963 - $(MAKE) -C axi_adaq8092 - $(MAKE) -C axi_adc_decimate - $(MAKE) -C axi_adc_trigger - $(MAKE) -C axi_adrv9001 - $(MAKE) -C axi_clkgen - $(MAKE) -C axi_clock_monitor - $(MAKE) -C axi_dac_interpolate - $(MAKE) -C axi_dmac - $(MAKE) -C axi_fan_control - $(MAKE) -C axi_fmcadc5_sync - $(MAKE) -C axi_generic_adc - $(MAKE) -C axi_gpreg - $(MAKE) -C axi_hdmi_rx - $(MAKE) -C axi_hdmi_tx - $(MAKE) -C axi_i2s_adi - $(MAKE) -C axi_intr_monitor - $(MAKE) -C axi_laser_driver - $(MAKE) -C axi_logic_analyzer - $(MAKE) -C axi_ltc235x - $(MAKE) -C axi_ltc2387 - $(MAKE) -C axi_pulse_gen - $(MAKE) -C axi_pwm_gen - $(MAKE) -C axi_rd_wr_combiner - $(MAKE) -C axi_spdif_rx - $(MAKE) -C axi_spdif_tx - $(MAKE) -C axi_sysid - $(MAKE) -C axi_tdd - $(MAKE) -C cn0363/cn0363_dma_sequencer - $(MAKE) -C cn0363/cn0363_phase_data_sync - $(MAKE) -C cordic_demod - $(MAKE) -C data_offload - $(MAKE) -C intel/adi_jesd204 - $(MAKE) -C intel/avl_adxcfg - $(MAKE) -C intel/avl_adxcvr - $(MAKE) -C intel/avl_adxcvr_octet_swap - $(MAKE) -C intel/avl_adxphy - $(MAKE) -C intel/avl_dacfifo - $(MAKE) -C intel/axi_adxcvr - $(MAKE) -C intel/common/intel_mem_asym - $(MAKE) -C intel/common/intel_serdes - $(MAKE) -C intel/jesd204_phy - $(MAKE) -C intel/util_clkdiv - $(MAKE) -C jesd204/ad_ip_jesd204_tpl_adc - $(MAKE) -C jesd204/ad_ip_jesd204_tpl_dac - $(MAKE) -C jesd204/axi_jesd204_common - $(MAKE) -C jesd204/axi_jesd204_rx - $(MAKE) -C jesd204/axi_jesd204_tx - $(MAKE) -C jesd204/jesd204_common - $(MAKE) -C jesd204/jesd204_rx - $(MAKE) -C jesd204/jesd204_rx_static_config - $(MAKE) -C jesd204/jesd204_soft_pcs_rx - $(MAKE) -C jesd204/jesd204_soft_pcs_tx - $(MAKE) -C jesd204/jesd204_tx - $(MAKE) -C jesd204/jesd204_tx_static_config - $(MAKE) -C jesd204/jesd204_versal_gt_adapter_rx - $(MAKE) -C jesd204/jesd204_versal_gt_adapter_tx - $(MAKE) -C spi_engine/axi_spi_engine - $(MAKE) -C spi_engine/spi_axis_reorder - $(MAKE) -C spi_engine/spi_engine_execution - $(MAKE) -C spi_engine/spi_engine_interconnect - $(MAKE) -C spi_engine/spi_engine_offload - $(MAKE) -C sysid_rom - $(MAKE) -C util_adcfifo - $(MAKE) -C util_axis_fifo - $(MAKE) -C util_axis_fifo_asym - $(MAKE) -C util_axis_resize - $(MAKE) -C util_axis_upscale - $(MAKE) -C util_bsplit - $(MAKE) -C util_cdc - $(MAKE) -C util_cic - $(MAKE) -C util_dacfifo - $(MAKE) -C util_dec256sinc24b - $(MAKE) -C util_delay - $(MAKE) -C util_do_ram - $(MAKE) -C util_extract - $(MAKE) -C util_fir_dec - $(MAKE) -C util_fir_int - $(MAKE) -C util_gmii_to_rgmii - $(MAKE) -C util_hbm - $(MAKE) -C util_i2c_mixer - $(MAKE) -C util_mfifo - $(MAKE) -C util_mii_to_rmii - $(MAKE) -C util_pack/util_cpack2 - $(MAKE) -C util_pack/util_upack2 - $(MAKE) -C util_pad - $(MAKE) -C util_pulse_gen - $(MAKE) -C util_rfifo - $(MAKE) -C util_sigma_delta_spi - $(MAKE) -C util_tdd_sync - $(MAKE) -C util_var_fifo - $(MAKE) -C util_wfifo - $(MAKE) -C xilinx/axi_adcfifo - $(MAKE) -C xilinx/axi_adxcvr - $(MAKE) -C xilinx/axi_dacfifo - $(MAKE) -C xilinx/axi_xcvrlb - $(MAKE) -C xilinx/util_adxcvr - $(MAKE) -C xilinx/util_clkdiv - - $(MAKE) -C interfaces +lib: TARGET:= +lib: $(_LIBS) #################################################################################### #################################################################################### From bbee631ddc258317c8bdfaf6b02c1de37aa52f28 Mon Sep 17 00:00:00 2001 From: Liam Beguin Date: Tue, 31 Oct 2023 13:15:42 -0400 Subject: [PATCH 04/14] scripts: xilinx: shrink and parallelize clean targets Shrink and parallelize clean targets by leveraging target-specific variables. This allows us to reuse the generic component.xml target and trigger a clean instead of a build. Signed-off-by: Liam Beguin --- projects/scripts/project-xilinx.mk | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/projects/scripts/project-xilinx.mk b/projects/scripts/project-xilinx.mk index 209e4b4549e..ae8fc3d0f9b 100644 --- a/projects/scripts/project-xilinx.mk +++ b/projects/scripts/project-xilinx.mk @@ -79,6 +79,8 @@ M_DEPS += $(foreach dep,$(LIB_DEPS),$(HDL_LIBRARY_PATH)$(dep)/component.xml) .PHONY: all lib clean clean-all all: $(PROJECT_NAME).sdk/system_top.xsa + +lib: TARGET:=xilinx lib: $(M_DEPS) clean: @@ -88,13 +90,9 @@ clean: $(HL)$(PROJECT_NAME)$(NC) project) -rm -Rf ${DIR_NAME} -clean-all: clean - @for lib in $(LIB_DEPS); do \ - $(MAKE) -C $(HDL_LIBRARY_PATH)$${lib} clean; \ - done - @for dir in ${CLEAN_DIRS}; do \ - rm -Rf $${dir}; \ - done +clean-all: TARGET:=clean +clean-all: clean $(M_DEPS) + @rm -Rf $(CLEAN_DIRS) MODE ?= "default" @@ -118,7 +116,7 @@ $(PROJECT_NAME).sdk/system_top.xsa: $(M_DEPS) $(HDL_LIBRARY_PATH)%/component.xml: if [ -n "${REQUIRED_VIVADO_VERSION}" ]; then \ - $(MAKE) -C $(dir $@) xilinx REQUIRED_VIVADO_VERSION=${REQUIRED_VIVADO_VERSION} || exit $$?; \ + $(MAKE) -C $(dir $@) $(TARGET) REQUIRED_VIVADO_VERSION=${REQUIRED_VIVADO_VERSION} || exit $$?; \ else \ - $(MAKE) -C $(dir $@) xilinx || exit $$?; \ + $(MAKE) -C $(dir $@) $(TARGET) || exit $$?; \ fi; From bd63722e29fa7a55fecd13d1c309e0e49541ff64 Mon Sep 17 00:00:00 2001 From: Jorge Marques Date: Thu, 9 Nov 2023 12:17:13 -0300 Subject: [PATCH 05/14] scripts: xilinx: always call library.mk on deps Library dependencies are managed in library.mk, this commit ensures that library.mk manage and skip them by setting a dummy FORCE target. When building a project, it is desired to rebuild all libraries that have been modified. Previously, the solution placed component.xml files as dependencies, skipping these targets if the file already exists, but ignored changes to them. Signed-off-by: Jorge Marques --- projects/scripts/project-xilinx.mk | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/projects/scripts/project-xilinx.mk b/projects/scripts/project-xilinx.mk index ae8fc3d0f9b..3508016e32c 100644 --- a/projects/scripts/project-xilinx.mk +++ b/projects/scripts/project-xilinx.mk @@ -3,7 +3,7 @@ ## SPDX short identifier: BSD-1-Clause #################################################################################### -# Assumes this file is in prpojects/scripts/project-xilinx.mk +# Assumes this file is in projects/scripts/project-xilinx.mk HDL_PROJECT_PATH := $(subst scripts/project-xilinx.mk,,$(lastword $(MAKEFILE_LIST))) HDL_LIBRARY_PATH := $(HDL_PROJECT_PATH)../library/ @@ -74,7 +74,7 @@ M_DEPS += $(HDL_PROJECT_PATH)scripts/adi_project_xilinx.tcl M_DEPS += $(HDL_PROJECT_PATH)../scripts/adi_env.tcl M_DEPS += $(HDL_PROJECT_PATH)scripts/adi_board.tcl -M_DEPS += $(foreach dep,$(LIB_DEPS),$(HDL_LIBRARY_PATH)$(dep)/component.xml) +M_DEPS += $(foreach dep,$(LIB_DEPS),$(HDL_LIBRARY_PATH)$(dep)/) .PHONY: all lib clean clean-all @@ -114,7 +114,8 @@ $(PROJECT_NAME).sdk/system_top.xsa: $(M_DEPS) $(PROJECT_NAME)_vivado.log, \ $(HL)$(PROJECT_NAME)$(NC) project) -$(HDL_LIBRARY_PATH)%/component.xml: +FORCE: +$(HDL_LIBRARY_PATH)%/: FORCE if [ -n "${REQUIRED_VIVADO_VERSION}" ]; then \ $(MAKE) -C $(dir $@) $(TARGET) REQUIRED_VIVADO_VERSION=${REQUIRED_VIVADO_VERSION} || exit $$?; \ else \ From 897a1620f0139ea17ed160ca458e5552378dc4c1 Mon Sep 17 00:00:00 2001 From: Jorge Marques Date: Fri, 10 Nov 2023 10:59:55 -0300 Subject: [PATCH 06/14] quiet.mk: Update message Since we now support parallel build, differ message from starting and finishing the build. A more sophisticated solution could be develop but Makefile is not good for shared global variables. Signed-off-by: Jorge Marques --- quiet.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quiet.mk b/quiet.mk index f4e173badb1..75b5faf4526 100644 --- a/quiet.mk +++ b/quiet.mk @@ -27,9 +27,9 @@ ifneq ($(VERBOSE),1) @echo $(if $(filter -j%,$(MAKEFLAGS)),,-n) "Building $(strip $(3)) [$(HL)$(CURDIR)/$(strip $(2))$(NC)] ..." $(strip $(1)) >> $(strip $(2)) 2>&1; \ (ERR=$$?; if [ $$ERR = 0 ]; then \ - echo "$(if $(filter -j%,$(MAKEFLAGS)),Building $(strip $(3)) [$(HL)$(CURDIR)/$(strip $(2))$(NC)] ...,) $(GREEN)OK$(NC)"; \ + echo "$(if $(filter -j%,$(MAKEFLAGS)),Build $(strip $(3)) [$(HL)$(CURDIR)/$(strip $(2))$(NC)]) $(GREEN)OK$(NC)"; \ else \ - echo "$(if $(filter -j%,$(MAKEFLAGS)),Building $(strip $(3)) [$(HL)$(CURDIR)/$(strip $(2))$(NC)] ...,) $(RED)FAILED$(NC)"; \ + echo "$(if $(filter -j%,$(MAKEFLAGS)),Build $(strip $(3)) [$(HL)$(CURDIR)/$(strip $(2))$(NC)]) $(RED)FAILED$(NC)"; \ echo "For details see $(HL)$(CURDIR)/$(strip $(2))$(NC)"; \ echo ""; \ fi; exit $$ERR) From 7401041e8b6192588054a50f6d2c1ac7340fccf9 Mon Sep 17 00:00:00 2001 From: Jorge Marques Date: Fri, 10 Nov 2023 17:31:20 -0300 Subject: [PATCH 07/14] scripts: intel: .timestamp_intel parallel support Add support for touching .timestamp_intel as separated targets. Signed-off-by: Jorge Marques --- library/scripts/library.mk | 15 +++++++-------- projects/scripts/project-intel.mk | 24 +++++++++++------------- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/library/scripts/library.mk b/library/scripts/library.mk index c5310fad42a..3e15a713514 100644 --- a/library/scripts/library.mk +++ b/library/scripts/library.mk @@ -51,7 +51,7 @@ CLEAN_TARGET += tb/libraries GENERIC_DEPS += $(HDL_LIBRARY_PATH)../scripts/adi_env.tcl -.PHONY: all intel intel_dep xilinx clean clean-all +.PHONY: all intel xilinx clean clean-all all: intel xilinx @@ -66,17 +66,16 @@ ifneq ($(INTEL_DEPS),) INTEL_DEPS += $(GENERIC_DEPS) INTEL_DEPS += $(HDL_LIBRARY_PATH)scripts/adi_ip_intel.tcl -INTEL_DEPS += $(foreach dep,$(INTEL_LIB_DEPS),$(HDL_LIBRARY_PATH)$(dep)/.timestamp_intel) +_INTEL_LIB_DEPS = $(foreach dep,$(INTEL_LIB_DEPS),$(HDL_LIBRARY_PATH)$(dep)/.timestamp_intel) -intel: intel_dep .timestamp_intel +intel: .timestamp_intel -.timestamp_intel: $(INTEL_DEPS) +.timestamp_intel: $(INTEL_DEPS) $(_INTEL_LIB_DEPS) touch $@ -intel_dep: - @for lib in $(INTEL_LIB_DEPS); do \ - $(MAKE) -C $(HDL_LIBRARY_PATH)$${lib} intel || exit $$?; \ - done +$(_INTEL_LIB_DEPS): + $(MAKE) -C $(dir $@) intel + endif ifneq ($(XILINX_DEPS),) diff --git a/projects/scripts/project-intel.mk b/projects/scripts/project-intel.mk index 91137013324..b6bf5336cac 100644 --- a/projects/scripts/project-intel.mk +++ b/projects/scripts/project-intel.mk @@ -102,10 +102,13 @@ M_DEPS += $(HDL_PROJECT_PATH)scripts/adi_tquest.tcl M_DEPS += $(HDL_PROJECT_PATH)scripts/adi_project_intel.tcl M_DEPS += $(HDL_PROJECT_PATH)../scripts/adi_env.tcl -M_DEPS += $(foreach dep,$(LIB_DEPS),$(HDL_LIBRARY_PATH)$(dep)/.timestamp_intel) +M_DEPS += $(foreach dep,$(LIB_DEPS),$(HDL_LIBRARY_PATH)$(dep)/) .PHONY: all lib clean clean-all -all: lib $(PROJECT_NAME).sof +all: $(PROJECT_NAME).sof + +lib: TARGET:=intel +lib: $(M_DEPS) clean: $(call clean, \ @@ -113,13 +116,9 @@ clean: $(HL)$(PROJECT_NAME)$(NC) project) -rm -Rf ${DIR_NAME} -clean-all: clean - @for lib in $(LIB_DEPS); do \ - $(MAKE) -C $(HDL_LIBRARY_PATH)$${lib} clean; \ - done - @for dir in ${CLEAN_DIRS}; do \ - rm -Rf $${dir}; \ - done +clean-all: TARGET:=clean +clean-all: clean $(M_DEPS) + @rm -Rf $(CLEAN_DIRS) $(PROJECT_NAME).sof: $(M_DEPS) -rm -rf $(CLEAN_TARGET) @@ -128,7 +127,6 @@ $(PROJECT_NAME).sof: $(M_DEPS) $(PROJECT_NAME)_quartus.log, \ $(HL)$(PROJECT_NAME)$(NC)) -lib: - @for lib in $(LIB_DEPS); do \ - $(MAKE) -C $(HDL_LIBRARY_PATH)$${lib} intel || exit $$?; \ - done +FORCE: +$(HDL_LIBRARY_PATH)%/: FORCE + $(MAKE) -C $(dir $@) $(TARGET) || exit $$?; \ From 2709dab8ebc416e07587728e2f06a3dec2f1c53c Mon Sep 17 00:00:00 2001 From: "Jorge.Marques" Date: Fri, 10 Nov 2023 21:30:15 +0000 Subject: [PATCH 08/14] scripts: fixup improper target-specific variables xilinx and intel were set at lib target, having empty value at the actual target (component.xml, .timestamp_intel), which default to building both. Signed-off-by: Jorge Marques --- projects/scripts/project-intel.mk | 6 +++--- projects/scripts/project-xilinx.mk | 7 +++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/projects/scripts/project-intel.mk b/projects/scripts/project-intel.mk index b6bf5336cac..6e353ed0493 100644 --- a/projects/scripts/project-intel.mk +++ b/projects/scripts/project-intel.mk @@ -102,12 +102,11 @@ M_DEPS += $(HDL_PROJECT_PATH)scripts/adi_tquest.tcl M_DEPS += $(HDL_PROJECT_PATH)scripts/adi_project_intel.tcl M_DEPS += $(HDL_PROJECT_PATH)../scripts/adi_env.tcl -M_DEPS += $(foreach dep,$(LIB_DEPS),$(HDL_LIBRARY_PATH)$(dep)/) +M_DEPS += $(foreach dep,$(LIB_DEPS),$(HDL_LIBRARY_PATH)$(dep)/.timestamp_intel) .PHONY: all lib clean clean-all all: $(PROJECT_NAME).sof -lib: TARGET:=intel lib: $(M_DEPS) clean: @@ -127,6 +126,7 @@ $(PROJECT_NAME).sof: $(M_DEPS) $(PROJECT_NAME)_quartus.log, \ $(HL)$(PROJECT_NAME)$(NC)) +$(HDL_LIBRARY_PATH)%/.timestamp_intel: TARGET:=intel FORCE: -$(HDL_LIBRARY_PATH)%/: FORCE +$(HDL_LIBRARY_PATH)%/.timestamp_intel: FORCE $(MAKE) -C $(dir $@) $(TARGET) || exit $$?; \ diff --git a/projects/scripts/project-xilinx.mk b/projects/scripts/project-xilinx.mk index 3508016e32c..738c02f24e3 100644 --- a/projects/scripts/project-xilinx.mk +++ b/projects/scripts/project-xilinx.mk @@ -74,13 +74,12 @@ M_DEPS += $(HDL_PROJECT_PATH)scripts/adi_project_xilinx.tcl M_DEPS += $(HDL_PROJECT_PATH)../scripts/adi_env.tcl M_DEPS += $(HDL_PROJECT_PATH)scripts/adi_board.tcl -M_DEPS += $(foreach dep,$(LIB_DEPS),$(HDL_LIBRARY_PATH)$(dep)/) +M_DEPS += $(foreach dep,$(LIB_DEPS),$(HDL_LIBRARY_PATH)$(dep)/component.xml) .PHONY: all lib clean clean-all all: $(PROJECT_NAME).sdk/system_top.xsa -lib: TARGET:=xilinx lib: $(M_DEPS) clean: @@ -114,8 +113,8 @@ $(PROJECT_NAME).sdk/system_top.xsa: $(M_DEPS) $(PROJECT_NAME)_vivado.log, \ $(HL)$(PROJECT_NAME)$(NC) project) -FORCE: -$(HDL_LIBRARY_PATH)%/: FORCE +$(HDL_LIBRARY_PATH)%/component.xml: TARGET:=xilinx +$(HDL_LIBRARY_PATH)%/component.xml: FORCE if [ -n "${REQUIRED_VIVADO_VERSION}" ]; then \ $(MAKE) -C $(dir $@) $(TARGET) REQUIRED_VIVADO_VERSION=${REQUIRED_VIVADO_VERSION} || exit $$?; \ else \ From 8ffc4ec8e71797da22f027d9ed6301811de911cc Mon Sep 17 00:00:00 2001 From: Jorge Marques Date: Mon, 13 Nov 2023 08:33:54 -0300 Subject: [PATCH 09/14] scripts: xilinx: revert deleted line I mistakenly deleted the FORCE line in the last commit. Signed-off-by: Jorge Marques --- projects/scripts/project-xilinx.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/scripts/project-xilinx.mk b/projects/scripts/project-xilinx.mk index 738c02f24e3..6ca679500ae 100644 --- a/projects/scripts/project-xilinx.mk +++ b/projects/scripts/project-xilinx.mk @@ -114,6 +114,7 @@ $(PROJECT_NAME).sdk/system_top.xsa: $(M_DEPS) $(HL)$(PROJECT_NAME)$(NC) project) $(HDL_LIBRARY_PATH)%/component.xml: TARGET:=xilinx +FORCE: $(HDL_LIBRARY_PATH)%/component.xml: FORCE if [ -n "${REQUIRED_VIVADO_VERSION}" ]; then \ $(MAKE) -C $(dir $@) $(TARGET) REQUIRED_VIVADO_VERSION=${REQUIRED_VIVADO_VERSION} || exit $$?; \ From 3614ee3a7e1aeddfe07f44bdbbb553f40a977143 Mon Sep 17 00:00:00 2001 From: Jorge Marques Date: Mon, 13 Nov 2023 15:39:50 -0300 Subject: [PATCH 10/14] scripts: add lock file, remove flock Wrap library.mk files around a lock file, avoiding a vivado call when other dependency already queue a vivado library call. The next calls will properly resolve the dependencies against component.xml timestamp and skip it. Signed-off-by: Jorge Marques --- library/scripts/library.mk | 9 +++++++-- projects/scripts/project-xilinx.mk | 5 +++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/library/scripts/library.mk b/library/scripts/library.mk index 3e15a713514..fc32e8a2ae6 100644 --- a/library/scripts/library.mk +++ b/library/scripts/library.mk @@ -59,7 +59,7 @@ clean: clean-all clean-all: $(call clean, \ - $(CLEAN_TARGET), \ + $(CLEAN_TARGET) .lock, \ $(HL)$(LIBRARY_NAME)$(NC) library) ifneq ($(INTEL_DEPS),) @@ -92,7 +92,7 @@ xilinx: component.xml component.xml: $(XILINX_DEPS) $(_XILINX_INTF_DEPS) $(_XILINX_LIB_DEPS) -rm -rf $(CLEAN_TARGET) $(call build, \ - flock component.xml -c "$(VIVADO) $(LIBRARY_NAME)_ip.tcl", \ + $(VIVADO) $(LIBRARY_NAME)_ip.tcl, \ $(LIBRARY_NAME)_ip.log, \ $(HL)$(LIBRARY_NAME)$(NC) library) @@ -100,7 +100,12 @@ $(_XILINX_INTF_DEPS): $(MAKE) -C $(dir $@) $(notdir $@) $(_XILINX_LIB_DEPS): + while [ -e $(dir $@).lock ]; do \ + sleep .5s ; \ + done ; \ + touch $(dir $@).lock $(MAKE) -C $(dir $@) xilinx + rm $(dir $@).lock 2> /dev/null || true %.xml: $(MAKE) -C $(dir $@) $(notdir $@) diff --git a/projects/scripts/project-xilinx.mk b/projects/scripts/project-xilinx.mk index 6ca679500ae..13727b122b3 100644 --- a/projects/scripts/project-xilinx.mk +++ b/projects/scripts/project-xilinx.mk @@ -116,8 +116,13 @@ $(PROJECT_NAME).sdk/system_top.xsa: $(M_DEPS) $(HDL_LIBRARY_PATH)%/component.xml: TARGET:=xilinx FORCE: $(HDL_LIBRARY_PATH)%/component.xml: FORCE + while [ -e $(dir $@).lock ]; do \ + sleep .5s ; \ + done ; \ + touch $(dir $@).lock if [ -n "${REQUIRED_VIVADO_VERSION}" ]; then \ $(MAKE) -C $(dir $@) $(TARGET) REQUIRED_VIVADO_VERSION=${REQUIRED_VIVADO_VERSION} || exit $$?; \ else \ $(MAKE) -C $(dir $@) $(TARGET) || exit $$?; \ fi; + rm $(dir $@).lock 2> /dev/null || true From 4712b9d7b5d9afe223d03b5e5866685421c339ed Mon Sep 17 00:00:00 2001 From: Jorge Marques Date: Mon, 13 Nov 2023 17:30:26 -0300 Subject: [PATCH 11/14] scripts: use flock in lock file component.xml cannot be used as lock file because generating the lock would create a new timestamp and library.mk would think the library is up-to-date. Signed-off-by: Jorge Marques --- library/scripts/library.mk | 7 +------ projects/scripts/project-xilinx.mk | 8 ++------ 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/library/scripts/library.mk b/library/scripts/library.mk index fc32e8a2ae6..b4028bfe574 100644 --- a/library/scripts/library.mk +++ b/library/scripts/library.mk @@ -100,12 +100,7 @@ $(_XILINX_INTF_DEPS): $(MAKE) -C $(dir $@) $(notdir $@) $(_XILINX_LIB_DEPS): - while [ -e $(dir $@).lock ]; do \ - sleep .5s ; \ - done ; \ - touch $(dir $@).lock - $(MAKE) -C $(dir $@) xilinx - rm $(dir $@).lock 2> /dev/null || true + flock $(dir $@).lock -c "$(MAKE) -C $(dir $@) xilinx" %.xml: $(MAKE) -C $(dir $@) $(notdir $@) diff --git a/projects/scripts/project-xilinx.mk b/projects/scripts/project-xilinx.mk index 13727b122b3..c55603e59fc 100644 --- a/projects/scripts/project-xilinx.mk +++ b/projects/scripts/project-xilinx.mk @@ -116,13 +116,9 @@ $(PROJECT_NAME).sdk/system_top.xsa: $(M_DEPS) $(HDL_LIBRARY_PATH)%/component.xml: TARGET:=xilinx FORCE: $(HDL_LIBRARY_PATH)%/component.xml: FORCE - while [ -e $(dir $@).lock ]; do \ - sleep .5s ; \ - done ; \ - touch $(dir $@).lock + flock $(dir $@).lock -c " \ if [ -n "${REQUIRED_VIVADO_VERSION}" ]; then \ $(MAKE) -C $(dir $@) $(TARGET) REQUIRED_VIVADO_VERSION=${REQUIRED_VIVADO_VERSION} || exit $$?; \ else \ $(MAKE) -C $(dir $@) $(TARGET) || exit $$?; \ - fi; - rm $(dir $@).lock 2> /dev/null || true + fi" From 196348052f3c5c1789c1b17ad5992ef68be00493 Mon Sep 17 00:00:00 2001 From: Jorge Marques Date: Mon, 4 Dec 2023 11:06:12 -0300 Subject: [PATCH 12/14] scripts: Fix flock error propagation Catch error from the target command, instead of flock exit code. Flock only exits with a error code for issues with the command itself, like a timed out lock, never from target the command. Signed-off-by: Jorge Marques --- library/scripts/library.mk | 2 +- projects/scripts/project-xilinx.mk | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/library/scripts/library.mk b/library/scripts/library.mk index b4028bfe574..ddfc29d5d39 100644 --- a/library/scripts/library.mk +++ b/library/scripts/library.mk @@ -100,7 +100,7 @@ $(_XILINX_INTF_DEPS): $(MAKE) -C $(dir $@) $(notdir $@) $(_XILINX_LIB_DEPS): - flock $(dir $@).lock -c "$(MAKE) -C $(dir $@) xilinx" + flock $(dir $@).lock -c "$(MAKE) -C $(dir $@) xilinx"; exit $$? %.xml: $(MAKE) -C $(dir $@) $(notdir $@) diff --git a/projects/scripts/project-xilinx.mk b/projects/scripts/project-xilinx.mk index c55603e59fc..befbdc23039 100644 --- a/projects/scripts/project-xilinx.mk +++ b/projects/scripts/project-xilinx.mk @@ -118,7 +118,7 @@ FORCE: $(HDL_LIBRARY_PATH)%/component.xml: FORCE flock $(dir $@).lock -c " \ if [ -n "${REQUIRED_VIVADO_VERSION}" ]; then \ - $(MAKE) -C $(dir $@) $(TARGET) REQUIRED_VIVADO_VERSION=${REQUIRED_VIVADO_VERSION} || exit $$?; \ + $(MAKE) -C $(dir $@) $(TARGET) REQUIRED_VIVADO_VERSION=${REQUIRED_VIVADO_VERSION}; \ else \ - $(MAKE) -C $(dir $@) $(TARGET) || exit $$?; \ - fi" + $(MAKE) -C $(dir $@) $(TARGET); \ + fi"; exit $$? From 9da21ecf09b3bcc04fdda59492b25fa3f2317cb2 Mon Sep 17 00:00:00 2001 From: Jorge Marques Date: Tue, 12 Dec 2023 11:45:45 -0300 Subject: [PATCH 13/14] scripts: Fixup, escape double quotes Signed-off-by: Jorge Marques --- projects/scripts/project-xilinx.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/scripts/project-xilinx.mk b/projects/scripts/project-xilinx.mk index befbdc23039..95e2c2340a5 100644 --- a/projects/scripts/project-xilinx.mk +++ b/projects/scripts/project-xilinx.mk @@ -117,7 +117,7 @@ $(HDL_LIBRARY_PATH)%/component.xml: TARGET:=xilinx FORCE: $(HDL_LIBRARY_PATH)%/component.xml: FORCE flock $(dir $@).lock -c " \ - if [ -n "${REQUIRED_VIVADO_VERSION}" ]; then \ + if [ -n \"${REQUIRED_VIVADO_VERSION}\" ]; then \ $(MAKE) -C $(dir $@) $(TARGET) REQUIRED_VIVADO_VERSION=${REQUIRED_VIVADO_VERSION}; \ else \ $(MAKE) -C $(dir $@) $(TARGET); \ From 7c6414936a8ab49bca2517aeb0f40c682e0f7b4f Mon Sep 17 00:00:00 2001 From: Jorge Marques Date: Thu, 14 Dec 2023 09:31:45 -0300 Subject: [PATCH 14/14] scripts: Use virtual targets for library.mk Fixup "make clean all" not executing second target since the dependencies were the same. Same approach as projects-toplevel.mk. Signed-off-by: Jorge Marques --- library/Makefile | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/library/Makefile b/library/Makefile index 8fa25a61f01..02af06029fc 100644 --- a/library/Makefile +++ b/library/Makefile @@ -10,18 +10,22 @@ include ../quiet.mk .PHONY: all lib clean clean-all all: lib -_LIBS := $(shell find . -mindepth 2 -name Makefile -exec dirname {} \; | sort) +_LIBS := $(dir $(shell find . -mindepth 2 -name Makefile | sort)) -FORCE: -$(_LIBS): FORCE - $(MAKE) -C $@ $(TARGET) +# Create virtual targets "$library/all", "$library/clean" +_LIBS_ALL := $(addsuffix all, $(_LIBS)) +_LIBS_CLEAN := $(addsuffix clean, $(_LIBS)) -clean: TARGET:=clean -clean: $(_LIBS) +$(_LIBS_ALL): + $(MAKE) -C $(@D) $(@F) + +$(_LIBS_CLEAN): + $(MAKE) -C $(@D) $(@F) + +clean: $(_LIBS_CLEAN) clean-all: clean -lib: TARGET:= -lib: $(_LIBS) +lib: $(_LIBS_ALL) #################################################################################### ####################################################################################