From 9cb3971e0497131f62131fd7f96f04d091345bd1 Mon Sep 17 00:00:00 2001 From: Joey Armstrong Date: Thu, 18 Aug 2011 17:16:21 -0400 Subject: [PATCH] Bug 680246 - makefile logic to support threadsafe mkdir -p; r=ted --- allmakefiles.sh | 1 + build/unix/test/Makefile.in | 18 +++---- config/makefiles/autotargets.mk | 67 ++++++++++++++++++++++++ config/rules.mk | 9 ++++ js/src/config/makefiles/autotargets.mk | 71 ++++++++++++++++++++++++++ js/src/config/rules.mk | 9 ++++ 6 files changed, 163 insertions(+), 12 deletions(-) create mode 100644 config/makefiles/autotargets.mk create mode 100644 js/src/config/makefiles/autotargets.mk diff --git a/allmakefiles.sh b/allmakefiles.sh index d290895f34eb..126dde6733dd 100755 --- a/allmakefiles.sh +++ b/allmakefiles.sh @@ -62,6 +62,7 @@ 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 diff --git a/build/unix/test/Makefile.in b/build/unix/test/Makefile.in index 2e81243e84a3..cc217e97230d 100644 --- a/build/unix/test/Makefile.in +++ b/build/unix/test/Makefile.in @@ -42,19 +42,23 @@ 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 @@ -63,14 +67,4 @@ $(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 diff --git a/config/makefiles/autotargets.mk b/config/makefiles/autotargets.mk new file mode 100644 index 000000000000..bfa3b0b6c46d --- /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 +# +# 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 $@ diff --git a/config/rules.mk b/config/rules.mk index e9d9414aa49f..f0b9457013dc 100644 --- a/config/rules.mk +++ b/config/rules.mk @@ -2030,3 +2030,12 @@ libs export libs:: 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 + diff --git a/js/src/config/makefiles/autotargets.mk b/js/src/config/makefiles/autotargets.mk new file mode 100644 index 000000000000..90bfebfc0f18 --- /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 +# +# 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 $@ diff --git a/js/src/config/rules.mk b/js/src/config/rules.mk index e9d9414aa49f..f0b9457013dc 100644 --- a/js/src/config/rules.mk +++ b/js/src/config/rules.mk @@ -2030,3 +2030,12 @@ libs export libs:: 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 +