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

在Makefile中调用自己的脚本后,我可以调用另一个目标吗?,makefile,gnu,Makefile,Gnu,调用自定义命令后,我想调用makefile中的另一个目标,如下所示: first_target: do_some_stuff second_target: call some command first_target first_target: do_some_stuff second_target: first_target call some command 当我像上面那样做时,它会抱怨没有找到第一个_目标命令。我该怎么做呢

调用自定义命令后,我想调用makefile中的另一个目标,如下所示:

first_target:
        do_some_stuff

second_target:
        call some command
        first_target
first_target:
   do_some_stuff

second_target: first_target
   call some command

当我像上面那样做时,它会抱怨没有找到第一个_目标命令。我该怎么做呢?

显而易见的答案是您可以调用另一个make:

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脚本,并在第一个和第二个目标配方中展开,但我不喜欢这样,因为这样会使生成文件更难读取)。

您必须记住,生成文件接收器必须具有以下语法:

target: dependency1 dependency2 ... dependencyN
    command1
    command2
    ...
    command3
使用
command1
command2
。。。是系统外壳上可执行的命令。因此,在您的示例中编写
first\u target
会导致
gmake
尝试执行命令
first\u target
,但由于没有这样的命令,该命令失败

为了实现您的目标,您必须处理在recepie名称后面列出的依赖项。在您的示例中,依赖项列表为空。每个依赖项都必须是可用的,然后才能进行recepie。对于每个依赖项,makefile中都应该有一个recepie,这样
gmake
就能够创建recepie所需的所有内容(或者
gmake
将失败,因为
没有规则使目标xxx
)。还请记住,所有依赖项都是在接收之前生成的

因此,在您的情况下,我建议您这样做:

first_target:
        do_some_stuff

second_target:
        call some command
        first_target
first_target:
   do_some_stuff

second_target: first_target
   call some command
这将导致以下命令序列(注意,第一个_目标的命令在第二个_目标的命令之前执行):

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

first_target:
   do_some_stuff

second_target:
   call some command

all: second_target first_target
这将导致以下命令序列:

call some command
do_some_stuff

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

parent_1:
@回显“父1”
家长2:
@回显“父2”
子_1:父_1
@回应“儿童1”
子_2:父_1
@回声“儿童2”
$(制作)父项2
@回显“结束子项2”
避免另一个make实例:

child_2_设置:
@回声“儿童2”
子\u 2\u复合体:父\u 1子\u 2\u设置父\u 2
@回显“结束子项2”

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

我不知道你说了什么。你的意思是我必须创建两个目标,再加上一个目标来调用前两个目标,对吗?因此,我不能指定一个目标,它调用另一个目标并执行一些操作,例如:
@echo“Start”\n first\u target\n@echo“Finish”