diff options
Diffstat (limited to 'support')
-rwxr-xr-x | support/download/bzr | 4 | ||||
-rwxr-xr-x | support/download/cp | 4 | ||||
-rwxr-xr-x | support/download/cvs | 4 | ||||
-rwxr-xr-x | support/download/git | 6 | ||||
-rwxr-xr-x | support/download/hg | 4 | ||||
-rwxr-xr-x | support/download/scp | 4 | ||||
-rwxr-xr-x | support/download/svn | 4 | ||||
-rwxr-xr-x | support/download/wget | 4 | ||||
-rw-r--r-- | support/misc/utils.mk | 111 |
9 files changed, 136 insertions, 9 deletions
diff --git a/support/download/bzr b/support/download/bzr index e18b01f39..75b7b415c 100755 --- a/support/download/bzr +++ b/support/download/bzr @@ -26,6 +26,8 @@ repo="${2}" rev="${3}" basename="${4}" +shift 4 # Get rid of our options + # Caller needs to single-quote its arguments to prevent them from # being expanded a second time (in case there are spaces in them) _bzr() { @@ -49,5 +51,5 @@ if [ ${bzr_version} -ge ${bzr_min_version} ]; then fi _bzr export ${verbose} --root="'${basename}/'" --format=tgz \ - ${timestamp_opt} - "'${repo}'" -r "'${rev}'" \ + ${timestamp_opt} - "${@}" "'${repo}'" -r "'${rev}'" \ >"${output}" diff --git a/support/download/cp b/support/download/cp index 09ce3d110..0ee1f3ba8 100755 --- a/support/download/cp +++ b/support/download/cp @@ -28,10 +28,12 @@ shift $((OPTIND-1)) output="${1}" source="${2}" +shift 2 # Get rid of our options + # Caller needs to single-quote its arguments to prevent them from # being expanded a second time (in case there are spaces in them) _localfiles() { eval ${LOCALFILES} "${@}" } -_localfiles ${verbose} "'${source}'" "'${output}'" +_localfiles ${verbose} "${@}""'${source}'" "'${output}'" diff --git a/support/download/cvs b/support/download/cvs index 7980389a4..50050ab1c 100755 --- a/support/download/cvs +++ b/support/download/cvs @@ -26,6 +26,8 @@ rev="${3}" rawname="${4}" basename="${5}" +shift 5 # Get rid of our options + # Caller needs to single-quote its arguments to prevent them from # being expanded a second time (in case there are spaces in them) _cvs() { @@ -48,6 +50,6 @@ fi export TZ=UTC _cvs ${verbose} -z3 -d"'${repo}'" \ - co -d "'${basename}'" ${select} "'${rev}'" -P "'${rawname}'" + co "${@}" -d "'${basename}'" ${select} "'${rev}'" -P "'${rawname}'" tar czf "${output}" "${basename}" diff --git a/support/download/git b/support/download/git index 416cd1baf..281db61a9 100755 --- a/support/download/git +++ b/support/download/git @@ -30,6 +30,8 @@ repo="${2}" cset="${3}" basename="${4}" +shift 4 # Get rid of our options + # Caller needs to single-quote its arguments to prevent them from # being expanded a second time (in case there are spaces in them) _git() { @@ -46,7 +48,7 @@ _git() { git_done=0 if [ -n "$(_git ls-remote "'${repo}'" "'${cset}'" 2>&1)" ]; then printf "Doing shallow clone\n" - if _git clone ${verbose} --depth 1 -b "'${cset}'" "'${repo}'" "'${basename}'"; then + if _git clone ${verbose} "${@}" --depth 1 -b "'${cset}'" "'${repo}'" "'${basename}'"; then git_done=1 else printf "Shallow clone failed, falling back to doing a full clone\n" @@ -54,7 +56,7 @@ if [ -n "$(_git ls-remote "'${repo}'" "'${cset}'" 2>&1)" ]; then fi if [ ${git_done} -eq 0 ]; then printf "Doing full clone\n" - _git clone ${verbose} "'${repo}'" "'${basename}'" + _git clone ${verbose} "${@}" "'${repo}'" "'${basename}'" fi pushd "${basename}" >/dev/null diff --git a/support/download/hg b/support/download/hg index 25cb4e9d3..3af01690b 100755 --- a/support/download/hg +++ b/support/download/hg @@ -25,13 +25,15 @@ repo="${2}" cset="${3}" basename="${4}" +shift 4 # Get rid of our options + # Caller needs to single-quote its arguments to prevent them from # being expanded a second time (in case there are spaces in them) _hg() { eval ${HG} "${@}" } -_hg clone ${verbose} --noupdate "'${repo}'" "'${basename}'" +_hg clone ${verbose} "${@}" --noupdate "'${repo}'" "'${basename}'" _hg archive ${verbose} --repository "'${basename}'" --type tgz \ --prefix "'${basename}'" --rev "'${cset}'" \ diff --git a/support/download/scp b/support/download/scp index 95cf502be..825fd41c6 100755 --- a/support/download/scp +++ b/support/download/scp @@ -23,10 +23,12 @@ shift $((OPTIND-1)) output="${1}" url="${2}" +shift 2 # Get rid of our options + # Caller needs to single-quote its arguments to prevent them from # being expanded a second time (in case there are spaces in them) _scp() { eval ${SCP} "${@}" } -_scp ${verbose} "'${url}'" "'${output}'" +_scp ${verbose} "${@}" "'${url}'" "'${output}'" diff --git a/support/download/svn b/support/download/svn index 4dcdd0623..77abf3d02 100755 --- a/support/download/svn +++ b/support/download/svn @@ -25,12 +25,14 @@ repo="${2}" rev="${3}" basename="${4}" +shift 4 # Get rid of our options + # Caller needs to single-quote its arguments to prevent them from # being expanded a second time (in case there are spaces in them) _svn() { eval ${SVN} "${@}" } -_svn export ${verbose} "'${repo}@${rev}'" "'${basename}'" +_svn export ${verbose} "${@}" "'${repo}@${rev}'" "'${basename}'" tar czf "${output}" "${basename}" diff --git a/support/download/wget b/support/download/wget index 0fc7ffa94..768de904c 100755 --- a/support/download/wget +++ b/support/download/wget @@ -23,10 +23,12 @@ shift $((OPTIND-1)) output="${1}" url="${2}" +shift 2 # Get rid of our options + # Caller needs to single-quote its arguments to prevent them from # being expanded a second time (in case there are spaces in them) _wget() { eval ${WGET} "${@}" } -_wget ${verbose} -O "'${output}'" "'${url}'" +_wget ${verbose} "${@}" -O "'${output}'" "'${url}'" diff --git a/support/misc/utils.mk b/support/misc/utils.mk new file mode 100644 index 000000000..990a3d1fd --- /dev/null +++ b/support/misc/utils.mk @@ -0,0 +1,111 @@ +################################################################################ +# +# This file contains various utility macros and variables used about +# everywhere in make constructs. +# +################################################################################ + +# Strip quotes and then whitespaces +qstrip = $(strip $(subst ",,$(1))) +#")) + +# Variables for use in Make constructs +comma := , +empty := +space := $(empty) $(empty) + +# Case conversion macros. This is inspired by the 'up' macro from gmsl +# (http://gmsl.sf.net). It is optimised very heavily because these macros +# are used a lot. It is about 5 times faster than forking a shell and tr. +# +# The caseconvert-helper creates a definition of the case conversion macro. +# After expansion by the outer $(eval ), the UPPERCASE macro is defined as: +# $(strip $(eval __tmp := $(1)) $(eval __tmp := $(subst a,A,$(__tmp))) ... ) +# In other words, every letter is substituted one by one. +# +# The caseconvert-helper allows us to create this definition out of the +# [FROM] and [TO] lists, so we don't need to write down every substition +# manually. The uses of $ and $$ quoting are chosen in order to do as +# much expansion as possible up-front. +# +# Note that it would be possible to conceive a slightly more optimal +# implementation that avoids the use of __tmp, but that would be even +# more unreadable and is not worth the effort. + +[FROM] := a b c d e f g h i j k l m n o p q r s t u v w x y z - . +[TO] := A B C D E F G H I J K L M N O P Q R S T U V W X Y Z _ _ + +define caseconvert-helper +$(1) = $$(strip \ + $$(eval __tmp := $$(1))\ + $(foreach c, $(2),\ + $$(eval __tmp := $$(subst $(word 1,$(subst :, ,$c)),$(word 2,$(subst :, ,$c)),$$(__tmp))))\ + $$(__tmp)) +endef + +$(eval $(call caseconvert-helper,UPPERCASE,$(join $(addsuffix :,$([FROM])),$([TO])))) +$(eval $(call caseconvert-helper,LOWERCASE,$(join $(addsuffix :,$([TO])),$([FROM])))) + +# Sanitize macro cleans up generic strings so it can be used as a filename +# and in rules. Particularly useful for VCS version strings, that can contain +# slashes, colons (OK in filenames but not in rules), and spaces. +sanitize = $(subst $(space),_,$(subst :,_,$(subst /,_,$(strip $(1))))) + +# MESSAGE Macro -- display a message in bold type +MESSAGE = echo "$(TERM_BOLD)>>> $($(PKG)_NAME) $($(PKG)_VERSION) $(call qstrip,$(1))$(TERM_RESET)" +TERM_BOLD := $(shell tput smso 2>/dev/null) +TERM_RESET := $(shell tput rmso 2>/dev/null) + +# Utility functions for 'find' +# findfileclauses(filelist) => -name 'X' -o -name 'Y' +findfileclauses = $(call notfirstword,$(patsubst %,-o -name '%',$(1))) +# finddirclauses(base, dirlist) => -path 'base/dirX' -o -path 'base/dirY' +finddirclauses = $(call notfirstword,$(patsubst %,-o -path '$(1)/%',$(2))) + +# Miscellaneous utility functions +# notfirstword(wordlist): returns all but the first word in wordlist +notfirstword = $(wordlist 2,$(words $(1)),$(1)) + +# Needed for the foreach loops to loop over the list of hooks, so that +# each hook call is properly separated by a newline. +define sep + + +endef + +PERCENT = % +QUOTE = ' +# ' # Meh... syntax-highlighting + +# This macro properly escapes a command string, then prints it with printf: +# +# - first, backslash '\' are self-escaped, so that they do not escape +# the following char and so that printf properly outputs a backslash; +# +# - next, single quotes are escaped by closing an existing one, adding +# an escaped one, and re-openning a new one (see below for the reason); +# +# - then '%' signs are self-escaped so that the printf does not interpret +# them as a format specifier, in case the variable contains an actual +# printf with a format; +# +# - finally, $(sep) is replaced with the literal '\n' so that make does +# not break on the so-expanded variable, but so that the printf does +# correctly output an LF. +# +# Note: this must be escaped in this order to avoid over-escaping the +# previously escaped elements. +# +# Once everything has been escaped, it is passed between single quotes +# (that's why the single-quotes are escaped they way they are, above, +# and why the dollar sign is not escaped) to printf(1). A trailing +# newline is apended, too. +# +# Note: leading or trailing spaces are *not* stripped. +# +define PRINTF + printf '$(subst $(sep),\n,\ + $(subst $(PERCENT),$(PERCENT)$(PERCENT),\ + $(subst $(QUOTE),$(QUOTE)\$(QUOTE)$(QUOTE),\ + $(subst \,\\,$(1)))))\n' +endef |