• 学习资料

本文主要参考资料:驾驭Makefile(李云).pdf

  • 原理

(1)最基本的语法

targets: prerequisites

  command

targets是目标,prerequisites是先决条件,目标依赖于先决条件。

command是生成目标的命令。

这一整个形式就是规则。

(2)目标的生成

一个目标的生成(目标不存在或者依赖比目标新才会重新创建目标):

(1)先判断目标是否有依赖,有则寻找相应规则生成依赖;

(2)没有依赖,运行命令生成target。

(3)依赖的生成递归调用(1)和(2)

如下图所示:

(3)Makefile目标语法

  • 默认目标为第一个目标
  • 伪目标,可以用.PHONY: clean【避免与现有的文件同名】
  • simple项目

写Makefile文件之前,需要先想好依赖关系,再进行编写。

假设现在有foo.c和main.c两个文件,则依赖关系如下:

    foo.o    foo.c

simple

    main.o   main.c

生成main.o命令:gcc -o main.o -c main.c

生成foo.o命令:gcc -o simple main.o foo.o

gcc的-o选项,指定输出文件的文件名

gcc的-c选项,仅作预处理、编译和汇编并生成目标文件

  • 变量

(1)变量定义及引用

定义:EXE = simple

引用:$(EXE)或${EXE}

(2)特殊变量

$(MAKE) -》 make命令名是什么

$(MAKECMDGOALS) -》 make的目标是什么

(3)变量的类别

EXE = simple 递归扩展变量

EXE := simple 简单拓展变量,只进行一次扫描和替换

EXE ?= simple 条件赋值变量,当前变量以前没有定义就进行赋值,否则不处理

(4)自动变量

目标和先决条件在规则的命令中多次出现,应尽量避免

$@是指 造成命令运行的目标(可能有多个)。

$^是所有先决条件

$<是第一个先决条件

(5)变量来源

  • Makefile定义的变量
  • 自动变量,如$@ $^ $<等,根据上下文自动获得变量值
  • Shell环境
  • 在运行make命令是定义变量

(6)高级变量引用

$(EXE:.o=.c)自动完成后缀替换,可用patsubst完成同样的功能。

(7)override指令

不希望Makefile文件中定义的变量被覆盖掉。

  • 模式

对于多个规则去生成多个目标文件,如main.o和foo.o都有一条规则进行描述。

每一个object文件都有一条规则的话,这是非常麻烦的。

%.o : %.c ;
<command ......>;

在模式规则中,目标可能会是多个的,如果有模式匹配出多个目标,make就会产生所有的模式目标。

如果要生成的目标是 a.o b.o,那么%c 就是 a.c b.c,则会产生两个目标,规则分别如下。

foo.o : foo.c ;
<command ......>;
main.o : main.c ;
<command ......>;
  • 函数

(1)wildcard

在Makefile规则中,通配符会被自动展开,但在变量的定义和函数引用时,通配符将失效。

如果需要通配符有效,就需要使用函数“wildcard”,用法是:$(wildcard PATTERN...) ,如$(wildcard *.c)。

在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表

如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空

(2)patsubst

patsubst函数是用来进行字符串替换的,语法:

$(patsubst pattern, replacement, text)

eg:$(patsubst %.c, %.o, $(mixed))

(3)addprefix

addprefix函数是用来给字符串的每个子字符串前加上一个前缀,语法:

$(addprefix prefix, names...)

(4)filter

filter函数用于从一个字符串中,根据模式得到满足模式的字符串,语法:

$(filter pattern..., text)

(5)filter-out

filter-out函数用于从一个字符串中,根据模式去除满足模式的字符串,语法:

$(filter-out pattern..., text)

(6)strip

strip函数用于去除变量中多余的空格,语法:

$(strip string)

