Bug 680246 - makefile logic to support threadsafe mkdir -p; r=ted
☠☠ backed out by 0b9c0a2a1a25 ☠ ☠
authorJoey Armstrong <joey@mozilla.com>
Thu, 18 Aug 2011 17:16:21 -0400
changeset 77580 020f14584a2aad2492230d21296ffbc8c5a9f257
parent 77579 2c5bbb176d01195be87c7445f8cb1d91d967efbb
child 77581 0b9c0a2a1a252afd00fdd174f704584fdb7ade67
push idunknown
push userunknown
push dateunknown
reviewersted
bugs680246
milestone9.0a1
Bug 680246 - makefile logic to support threadsafe mkdir -p; r=ted
allmakefiles.sh
build/unix/test/Makefile.in
config/makefiles/autotargets.mk
config/rules.mk
js/src/config/makefiles/autotargets.mk
js/src/config/rules.mk
--- a/allmakefiles.sh
+++ b/allmakefiles.sh
@@ -57,16 +57,17 @@ fi
 #
 add_makefiles "
 Makefile
 build/Makefile
 build/pgo/Makefile
 build/pgo/blueprint/Makefile
 build/pgo/js-input/Makefile
 build/unix/Makefile
+build/unix/test/Makefile
 build/win32/Makefile
 build/win32/crashinjectdll/Makefile
 config/Makefile
 config/autoconf.mk
 config/mkdepend/Makefile
 config/nspr/Makefile
 config/doxygen.cfg
 config/expandlibs_config.py
--- a/build/unix/test/Makefile.in
+++ b/build/unix/test/Makefile.in
@@ -37,40 +37,34 @@
 # ***** END LICENSE BLOCK *****
 
 DEPTH		= ../../..
 topsrcdir	= @top_srcdir@
 srcdir		= @srcdir@
 VPATH		= @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
+
+TS = .ts
+GENERATED_DIRS += $(TS)
+GARBAGE_DIRS   += $(TS)
+
 include $(topsrcdir)/config/rules.mk
 
 ##################################################
 ## Gather a list of tests, generate timestamp deps
 ##################################################
