Build: Fix parallel build
authorEvan Lloyd <evan.lloyd@arm.com>
Fri, 7 Apr 2017 15:58:57 +0000 (16:58 +0100)
committerEvan Lloyd <evan.lloyd@arm.com>
Tue, 2 May 2017 17:27:05 +0000 (18:27 +0100)
2 problems were found, but are in one change to avoid submitting a patch
that might fail to build. The problems were:
1.  The macro MAKE_PREREQ_DIR has a minor bug, in that it is capable of
    generating recursive dependencies.
2.  The inclusion of BUILD_DIR in TEMP_OBJ_DIRS left no explicit
    dependency, BUILD_DIR might not exist when subdirectories are
    created by a thread on another CPU.

This fix corrects these with the following changes:
1.  MAKE_PREREQ_DIR does nothing for a direct self dependency.
2.  BUILD_DIR is built using MAKE_PREREQ_DIR.
3.  BUILD_DIR is an explicit prerequisite of all OBJ_DIRS.

Change-Id: I938cddea4a006df225c02a47b9cf759212f27fb7

Signed-off-by: Evan Lloyd <evan.lloyd@arm.com>
make_helpers/build_macros.mk
make_helpers/unix.mk
make_helpers/windows.mk

index 93db2d664d8803c4e8bf3550e16ddf054bf2a5cd..cc51393787bc032055d33d45352f66733902e669 100644 (file)
@@ -308,14 +308,16 @@ define MAKE_BL
         $(eval BL_LINKERFILE := $(BL$(call uppercase,$(1))_LINKERFILE))
         # We use sort only to get a list of unique object directory names.
         # ordering is not relevant but sort removes duplicates.
-        $(eval TEMP_OBJ_DIRS := $(sort $(BUILD_DIR)/ $(dir ${OBJS} ${LINKERFILE})))
+        $(eval TEMP_OBJ_DIRS := $(sort $(dir ${OBJS} ${LINKERFILE})))
         # The $(dir ) function leaves a trailing / on the directory names
         # Rip off the / to match directory names with make rule targets.
         $(eval OBJ_DIRS   := $(patsubst %/,%,$(TEMP_OBJ_DIRS)))
 
 # Create generators for object directory structure
 
-$(eval $(foreach objd,${OBJ_DIRS},$(call MAKE_PREREQ_DIR,${objd},)))
+$(eval $(call MAKE_PREREQ_DIR,${BUILD_DIR},))
+
+$(eval $(foreach objd,${OBJ_DIRS},$(call MAKE_PREREQ_DIR,${objd},${BUILD_DIR})))
 
 .PHONY : bl${1}_dirs
 
index ab604357c86520ea1beb596f1ae062ecdf2e29c5..6f7020080dd7f0fa8789cb631256fabfabd84135 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
+# Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are met:
@@ -67,11 +67,14 @@ ifndef UNIX_MK
 
     # ${1} is the directory to be generated.
     # ${2} is optional, and allows a prerequisite to be specified.
+    # Do nothing if $1 == $2, to ignore self dependencies.
     define MAKE_PREREQ_DIR
+        ifneq (${1},${2})
 
 ${1} : ${2}
        ${Q}mkdir -p  "${1}"
 
+        endif
     endef
 
     define SHELL_REMOVE_DIR
index c4317d53d8692bf73338f997158bb9e8027122af..5138d1b9ca2ac9211359c11a124b8d61baa49047 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
+# Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are met:
@@ -75,12 +75,15 @@ ifndef WINDOWS_MK
 
     # ${1} is the directory to be generated.
     # ${2} is optional, and allows prerequisites to be specified.
+    # Do nothing if $1 == $2, to ignore self dependencies.
     define MAKE_PREREQ_DIR
+        ifneq (${1},${2})
 
 ${1} : ${2}
        $(eval tmp_dir:=$(subst /,\,${1}))
        -@if not exist "$(tmp_dir)"  mkdir "${tmp_dir}"
 
+        endif
     endef
 
     # ${1} is the directory to be removed.