Bug 743243 - Add isTargetStem makefile function. r=ted

This commit is contained in:
Joey Armstrong 2012-04-28 11:16:12 -04:00
parent 0913ad8c54
commit 6a6ade340c
6 changed files with 182 additions and 28 deletions

View File

@ -50,8 +50,5 @@ endif
AUTO_DEPS +=$(GENERATED_DIRS_DEPS) AUTO_DEPS +=$(GENERATED_DIRS_DEPS)
# Complain loudly if deps have not loaded so getargv != $(NULL) # Complain loudly if deps have not loaded so getargv != $(NULL)
ifndef getargv $(call requiredfunction,getargv)
$(error config/makefiles/makeutil.mk has not been included)
endif

View File

@ -5,13 +5,6 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this file, # License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/. # You can obtain one at http://mozilla.org/MPL/2.0/.
# Usage: $(call banner,foo bar tans)
banner =\
$(info )\
$(info ***************************************************************************)\
$(info ** BANNER: $(1) $(2) $(3) $(4) $(5) $(6) $(7) $(8) $(9))\
$(info ***************************************************************************)\
## Identify function argument types ## Identify function argument types
istype =$(if $(value ${1}),list,scalar) istype =$(if $(value ${1}),list,scalar)
isval =$(if $(filter-out list,$(call istype,${1})),true) isval =$(if $(filter-out list,$(call istype,${1})),true)
@ -35,6 +28,62 @@ argv +=)
## getarglist() would be a more accurate name but is longer to type ## getarglist() would be a more accurate name but is longer to type
getargv = $(if $(call isvar,$(1)),$($(1)),$(argv)) getargv = $(if $(call isvar,$(1)),$($(1)),$(argv))
###########################################################################
# Strip [n] leading options from an argument list. This will allow passing
# extra args to user functions that will not propogate to sub-$(call )'s
# Usage: $(call subargv,2)
subargv =$(wordlist $(1),$(words $(getargv)),$(getargv))
###########################################################################
# Intent: Display a distinct banner heading in the output stream
# Usage: $(call banner,BUILDING: foo bar tans)
# Debug:
# target-preqs = \
# $(call banner,target-preqs-BEGIN) \
# foo bar tans \
# $(call banner,target-preqs-END) \
# $(NULL)
# target: $(target-preqs)
banner =\
$(info )\
$(info ***************************************************************************)\
$(info ** $(getargv))\
$(info ***************************************************************************)\
$(NULL)
#####################################################################
# Intent: Determine if a string or pattern is contained in a list
# Usage: strcmp - $(call if_XinY,clean,$(MAKECMDGOALS))
# : pattern - $(call if_XinY,clean%,$(MAKECMDGOALS))
is_XinY =$(filter $(1),$(call subargv,3,$(getargv)))
#####################################################################
# Provide an alternate var to support testing
ifdef MAKEUTILS_UNIT_TEST
mcg_goals=TEST_MAKECMDGOALS
else
mcg_goals=MAKECMDGOALS
endif
# Intent: Conditionals for detecting common/tier target use
# Todo: are check, install, test needed ?
isTargetStem = $(sort $(foreach pat, $(1)% %$(1), $(call is_XinY,$(pat),${$(mcg_goals)})))
isTargetStemClean = $(call isTargetStem,clean)
isTargetStemExport = $(call isTargetStem,export)
isTargetStemLibs = $(call isTargetStem,libs)
isTargetStemTools = $(call isTargetStem,tools)
##################################################
# Intent: Validation functions / unit test helpers
errorifneq =$(if $(subst $(strip $(1)),$(NULL),$(strip $(2))),$(error expected [$(1)] but found [$(2)]))
# Intent: verify function declaration exists
requiredfunction =$(foreach func,$(1) $(2) $(3) $(4) $(5) $(6) $(7) $(8) $(9),$(if $(value $(func)),$(NULL),$(error required function [$(func)] is unavailable)))
## http://www.gnu.org/software/make/manual/make.html#Call-Function ## http://www.gnu.org/software/make/manual/make.html#Call-Function
## Usage: o = $(call map,origin,o map $(MAKE)) ## Usage: o = $(call map,origin,o map $(MAKE))
map = $(foreach val,$(2),$(call $(1),$(val))) map = $(foreach val,$(2),$(call $(1),$(val)))

