我在Makefile中调用自己的脚本后可以调用另一个目标吗?

时间:2015-10-20 07:31:05

标签: makefile gnu

在调用类似这样的自定义命令之后,我想在makefile中调用另一个目标:

first_target:
        do_some_stuff

second_target:
        call some command
        first_target

当我这样做时,它抱怨找不到first_target命令。我怎么能这样做呢?

3 个答案:

答案 0 :(得分:2)

显而易见的答案是你可以调用另一个品牌:

second_target:
    call some command
    $(MAKE) first_target

但是,这不一定是最有效的方式。您可以使用中间目标:

intermediate_target:
    call_some_command

second_target first_target:
    do_some_stuff

second_target: intermediate_target

(您也可以将第一个目标的配方作为宏或shell脚本,在第一个和第二个目标配方中进行扩展,但我不喜欢它,因为它使makefile更难阅读)。

答案 1 :(得分:2)

你必须记住makefile recepies必须遵循以下语法:

target: dependency1 dependency2 ... dependencyN
    command1
    command2
    ...
    command3

使用command1command2 ...可以在系统的shell上执行命令。因此,在您的示例中写first_target导致gmake尝试执行失败的first_target命令,因为没有这样的命令。

为了实现您的目标,您必须使用在recepie名称后面列出的依赖项。在您的示例中,依赖项列表为空。在可以进行接收之前,每个依赖项都必须可用。对于每个依赖项,您的makefile中应该有一个recepie,因此gmake能够创建接收所需的所有内容(或gmake将失败并显示no rule to make target xxx)。另请记住,所有家属都是之前收件人。

所以在你的情况下,我建议做这样的事情:

first_target:
   do_some_stuff

second_target: first_target
   call some command

这将产生以下命令序列(请注意,first_target的命令在second_target之前执行):

do_some_stuff
call some command

我想这不是你真正需要的,所以我建议你创建一个新的构建目标,如下所示:

first_target:
   do_some_stuff

second_target:
   call some command

all: second_target first_target

这将产生以下命令序列:

call some command
do_some_stuff

答案 2 :(得分:0)

我寻求的是: 1. 先做一个目标,然后再做另一个目标。 2. 在一个目标结束时,再做一个目标。

parent_1:
    @echo "parent 1"

parent_2:
    @echo "parent 2"

child_1: parent_1
    @echo "child 1"

child_2: parent_1
    @echo "child 2"
    $(MAKE) parent_2
    @echo "end child 2"

避免另一个 make 实例:

child_2_setup:
    @echo "child 2"

child_2_complex: parent_1 child_2_setup parent_2
    @echo "end child 2"

这更复杂,尤其是对于多个子任务。