make : rule call rule

后端 未结 5 785
一生所求
一生所求 2020-12-23 16:10

In a makefile, can I call a rule from another rule?

Similar to:

rule1:
        echo \"bye\"
rule2:
        date
rule3:
        @echo \"hello\"
               


        
相关标签:
5条回答
  • 2020-12-23 16:25

    Either use dependencies or recursive making to connect from one rule to another.

    Dependencies would be done like this (though the order will be different):

    rule1:
            echo "bye"
    rule2:
            date
    rule3: rule1
            @echo "hello"
    

    Recursive make would be done like this (though it does involve a subprocess):

    rule1:
            echo "bye"
    rule2:
            date
    rule3:
            @echo "hello"
            $(MAKE) rule1
    

    Neither is perfect; indeed, with recursive make you can get into significant problems if you build a loop. You also probably ought to add a .PHONY rule so as to mark those rules above as synthetic, so that a stray rule1 (etc.) in the directory won't cause confusion.

    0 讨论(0)
  • 2020-12-23 16:27

    There are two advanced functions in GNU Make which can do this, although it should only be used in extenuating circumstances. This SO is top rated in google.

    Rule prerequisites are more recommended, but sometimes you need a post-requisite.

    GNU Make Call function

    GNU Make Eval function

    Essentially, Eval lets you build targets on the fly, and Call allows function like "defines" to be created.

    0 讨论(0)
  • 2020-12-23 16:34

    A simple way to do it is:

    ifeq (a, b)
        build_target:=one
    else
        build_target:=two
    endif
    
    mytarget: $(build_target)
    
    0 讨论(0)
  • 2020-12-23 16:37

    Makefiles are not procedural; "rules" are not like functions. That said, you can specify that one rule is a prerequisite of another:

    rule1:
        @echo "Rule 1"
    
    rule2: rule1
        @echo "Rule 2"
    

    If you do make rule2, you should see:

    Rule 1
    Rule 2
    
    0 讨论(0)
  • 2020-12-23 16:41

    Just add a new rule with the ordering you want..

    rule1:
            echo "bye"
    rule2:
            date
    rule3:
            @echo "hello"
    
    rule4: rule3 rule1
    
    0 讨论(0)
提交回复
热议问题