* harbour/make_gcc.mak
! added additional rules to fix time conditions in parallel compilation
* harbour/config/dos/dir.cf
* harbour/config/w32/dir.cf
* changed simple assignments to recursive ones
* harbour/config/dir.cf
+ added support for dependencies between build directories for
parallel execution. If compilation of dirX needs results of
dirY and dirZ compilation then it hsould be declared as:
dirX{dirY,dirZ}
% process directories defined in DIRS simultaneously when -j<N>
GNU make switch is used - it gives additional speed improvement
on multi CPU machines
* harbour/Makefile
* harbour/source/Makefile
* set directory dependencies for parallel compilation
The parallel compilation can be enabled by using -j<n> GNU make
switch on multiprocess platforms, f.e.:
./gnu_make.sh -j3
It should give some speed improvement even on single CPU machines.
These are results of clean Harbour compilation on my 3 phantom CPU
computer:
1. leaner compilation without -j<n> 6m29.895s
2. parallel compilation with -j5 but without
parallel directory processing 3m20.163s
3. parallel compilation with -j5 and with new
parallel directory processing 2m6.168s
77 lines
1.4 KiB
CFEngine3
77 lines
1.4 KiB
CFEngine3
#
|
|
# $Id$
|
|
#
|
|
|
|
ifneq ($(HB_ARCHITECTURE),)
|
|
ifneq ($(HB_COMPILER),)
|
|
|
|
include $(TOP)$(ROOT)config/global.cf
|
|
#include $(TOP)$(ROOT)config/$(HB_ARCHITECTURE)/dir.cf
|
|
|
|
ifeq ($(DIR_RULE),)
|
|
|
|
# NOTE: The empty line directly before 'endef' HAVE TO exist!
|
|
# It causes that every commands will be separated by LF
|
|
define dir_mk
|
|
$(MK) -C $(dir) $@
|
|
|
|
endef
|
|
|
|
DIRS_PURE = $(filter-out {%},$(subst {, {,$(DIRS)))
|
|
DIRS_DEP = $(filter-out $(DIRS_PURE),$(DIRS))
|
|
DIRS_MK = $(foreach d, $(DIRS_PURE), $(if $(wildcard $(d)/Makefile),$(d),))
|
|
DIR_RULE = $(foreach dir, $(DIRS_MK), $(dir_mk))
|
|
MULTI_DEPS = yes
|
|
|
|
else
|
|
|
|
DIRS := $(filter-out {%},$(subst {, {,$(DIRS)))
|
|
MULTI_DEPS = no
|
|
|
|
endif
|
|
|
|
all : first
|
|
|
|
ifneq ($(MULTI_DEPS),yes)
|
|
|
|
first clean install::
|
|
+$(DIR_RULE)
|
|
|
|
else
|
|
|
|
DIRS_CLEAN = $(foreach dir, $(DIRS_MK), $(dir).clean)
|
|
DIRS_INST = $(foreach dir, $(DIRS_MK), $(dir).inst)
|
|
|
|
first :: $(DIRS_MK)
|
|
install :: $(DIRS_INST)
|
|
clean :: $(DIRS_CLEAN)
|
|
|
|
comma=,
|
|
define dep_rule
|
|
$(subst $(comma),$(2) ,$(subst },$(2),$(subst {,$(2)::|,$(1))))
|
|
endef
|
|
|
|
$(foreach dep, $(DIRS_DEP), $(eval $(call dep_rule,$(dep),.clean)))
|
|
$(foreach dep, $(DIRS_DEP), $(eval $(call dep_rule,$(dep),.inst)))
|
|
$(foreach dep, $(DIRS_DEP), $(eval $(call dep_rule,$(dep),)))
|
|
|
|
$(DIRS_CLEAN) ::
|
|
+$(MK) -C $(@:.clean=) clean
|
|
|
|
$(DIRS_INST) ::
|
|
+$(MK) -C $(@:.inst=) install
|
|
|
|
$(DIRS_MK) ::
|
|
+$(MK) -C $(@)
|
|
|
|
endif
|
|
|
|
|
|
ifneq ($(HB_POSTINST),)
|
|
install::
|
|
+$(HB_POSTINST)
|
|
endif
|
|
|
|
endif
|
|
endif
|