Add support for top-level parallel make
v10 cover Add support for top-level parallel make
Hi all,
this is a patch set for adding support for top-level parallel make in buildroot, the common problem scattered in buildroot's top-level makefiles is that in the rules it relies on the order of evaluation of the prerequisites, to be able to use top-level parallel make instead of reling on the left to right ordering of evaluation of the prerequisites we must add an explicit rule to describe the dependencies.
With this patch set the top-level parallel make seems to works fine, example:
make clean make BR2_JLEVEL= -j$((`getconf _NPROCESSORS_ONLN` + 1))
Before to try it remeber to remove the ".NOTPARALLEL" line.
On my quad core system the building time for qemu_x86_defconfig is 14m versus 11m and with ccache enabled 7m vs 5m.
I've tested the qemu_x86_defconfig, uclibc/eglibc/glibc, ccache off/on, sstrip off/on.
I've finished to work on this patch set, Arnout has acked some patches so i hope that this patch set is going to be merged soon.
Thank you for all reviews and in particular Arnout.
Best regards
Fabio Porcedda
v10:
- Added Acked-by: Arnout Vandecappelle on the first two patches
- Improved descption and text of the last patch
- Rebased over master
v9:
- Added Acked-by: Arnout Vandecappelle on some patches.
- Changed the patches contents and descriptions following advices of Arnout
- 1th patch: fixed to support ccache & sstrip
- 2th patch: added pkg-cmake.mk
- 2th patch: splitted ifeq
- 3th patch: improved description
- 3th patch: does not use %_BUILD_DEPENDENCIES anymore
- 3th patch: added a comment about "|"
- 4th patch: added a comment
- 5th patch: added a comment
- 6th patch:
- 2th patch: fixed a comment
- 8th patch: now it change only the comment
v8:
- rebased over master
- added patche for for base dependency
- added patche for for glibc package
- added patche for for uclibc package
- removed patch already merged
- changed some descriptions
- modified the patch for toolchain dependency to prevent circular dependency
v7:
- add the latest patch
- add to the first patch the <pkgname>_TOOLCHAIN variable
- improve the fifth patch
v6:
- added the fifth patch
- updated the fourth patch adding the install targets
- updated the second patch to remove TARGETS_ALL
v5:
- added the fourth patch
- fixed some typos
- rewrited the second patch to use only $$($(2)_TARGET_*) in the rules
- add support for top-level parallel make for the glibc package
v4:
- rebased over master
- add Acked-by: Thomas Petazzoni on the third patch
- changed the orderd of the patches
v3:
- add back the patch "package: add toolchain dependency to inner-generic-package" because now is working fine.
- add Acked-by: Arnout Vandecappelle to the third patch.
- reworked the second patch following Arnout suggestions.
v2:
- remove patch "package: add toolchain dependency to inner-generic-package" because was not working fine against recent toolchain changes.
Fabio Porcedda (8):
package: add base dependency to every package
package: add toolchain dependency to every target package
package: add support for top-level parallel make
uclibc: add support for top-level parallel make
glibc: add support for top-level parallel make
Makefile: add support for top-level parallel make
package: enable jobserver for recursive make
Makefile: update comment about top-level parallel Makefile
Makefile | 34 ++++++----- fs/common.mk | 4 +- package/glibc/glibc.mk | 12 +++- package/linux-headers/linux-headers.mk | 3 + package/pkg-autotools.mk | 3 +- package/pkg-cmake.mk | 2 +- package/pkg-generic.mk | 67 ++++++++++++++-------- package/uclibc/uclibc.mk | 12 +++- .../toolchain-buildroot/toolchain-buildroot.mk | 2 + toolchain/toolchain-external/toolchain-external.mk | 2 + toolchain/toolchain/toolchain.mk | 5 +- 11 files changed, 97 insertions(+), 49 deletions(-)
Signature · 1 line
1.8.5
PATCH v10 1/8 package: add base dependency to every package
Move "dependencies" "dirs" "prepare" dependencies from "toolchain" to every package.
This way we can build correctly every package right after the clean stage.
As example with this commit we can build successfully the glibc right after the clean stage:
make clean glibc
This is also a step forward supporting top-level parallel make.
--- package/pkg-generic.mk | 5 +++++ toolchain/toolchain/toolchain.mk | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-)
package/pkg-generic.mk +5 -0
@@ -426,6 +426,11 @@ $(1)-install-host: $(1)-build $$($(2)_TARGET_INSTALL_HOST) $(1)-build: $(1)-configure \ $$($(2)_TARGET_BUILD) +$$($(2)_TARGET_SOURCE) $$($(2)_TARGET_RSYNC): | dirs prepare +ifeq ($(filter $(1),$(DEPENDENCIES_HOST_PREREQ)),) +$$($(2)_TARGET_SOURCE) $$($(2)_TARGET_RSYNC): | dependencies +endif + ifeq ($$($(2)_OVERRIDE_SRCDIR),) # In the normal case (no package override), the sequence of steps is # source, by downloading
toolchain/toolchain/toolchain.mk +1 -2
@@ -14,5 +14,4 @@ endif $(eval $(generic-package)) -toolchain-source: prepare dirs dependencies $(HOST_DIR)/usr/share/buildroot/toolchainfile.cmake - +toolchain: $(HOST_DIR)/usr/share/buildroot/toolchainfile.cmake
Signature · 1 line
1.8.5
PATCH v10 1/8 package: add base dependency to every package
Quoted 8 lines · Fabio Porcedda
Move "dependencies" "dirs" "prepare" dependencies from "toolchain" to every package.
This way we can build correctly every package right after the clean stage.
As example with this commit we can build successfully the glibc right after the clean stage:
make clean glibc
Quoted 4 lines
This is also a step forward supporting top-level parallel make.
Signed-off-by Fabio Porcedda<[email protected]>
Peter,
This one is fixing a problem reported by a user and has already gone
through 10 iterations. Can it be committed?
Regards,
Arnout
Signature · 6 lines
Arnout Vandecappelle arnout at mind be Senior Embedded Software Architect +32-16-286500 Essensium/Mind http://www.mind.be G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle GPG fingerprint: 7CB5 E4CC 6C2E EFD4 6E3D A754 F963 ECAB 2450 2F1F
PATCH v10 1/8 package: add base dependency to every package
Quoted 12 lines · Arnout Vandecappelle
Quoted 11 lines · Fabio Porcedda
Move "dependencies" "dirs" "prepare" dependencies from "toolchain" to every package.
This way we can build correctly every package right after the clean stage.
As example with this commit we can build successfully the glibc right after the clean stage:
make clean glibcThis is also a step forward supporting top-level parallel make.
Quoted 8 lines
Quoted 2 lines
Signed-off-by Fabio Porcedda<[email protected]>Peter,
This one is fixing a problem reported by a user and has already gone
through 10 iterations. Can it be committed?
I've sent a rebased version, so now are 11 iterations...
Best regards
Signature · 1 line
Fabio Porcedda
PATCH v10 2/8 package: add toolchain dependency to every target package
In reply to Fabio PorceddaThis commit makes the dependency from the target toolchain explicit. This way we can buid from command line a package that use innger-generic-package right after the configuration phase, example:
make clean <package-name>
Also remove TARGETS_ALL because the only purpose was to add toolchain dependency so it's superseded by this commit.
To prevent circular dependency add the new variable <pkgname>_ADD_TOOLCHAIN_DEPENDENCY to avoid adding the toolchain dependency for toolchain packages.
This is also a step forward supporting top-level parallel make.
--- Makefile | 8 ++------ package/glibc/glibc.mk | 3 +++ package/linux-headers/linux-headers.mk | 3 +++ package/pkg-autotools.mk | 3 ++- package/pkg-cmake.mk | 2 +- package/pkg-generic.mk | 14 ++++++++++++-- package/uclibc/uclibc.mk | 3 +++ toolchain/toolchain-buildroot/toolchain-buildroot.mk | 2 ++ toolchain/toolchain-external/toolchain-external.mk | 2 ++ toolchain/toolchain/toolchain.mk | 2 ++ 10 files changed, 32 insertions(+), 10 deletions(-)
Makefile +2 -6
@@ -388,7 +388,6 @@ TARGETS+=target-post-image TARGETS_SOURCE:=$(patsubst %,%-source,$(TARGETS) $(BASE_TARGETS)) TARGETS_DIRCLEAN:=$(patsubst %,%-dirclean,$(TARGETS)) -TARGETS_ALL:=$(patsubst %,__real_tgt_%,$(TARGETS)) # host-* dependencies have to be handled specially, as those aren't # visible in Kconfig and hence not added to a variable like TARGETS.
@@ -411,9 +410,6 @@ HOST_SOURCE += $(addsuffix -source,$(sort $(TARGETS_HOST_DEPS) $(HOST_DEPS))) TARGETS_LEGAL_INFO:=$(patsubst %,%-legal-info,\ $(TARGETS) $(BASE_TARGETS) $(TARGETS_HOST_DEPS) $(HOST_DEPS)))) -# all targets depend on the crosscompiler and it's prerequisites -$(TARGETS_ALL): __real_tgt_%: $(BASE_TARGETS) % - dirs: $(BUILD_DIR) $(STAGING_DIR) $(TARGET_DIR) \ $(HOST_DIR) $(BINARIES_DIR) $(STAMP_DIR)
@@ -422,11 +418,11 @@ $(BUILD_DIR)/buildroot-config/auto.conf: $(BUILDROOT_CONFIG) prepare: $(BUILD_DIR)/buildroot-config/auto.conf -world: $(BASE_TARGETS) $(TARGETS_ALL) +world: $(TARGETS) .PHONY: all world toolchain dirs clean distclean source outputmakefile \ legal-info legal-info-prepare legal-info-clean printvars \ - $(BASE_TARGETS) $(TARGETS) $(TARGETS_ALL) \ + $(BASE_TARGETS) $(TARGETS) \ $(TARGETS_DIRCLEAN) $(TARGETS_SOURCE) $(TARGETS_LEGAL_INFO) \ $(BUILD_DIR) $(STAGING_DIR) $(TARGET_DIR) \ $(HOST_DIR) $(BINARIES_DIR) $(STAMP_DIR)
package/glibc/glibc.mk +3 -0
@@ -31,6 +31,9 @@ endif GLIBC_LICENSE = GPLv2+ (programs), LGPLv2.1+, BSD-3c, MIT (library) GLIBC_LICENSE_FILES = $(addprefix $(GLIBC_SRC_SUBDIR)/,COPYING COPYING.LIB LICENSES) +# glibc is part of the toolchain so disable the toolchain dependency +GLIBC_ADD_TOOLCHAIN_DEPENDENCY = NO + # Before (e)glibc is configured, we must have the first stage # cross-compiler and the kernel headers GLIBC_DEPENDENCIES = host-gcc-initial linux-headers host-gawk
package/linux-headers/linux-headers.mk +3 -0
@@ -17,6 +17,9 @@ LINUX_HEADERS_SOURCE = linux-$(LINUX_HEADERS_VERSION).tar.xz LINUX_HEADERS_INSTALL_STAGING = YES +# linux-headers is part of the toolchain so disable the toolchain dependency +LINUX_HEADERS_ADD_TOOLCHAIN_DEPENDENCY = NO + define LINUX_HEADERS_INSTALL_STAGING_CMDS (cd $(@D); \ $(TARGET_MAKE_ENV) $(MAKE) \
package/pkg-autotools.mk +2 -1
@@ -206,7 +206,8 @@ endef # This must be repeated from inner-generic-package, otherwise we get an empty # _DEPENDENCIES if _AUTORECONF is YES. Also filter the result of _AUTORECONF # away from the non-host rule -$(2)_DEPENDENCIES ?= $(filter-out host-automake host-autoconf host-libtool $(1),\ +$(2)_DEPENDENCIES ?= $(filter-out host-automake host-autoconf host-libtool \ + host-toolchain $(1),\ $(patsubst host-host-%,host-%,$(addprefix host-,$($(3)_DEPENDENCIES))))
package/pkg-cmake.mk +1 -1
@@ -88,7 +88,7 @@ endif # This must be repeated from inner-generic-package, otherwise we only get # host-cmake in _DEPENDENCIES because of the following line -$(2)_DEPENDENCIES ?= $(filter-out $(1),$(patsubst host-host-%,host-%,$(addprefix host-,$($(3)_DEPENDENCIES)))) +$(2)_DEPENDENCIES ?= $(filter-out host-toolchain $(1),$(patsubst host-host-%,host-%,$(addprefix host-,$($(3)_DEPENDENCIES)))) $(2)_DEPENDENCIES += host-cmake
package/pkg-generic.mk +12 -2
@@ -349,8 +349,18 @@ endif $(2)_REDISTRIBUTE ?= YES - -$(2)_DEPENDENCIES ?= $(filter-out $(1),$(patsubst host-host-%,host-%,$(addprefix host-,$($(3)_DEPENDENCIES)))) +# When a target package is a toolchain dependency set this variable to +# 'NO' so the 'toolchain' dependency is not added to prevent a circular +# dependency +$(2)_ADD_TOOLCHAIN_DEPENDENCY ?= YES + +$(2)_DEPENDENCIES ?= $(filter-out host-toolchain $(1),\ + $(patsubst host-host-%,host-%,$(addprefix host-,$($(3)_DEPENDENCIES)))) +ifeq ($(5),target) +ifeq ($$($(2)_ADD_TOOLCHAIN_DEPENDENCY),YES) +$(2)_DEPENDENCIES += toolchain +endif +endif $(2)_INSTALL_STAGING ?= NO $(2)_INSTALL_IMAGES ?= NO
package/uclibc/uclibc.mk +3 -0
@@ -19,6 +19,9 @@ endif UCLIBC_INSTALL_STAGING = YES +# uclibc is part of the toolchain so disable the toolchain dependency +UCLIBC_ADD_TOOLCHAIN_DEPENDENCY = NO + # Before uClibc is configured, we must have the first stage # cross-compiler and the kernel headers UCLIBC_DEPENDENCIES = host-gcc-initial linux-headers
toolchain/toolchain-buildroot/toolchain-buildroot.mk +2 -0
@@ -14,4 +14,6 @@ BUILDROOT_LIBC = $(call qstrip,$(BR2_TOOLCHAIN_BUILDROOT_LIBC)) TOOLCHAIN_BUILDROOT_DEPENDENCIES = host-gcc-final +TOOLCHAIN_BUILDROOT_ADD_TOOLCHAIN_DEPENDENCY = NO + $(eval $(generic-package))
toolchain/toolchain-external/toolchain-external.mk +2 -0
@@ -362,6 +362,8 @@ TOOLCHAIN_EXTERNAL_SITE = TOOLCHAIN_EXTERNAL_SOURCE = endif +TOOLCHAIN_EXTERNAL_ADD_TOOLCHAIN_DEPENDENCY = NO + TOOLCHAIN_EXTERNAL_INSTALL_STAGING = YES ifeq ($(BR2_TOOLCHAIN_EXTERNAL_BLACKFIN_UCLINUX_2012R1)$(BR2_TOOLCHAIN_EXTERNAL_BLACKFIN_UCLINUX_2012R2),y)
toolchain/toolchain/toolchain.mk +2 -0
@@ -12,6 +12,8 @@ else ifeq ($(BR2_TOOLCHAIN_EXTERNAL),y) TOOLCHAIN_DEPENDENCIES += toolchain-external endif +TOOLCHAIN_ADD_TOOLCHAIN_DEPENDENCY = NO + $(eval $(generic-package)) toolchain: $(HOST_DIR)/usr/share/buildroot/toolchainfile.cmake
Signature · 1 line
1.8.5
PATCH v10 3/8 package: add support for top-level parallel make
In reply to Fabio PorceddaTo be able to use top-level parallel make we must not depend in a rule on the order of evaluation of the prerequisites, so instead of relying on the left to right ordering of evaluation of the prerequisites add an explicit rule to describe the dependencies.
We cannot use the pattern rules because they must have the same dependency for every package, but we need to change the dependencies depending on $(2)_OVERRIDE_SRCDIR variable value, so we must use a more flexible way like $(2)_TARGET_% variables.
So add explicit dependencies for the following stamp files:
$(2)_TARGET_EXTRACT
$(2)_TARGET_PATCH
$(2)_TARGET_CONFIGURE
$(2)_TARGET_BUILD
$(2)_TARGET_INSTALL_STAGING $(2)_TARGET_INSTALL_TARGET $(2)_TARGET_INSTALL_IMAGES $(2)_TARGET_INSTALL_HOST
--- package/glibc/glibc.mk | 6 +++--- package/pkg-generic.mk | 40 +++++++++++++++++++++++----------------- package/uclibc/uclibc.mk | 6 +++--- 3 files changed, 29 insertions(+), 23 deletions(-)
package/glibc/glibc.mk +3 -3
@@ -38,9 +38,6 @@ GLIBC_ADD_TOOLCHAIN_DEPENDENCY = NO # cross-compiler and the kernel headers GLIBC_DEPENDENCIES = host-gcc-initial linux-headers host-gawk -# Before (e)glibc is built, we must have the second stage cross-compiler -glibc-build: host-gcc-intermediate - GLIBC_SUBDIR = build GLIBC_INSTALL_STAGING = YES
@@ -142,3 +139,6 @@ define GLIBC_INSTALL_TARGET_CMDS endef $(eval $(autotools-package)) + +# Before (e)glibc is built, we must have the second stage cross-compiler +$(GLIBC_TARGET_BUILD): | host-gcc-intermediate
package/pkg-generic.mk +23 -17
@@ -411,30 +411,37 @@ $(1)-install: $(1)-install-staging $(1)-install-target $(1)-install-images endif ifeq ($$($(2)_INSTALL_TARGET),YES) -$(1)-install-target: $(1)-build \ - $$($(2)_TARGET_INSTALL_TARGET) +$(1)-install-target: $$($(2)_TARGET_INSTALL_TARGET) else $(1)-install-target: endif ifeq ($$($(2)_INSTALL_STAGING),YES) -$(1)-install-staging: $(1)-build \ - $$($(2)_TARGET_INSTALL_STAGING) +$(1)-install-staging: $$($(2)_TARGET_INSTALL_STAGING) else $(1)-install-staging: endif ifeq ($$($(2)_INSTALL_IMAGES),YES) -$(1)-install-images: $(1)-build \ - $$($(2)_TARGET_INSTALL_IMAGES) +$(1)-install-images: $$($(2)_TARGET_INSTALL_IMAGES) else $(1)-install-images: endif -$(1)-install-host: $(1)-build $$($(2)_TARGET_INSTALL_HOST) +$(1)-install-host: $$($(2)_TARGET_INSTALL_HOST) -$(1)-build: $(1)-configure \ - $$($(2)_TARGET_BUILD) +$$($(2)_TARGET_INSTALL_TARGET) $$($(2)_TARGET_INSTALL_STAGING) \ +$$($(2)_TARGET_INSTALL_IMAGES) $$($(2)_TARGET_INSTALL_HOST): \ + $$($(2)_TARGET_BUILD) + +$(1)-build: $$($(2)_TARGET_BUILD) +$$($(2)_TARGET_BUILD): $$($(2)_TARGET_CONFIGURE) + +# The symbol "|" specify a order-only-prerequisite, this is needed for +# phony requisites to avoid rebuilding every time the target. + +$(1)-configure: $$($(2)_TARGET_CONFIGURE) +$$($(2)_TARGET_CONFIGURE): | $$($(2)_DEPENDENCIES) $$($(2)_TARGET_SOURCE) $$($(2)_TARGET_RSYNC): | dirs prepare ifeq ($(filter $(1),$(DEPENDENCIES_HOST_PREREQ)),)
@@ -448,13 +455,13 @@ ifeq ($$($(2)_OVERRIDE_SRCDIR),) # extract # patch # configure -$(1)-configure: $(1)-patch $(1)-depends \ - $$($(2)_TARGET_CONFIGURE) +$$($(2)_TARGET_CONFIGURE): $$($(2)_TARGET_PATCH) -$(1)-patch: $(1)-extract $$($(2)_TARGET_PATCH) +$(1)-patch: $$($(2)_TARGET_PATCH) +$$($(2)_TARGET_PATCH): $$($(2)_TARGET_EXTRACT) -$(1)-extract: $(1)-source \ - $$($(2)_TARGET_EXTRACT) +$(1)-extract: $$($(2)_TARGET_EXTRACT) +$$($(2)_TARGET_EXTRACT): $$($(2)_TARGET_SOURCE) $(1)-depends: $$($(2)_DEPENDENCIES)
@@ -464,10 +471,9 @@ else # source, by rsyncing # depends # configure -$(1)-configure: $(1)-depends \ - $$($(2)_TARGET_CONFIGURE) +$$($(2)_TARGET_CONFIGURE): $$($(2)_TARGET_RSYNC) -$(1)-depends: $(1)-rsync $$($(2)_DEPENDENCIES) +$(1)-depends: $$($(2)_DEPENDENCIES) $(1)-patch: $(1)-rsync $(1)-extract: $(1)-rsync
package/uclibc/uclibc.mk +3 -3
@@ -26,9 +26,6 @@ UCLIBC_ADD_TOOLCHAIN_DEPENDENCY = NO # cross-compiler and the kernel headers UCLIBC_DEPENDENCIES = host-gcc-initial linux-headers -# Before uClibc is built, we must have the second stage cross-compiler -uclibc-build: host-gcc-intermediate - # specifying UCLIBC_CONFIG_FILE on the command-line overrides the .config # setting. ifndef UCLIBC_CONFIG_FILE
@@ -551,3 +548,6 @@ uclibc-menuconfig: dirs uclibc-patch rm -f $(UCLIBC_DIR)/.stamp_{configured,built,target_installed,staging_installed} $(eval $(generic-package)) + +# Before uClibc is built, we must have the second stage cross-compiler +$(UCLIBC_TARGET_BUILD): | host-gcc-intermediate
Signature · 1 line
1.8.5
PATCH v10 4/8 uclibc: add support for top-level parallel make
In reply to Fabio PorceddaTo be able to use top-level parallel make we must not depend in a rule on the order of evaluation of the prerequisites, so instead of relyng on the left to right ordering of evaluation of the prerequisites add an explicit rule to describe the dependencies.
The uclibc-install-target depends on uclibc-install-staging so add a rule for it.
--- package/uclibc/uclibc.mk | 3 +++ 1 file changed, 3 insertions(+)
package/uclibc/uclibc.mk +3 -0
@@ -551,3 +551,6 @@ $(eval $(generic-package)) # Before uClibc is built, we must have the second stage cross-compiler $(UCLIBC_TARGET_BUILD): | host-gcc-intermediate + +# The uclibc-install-target use files from uclibc-install-staging +$(UCLIBC_TARGET_INSTALL_TARGET): $(UCLIBC_TARGET_INSTALL_STAGING)
Signature · 1 line
1.8.5
PATCH v10 5/8 glibc: add support for top-level parallel make
In reply to Fabio PorceddaTo be able to use top-level parallel make we must not depend in a rule on the order of evaluation of the prerequisites, so instead of relyng on the left to right ordering of evaluation of the prerequisites add an explicit rule to describe the dependencies.
The glibc-install-target depends on glibc-install-staging so add a rule for it.
--- package/glibc/glibc.mk | 3 +++ 1 file changed, 3 insertions(+)
package/glibc/glibc.mk +3 -0
@@ -142,3 +142,6 @@ $(eval $(autotools-package)) # Before (e)glibc is built, we must have the second stage cross-compiler $(GLIBC_TARGET_BUILD): | host-gcc-intermediate + +# The glic-install-target use files from glibc-install-staging +$(GLIBC_TARGET_INSTALL_TARGET): $(GLIBC_TARGET_INSTALL_STAGING)
Signature · 1 line
1.8.5
PATCH v10 6/8 Makefile: add support for top-level parallel make
In reply to Fabio PorceddaTo be able to use top-level parallel make we must not depend in a rule on the order of evaluation of the prerequisites, so instead of relyng on the left to right ordering of evaluation of the prerequisites add an explicit rule to describe the dependencies.
Add explicit rules to describe the following dependency chain:
$(TARGETS) -> target-finalize -> rootfs-* -> target-post-image
--- Makefile | 15 ++++++--------- fs/common.mk | 4 ++-- 2 files changed, 8 insertions(+), 11 deletions(-)
Makefile +6 -9
@@ -366,8 +366,6 @@ include system/system.mk include $(BR2_EXTERNAL)/external.mk -TARGETS+=target-finalize - ifeq ($(BR2_ENABLE_LOCALE_PURGE),y) TARGETS+=target-purgelocales endif
@@ -384,8 +382,6 @@ endif include fs/common.mk -TARGETS+=target-post-image - TARGETS_SOURCE:=$(patsubst %,%-source,$(TARGETS) $(BASE_TARGETS)) TARGETS_DIRCLEAN:=$(patsubst %,%-dirclean,$(TARGETS))
@@ -418,11 +414,12 @@ $(BUILD_DIR)/buildroot-config/auto.conf: $(BUILDROOT_CONFIG) prepare: $(BUILD_DIR)/buildroot-config/auto.conf -world: $(TARGETS) +world: target-post-image .PHONY: all world toolchain dirs clean distclean source outputmakefile \ legal-info legal-info-prepare legal-info-clean printvars \ - $(BASE_TARGETS) $(TARGETS) \ + target-finalize target-post-image \ + $(BASE_TARGETS) $(TARGETS) $(TARGETS_ROOTFS) \ $(TARGETS_DIRCLEAN) $(TARGETS_SOURCE) $(TARGETS_LEGAL_INFO) \ $(BUILD_DIR) $(STAGING_DIR) $(TARGET_DIR) \ $(HOST_DIR) $(BINARIES_DIR) $(STAMP_DIR)
@@ -482,7 +479,7 @@ endif STRIP_FIND_CMD += -type f -perm /111 STRIP_FIND_CMD += -not \( $(call findfileclauses,libpthread*.so* $(call qstrip,$(BR2_STRIP_EXCLUDE_FILES))) \) -print -target-finalize: +target-finalize: $(TARGETS) rm -rf $(TARGET_DIR)/usr/include $(TARGET_DIR)/usr/share/aclocal \ $(TARGET_DIR)/usr/lib/pkgconfig $(TARGET_DIR)/usr/share/pkgconfig \ $(TARGET_DIR)/usr/lib/cmake $(TARGET_DIR)/usr/share/cmake
@@ -588,7 +585,7 @@ target-generatelocales: host-localedef done endif -target-post-image: +target-post-image: target-finalize $(TARGETS_ROOTFS) @$(foreach s, $(call qstrip,$(BR2_ROOTFS_POST_IMAGE_SCRIPT)), \ $(call MESSAGE,"Executing post-image script $(s)"); \ $(USER_HOOKS_EXTRA_ENV) $(s) $(BINARIES_DIR) $(call qstrip,$(BR2_ROOTFS_POST_SCRIPT_ARGS))$(sep))
@@ -625,7 +622,7 @@ legal-info: dirs legal-info-clean legal-info-prepare $(TARGETS_LEGAL_INFO) \ @rm -f $(LEGAL_WARNINGS) show-targets: - @echo $(TARGETS) + @echo $(TARGETS) $(TARGETS_ROOTFS) else # ifeq ($(BR2_HAVE_DOT_CONFIG),y)
fs/common.mk +2 -2
@@ -63,7 +63,7 @@ ROOTFS_$(2)_COMPRESS_EXT = .xz ROOTFS_$(2)_COMPRESS_CMD = $$(XZ) -9 -C crc32 -c endif -$$(BINARIES_DIR)/rootfs.$(1): $$(ROOTFS_$(2)_DEPENDENCIES) +$$(BINARIES_DIR)/rootfs.$(1): target-finalize $$(ROOTFS_$(2)_DEPENDENCIES) @$$(call MESSAGE,"Generating root filesystem image rootfs.$(1)") $$(foreach hook,$$(ROOTFS_$(2)_PRE_GEN_HOOKS),$$(call $$(hook))$$(sep)) rm -f $$(FAKEROOT_SCRIPT)
@@ -94,7 +94,7 @@ rootfs-$(1)-show-depends: rootfs-$(1): $$(BINARIES_DIR)/rootfs.$(1) $$(ROOTFS_$(2)_POST_TARGETS) ifeq ($$(BR2_TARGET_ROOTFS_$(2)),y) -TARGETS += rootfs-$(1) +TARGETS_ROOTFS += rootfs-$(1) endif endef
Signature · 1 line
1.8.5
PATCH v10 7/8 package: enable jobserver for recursive make
In reply to Fabio PorceddaAdd '+' prefix to the $($(PKG)_BUILD_CMDS) and $($(PKG)_INSTALL*_CMDS) commands to enable jobserver for the sub-make.
Without the '+' prefix GNU make does not detect the sub-make so it disable the jobserver for the sub-make.
From GNU make documentation:
Using the MAKE variable has the same effect as using a ?+? character at the beginning of the recipe line. This special feature is only enabled if the MAKE variable appears directly in the recipe: it does not apply if the MAKE variable is referenced through expansion of another variable. In the latter case you must use the ?+? token to get these special effects.
--- package/pkg-generic.mk | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
package/pkg-generic.mk +5 -5
@@ -170,7 +170,7 @@ $(BUILD_DIR)/%/.stamp_configured: $(BUILD_DIR)/%/.stamp_built:: @$(call step_start,build) @$(call MESSAGE,"Building") - $($(PKG)_BUILD_CMDS) + +$($(PKG)_BUILD_CMDS) $(foreach hook,$($(PKG)_POST_BUILD_HOOKS),$(call $(hook))$(sep)) $(Q)touch $@ @$(call step_end,build)
@@ -179,7 +179,7 @@ $(BUILD_DIR)/%/.stamp_built:: $(BUILD_DIR)/%/.stamp_host_installed: @$(call step_start,install-host) @$(call MESSAGE,"Installing to host directory") - $($(PKG)_INSTALL_CMDS) + +$($(PKG)_INSTALL_CMDS) $(foreach hook,$($(PKG)_POST_INSTALL_HOOKS),$(call $(hook))$(sep)) $(Q)touch $@ @$(call step_end,install-host)
@@ -188,7 +188,7 @@ $(BUILD_DIR)/%/.stamp_host_installed: $(BUILD_DIR)/%/.stamp_staging_installed: @$(call step_start,install-staging) @$(call MESSAGE,"Installing to staging directory") - $($(PKG)_INSTALL_STAGING_CMDS) + +$($(PKG)_INSTALL_STAGING_CMDS) $(foreach hook,$($(PKG)_POST_INSTALL_STAGING_HOOKS),$(call $(hook))$(sep)) $(Q)if test -n "$($(PKG)_CONFIG_SCRIPTS)" ; then \ $(call MESSAGE,"Fixing package configuration files") ;\
@@ -204,7 +204,7 @@ $(BUILD_DIR)/%/.stamp_staging_installed: $(BUILD_DIR)/%/.stamp_images_installed: @$(call step_start,install-image) @$(call MESSAGE,"Installing to images directory") - $($(PKG)_INSTALL_IMAGES_CMDS) + +$($(PKG)_INSTALL_IMAGES_CMDS) $(foreach hook,$($(PKG)_POST_INSTALL_IMAGES_HOOKS),$(call $(hook))$(sep)) $(Q)touch $@ @$(call step_end,install-image)
@@ -217,7 +217,7 @@ $(BUILD_DIR)/%/.stamp_target_installed: $($(PKG)_INSTALL_INIT_SYSTEMD)) $(if $(BR2_INIT_SYSV)$(BR2_INIT_BUSYBOX),\ $($(PKG)_INSTALL_INIT_SYSV)) - $($(PKG)_INSTALL_TARGET_CMDS) + +$($(PKG)_INSTALL_TARGET_CMDS) $(foreach hook,$($(PKG)_POST_INSTALL_TARGET_HOOKS),$(call $(hook))$(sep)) $(Q)if test -n "$($(PKG)_CONFIG_SCRIPTS)" ; then \ $(RM) -f $(addprefix $(TARGET_DIR)/usr/bin/,$($(PKG)_CONFIG_SCRIPTS)) ; \
Signature · 1 line
1.8.5
PATCH v10 7/8 package: enable jobserver for recursive make
Quoted 5 lines · Fabio Porcedda
Add '+' prefix to the $($(PKG)_BUILD_CMDS) and $($(PKG)_INSTALL*_CMDS) commands to enable jobserver for the sub-make.
Without the '+' prefix GNU make does not detect the sub-make so it disable the jobserver for the sub-make.
$(PKG)_BUILD_CMDS is a multiline define, and the recursive make call
may not be the first command. Can you check if this still works if the build commands are something like:
define FOO_BUILD_CMDS
echo "Hello world!" $(MAKE) -C $(@D)
endef
Regards,
Arnout
Quoted 10 lines
From GNU make documentation:
Using the MAKE variable has the same effect as using a ?+? character at the beginning of the recipe line. This special feature is only enabled if the MAKE variable appears directly in the recipe: it does not apply if the MAKE variable is referenced through expansion of another variable. In the latter case you must use the ?+? token to get these special effects.Signed-off-by Fabio Porcedda<[email protected]>
[snip]
Signature · 6 lines
Arnout Vandecappelle arnout at mind be Senior Embedded Software Architect +32-16-286500 Essensium/Mind http://www.mind.be G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle GPG fingerprint: 7CB5 E4CC 6C2E EFD4 6E3D A754 F963 ECAB 2450 2F1F
PATCH v10 7/8 package: enable jobserver for recursive make
Quoted 9 lines · Arnout Vandecappelle
Quoted 6 lines · Fabio Porcedda
Add '+' prefix to the $($(PKG)_BUILD_CMDS) and $($(PKG)_INSTALL*_CMDS) commands to enable jobserver for the sub-make.
Without the '+' prefix GNU make does not detect the sub-make so it disable the jobserver for the sub-make.
Quoted 8 lines
$(PKG)_BUILD_CMDS is a multiline define, and the recursive make call may
not be the first command. Can you check if this still works if the build commands are something like:define
FOO_BUILD_CMDS
echo "Hello world!"
$(MAKE) -C $(@D)
endef
The following test seems to work fine:
define test
echo test
$($(PKG)_BUILD_CMDS)endef
# Build
$(BUILD_DIR)/%/.stamp_built::
@$(call step_start,build)
@$(call MESSAGE,"Building")
+$(test)
...Test output:
-----
$ make BR2_JLEVEL= -j$((`getconf _NPROCESSORS_ONLN`+1)) -s wget-build
Quoted 1 line
Quoted 1 line
Quoted 1 line
wget 1.14 Building
test
Making all in lib
Making all in src
Making all in doc
Making all in po
Making all in tests
Making all in util
----
If i remove the '+' charter:
----
$ make BR2_JLEVEL= -j$((`getconf _NPROCESSORS_ONLN`+1)) -s wget-build
Quoted 1 line
Quoted 1 line
Quoted 1 line
wget 1.14 Building
test
make[1]: warning: jobserver unavailable: using -j1. Add `+' to parent make rule.
Making all in lib
Making all in src
Making all in doc
Making all in po
Making all in tests
Making all in util
----
Best regards
Signature · 1 line
Fabio Porcedda
PATCH v10 7/8 package: enable jobserver for recursive make
Quoted 14 lines · Fabio Porcedda
Quoted 13 lines · Arnout Vandecappelle
Quoted 6 lines · Fabio Porcedda
Add '+' prefix to the $($(PKG)_BUILD_CMDS) and $($(PKG)_INSTALL*_CMDS) commands to enable jobserver for the sub-make.
Without the '+' prefix GNU make does not detect the sub-make so it disable the jobserver for the sub-make.
$(PKG)_BUILD_CMDS is a multiline define, and the recursive make call may
not be the first command. Can you check if this still works if the build commands are something like:
Quoted 6 lines
Quoted 4 lines
define
FOO_BUILD_CMDS
echo "Hello world!"
$(MAKE) -C $(@D)
endefThe following test seems to work fine:
OK, good!
Regards,
Arnout
Quoted 43 lines
define test
echo test $($(PKG)_BUILD_CMDS)endef
# Build
$(BUILD_DIR)/%/.stamp_built::@$(call step_start,build) @$(call MESSAGE,"Building") +$(test) ...Test output:
-----$ make BR2_JLEVEL= -j$((`getconf _NPROCESSORS_ONLN`+1)) -s wget-buildQuoted 1 line
Quoted 1 line
Quoted 1 line
wget 1.14 Building
test
Making all in lib
Making all in src
Making all in doc
Making all in po
Making all in tests
Making all in util
----If i remove the '+' charter:
----$ make BR2_JLEVEL= -j$((`getconf _NPROCESSORS_ONLN`+1)) -s wget-buildQuoted 1 line
Quoted 1 line
Quoted 1 line
wget 1.14 Building
test
make[1]: warning: jobserver unavailable: using -j1. Add `+' to parent make rule.
Making all in lib
Making all in src
Making all in doc
Making all in po
Making all in tests
Making all in util
----Best regards
Signature · 6 lines
Arnout Vandecappelle arnout at mind be Senior Embedded Software Architect +32-16-286500 Essensium/Mind http://www.mind.be G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle GPG fingerprint: 7CB5 E4CC 6C2E EFD4 6E3D A754 F963 ECAB 2450 2F1F
PATCH v10 7/8 package: enable jobserver for recursive make
In reply to Fabio PorceddaQuoted 8 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Fabio" == Fabio Porcedda <[email protected]> writes:
Add '+' prefix to the $($(PKG)_BUILD_CMDS) and $($(PKG)_INSTALL*_CMDS) commands to enable jobserver for the sub-make.
Without the '+' prefix GNU make does not detect the sub-make so it disable the jobserver for the sub-make.
Quoted 7 lines
From GNU make documentation:
Using the MAKE variable has the same effect as using a ?+? character at the beginning of the recipe line. This special feature is only enabled if the MAKE variable appears directly in the recipe: it does not apply if the MAKE variable is referenced through expansion of another variable. In the latter case you must use the ?+? token to get these special effects.
Wouldn't it make more sense to add the '+' to MAKE / MAKE1?
Signature · 1 line
Bye, Peter Korsgaard
PATCH v10 7/8 package: enable jobserver for recursive make
Hi Peter,
thanks for reviewing,
Quoted 16 lines · Peter Korsgaard
Quoted 8 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Fabio" == Fabio Porcedda <[email protected]> writes:
Add '+' prefix to the $($(PKG)_BUILD_CMDS) and $($(PKG)_INSTALL*_CMDS) commands to enable jobserver for the sub-make.
Without the '+' prefix GNU make does not detect the sub-make so it disable the jobserver for the sub-make.
Quoted 7 lines
From GNU make documentation:
Using the MAKE variable has the same effect as using a ?+? character at the beginning of the recipe line. This special feature is only enabled if the MAKE variable appears directly in the recipe: it does not apply if the MAKE variable is referenced through expansion of another variable. In the latter case you must use the ?+? token to get these special effects.
Quoted 1 line
Wouldn't it make more sense to add the '+' to MAKE / MAKE1?
Unfortunately that does not work, the '+' must be the first character of the command line, e.g.:
PATH=/home/fabiopo/buildroot/output/host/bin:/home/fabiopo/buildroot/output/host/usr/bin:/home/fabiopo/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
LD_LIBRARY_PATH="/home/fabiopo/buildroot/output/host/usr/lib:"
PKG_CONFIG="/home/fabiopo/buildroot/output/host/usr/bin/pkg-config"
PKG_CONFIG_SYSROOT_DIR="/"
PKG_CONFIG_LIBDIR="/home/fabiopo/buildroot/output/host/usr/lib/pkgconfig"
PERLLIB="/home/fabiopo/buildroot/output/host/usr/lib/perl"
+/usr/bin/make -j5 -C/home/fabiopo/buildroot/output/build/host-binutils-2.22//bin/sh: +/usr/bin/make: No such file or directory
make: *** [/home/fabiopo/buildroot/output/build/host-binutils-2.22/.stamp_built]
Error 127
Best regards
Signature · 1 line
Fabio Porcedda
PATCH v10 7/8 package: enable jobserver for recursive make
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Fabio" == Fabio Porcedda <[email protected]> writes:
Hi,
Quoted 4 lines
Quoted 1 line
Wouldn't it make more sense to add the '+' to MAKE / MAKE1?
Unfortunately that does not work, the '+' must be the first character of the command line, e.g.:
Ahh, ok :/
Signature · 1 line
Bye, Peter Korsgaard
PATCH v10 8/8 Makefile: update comment about top-level parallel Makefile
In reply to Fabio PorceddaAfter the latest patches top-level parallel Makefile is working but there is still an issue when a package has an unspecified optional dependency so change the comment to explain that.
--- Makefile | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
Makefile +14 -1
@@ -42,7 +42,20 @@ export HOSTARCH := $(shell uname -m | \ -e s/macppc/powerpc/\ -e s/sh.*/sh/) -# This top-level Makefile can *not* be executed in parallel +# Parallel execution of this Makefile is disabled because it could +# change the build result if a package has an unspecified optional +# dependency. +# Parallel execution changes the packages building order, that can be +# a problem when a package has an unspecified optional dependency, +# because if that dependency is present when the package is built, it +# is used, otherwise it isn't (but compilation happily proceeds). This +# means that the packages building order is relevant in that case, and +# the end result will differ if the order is swapped due to parallel +# building. +# Taking in account the above warning, if you still want to execute +# this top-level Makefile in parrallel comment the following line and +# execute: +# make BR2_JLEVEL= -j$((`getconf _NPROCESSORS_ONLN`+1)) .NOTPARALLEL: # absolute path
Signature · 1 line
1.8.5
PATCH v10 8/8 Makefile: update comment about top-level parallel Makefile
Quoted 14 lines · Fabio Porcedda
After the latest patches top-level parallel
Makefileis working but there is still an issue when a package has an unspecified optional dependency so change the comment to explain that.Signed-off-by Fabio Porcedda <[email protected]>--- Makefile | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)Makefile +0
-0
Makefile export HOSTARCH := $(shell uname -m | \ · line 47
Quoted 7 lines
Makefile +3
-1@@ -42,7 +42,20 @@ export HOSTARCH := $(shell uname -m | \ -e s/macppc/powerpc/\ -e s/sh.*/sh/) -# This top-level Makefile can *not* be executed in parallel +# Parallel execution of this Makefile is disabled because it could +# change the build result if a package has an unspecified optional +# dependency.
... or if two packages manipulate the same file in the target directory.
Makefile export HOSTARCH := $(shell uname -m | \ · line 51
Quoted 4 lines
Makefile +4
-0+# Parallel execution changes the packages building order, that can be +# a problem when a package has an unspecified optional dependency, +# because if that dependency is present when the package is built, it +# is used, otherwise it isn't (but compilation happily proceeds). This
This is a repeat of the first sentence.
Makefile export HOSTARCH := $(shell uname -m | \ · line 55
Quoted 4 lines
Makefile +4
-0+# means that the packages building order is relevant in that case, and +# the end result will differ if the order is swapped due to parallel +# building. +# Taking in account the above warning, if you still want to execute
Taking into acount
Makefile export HOSTARCH := $(shell uname -m | \ · line 56
Quoted 1 line
Makefile +1
-0+# this top-level Makefile in parrallel comment the following line and
parallel
Regards,
Arnout
Quoted 6 lines
Makefile +2
-0+# execute: +# make BR2_JLEVEL= -j$((`getconf _NPROCESSORS_ONLN`+1)) .NOTPARALLEL: # absolute path
Signature · 6 lines
Arnout Vandecappelle arnout at mind be Senior Embedded Software Architect +32-16-286500 Essensium/Mind http://www.mind.be G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle GPG fingerprint: 7CB5 E4CC 6C2E EFD4 6E3D A754 F963 ECAB 2450 2F1F
PATCH v10 8/8 Makefile: update comment about top-level parallel Makefile
Hi Arnout,
thanks for reviewing.
Quoted 19 lines · Arnout Vandecappelle
Quoted 18 lines · Fabio Porcedda
After the latest patches top-level parallel
Makefileis working but there is still an issue when a package has an unspecified optional dependency so change the comment to explain that.Signed-off-by Fabio Porcedda <[email protected]>--- Makefile | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)Makefile +0
-0@@ -42,7 +42,20 @@ export HOSTARCH := $(shell uname -m | \ -e s/macppc/powerpc/\ -e s/sh.*/sh/)
Quoted 7 lines
Makefile export HOSTARCH := $(shell uname -m | \ · line 47
Quoted 4 lines
Makefile +3
-1-# This top-level Makefile can *not* be executed in parallel +# Parallel execution of this Makefile is disabled because it could +# change the build result if a package has an unspecified optional +# dependency.... or if two packages manipulate the same file in the target directory.
Ok, added.
Quoted 8 lines
Makefile export HOSTARCH := $(shell uname -m | \ · line 51
Quoted 5 lines
Makefile +4
-0+# Parallel execution changes the packages building order, that can be +# a problem when a package has an unspecified optional dependency, +# because if that dependency is present when the package is built, it +# is used, otherwise it isn't (but compilation happily proceeds). ThisThis is a repeat of the first sentence.
So i just remove it?
Quoted 8 lines
Makefile export HOSTARCH := $(shell uname -m | \ · line 55
Quoted 5 lines
Makefile +4
-0+# means that the packages building order is relevant in that case, and +# the end result will differ if the order is swapped due to parallel +# building. +# Taking in account the above warning, if you still want to executeTaking into acount
Ok fixed.
Quoted 5 lines
Makefile export HOSTARCH := $(shell uname -m | \ · line 56
Quoted 2 lines
Makefile +1
-0+# this top-level Makefile in parrallel comment the following line andparallel
Ok fixed.
<snip>
Best regards
Signature · 1 line
Fabio Porcedda
PATCH v10 8/8 Makefile: update comment about top-level parallel Makefile
Quoted 30 lines · Fabio Porcedda
Quoted 19 lines · Arnout Vandecappelle
Quoted 19 lines · Fabio Porcedda
Quoted 18 lines
Quoted 18 lines
After the latest patches top-level parallel
Makefileis working but there is still an issue when a package has an unspecified optional dependency so change the comment to explain that.Signed-off-by Fabio Porcedda<[email protected]>--- Makefile | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)Makefile +0
-0@@ -42,7 +42,20 @@ export HOSTARCH := $(shell uname -m | \ -e s/macppc/powerpc/\ -e s/sh.*/sh/)Quoted 7 lines
Quoted 7 lines
Quoted 4 lines
Makefile export HOSTARCH := $(shell uname -m | \ · line 47
Quoted 4 lines
Makefile +3
-1-# This top-level Makefile can*not* be executed in parallel +# Parallel execution of this Makefile is disabled because it could +# change the build result if a package has an unspecified optional +# dependency.... or if two packages manipulate the same file in the target directory.
Ok, added.
Quoted 1 line
Quoted 1 line
Quoted 9 lines
Quoted 7 lines
Quoted 7 lines
Quoted 4 lines
Makefile export HOSTARCH := $(shell uname -m | \ · line 51
Quoted 4 lines
Makefile +4
-0+# Parallel execution changes the packages building order, that can be +# a problem when a package has an unspecified optional dependency, +# because if that dependency is present when the package is built, it +# is used, otherwise it isn't (but compilation happily proceeds). ThisThis is a repeat of the first sentence.
So i just remove it?
Probably better to remove the first sentence, the second one is more
descriptive.
Regards,
Arnout
Signature · 6 lines
Arnout Vandecappelle arnout at mind be Senior Embedded Software Architect +32-16-286500 Essensium/Mind http://www.mind.be G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle GPG fingerprint: 7CB5 E4CC 6C2E EFD4 6E3D A754 F963 ECAB 2450 2F1F
PATCH v10 8/8 Makefile: update comment about top-level parallel Makefile
Quoted 48 lines · Arnout Vandecappelle
Quoted 47 lines · Fabio Porcedda
Quoted 23 lines · Arnout Vandecappelle
Quoted 23 lines · Fabio Porcedda
Quoted 20 lines
Quoted 20 lines
After the latest patches top-level parallel
Makefileis working but there is still an issue when a package has an unspecified optional dependency so change the comment to explain that.Signed-off-by Fabio Porcedda<[email protected]>--- Makefile | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)Makefile +0
-1@@ -42,7 +42,20 @@ export HOSTARCH := $(shell uname -m | \ -e s/macppc/powerpc/\ -e s/sh.*/sh/) -# This top-level Makefile can*not* be executed in parallelQuoted 8 lines
Quoted 8 lines
Quoted 3 lines
Makefile export HOSTARCH := $(shell uname -m | \ · line 47
Quoted 3 lines
Makefile +3
-0+# Parallel execution of this Makefile is disabled because it could +# change the build result if a package has an unspecified optional +# dependency.... or if two packages manipulate the same file in the target
directory.Ok, added.
Quoted 10 lines
Quoted 10 lines
Quoted 7 lines
Quoted 7 lines
Makefile +4
-0+# Parallel execution changes the packages building order, that can be +# a problem when a package has an unspecified optional dependency, +# because if that dependency is present when the package is built, it +# is used, otherwise it isn't (but compilation happily proceeds).This
Quoted 7 lines
Quoted 4 lines
Quoted 1 line
Quoted 1 line
This is a repeat of the first sentence.
So i just remove it?
Probably better to remove the first sentence, the second one is more
descriptive.
This is the fixed comment:
# Parallel execution of this Makefile is disabled because it changes
# the packages building order, that can be a problem when a package # has an unspecified optional dependency, because if that dependency # is present when the package is built, it is used, otherwise it isn't # (but compilation happily proceeds). This means that the packages # building order is relevant in that case, and the end result will # differ if the order is swapped due to parallel building. Also # changing the building order can be a problem if two packages # manipulate the same file in the target directory. # Taking into account the above warnings, if you still want to execute # this top-level Makefile in parallel comment the following line and # execute: # make BR2_JLEVEL= -j$((`getconf _NPROCESSORS_ONLN`+1))
Regards
Signature · 1 line
Fabio Porcedda
PATCH v10 8/8 Makefile: update comment about top-level parallel Makefile
Quoted 16 lines · On Tue, 7 Jan 2014 11:05:52 +0100 Fabio Porcedda <[email protected]>…
This is the fixed comment:
# Parallel execution of this
Makefileis disabled because it changes# the packages building order, that can be a problem when a package # has an unspecified optional dependency, because if that dependency # is present when the package is built, it is used, otherwise it isn't # (but compilation happily proceeds). This means that the packages # building order is relevant in that case, and the end result will # differ if the order is swapped due to parallel building. Also # changing the building order can be a problem if two packages # manipulate the same file in the target directory. # Taking into account the above warnings, if you still want to execute # this top-level Makefile in parallel comment the following line and # execute: # make BR2_JLEVEL= -j$((`getconf _NPROCESSORS_ONLN`+1))
Quoted 2 lines
Regards
Been a silent reader for years here now, but I just must make a suggestion:
# Parallel execution of this top-level Makefile is disabled. #
# Single execution is forced here for two reasons:
#
# Maintaining reproducible builds:
# Packages with an unspecified, optional, dependency could
# otherwise change the build order among multiple builds. # # Prevent file modification collisions: # This can happen if two packages manipulate the same file. # # After taking into account the above considerations; # If you still want to execute this top-level Makefile in # parallel, comment out the following line and then execute: # make BR2_JLEVEL= -j$((`getconf _NPROCESSORS_ONLN`+1))
Just clarify which line is "the following line" in the context of this comment.
Add styling to first line of each paragraph to match the context.
- - - -
I will return now to my read-only mode.
Mike
PATCH v10 8/8 Makefile: update comment about top-level parallel Makefile
Quoted 19 lines · Mike Zick
Quoted 16 lines · On Tue, 7 Jan 2014 11:05:52 +0100 Fabio Porcedda <[email protected]>…
This is the fixed comment:
# Parallel execution of this
Makefileis disabled because it changes# the packages building order, that can be a problem when a package # has an unspecified optional dependency, because if that dependency # is present when the package is built, it is used, otherwise it isn't # (but compilation happily proceeds). This means that the packages # building order is relevant in that case, and the end result will # differ if the order is swapped due to parallel building. Also # changing the building order can be a problem if two packages # manipulate the same file in the target directory. # Taking into account the above warnings, if you still want to execute # this top-level Makefile in parallel comment the following line and # execute: # make BR2_JLEVEL= -j$((`getconf _NPROCESSORS_ONLN`+1))
Quoted 5 lines
Quoted 2 lines
Regards
Been a silent reader for years here now, but I just must make a suggestion:
Hi Mike,
welcome as a writer :)
Quoted 16 lines
# Parallel execution of this top-level
Makefileis disabled. #
# Single execution is forced here for two reasons:
#
# Maintaining reproducible builds:
# Packages with an unspecified, optional, dependency could# otherwise change the build order among multiple builds. # # Prevent file modification collisions: # This can happen if two packages manipulate the same file. # # After taking into account the above considerations; # If you still want to execute this top-level Makefile in # parallel, comment out the following line and then execute: # make BR2_JLEVEL= -j$((`getconf _NPROCESSORS_ONLN`+1))
Quoted 4 lines
Just clarify which line is "the following line" in the context of this comment.
Add styling to first line of each paragraph to match the context.
Thanks for the suggestion, maybe a mix of the two:
# Parallel execution of this Makefile is disabled because it changes
# the packages building order, that can be a problem for two reasons: # - If a package has an unspecified optional dependency and that # dependency is present when the package is built, it is used, # otherwise it isn't (but compilation happily proceeds) so the end # result will differ if the order is swapped due to parallel # building. # - Also changing the building order can be a problem if two packages # manipulate the same file in the target directory. # # Taking into account the above considerations, if you still want to execute # this top-level Makefile in parallel comment the ".NOTPARALLEL" line and # build using the following command: # make BR2_JLEVEL= -j$((`getconf _NPROCESSORS_ONLN`+1))
Regards
Signature · 1 line
Fabio Porcedda
v10 cover Add support for top-level parallel make
In reply to Fabio PorceddaQuoted 8 lines · Fabio Porcedda
this is a patch set for adding support for top-level parallel make in buildroot, the common problem scattered in buildroot's top-level makefiles is that in the rules it relies on the order of evaluation of the prerequisites, to be able to use top-level parallel make instead of reling on the left to right ordering of evaluation of the prerequisites we must add an explicit rule to describe the dependencies.
Quoted 4 lines
With this patch set the top-level parallel make seems to works fine, example:
make clean make BR2_JLEVEL= -j$((`getconf _NPROCESSORS_ONLN` + 1))
Would it be possible to disable BR2_JLEVEL automatically when -j
appears on the command line?
Quoted 5 lines
Before to try it remeber to remove the ".NOTPARALLEL" line.
On my quad core system the building time for
qemu_x86_defconfigis 14m versus 11m and with ccache enabled 7m vs 5m.
These are not very relevant benchmarks because there's not a lot that
can be done in parallel there. It would be much more interesting with an allpackageyesconfig (which you'll have to modify by hand BTW to exclude some packages that don't build...).
Regards,
Arnout
Signature · 6 lines
Arnout Vandecappelle arnout at mind be Senior Embedded Software Architect +32-16-286500 Essensium/Mind http://www.mind.be G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle GPG fingerprint: 7CB5 E4CC 6C2E EFD4 6E3D A754 F963 ECAB 2450 2F1F
v10 cover Add support for top-level parallel make
Quoted 10 lines · Arnout Vandecappelle
Quoted 9 lines · Fabio Porcedda
this is a patch set for adding support for top-level parallel make in buildroot, the common problem scattered in buildroot's top-level makefiles is that in the rules it relies on the order of evaluation of the prerequisites, to be able to use top-level parallel make instead of reling on the left to right ordering of evaluation of the prerequisites we must add an explicit rule to describe the dependencies.
Quoted 8 lines
Quoted 4 lines
With this patch set the top-level parallel make seems to works fine, example:
make clean make BR2_JLEVEL= -j$((`getconf _NPROCESSORS_ONLN` + 1))Would it be possible to disable
BR2_JLEVELautomatically when -j appears on
the command line?
It would be great but i don't know i way to check if the -j options is being used.
Quoted 4 lines
Quoted 4 lines
Before to try it remeber to remove the ".NOTPARALLEL" line.
Quoted 8 lines
Quoted 2 lines
On my quad core system the building time for
qemu_x86_defconfigis 14m versus 11m and with ccache enabled 7m vs 5m.These are not very relevant benchmarks because there's not a lot that can
be done in parallel there. It would be much more interesting with an allpackageyesconfig (which you'll have to modify by hand BTW to exclude some packages that don't build...).
You are right, i've already tried to do that but disabling all the falling packages takes time,
i will try do that again.
It would be best if at least in the default configuration all the packages build fine.
The autobuild does not try to test allpackageyesconfig, does it?
Best regards
Signature · 1 line
Fabio Porcedda
v10 cover Add support for top-level parallel make
Dear Fabio Porcedda,
Quoted 1 line · Fabio Porcedda
The autobuild does not try to test allpackageyesconfig, does it?
But, the autobuild is not designed for that. However, an allyespackageconfig configuration is something we could add to the Jenkins if you want.
Best regards,
Thomas
Signature · 3 lines
Thomas Petazzoni, CTO, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com
v10 cover Add support for top-level parallel make
Quoted 9 lines · Thomas Petazzoni
Dear Fabio Porcedda,
Quoted 1 line · Fabio Porcedda
The autobuild does not try to test allpackageyesconfig, does it?
But, the autobuild is not designed for that. However, an allyespackageconfig configuration is something we could add to the Jenkins if you want.
If you do that, expect it to fail :-)
It will certainly fail if you include a kernel in that config: some
packages (Xenomai, rtnet, some modules) only work with certain kernel versions and AFAIK there is no single kernel that works for all these packages.
Not building a kernel excludes many packages so may give you more luck.
Regards,
Arnout
Signature · 6 lines
Arnout Vandecappelle arnout at mind be Senior Embedded Software Architect +32-16-286500 Essensium/Mind http://www.mind.be G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle GPG fingerprint: 7CB5 E4CC 6C2E EFD4 6E3D A754 F963 ECAB 2450 2F1F
v10 cover Add support for top-level parallel make
Quoted 4 lines · Arnout Vandecappelle
Quoted 3 lines · Thomas Petazzoni
Dear Fabio Porcedda,
Quoted 8 lines
Quoted 8 lines · Fabio Porcedda
Quoted 2 lines
The autobuild does not try to test allpackageyesconfig, does it?
But, the autobuild is not designed for that. However, an allyespackageconfig configuration is something we could add to the Jenkins if you want.
I think It would be great.
IMHO it's a useful test because this way we know if packages build fine at least with the default config.
Building again the default config is the first test that a package must pass, doesn't it?
Quoted 9 lines
If you do that, expect it to fail :-)
It will certainly fail if you include a kernel in that config: some
packages (Xenomai, rtnet, some modules) only work with certain kernel versions and AFAIK there is no single kernel that works for all these packages.Not building a kernel excludes many packages so may give you more luck.
Thanks and best regards
Signature · 1 line
Fabio Porcedda
v10 cover Add support for top-level parallel make
In reply to Arnout VandecappelleQuoted 1 line · Arnout Vandecappelle
On 18/12/13 11:36, Fabio Porcedda wrote:
<snip>
Quoted 8 lines
Quoted 2 lines
On my quad core system the building time for
qemu_x86_defconfigis 14m versus 11m and with ccache enabled 7m vs 5m.These are not very relevant benchmarks because there's not a lot that can
be done in parallel there. It would be much more interesting with an allpackageyesconfig (which you'll have to modify by hand BTW to exclude some packages that don't build...).
I've build the first 220 packages of the "allpackageyesconfig", now the numbers look better: 43m vs 18m.
Best regards
Signature · 1 line
Fabio Porcedda