Makefile:定义食谱中的规则和先决条件

时间:2016-08-28 05:36:27

标签: makefile gnu-make

我有一个设置,我想用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'} BARblub时,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

1 个答案:

答案 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的脚本。