Bug 680246 - makefile logic to support threadsafe mkdir -p; r=ted

This commit is contained in:
Joey Armstrong 2011-08-18 17:16:21 -04:00
parent 6698e3f145
commit 9cb3971e04
6 changed files with 163 additions and 12 deletions

View File

@ -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

View File

@ -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

View File

@ -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 $@

View File

@ -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

View File

@ -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 $@

View File

@ -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