View File

@ -10,6 +10,8 @@ srcdir = @srcdir@
VPATH = @srcdir@ VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk include $(DEPTH)/config/autoconf.mk
MAKEUTILS_UNIT_TEST = 1
include $(topsrcdir)/config/makefiles/makeutils.mk include $(topsrcdir)/config/makefiles/makeutils.mk
##------------------_## ##------------------_##
@ -29,9 +31,10 @@ all::
check:: check::
@true @true
###########################################################################
## Logic processed at compile time so be selective about when to test ## Logic processed at compile time so be selective about when to test
ifneq ($(NULL),$(findstring check,$(MAKECMDGOALS))) #{ ## Verify istype, isval, isvar, getargv, subargv
ifneq ($(NULL),$(findstring check,$(MAKECMDGOALS))) #
ifdef VERBOSE ifdef VERBOSE
@ -45,11 +48,14 @@ $(info Running test: istype, getargv)
$(info ===========================================================================) $(info ===========================================================================)
endif endif
## Silent errors are oh so much fun ifndef requiredfunction
ifndef istype $(error requiredfunction is not defined)
$(error makeutils.mk was not included)
endif endif
include $(topsrcdir)/config/makefiles/test/check_XinY.mk
$(call requiredfunc,istype isvar isval)
# arg_scalar = [scalar|literal] # arg_scalar = [scalar|literal]
arg_list = foo bar arg_list = foo bar
arg_ref = arg_list arg_ref = arg_list
@ -124,4 +130,13 @@ ifdef MANUAL_TEST #{
$(error TEST FAILED: processing should not reach this point) $(error TEST FAILED: processing should not reach this point)
endif #} endif #}
endif #} check in MAKECMDGOALS # Verify subargv expansion
##########################
subargs=foo bar tans fans
subargs_exp=tans fans
subargs_found=$(call subargv,4,$(subargs))
ifneq ($(subargs_exp),$(subargs_found))
$(error subargv(4,$(subargs)): expected [$(subargs_exp)] found [$(subargs_found)])
endif
endif #} unit_test: istype, isvar, isval, getargv, subargv

View File

@ -0,0 +1,47 @@
# -*- makefile -*-
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.
# Verify dependencies are available
$(call requiredfunction,getargv subargv is_XinY errorifneq)
#############################
ifdef VERBOSE
$(warning )
$(call banner,Unit test: is_XinY)
endif
zero := 0
one := 1
# Verify 'invalid' is not matched
val := invalid
$(call errorifneq,$(zero),$(words $(call is_XinY,foo,$(val))))
$(call errorifneq,$(zero),$(words $(call is_XinY,clean,$(val))))
$(call errorifneq,$(zero),$(words $(call is_XinY,clean%,$(val))))
# verify strcmp('clean')
val := clean
$(call errorifneq,$(zero),$(words $(call is_XinY,foo,$(val))))
$(call errorifneq,$(one),$(words $(call is_XinY,clean,$(val))))
$(call errorifneq,$(one,$(words $(call is_XinY,clean%,$(val)))))
$(call errorifneq,$(one),$(words $(call is_XinY,%clean,$(val))))
# List match for 'clean'
val := blah clean distclean FcleanG clean-level-1
wanted := clean distclean clean-level-1
$(call errorifneq,$(zero),$(words $(call is_XinY_debug,foo,$(val))))
$(call errorifneq,$(one),$(words $(call is_XinY,clean,$(val))))
$(call errorifneq,$(one),$(words $(call is_XinY,distclean,$(val))))
# pattern match 'clean'
# match: clean, distclean, clean-level-1
# exclude: FcleanG
TEST_MAKECMDGOALS := $(val)
$(call errorifneq,3,$(words $(call isTargetStemClean)))
TEST_MAKECMDGOALS := invalid
$(call errorifneq,$(zero),$(words $(call isTargetStemClean)))

