[dpdk-dev,v7,6/6] mk: install symlinks before build step
Checks
Commit Message
From: Luca Boccassi <luca.boccassi@gmail.com>
A race condition can happen during parallel builds, where a header
might be installed in RTE_OUT/include before CFLAGS is recursively
expanded. This causes GCC to sometimes pick the header path as
SRCDIR/... and sometimes as RTE_OUT/include/... making the build
unreproducible, as the full path is used for the expansion of
__FILE__ and in the DWARF directory listing.
Installing all symlinks before all builds solves the problem. It is
still suboptimal, as the (fixed) path recorded in the DWARF dir
listing will include the user-configurable build output directory,
and thus will result in a different binary between different users
despite all other conditions being equal, but it is a simpler
approach that will anyway be obsolete once the build system is
switched to Meson.
Suggested-by: Ferruh Yigit <ferruh.yigit@intel.com>
Signed-off-by: Luca Boccassi <luca.boccassi@gmail.com>
---
mk/rte.lib.mk | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
Comments
05/09/2017 22:51, luca.boccassi@gmail.com:
> .PHONY: install
> +ifeq ($(SYMLINK-FILES-y),)
> install: build _postinstall
> +else
> +install: _preinstall build _postinstall
> +endif
I think you cannot be sure that "_preinstall" will be finished
before the "build" target starts in parallel make.
Am I missing something?
On Thu, 2017-10-12 at 04:58 +0200, Thomas Monjalon wrote:
> 05/09/2017 22:51, luca.boccassi@gmail.com:
> > .PHONY: install
> > +ifeq ($(SYMLINK-FILES-y),)
> > install: build _postinstall
> > +else
> > +install: _preinstall build _postinstall
> > +endif
>
> I think you cannot be sure that "_preinstall" will be finished
> before the "build" target starts in parallel make.
> Am I missing something?
Yes, you are right, good catch. I'll add a dependency:
build: _preinstall
Which should take care of it, retest and send a new version.
@@ -59,14 +59,19 @@ endif
_BUILD = $(LIB)
-_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
+PREINSTALL = $(SYMLINK-FILES-y)
+_INSTALL = $(INSTALL-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
_CLEAN = doclean
.PHONY: all
all: install
.PHONY: install
+ifeq ($(SYMLINK-FILES-y),)
install: build _postinstall
+else
+install: _preinstall build _postinstall
+endif
_postinstall: build