网上或书上的makefile教程大多都很简单,而实际工程的makefile往往又很复杂,这时可以去gnu上查阅, make手册的网址是: http://www.gnu.org/software/make/manual/make.html,
直接查找就行了,没有什么地方比gnu官方手册更权威全面了
以下为我总结的一些makefile要点,以方便查阅,随时补充:
1.
一个约定:make默认将试图创建列在makefile文件中的第一个目标(以.开头的目标不算,例如
: .phony),许多程序员都会在自己的makefile文件中将第一个目标定义为all,然后在列出其他的从属目标,这样可以明确的告诉make
命令,在未指定特定目标时,默认情况下应该创建哪个目标,我们应坚持使用这一约定。
2 规则所在的行必须以制表符tab开头,但空格是不行的,此外,如果makefile文件中的某行以空格结尾 ,它也会导致make命令执行失败。
3. make命令内置了一些特殊的宏定义。使用它们可以使makefile文件更加简洁:
$? 列出当前目标依赖的文件列表中比当前目标文件还要新的文件
$@ 当前目标的名字
$< 当前目标依赖的第一个文件名
$^ 当前目标依赖的所有文件(去除重复的文件名)
$* 不包括后缀名的当前依赖文件的名字
4. 在makefile文件中,我们还经常看到另外两个有用的特殊字符,它们出现在命令之前:
- 忽略所有错误
exp: -mkdir yourdirectories 如果你想创建的目录已存在,错误信息不会提示
@ 告诉make在执行某条命令前不将该命令本身输出到标准输出。想用echo命令给出一些提示 信息时,这个字符将非常有用。
5 命令行上的宏定义: 命令行上的宏定义将替换在makeifle中的宏定义。
exp: make CC=gcc
宏定义必须有单个参数的形式传递,要避免在宏定义中使用空格或引号,下例是错误的:
make "CC = c89"
6.make -jN 允许 make命令同时执行N条命令,可节省时间,一般以-j3为出发点
7.gcc -MM 产生一个适用于make命令的依赖关系清单
8. include filenames... (filenames允许使用正则表达式)
暂停读取当前makefile文件,转而去读取包含进来的makefile文件等,
注意:前面不允许有TAB键,但可以有空格,因为以TAB键开头代表着命令
-include filenames... 忽略所有错误。(为于其他make兼容,使用sinclude代替.include
9. $(lastword names...)
The argument names is regarded as a series of names, separated by whitespace. The value is the last name in the series.
For example,
$(lastword foo bar)
produces the result `bar'.
10.还有另一种定义变量的方式simply-expanded (:=) variable definitions.:
exp:
x := foo
y := $(x) bar
x := later
is equivalent to
y := foo bar
x := later
11.当你要引用make的变量的时候,使用$(VAR)就可以了,但是如果你想要引用外部shell的变量,你必须使用$$(VAR).
以下几段有点不懂:留待以后查阅:
2.3 How make Processes a Makefile
Before recompiling an object file, make considers updating its
prerequisites, the source file and header files. This makefile does not
specify anything to be done for them—the `.c' and `.h' files are not
the targets of any rules—so make does nothing for these files. But make
would update automatically generated C programs, such as those made by
Bison or Yacc, by their own rules at this time.
3.4 The Variable MAKEFILES
If
the environment variable MAKEFILES is defined, make considers its value
as a list of names (separated by whitespace) of additional makefiles to
be read before the others. This works much like the include directive:
various directories are searched for those files (see Including Other
Makefiles). In addition, the default goal is never taken from one of
these makefiles and it is not an error if the files listed in MAKEFILES
are not found.
The main use of MAKEFILES is in communication
between recursive invocations of make (see Recursive Use of make). It
usually is not desirable to set the environment variable before a
top-level invocation of make, because it is usually better not to mess
with a makefile from outside. However, if you are running make without
a specific makefile, a makefile in MAKEFILES can do useful things to
help the built-in implicit rules work better, such as defining search
paths (see Directory Search).
Some users are tempted to set
MAKEFILES in the environment automatically on login, and program
makefiles to expect this to be done. This is a very bad idea, because
such makefiles will fail to work if run by anyone else. It is much
better to write explicit include directives in the makefiles. See
Including Other Makefiles.
分享到:
相关推荐
- **General Buildroot usage**: 包括make tips(使用make时的建议),了解何时需要进行完全重建(full rebuild),以及如何重建包(rebuild packages)。 ### Advanced Usage - **Environment variables**: ...
通用Buildroot使用(General Buildroot usage)章节提供了一系列实用技巧(make tips)以及如何判断和执行全面重建(Understanding when a full rebuild is necessary)的指南。 包管理部分详细解释了如何重建...
Prentice.Hall.Linux.Debugging.and.Performance.Tuning.Tips.and.Techniques.chm 本人一直都在UNIX下从事嵌入式的开发工作,也深知老祖宗说的:工欲善其事必先利其器的道理.这些书籍涵盖了从vi,emacs(编辑器), gcc...
### Vim Tips 汇总知识点解析 #### Vim Tip 1: 使用“*”键进行高效搜索 在 Vim 编辑器中,`*` 键是一个非常实用但往往被忽略的功能。当你处于正常模式(Normal mode)时,按下 `*` 键可以搜索光标所在位置下的...
Prentice.Hall.Linux.Debugging.and.Performance.Tuning.Tips.and.Techniques.chm 本人一直都在UNIX下从事嵌入式的开发工作,也深知老祖宗说的:工欲善其事必先利其器的道理.这些书籍涵盖了从vi,emacs(编辑器), gcc...
Prentice.Hall.Linux.Debugging.and.Performance.Tuning.Tips.and.Techniques.chm 本人一直都在UNIX下从事嵌入式的开发工作,也深知老祖宗说的:工欲善其事必先利其器的道理.这些书籍涵盖了从vi,emacs(编辑器), gcc...
Prentice.Hall.Linux.Debugging.and.Performance.Tuning.Tips.and.Techniques.chm 本人一直都在UNIX下从事嵌入式的开发工作,也深知老祖宗说的:工欲善其事必先利其器的道理.这些书籍涵盖了从vi,emacs(编辑器), gcc...
Prentice.Hall.Linux.Debugging.and.Performance.Tuning.Tips.and.Techniques.chm 本人一直都在UNIX下从事嵌入式的开发工作,也深知老祖宗说的:工欲善其事必先利其器的道理.这些书籍涵盖了从vi,emacs(编辑器), gcc...
Prentice.Hall.Linux.Debugging.and.Performance.Tuning.Tips.and.Techniques.chm 本人一直都在UNIX下从事嵌入式的开发工作,也深知老祖宗说的:工欲善其事必先利其器的道理.这些书籍涵盖了从vi,emacs(编辑器), gcc...
Prentice.Hall.Linux.Debugging.and.Performance.Tuning.Tips.and.Techniques.chm 本人一直都在UNIX下从事嵌入式的开发工作,也深知老祖宗说的:工欲善其事必先利其器的道理.这些书籍涵盖了从vi,emacs(编辑器), gcc...
Prentice.Hall.Linux.Debugging.and.Performance.Tuning.Tips.and.Techniques.chm 本人一直都在UNIX下从事嵌入式的开发工作,也深知老祖宗说的:工欲善其事必先利其器的道理.这些书籍涵盖了从vi,emacs(编辑器), gcc...
Prentice.Hall.Linux.Debugging.and.Performance.Tuning.Tips.and.Techniques.chm 本人一直都在UNIX下从事嵌入式的开发工作,也深知老祖宗说的:工欲善其事必先利其器的道理.这些书籍涵盖了从vi,emacs(编辑器), gcc...
"nlmeansC 编译 tips"这个标题暗示我们正在处理一个与非局部均值降噪(Non-local Means Denoising)相关的C语言实现,可能是一个用于图片去噪的库。非局部均值算法是一种广泛应用的图像去噪技术,它通过比较图像中的...
The aim is not to teach LATEX programming, but to give a quick reference to all the tips and tricks that can be used if you are encountering a (difficult) problem, or simply facing a question which ...
api_make_sphere(1.0, body); ``` 在HOOPS中可以通过操作Geometry来控制ACIS实体的运动。然而,当Geometry运动时,ACIS实体似乎也会相应地运动,这是一个比较特别的现象。要实现特定的动画效果,如让球体绕着某个轴...
- **设定会议时间**:"Let’s make a meeting next Monday at 5:30 PM SLC time." 明确会议时间和地点。 - **寻求更多信息**:"I want to talk to you over the phone regarding issues about report development ...
40 Outstanding Raspberry Pi Tips and Tricks for Absolute Beginners Have you wanted to design and build consumer electronics? Have you thought my ideas can make me a million, if only I had the right ...
9. 高级Android开发者应不断学习和更新知识:以Reto Meier为例,他既是开发者关系技术负责人,也是Android Pro Tips的作者,这表明了持续学习对于开发者的重要性。 此外,文档还推荐了Android设计指南,这是Google...
make edit_cache; make` 这样做可以使CMake运行速度提升近50%,例如VTK项目的配置时间从25秒降低到14秒。 2. **CMake配置时间的优化** - **调查/分析方法** 可以通过实时观察`cmake --trace`输出来发现配置...