Using Implicit Rules

Letting make Deduce the Commands

It has an implicit rule for updating a .o file from a correspondingly named .c file using a cc -c command.

For example, it will use the command cc -c main.c -o main.o to compile main.c into main.o.

We can therefore omit the commands from the rules for the object files.

When a .c file is used automatically in this way, it is also automatically added to the list of prerequisites.

We can therefore omit the .c files from the prerequisites, provided we omit the commands.

bash 复制代码
# makefile中就一行
main:main.o
# 此时执行make
[root@kafka100 cpp]# make
cc -c -o main.o main.c
cc main.o -o main
# Because you mention main.o but do not give a rule for it, make will automatically look for an implicit rule that
# tells how to update it. 

# makefile中就一行
main:
# 此时执行make
[root@kafka100 cpp]# make
cc main.c -o main
bash 复制代码
The built-in implicit rules use several variables in their recipes so that, by changing the values of the
variables, you can change the way the implicit rule works.
You can define your own implicit rules by writing pattern rules.

Defining and Redefining Pattern Rules

bash 复制代码
You define an implicit rule by writing a pattern rule.
A pattern rule looks like an ordinary rule, except that its target contains the character '%'.

the '%' matches any nonempty substring, while other characters match only themselves.
A target pattern is composed of a '%' between a prefix and a suffix, either or both of which may be empty.
's.%.c' as a pattern matches any file name that starts with 's.', ends in '.c' and is at least five characters long.
(There must be at least one character to match the '%'.) 
The substring that the '%' matches is called the stem.
'%' in a prerequisite of a pattern rule stands for the same stem that was matched by the '%' in the target.

# 不需要任何先决条件包含%,或者不需要任何先决条件
A pattern rule need not have any prerequisites that contain '%', or in fact any prerequisites at all.
Such a rule is effectively a general wildcard.

Automatic Variables

bash 复制代码
It's very important that you recognize the limited scope in which automatic variable values are available:
they only have values within the recipe.

$@:The file name of the target of the rule.
$<:The name of the first prerequisite.
$^:The names of all the prerequisites, with spaces between them.
$?:The names of all the prerequisites that are newer than the target, with spaces between them.
If the target does not exist, all prerequisites will be included.

https://www.gnu.org/software/make/manual/html_node/Catalogue-of-Rules.html

https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html

https://www.gnu.org/software/make/manual/html_node/Pattern-Rules.html

https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html

相关推荐
fareast_mzh3 天前
redis: undefined reference to `log‘
redis·makefile
冉佳驹3 天前
Linux ——— sudo权限管理和GCC编译工具链的核心操作
linux·makefile·make·gcc·sudo·.phony
攻城狮7号4 天前
【AI时代速通QT】第十节:在 Windows 上配置vs和qmake环境手动编译 Qt 项目
windows·qt·makefile·visual studio·qmake·vcvarsall·nmake/jom
青云交10 天前
ShellCheck命令行工具适配开源鸿蒙PC实战指南
华为·开源·makefile·harmonyos·shellcheck·预编译二进制·hnp 打包
不知所云,13 天前
3. cmake 和 Ninja安装
驱动开发·makefile·make·构建工具·ninja
HalvmånEver1 个月前
Linux:基础开发工具(四)
linux·运维·服务器·开发语言·学习·makefile
Fcy6481 个月前
Linux下的项目自动化构建-make\makefile详解
linux·运维·自动化·makefile·make
边疆.1 个月前
【Linux】自动化构建工具make和Makefile和第一个系统程序—进度条
linux·运维·服务器·makefile·make
LostSpeed2 个月前
debug - MDK - arm-none-eabi - 从MDK工程做一个makefile工程出来
makefile·bat·mdk·arm-none-eabi
DebugKitty3 个月前
硬件开发2-ARM裸机开发1-I.MX6ULL - 汇编点灯
汇编·makefile·imax6ull·gpio·电路复用