在调用类似这样的自定义命令之后,我想在makefile中调用另一个目标:
first_target:
do_some_stuff
second_target:
call some command
first_target
当我这样做时,它抱怨找不到first_target命令。我怎么能这样做呢?
答案 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
使用command1
,command2
...可以在系统的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"
这更复杂,尤其是对于多个子任务。