网站建设需要哪些设备,站长之家seo概况查询,wordpress问答汉化,网站建设 技术要求一、目标#xff0c;依赖#xff0c;命令也许大家觉得这个不重要#xff0c;但今天我有了新的认识#xff0c;所以写了下来。这三个就是Makefile的全部#xff0c;但今天我要重点说一下它的执行顺序。每个Makefile都有且只有一个终极目标#xff0c;下设若干子目标#…一、目标依赖命令也许大家觉得这个不重要但今天我有了新的认识所以写了下来。这三个就是Makefile的全部但今天我要重点说一下它的执行顺序。每个Makefile都有且只有一个终极目标下设若干子目标make的规则会检查目标与依赖的时间戳依赖中的某一个比目标新说明目标已经过时需要更新。这里要着重说一下make会将目标的依赖及依赖的依赖全部展开然后才能决定是否需要更新终极目标。a.out/ | \/ | \_ / _ \_/ | \hello.o world.o main.o_/ | \_/ | \hello.c world.c main.c对于这个例子相信大家都能写出Makefile。make在解析Makefile时就会生成上面的依赖树它会自底向上比较时间戳若下层的新则执行上层目标所对应的命令然后依次执行上上层的命令因为底层更新了所以上面的都需要更新。如果底层不比上层的新则不执行上层目标所对应的命令这就是make的聪明之处。例如我们更改了hello.c文件make在解析Makefile时首先比较的不是a.out与hello.o谁更新如果make真的这么做那么make就会直接退出因为自你上次执行make时a.out会比hello.o更新而我们修改hello.c并不会影响hello.o的时间戳 而是依赖树的最底端hello.c与hello.o的时间戳因为hello.c的修改目标hello.o的命令会被执行进而触发a.out所对应的命令。目标werld.o与main.o所对应的命令当然不会被执行。make的输出看上去是这个样子的gcc -c hello.cgcc hello.o world.o main.o 在make 的info文档中有这样一段话注意粗体字3.9 How make Reads a MakefileGNU make does its work in two distinct phases. During the firstphase it reads all the makefiles, included makefiles, etc. andinternalizes all the variables and their values, implicit and explicitrules, and constructs a dependency graph of all the targets and theirprerequisites. During the second phase, make uses these internalstructures to determine what targets will need to be rebuilt and toinvoke the rules necessary to do so.4 Writing Rules***************A rule appears in the makefile and says when and how to remakecertain files, called the rules targets (most often only one perrule). It lists the other files that are the prerequisites of thetarget, and commands to use to create or update the target.The order of rules is not significant, except for determining thedefault goal: the target for make to consider, if you do nototherwise specify one. The default goal is the target of the firstrule in the first makefile. If the first rule has multiple targets,only the first target is taken as the default. There are twoexceptions: a target starting with a period is not a default unless itcontains one or more slashes, /, as well; and, a target that definesa pattern rule has no effect on the default goal. (*Note Defining andRedefining Pattern Rules: Pattern Rules.)二、伪目标伪目标总被认为是过期的总被认为需要被更新。伪目标又称标签之所以这样叫是为了与真实的文件进行区别。那伪目标是如何工作的我们可以将它当作普通文件但不管出现在目标中还是依赖中都以为着它是将要被更新的普通文件。1、伪目标做目标普通文件做依赖这是最常见的一种典型的all伪目标 .PHONY:allall: prog1 prog2 #执行make后会一次生成两个可执行程序prog1: a.c ...command...prog2: b.c ...command...分析在这个Makefile中。.PHONY是第一个目标但它以点开头不会作为终极目标在上面的英文中有解释所以终极目标是allmake的职责所在就是重建这个all目标。因为all是伪目标make命令总认为它需要被更新而更新它需要首先更新prog1 和 prog2 这就达到了一次make而生成两个可执行文件。2、伪目标做目标伪目标又做依赖虽然称为伪目标但也可做依赖目标与依赖是相互转化的就像上面的hello.o它是hello.c的目标又是a.out的依赖.PHONY: all subdir appsall: subdir appssubdir: prog1 prog2apps: prog3 prog4prog1: a.ccommand... prog2: b.ccommand...prog3: c.ccommand...prog4: d.ccommand...分析all是终极目标它依赖于subdir 和 apps 因这两个都是伪目标即他们需要被更新。subdir又依赖于prog1 和 prog2 这就回到了上面的那种情况。这种形式经常出现在大的工程中是对上面一种情况的扩展我们可以修改all 或 subdir 或 apps 中的依赖来决定我们需要那些应用程序裁剪掉那些应用程序。你应该听说过内核裁剪与移植吧所谓裁剪就是修改Makefile的目标不生成我们不需要的东东所谓移植就是修改Makefile的编译参数换成其他的编译工具。3、普通文件做目标伪目标做依赖all: progprog: a.c prtcommand....PHONY: prtprt:echo this is prt分析每次执行make时this is prt都会出现在屏幕上。尽管prog不需要被更新但prt中的命令依然要被执行。make会这样来解析prog依赖于prt而prt有需要被更新因为它是伪目标这意味着this si prt会出现在屏幕上prt更新完成后prog目标中的command...就会被执行我们假定a.c没有被更改。事实上我们那个文件也没有更改但是prog目标中的命令还是被执行了info make中不建议这样做A phony target should not be a prerequisite of a real target file;if it is, its commands are run every time make goes to update thatfile.总结在伪目标中始终贯穿着这样一句话伪目标总被认为是需要被更新的。我也是依据这句话来分析上述伪目标的应用。伪目标可以与真实文件重名典型的clean用法因为make知道我们只是想执行clean下的命令而不是去重建一个叫做clean的文件这也是我们有时把它解释称标签的原因。关于上述第二种情况info make中有这样一个解释When one phony target is a prerequisite of another, it serves as asubroutine of the other. For example, here make cleanall will deletethe object files, the difference files, and the file program:.PHONY: cleanall cleanobj cleandiffcleanall : cleanobj cleandiff rm programcleanobj : rm *.ocleandiff : rm *.diff一、目标依赖命令 这三个是makefile的全部内容现在来说一下它的执行顺序转载于:https://www.cnblogs.com/SFTD/p/3622126.html