makefile中的假目标

时间:2015-10-28 06:06:21

标签: linux makefile gnu

我试图在此link中执行该示例。

all : prog1 prog2 prog3
.PHONY : all

prog1 : prog1.o utils.o
    cc -o prog1 prog1.o utils.o

prog2 : prog2.o
    cc -o prog2 prog2.o

prog3 : prog3.o sort.o utils.o
    cc -o prog3 prog3.o sort.o utils.o

有或没有PHONY(如果我注释掉.PHONY线),输出是相同的。 PHONY的真正用途是什么?

文章提到了这个

When one directory contains multiple programs, it is most convenient to describe all of the programs in one makefile

Since the target remade by default will be the first one in the makefile, it is common to make this a phony target named ‘all’ and give it, as prerequisites, all the individual programs

我无法理解PHONY的实际用途。在这个例子中,有人能指出一个场景,在没有PHONY的情况下程序的行为会有所不同吗?

2 个答案:

答案 0 :(得分:3)

没有.PHONY"所有"只是一个常规的制作目标,它取决于prog1,prog2,prog3。这意味着如果一个名为" all"会发生在比prog1,prog2和prog3更新的目录中,它们不会被构建(试试吧!) - 但这显然不是你想到的。

.PHONY告诉GNU make" all"目标是假的 - 你真的不想用于一个名为" all"要创建它,它应该构建依赖关系,无论文件名为" all"存在与否。

稍后添加:

我的上面所有和prog1的例子不正确,尽管一般的想法是正确的。这是一个非常简单的例子

jQuery(".nks_cc_trigger_element").click(function(){
        var str = jQuery(this).attr("data-product_id");
        jQuery.ajax({
        url: "/ajax_product.php?q="+parseInt(str), 
        type: 'POST',
        dataType: 'json',
        success: function(result){
        jQuery("#nks-content-1 > div").html(result);
        console.log(result);
        },
        error: function(jqXHR,error, errorThrown) {  
        if(jqXHR.status&&jqXHR.status==400){
        alert(jqXHR.responseText); 
        }else{
        alert("Something went wrong");
        alert(jqXHR.responseText);
        }
        }
        }).done(function() {

        }); 
    >>PHP CODE  

    echo json_encode($data) ; 

答案 1 :(得分:2)

至少对于GNU Make与此示例相结合,无论目标是" all"还是有关输出的行为都是相同的。是假的目标。即使有一个名为" all"。

的文件

但是如链接后面的手册中所述,GNU Make的内部行为是不同的。如果"所有" GNU Make不是一个虚假的目标,它会检查一个名为" all"的文件。存在并且比其先决条件更早。尝试"制作-d"你会发现差异。

另一个重要的一点是,伪目标的配方总是被执行。如果你举这个例子:

all: goal
    echo "Done"

.PHONY : clean

goal:
    echo "Hello World!" > $(@)

clean:
    rm -f goal all

...并执行此操作:

$ make clean
rm -f goal all
$ make
echo "Hello World!" > goal
echo "Done"
Done
$ make
echo "Done"
Done
$ touch all
$ make
make: 'all' is up to date.

...创建文件" all"。

后,不会执行配方

" all"是一个虚假的目标:

all: goal
    echo "Done"

.PHONY : all clean

goal:
    echo "Hello World!" > $(@)

clean:
    rm -f goal all

..." all"的食谱将始终独立于文件" all"。

的存在执行
$ make clean
rm -f goal all
$ make
echo "Hello World!" > goal
echo "Done"
Done
$ make
echo "Done"
Done
$ make
echo "Done"
Done
$ touch all
$ make
echo "Done"
Done
$ make
echo "Done"
Done