我有一个设置,我想用make处理的文件取决于另一个程序的输出。构建程序及其所有先决条件 也是一个复杂的任务,所以我也想使用make。现在我的问题是,似乎没有人可以在Makefile配方中生成规则和先决条件。请考虑以下代码:
bar:
echo target1 target2 target3 > bar
foo: bar
$(eval BAR := $(shell cat bar))
define FUN
$(1):
touch a$(1)
endef
ifdef BAR
$(foreach i,$BAR,$(eval $(call FUN,$(i))))
endif
blub: foo $(BAR)
我替换了一大堆复杂的食谱,这些食谱导致我最终希望通过bar
食谱生成我想要的文件列表。实际上,生成bar
的内容非常复杂,应该通过一组Makefile配方来完成,而不能仅仅通过(如上所示)来完成:
BAR:=$(shell echo target1 target2 target3)
我想将foreach
循环放入foo
的配方中,但失败的prerequisites cannot be defined in recipes
是有道理的,并在function define in makefile中解释
但似乎当make blub
foo
eval'} BAR
为blub
时,bar
的先决条件不是blub
重新评价。
所以我认为最终我要找两件事:
如何在运行时动态生成配方,基于(并依赖于)另一个配方(在这种情况下为bar
)输出?
如何根据(并依赖于)另一个配方(在这种情况下为.PHONY: all
all: blub
-include bar.make
.PHONY: blub
blub: $(BAR)
echo $^
bar.make: Makefile
printf 'BAR=target1 target2 target3\n' > $@
printf 'target1 target2 target3:\n' >>$@
printf '\ttouch $$@' >> $@
.PHONY: clean
clean:
rm -f target1 target2 target3 bar.make
)输出,在运行时动态更新目标(在这种情况下为from PIL import Image
img = Image.open('./image.jpg')
sub_image = img.crop(box=(200,0,320,120)).rotate(90)
img.paste(sub_image, box=(200,0))
)的先决条件
谢谢!
编辑:解决方案
在@ user657267的帮助下,以下似乎解决了我的问题:
def circle_rotate(image, x, y, radius, degree):
img_arr = numpy.asarray(image)
box = (x-radius, y-radius, x+radius+1, y+radius+1)
crop = image.crop(box=box)
crop_arr = numpy.asarray(crop)
# build the cirle mask
mask = numpy.zeros((2*radius+1, 2*radius+1))
for i in range(crop_arr.shape[0]):
for j in range(crop_arr.shape[1]):
if (i-radius)**2 + (j-radius)**2 <= radius**2:
mask[i,j] = 1
# create the new circular image
sub_img_arr = numpy.empty(crop_arr.shape ,dtype='uint8')
sub_img_arr[:,:,:3] = crop_arr[:,:,:3]
sub_img_arr[:,:,3] = mask*255
sub_img = Image.fromarray(sub_img_arr, "RGBA").rotate(degree)
i2 = image.copy()
i2.paste(sub_img, box[:2], sub_img.convert('RGBA'))
return i2
i2 = circle_rotate(img, 260, 60, 60, 45)
i2
答案 0 :(得分:3)
听起来你应该使用make的自我改造功能
<?php
echo "Is fork? <br/>";
var_dump (extension_loaded('pcntl'));
echo "<br><br> more checks: <br>";
$supports = array();
if (function_exists("pcntl_fork")) $supports[] = "ispcntl";
echo implode(",", $supports);
for ($i = 1; $i <= 5; ++$i) {
$pid = pcntl_fork();
if (!$pid) {
sleep(1);
print "In child $i\n";
exit;
}
}
?>
显然-include bar.make
blub: $(BAR)
@echo $^
bar.make:
@echo BAR := target1 target2 target3 > $@
@echo target1 target2 target3: ; touch $$@ >> $@
的配方是人为的,在现实世界中,他们可能会调用某种输出有效makefile的脚本。