# the system would allow it), or our implementation will likely suffer in
# performance and in memory consumption.
-# $(call am.xargs-map,FUNCTION,LIST)
-# ----------------------------------
-# Map the function $1 on the arguments $2, ensuring that each
-# call of $1 has at most 40 arguments.
+# $(call am.xargs-map,FUNCTION,LIST,[EXTRA-ARGS..])
+# -------------------------------------------------
+# Map the function $1 on the whitespace-separated list $2, ensuring that
+# each call of $1 has at most 40 entries from that list at once. If
+# further arguments are given (up to $9), they are passed to each $1
+# invocation.
# This implementation is hacky, but the more elegant or "naive" ones
# (based on recursion) proved to be ludicrously memory-hungry with
# huge lists.
)$(eval $0.counter := $$($0.counter)x)$(strip \
)$(eval $0.partial-args += $$i)$(strip \
)$(if $(filter $(am.max-cmdline-args),$($0.counter)),$(strip \
- )$(call $1,$(strip $($0.partial-args)))$(strip \
+ )$(call $1,$(strip $($0.partial-args)),$3,$4,$5,$6,$7,$8,$9)$(strip \
)$(eval $0.partial-args :=)$(strip \
)$(eval $0.counter :=)))$(strip \
- )$(if $($0.counter),$(call $1,$(strip $($0.partial-args)))))
+ )$(if $($0.counter),$(call $1,$(strip \
+ $($0.partial-args)),$3,$4,$5,$6,$7,$8,$9)))
endef
# Used only by the 'am.clean-cmd.*' functions below. Do not use in
# Filter out Automake comments.
grep -v '^##' "$am_amdir"/header-vars.mk > defn.mk \
|| fatal_ "fetching makefile fragment headers-vars.am"
+echo 'x-warning = $(warning $1)' >> defn.mk
+echo 'y-warning = $(warning $1 -- $2)' >> defn.mk
sed 's/^[0-9][0-9]*:://' > Makefile << 'END'
01::include ./defn.mk
08::
09::WARN := no
10::ifeq ($(WARN),yes)
-11:: $(call am.xargs-map,warning,$(args16))
-12:: $(call am.xargs-map,warning,$(args16) 0 1 2 3)
-13:: $(call am.xargs-map,warning,x y z)
-14::endif
+11:: $(call am.xargs-map,x-warning,$(args16))
+12:: $(call am.xargs-map,x-warning,$(args16) 0 1 2 3)
+13:: $(call am.xargs-map,x-warning,x y z)
+14:: $(call am.xargs-map,y-warning,$(args16) 0 1 2 3,X)
+15::endif
args32 := $(args16) $(args16)
args64 := $(args32) $(args32)
$(call am.xargs-map,bar,$(args16))
args = $(error 'args' should be overridden from the command line)
+more-args = $(error 'more-args' should be overridden from the command line)
+
foo = @echo $1$(am.chars.newline)
echo-xargs-map:
$(call am.xargs-map,foo,$(args))
+
+foo2 = @echo $1$(if $2, -- $2)$(am.chars.newline)
+echo2-xargs-map:
+ $(call am.xargs-map,foo2,$(args),$(more-args))
END
args1="0 1 2 3 4 5 6 7 8 9"
test $(grep -c "^Makefile:12: $args4$" stderr) -eq 4
test $(grep -c "^Makefile:12: 0 1 2 3$" stderr) -eq 1
test $(grep -c "^Makefile:13: x y z$" stderr) -eq 1
-test $(grep -c "^Makefile:" stderr) -eq 10
+test $(grep -c "^Makefile:14: $args4 -- X$" stderr) -eq 4
+test $(grep -c "^Makefile:14: 0 1 2 3 -- X" stderr) -eq 1
+test $(grep -c "^Makefile:" stderr) -eq 15
$MAKE 'test-xargs-map'
check_echo ()
{
cat > exp
- $MAKE --no-print-directory "echo-xargs-map" args="$1" >got \
+ mk="$MAKE --no-print-directory"
+ case $# in
+ 1) $mk "echo-xargs-map" args="$1";;
+ 2) $mk "echo2-xargs-map" args="$1" more-args="$2";;
+ *) fatal_ "check_echo: incorrect usage";;
+ esac >got \
|| { cat got >&2; exit 1; }
cat exp && cat got && diff exp got || exit 1
}
-echo "$args1" | check_echo '$(args1)'
-echo "$args2" | check_echo '$(args2)'
-echo "$args4" | check_echo '$(args4)'
+echo "$args1" | check_echo '$(args1)'
+echo "$args1 -- x" | check_echo '$(args1)' x
+echo "$args2" | check_echo '$(args2)'
+echo "$args2 -- no" | check_echo '$(args2)' '$(WARN)'
+echo "$args4" | check_echo '$(args4)'
+echo "$args4 -- a b c" | check_echo '$(args4)' '$(notdir x/a ./b c)'
check_echo '$(args8)'<<END
$args4
x
END
+check_echo "$args4 $args4 x" '.:.' <<END
+$args4 -- .:.
+$args4 -- .:.
+x -- .:.
+END
+
check_echo "$args4 01 02 03 04 05 06 07" <<END
$args4
01 02 03 04 05 06 07
END
+check_echo "$args4 01 2 03" "+++" <<END
+$args4 -- +++
+01 2 03 -- +++
+END
+
check_echo '$(args32) 11 12 13 67' <<END
$args4
$args4
11 12 13 67
END
+check_echo '$(args32) 11 12 13 67' 'lol cat' <<END
+$args4 -- lol cat
+$args4 -- lol cat
+$args4 -- lol cat
+$args4 -- lol cat
+$args4 -- lol cat
+$args4 -- lol cat
+$args4 -- lol cat
+$args4 -- lol cat
+11 12 13 67 -- lol cat
+END
+
check_echo '$(args64)' <<END
$args4
$args4