Давайте добавим еще код отладки.
all: $TARGETS
define f2
$$(info f2 called on $(1))
.PHONY: target$(1)
target$(1):
echo "We are in $(1)"
TARGETS+=target$(1)
endef
define f1
VAR$(1)=ValueWith$(1)
$(info too early: VAR$(1) is $$(VAR$(1)))
$$(info right time: VAR$(1) is $$(VAR$(1)))
$(eval $(call f2,$(VAR$(1))))
endef
$(eval $(call f1,CallOne))
$(eval $(call f1,CallTwo))
$(warning Warning: $(TARGETS))
Вывод:
too early: VARCallOne is $(VARCallOne)
f2 called on
right time: VARCallOne is ValueWithCallOne
too early: VARCallTwo is $(VARCallTwo)
f2 called on
debug.mk:18: warning: overriding commands for target `target'
debug.mk:17: warning: ignoring old commands for target `target'
right time: VARCallTwo is ValueWithCallTwo
debug.mk:20: Warning: target target
make: *** No rule to make target `ARGETS', needed by `all'. Stop.
Проблема в том, что вызов eval
выполняется до определения VAR…
, в то время как функция f1
раскрывается , а не во время обработки результата этого расширения. Вам нужно отложить выполнение eval
.
Также есть опечатка в строке 1; если вы исправите это, вы обнаружите, что цель all
ничего не строит, поскольку TARGETS
не определен во время его использования. Позже вам нужно будет объявить зависимости.
all: # default target, declare it first
define f2
.PHONY: target$(1)
target$(1):
echo "We are in $(1)"
TARGETS+=target$(1)
endef
define f1
VAR$(1)=ValueWith$(1)
$$(eval $$(call f2,$$(VAR$(1))))
endef
$(eval $(call f1,CallOne))
$(eval $(call f1,CallTwo))
$(warning Warning: $(TARGETS))
all: $(TARGETS)
Por supuesto, puede hacerlo con imagemagick
que puede instalar a través de macports o brew .
En OS X también puede hacerlo a través de la aplicación Vista previa .
El tamaño de mi captura de pantalla se tomó deCalculadora de relación de aspecto(No estoy seguro de que sea útil para usted, pero es un buen punto de partida para ajustar el procedimiento de imagen según sus necesidades):