Makefile文件应用——simple项目的更多相关文章

  1. Makefile文件应用——huge项目

    提高复用性 在build目录下,保存公用部分make.rule (1)绝对路径 用ROOT变量保存项目根目录 (2)增加控制变量 EXE/LIB/ (3)头文件查找目录 gcc 的-I(i的大写)选项 ...

  2. Makefile文件应用——complicated项目

    学习资料 本文主要参考资料:驾驭Makefile(李云).pdf Complicated项目 需求: (1)object文件放到objs目录下 (2)可执行文件放到exes目录下 (3)增加头文件依赖 ...

  3. 简单编写makefile文件,实现GCC4.9编译项目,增加boost库測试等等。。

    一.须要用到的hw.cpp hw.h funtest.cpp funtest.h makefile 几个測试文件 1.hw.cpp代码例如以下: #include "hw.h" # ...

  4. 利用 autoconf 和 automake 生成 Makefile 文件

    一.相关概念的介绍 什么是 Makefile?怎么书写 Makefile?竟然有工具可以自动生成 Makefile?怎么生成啊?开始的时候,我有这么多疑问,所以,必须得先把基本的概念搞个清楚. 1.M ...

  5. linux下使用automake工具自动生成makefile文件

    linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Au ...

  6. Linux内核Makefile文件(翻译自内核手册)

    --译自Linux3.9.5 Kernel Makefiles(内核目录documention/kbuild/makefiles.txt) kbuild(kernel build) 内核编译器 Thi ...

  7. makefile文件的技术

    [快速的学习笔记] gcc命令:http://www.cnblogs.com/ggjucheng/archive/2011/12/14/2287738.html#_Toc311642845 makef ...

  8. Linux平台Makefile文件的编写基础篇(转)

    目的:       基本掌握了 make 的用法,能在Linux系统上编程.环境:       Linux系统,或者有一台Linux服务器,通过终端连接.一句话:有Linux编译环境.准备:      ...

  9. Linux Makefile文件编写详细步骤与实践

    Linux Makefile文件编写详细步骤与实践 1.makefile概述 Windows环境下IDE会帮你完成makefile文件的编写,但在UNIX环境下你就必须自己写makefile了,会不会 ...

随机推荐

  1. Mycat安装及测试分片总结

    1.安装jdk1.72.连接实际mysql数据库 用命令行工具或图形化客户端,连接mysql,创建DEMO所用三个分片数据库:(默认schema.xml中的配置需要三个库) CREATE databa ...

  2. CSS3的自定义字体@font-face:将图片ICON转为字体

    大家都知道现在各个浏览器都支持CSS3的自定义字体(@font-face),包括IE6都支持,只是各自对字体文件格式的支持不太一样.那么对于网站中用到的各种icon,我们就可以尝试使用font来实现, ...

  3. ASP.Net请求处理机制初步探索之旅 - Part 3 管道(转)

    开篇:上一篇我们了解了一个ASP.Net页面请求的核心处理入口,它经历了三个重要的入口,分别是:ISAPIRuntime.ProcessRequest().HttpRuntime.ProcessReq ...

  4. 使用Docker创建Elasticsearch服务

    一.Docker是什么? Docker是一个开源工具,能将一个WEB应用封装在一个轻量级,便携且独立的容器里,然后可以运行在几乎任何服务环境下.Docker的容器能使应用跑在任何服务器上并且表现一致. ...

  5. 转!!Java设置session超时(失效)的时间

    Java设置session超时(失效)的时间   在一般系统登录后,都会设置一个当前session失效的时间,以确保在用户长时间不与服务器交互,自动退出登录,销毁session具体设置的方法有三种:1 ...

  6. Vue中通过鼠标移入移出来添加或取消class样式(active)

     基础知识: 先写一下vue中鼠标移入移出的基础知识,移入的触发事件是 @mouseenter,移出的触发事件是@mouseleave,知道这两个方法就简单了 基础知识的例子 <div clas ...

  7. 如何实现redis集群?

    由于Redis出众的性能,其在众多的移动互联网企业中得到广泛的应用.Redis在3.0版本前只支持单实例模式,虽然现在的服务器内存可以到100GB.200GB的规模,但是单实例模式限制了Redis没法 ...

  8. Python变量和基本数据类型

    1.变量 a .什么是变量 变量即变化的量,核心是“变”与“量”二字,变即变化,量即衡量状态. b.为什么要有变量 程序执行的本质就是一系列状态的变化,变是程序执行的直接体现,所以我们需要有一种机制能 ...

  9. 谷歌公布全新设计语言:跟苹果Swift天差地别

    今日凌晨.谷歌(微博)在I/O大会上公布了全新设计语言Material Design.在20多天前的WWDC上.苹果也公布了全新编程语言Swift.两家科技巨头公司,在一年一度的开发人员大会上,都公布 ...

  10. 【转载】在Jersey JAX-RS 处理泛型List等Collection

    在Java中,从1.5开始,我们就可以使用泛型了(generic),这看上去很像C++ Template,但是实际上它们是不同的.在这里我不想过多的描述细节,你可以从Google上搜索一下. 但是,泛 ...