View File

@ -50,8 +50,5 @@ endif
AUTO_DEPS +=$(GENERATED_DIRS_DEPS) AUTO_DEPS +=$(GENERATED_DIRS_DEPS)
# Complain loudly if deps have not loaded so getargv != $(NULL) # Complain loudly if deps have not loaded so getargv != $(NULL)
ifndef getargv $(call requiredfunction,getargv)
$(error config/makefiles/makeutil.mk has not been included)
endif

View File

@ -5,13 +5,6 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this file, # License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/. # You can obtain one at http://mozilla.org/MPL/2.0/.
# Usage: $(call banner,foo bar tans)
banner =\
$(info )\
$(info ***************************************************************************)\
$(info ** BANNER: $(1) $(2) $(3) $(4) $(5) $(6) $(7) $(8) $(9))\
$(info ***************************************************************************)\
## Identify function argument types ## Identify function argument types
istype =$(if $(value ${1}),list,scalar) istype =$(if $(value ${1}),list,scalar)
isval =$(if $(filter-out list,$(call istype,${1})),true) isval =$(if $(filter-out list,$(call istype,${1})),true)
@ -35,6 +28,62 @@ argv +=)
## getarglist() would be a more accurate name but is longer to type ## getarglist() would be a more accurate name but is longer to type
getargv = $(if $(call isvar,$(1)),$($(1)),$(argv)) getargv = $(if $(call isvar,$(1)),$($(1)),$(argv))
###########################################################################
# Strip [n] leading options from an argument list. This will allow passing
# extra args to user functions that will not propogate to sub-$(call )'s
# Usage: $(call subargv,2)
subargv =$(wordlist $(1),$(words $(getargv)),$(getargv))
###########################################################################
# Intent: Display a distinct banner heading in the output stream
# Usage: $(call banner,BUILDING: foo bar tans)
# Debug:
# target-preqs = \
# $(call banner,target-preqs-BEGIN) \
# foo bar tans \
# $(call banner,target-preqs-END) \
# $(NULL)
# target: $(target-preqs)
banner =\
$(info )\
$(info ***************************************************************************)\
$(info ** $(getargv))\
$(info ***************************************************************************)\
$(NULL)
#####################################################################
# Intent: Determine if a string or pattern is contained in a list
# Usage: strcmp - $(call if_XinY,clean,$(MAKECMDGOALS))
# : pattern - $(call if_XinY,clean%,$(MAKECMDGOALS))
is_XinY =$(filter $(1),$(call subargv,3,$(getargv)))
#####################################################################
# Provide an alternate var to support testing
ifdef MAKEUTILS_UNIT_TEST
mcg_goals=TEST_MAKECMDGOALS
else
mcg_goals=MAKECMDGOALS
endif
# Intent: Conditionals for detecting common/tier target use
# Todo: are check, install, test needed ?
isTargetStem = $(sort $(foreach pat, $(1)% %$(1), $(call is_XinY,$(pat),${$(mcg_goals)})))
isTargetStemClean = $(call isTargetStem,clean)
isTargetStemExport = $(call isTargetStem,export)
isTargetStemLibs = $(call isTargetStem,libs)
isTargetStemTools = $(call isTargetStem,tools)
##################################################
# Intent: Validation functions / unit test helpers
errorifneq =$(if $(subst $(strip $(1)),$(NULL),$(strip $(2))),$(error expected [$(1)] but found [$(2)]))
# Intent: verify function declaration exists
requiredfunction =$(foreach func,$(1) $(2) $(3) $(4) $(5) $(6) $(7) $(8) $(9),$(if $(value $(func)),$(NULL),$(error required function [$(func)] is unavailable)))
## http://www.gnu.org/software/make/manual/make.html#Call-Function ## http://www.gnu.org/software/make/manual/make.html#Call-Function
## Usage: o = $(call map,origin,o map $(MAKE)) ## Usage: o = $(call map,origin,o map $(MAKE))
map = $(foreach val,$(2),$(call $(1),$(val))) map = $(foreach val,$(2),$(call $(1),$(val)))