[dpdk-dev] [PATCH] mk: parallelize make config
Ferruh Yigit
ferruh.yigit at intel.com
Sun Jan 22 02:50:34 CET 2017
make config dependency resolving was always running serial,
parallelize it for better performance.
$ time make T=x86_64-native-linuxapp-gcc config
real 0m12.633s
$ time make -j8 T=x86_64-native-linuxapp-gcc config
real 0m1.826s
Signed-off-by: Ferruh Yigit <ferruh.yigit at intel.com>
---
mk/internal/rte.depdirs-post.mk | 11 ++++++-----
mk/rte.sdkdepdirs.mk | 21 ++++++++++++---------
mk/rte.subdir.mk | 15 +++++++--------
3 files changed, 25 insertions(+), 22 deletions(-)
diff --git a/mk/internal/rte.depdirs-post.mk b/mk/internal/rte.depdirs-post.mk
index 102a369..eb73ad3 100644
--- a/mk/internal/rte.depdirs-post.mk
+++ b/mk/internal/rte.depdirs-post.mk
@@ -29,11 +29,12 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.PHONY: depdirs
-depdirs:
- @for d in $(DEPDIRS-y); do \
- $(RTE_SDK)/buildtools/depdirs-rule.sh $(S) $$d ; \
- done
+.PHONY: depdirs $(DEPDIRS-y)
+depdirs: $(DEPDIRS-y)
+ @echo ""
+
+$(DEPDIRS-y):
+ @$(RTE_SDK)/buildtools/depdirs-rule.sh $(S) $@
.PHONY: depgraph
depgraph:
diff --git a/mk/rte.sdkdepdirs.mk b/mk/rte.sdkdepdirs.mk
index bebaf2a..daf42eb 100644
--- a/mk/rte.sdkdepdirs.mk
+++ b/mk/rte.sdkdepdirs.mk
@@ -36,19 +36,22 @@ ifeq (,$(wildcard $(RTE_OUTPUT)/Makefile))
$(error "need a make config first")
endif
+DEPDIRS = $(addsuffix /.depdirs, $(addprefix $(BUILDDIR)/,$(ROOTDIRS-y)))
+
# use a "for" in a shell to process dependencies: we don't want this
# task to be run in parallel.
.PHONY: depdirs
depdirs: $(RTE_OUTPUT)/.depdirs
-$(RTE_OUTPUT)/.depdirs: $(RTE_OUTPUT)/.config
- @rm -f $(RTE_OUTPUT)/.depdirs ; \
- for d in $(ROOTDIRS-y); do \
- if [ -f $(RTE_SRCDIR)/$$d/Makefile ]; then \
- [ -d $(BUILDDIR)/$$d ] || mkdir -p $(BUILDDIR)/$$d ; \
- $(MAKE) S=$$d -f $(RTE_SRCDIR)/$$d/Makefile depdirs \
- >> $(RTE_OUTPUT)/.depdirs ; \
- fi ; \
- done
+$(RTE_OUTPUT)/.depdirs: $(DEPDIRS)
+ @rm -f $@
+ @for f in $(DEPDIRS); do cat $$f >> $@; done
+ @sort -u -o $@ $@
+
+$(DEPDIRS): $(RTE_OUTPUT)/.config
+ @f=$(lastword $(subst /, ,$(dir $@))); \
+ [ -d $(BUILDDIR)/$$f ] || mkdir -p $(BUILDDIR)/$$f; \
+ rm -f $@; \
+ $(MAKE) S=$$f -f $(RTE_SRCDIR)/$$f/Makefile depdirs >> $@
.PHONY: depgraph
depgraph:
diff --git a/mk/rte.subdir.mk b/mk/rte.subdir.mk
index 256e64e..3bb3019 100644
--- a/mk/rte.subdir.mk
+++ b/mk/rte.subdir.mk
@@ -76,7 +76,7 @@ clean: _postclean
# include .depdirs and define rules to order priorities between build
# of directories.
#
-include $(RTE_OUTPUT)/.depdirs
+-include $(RTE_OUTPUT)/.depdirs
define depdirs_rule
$(1): $(sort $(patsubst $(S)/%,%,$(LOCAL_DEPDIRS-$(S)/$(1))))
@@ -84,16 +84,15 @@ endef
$(foreach d,$(DIRS-y),$(eval $(call depdirs_rule,$(d))))
+DEPDIRS = $(wildcard $(addprefix $(S)/,$(DIRS-y)))
# use a "for" in a shell to process dependencies: we don't want this
# task to be run in parallel.
-.PHONY: depdirs
-depdirs:
- @for d in $(DIRS-y); do \
- if [ -f $(SRCDIR)/$$d/Makefile ]; then \
- $(MAKE) S=$S/$$d -f $(SRCDIR)/$$d/Makefile depdirs ; \
- fi ; \
- done
+.PHONY: depdirs $(DEPDIRS)
+depdirs: $(DEPDIRS)
+
+$(DEPDIRS):
+ @$(MAKE) S=$@ -f $(RTE_SRCDIR)/$@/Makefile depdirs
.PHONY: depgraph
depgraph:
--
2.9.3
More information about the dev
mailing list