-TS=.ts
 ifneq (,$(findstring check,$(MAKECMDGOALS)))
           allsrc = $(wildcard $(srcdir)/*)
        tests2run = $(notdir $(filter %.tpl,$(allsrc)))
   check_targets += $(addprefix $(TS)/,$(tests2run))
 endif
 
-check:: $(TS) $(check_targets)
+check:: $(AUTO_DEPS) $(check_targets)
 
 #############################################
 # Only invoke tests when sources have changed
 #############################################
 $(TS)/%: $(srcdir)/%
 	$(PERL) $(srcdir)/runtest $<
 	@touch $@
 
-#####################################################
-## Extra dep needed to synchronize parallel execution
-#####################################################
-$(TS): $(TS)/.done
-$(TS)/.done:
-	$(MKDIR) -p $(dir $@)
-	touch $@
-
-GARBAGE_DIRS += $(TS)
-
 # EOF
new file mode 100644
--- /dev/null
+++ b/config/makefiles/autotargets.mk
@@ -0,0 +1,67 @@
+# -*- makefile -*-
+# vim:set ts=8 sw=8 sts=8 noet:
+#
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# The Mozilla Foundation
+# Portions created by the Initial Developer are Copyright (C) 2011
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Joey Armstrong <joey@mozilla.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either of the GNU General Public License Version 2 or later (the "GPL"),
+# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+SPACE ?= $(NULL) $(NULL)
+
+  get_auto_arg = $(word $(2),$(subst ^,$(SPACE),$(1))) # get(1=var, 2=offset)
+gen_auto_macro = $(addsuffix ^$(1),$(2))  # gen(1=target_pattern, 2=value)
+
+###########################################################################
+## Automatic dependency macro generation.
+## Macros should be defined prior to the inclusion of rules.mk
+##  GENERATED_DIRS - a list of directories to create
+##  AUTO_DEPS      - [returned] a list of generated deps targets can depend on
+##  Usage:
+##    all bootstrap: $(AUTO_DEPS)
+##    target: $(dir)/.dir.done $(dir)/foobar
+###########################################################################
+ifdef GENERATED_DIRS
+  GENERATED_DIR_DEPS = $(foreach dir,$(GENERATED_DIRS),$(dir)/.dir.done)
+  AUTO_DEPS += $(GENERATED_DIR_DEPS)
+endif
+
+.SECONDARY: $(GENERATED_DIRS) # preserve intermediates: .dir.done
+
+###################################################################
+## Thread safe directory creation
+###################################################################
+$(GENERATED_DIR_DEPS):
+	$(MKDIR) -p $(dir $@)
+	@touch $@
--- a/config/rules.mk
+++ b/config/rules.mk
@@ -2025,8 +2025,17 @@ FREEZE_VARIABLES = \
 CHECK_FROZEN_VARIABLES = $(foreach var,$(FREEZE_VARIABLES), \
   $(if $(subst $($(var)_FROZEN),,'$($(var))'),$(error Makefile variable '$(var)' changed value after including rules.mk. Was $($(var)_FROZEN), now $($(var)).)))
 
 libs export libs::
 	$(CHECK_FROZEN_VARIABLES)
 
 default all::
 	if test -d $(DIST)/bin ; then touch $(DIST)/bin/.purgecaches ; fi
+
+
+#############################################################################
+# Derived targets and dependencies
+
+ifndef INCLUDED_AUTOTARGETS_MK
+include $(topsrcdir)/config/makefiles/autotargets.mk
+endif
+
new file mode 100644
--- /dev/null
+++ b/js/src/config/makefiles/autotargets.mk
@@ -0,0 +1,71 @@
+# -*- makefile -*-
+# vim:set ts=8 sw=8 sts=8 noet:
+#
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# The Mozilla Foundation
+# Portions created by the Initial Developer are Copyright (C) 2011
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Joey Armstrong <joey@mozilla.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either of the GNU General Public License Version 2 or later (the "GPL"),
+# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+SPACE ?= $(NULL) $(NULL)
+
+  get_auto_arg = $(word $(2),$(subst ^,$(SPACE),$(1))) # get(1=var, 2=offset)
+gen_auto_macro = $(addsuffix ^$(1),$(2))  # gen(1=target_pattern, 2=value)
+
+###########################################################################
+## Automatic dependency macro generation.
+## Macros should be defined prior to the inclusion of rules.mk
+##  GENERATED_DIRS - a list of directories to create
+##  AUTO_DEPS      - [returned] a list of generated deps targets can depend on
+##  Usage:
+##    all bootstrap: $(AUTO_DEPS)
+##    target: $(dir)/.dir.done $(dir)/foobar
+###########################################################################
+ifdef GENERATED_DIRS
+  GENERATED_DIRS_DEP = $(foreach dir,$(GENERATED_DIRS),$(dir)/.dir.done)
+  AUTO_DEPS += $(GENERATED_DIRS_DEP)
+endif
+
+.SECONDARY: $(GENERATED_DIRS) # preserve intermediates: .dir.done
+
+###################################################################
+## Thread safe directory creation
+##   - targets suffixed by a slash will match and be processed
+##   - macro AUTO_DEPS can be used to explicitly add a list of deps
+##   - single: $(call threadsafe_mkdir,$(var))
+##   - $(foreach dir,$(list),$(call threadsafe_mkdir,$(dir)))
+###################################################################
+$(GENERATED_DIRS_DEP):
+	$(MKDIR) -p $(dir $@)
+	@touch $@
--- a/js/src/config/rules.mk
+++ b/js/src/config/rules.mk
@@ -2025,8 +2025,17 @@ FREEZE_VARIABLES = \
 CHECK_FROZEN_VARIABLES = $(foreach var,$(FREEZE_VARIABLES), \
   $(if $(subst $($(var)_FROZEN),,'$($(var))'),$(error Makefile variable '$(var)' changed value after including rules.mk. Was $($(var)_FROZEN), now $($(var)).)))
 
 libs export libs::
 	$(CHECK_FROZEN_VARIABLES)
 
 default all::
 	if test -d $(DIST)/bin ; then touch $(DIST)/bin/.purgecaches ; fi
+
+
+#############################################################################
+# Derived targets and dependencies
+
+ifndef INCLUDED_AUTOTARGETS_MK
+include $(topsrcdir)/config/makefiles/autotargets.mk
+endif
+