示例
当一个目标需要执行多个命令时,可以在 Makefile 中为该目标提供多行命令。每一行命令都必须以制表符开始。以下是一个简单的示例:
all: clean build run
clean:
    rm -f my_program
build:
    gcc -Wall -o my_program main.c util.c
run:
    ./my_program
在这个示例中:
- all是默认目标,它依赖于- clean、- build和- run。
- clean目标删除- my_program可执行文件。
- build目标编译源文件生成可执行文件。
- run目标运行可执行文件。
你可以使用以下命令来执行默认目标 all:
make
或者直接指定目标:
make build
当你运行 make 命令时,它将按照依赖关系执行目标,确保每个目标都是最新的。在上面的示例中,all 依赖于 clean、build 和 run,因此这些目标将按照指定的顺序执行。
注意:在 Makefile 中,确保使用制表符而不是空格,因为 Make 工具对此有特殊的要求。
添加多个命令
如果你想在 clean 目标中添加多个 Shell 命令,可以将它们放在同一行,并使用分号 ; 将它们分隔。下面是一个示例:
clean:
    rm -f my_program; \
    rm -f *.o; \
    echo "Cleanup complete"
在这个例子中,clean 目标包含三个 Shell 命令。每个命令都以分号 ; 结尾,表示命令的结束。使用 \ 来表示命令在多行上续行。
如果你希望多个命令按照顺序执行,但是希望其中一个失败时不会中断整个 Makefile 的执行,可以使用 ; 将它们分隔开。如果你希望后续命令只在前面的命令成功时执行,可以使用 && 连接命令,例如:
clean:
    rm -f my_program && \
    rm -f *.o && \
    echo "Cleanup complete"
这样,如果其中一个 rm 命令失败,后续的命令将不会执行。
常见错误
makefile:8: *** missing separator.  Stop.
这个错误通常表示在 Makefile 中使用了不正确的缩进。在 Makefile 中,必须使用 Tab(制表符)来缩进命令,而不是空格。