当前位置: 首页 > Linux

Makefile规则

时间:2023-04-06 02:22:23 Linux

makefile中的规则概述规则的一般形式:target:|<仅订单先决条件><;commands>makefile的主体是各种规则。一条规则,无论采用何种形式,都描述了一个三元组:目标、先决条件、命令。一个规则可以同时描述一个或多个甚至无数个工作目标(其实就是无数个规则组成的模式),而多目标规则可以看作是多个规则的叠加描述,可以是拆分为单个工作目标的规则。作业目标是文件名或“操作”,但不能为空。先决条件也可以是具体文件或“动作”,可以为空。命令是发生更新时交给子shell执行的命令。可以有多个命令,每个命令都交给一个shell。如果要将所有的命令交给一个shell执行,必须将它们放在一行中或者使用连续的行符号\。目标和先决条件中的变量会立即扩展,而命令则不会。(make会在所有的变量和命令都加载到数据库后,命令即将执行前展开命令中的变量。)如果定义了.SECONDEXPANSION目标,则后续规则中的必要条件会展开两次.第二次扩展发生在make读取所有变量和规则之后,但在执行规则之前。make在读取makefile时,需要根据必要条件的类型和目标的时间戳来决定是否采取更新动作(将命令交给子shell执行)。必要条件有两种:共同必要条件。在更新目标之前更新常见的先决条件。只要先决条件的时间戳大于或等于目标的时间戳(还不存在的文件的时间戳可以认为是负无穷大或某个古老的时间点),就会引起更新动作;“order-only”先决条件,(只执行一次的必要条件,|之后的必要条件)。当Make要更新这个必要条件时,它会检查文件是否存在。如果存在,则不会继续更新这个必要条件(不管它的时间戳),也不会相应地更新目标;如果不存在,则检查执行本次make过程中是否执行过针对必要条件的规则,如果不存在,则执行一次,否则结束本次必要条件的更新。下面是一个经常使用的例子。要求新目标文件之间目标文件夹已经存在,但不可能在新目标文件的每条规则中都执行mkdir-p。虽然这可以工作,但看起来不舒服。.更好的办法是让目标文件只顺序依赖于文件夹,然后对文件夹的更新动作是mkdir-p,这样mkdir只执行一次。OBJDIR:=objdirOBJS:=$(addprefix$(OBJDIR)/,foo.obar.obaz.o)$(OBJDIR)/%.o:%.c$(COMPILE.c)$(OUTPUT_OPTION)$$@chmoda+x$@static模式规则静态模式规则和普通模式规则之间的唯一区别是指定了匹配的作业目标集。$(OBJECTS):%.o:%.c$(CC)-c$(CFLAGS)$<-o$@suffix-rules后缀规则是过去没有模式规则的替代品,并且是已弃用。隐式规则隐式规则是内置于make中的模式规则。查看make内置了哪些规则,可以使用-p,--print-data-base命令显示。该命令还可以查看内置变量定义。当make检查一个作业目标时,如果它找不到特定的规则,则使用隐式规则。使用不带命令的模式规则可以屏蔽相应的隐式规则。例如:hello:hello:hello.c会自动执行相应的编译过程。%:%.o可以阻止从.o文件链接可执行程序的规则。可以在杂项规则中使用shell的模式匹配,在其他地方使用通配符功能。一条规则中的必要条件不需要一次描述完整,可以分成多次,但对于同一条规则的命令,只取最后一次描述中的命令。例如:hello:hello.cechohellohello:include.hgcc-ohellohello.c在针对hello的规则中有两个必要条件hello.c和include.h,这条规则的命令只有gcc-o你好你好。C。