网站建设技术分享兰州seo新站优化招商
初识"Makefiles"
创建一个 “Makefile” 文件
touch Makefile
“touch” 用于修改文件或者目录的时间属性,包括访问时间和修改时间,若文件不存在,则重新建立一个新的文件。这里有两个需要我们注意的:
进入并编辑"Makefile" 文件
vim Makefile
Hello:echo "hello, word"
编译 “Makefile” 文件
make Makefile
Makefile语法
Makefile由一组rules组成。rule通常如下所示:
targets : prerequisitsecommandcommandcommand
- tatgets (目标)是文件名,用空格分割。通常每个 rule 只有一个
- commands (命令) 是通常用于创建目标的一系列步骤,这些需要以制表符(tab)开头,不可以是空格
- prerequisites(先决条件)也是文件名,用空格分割。在运行目标命令之前,这些文件需要存在。这些也称为 dependencies(依赖项)
创建一个更典型的 Makefile-一个编译单个C文件的Makefile.
- 创建一个名为"blah.c"文件
int main()
{return 0;
}
- 然后创建 Makefile
blah:cc blah.c -o blah
因为没有先决条件,所以第一次运行将会编译获取blah文件(编译失败可能是没有安装gcc),以后无论如何更改 blash.c 并再编译的时候则会显示"blah 已是最新"
我们通过添加一个先决条件来解决这个问题:
blah:blah.ccc blah.c -o blah
这样在 blah.c 发生改变的时候,再使用 make 编译,blah将会被编译
另一个列子
blah:blah.occ blah.o -o blah
blah.o :blah.ccc -c blah.c -o blah.o
blah.c:echo "int main(){return 0;}">blah.c
下一个示例
some_file:other_fileecho "This will always run, and这里有两个需要我们注意的:
- runs second"touch some_file
other_file:echo "This will always run, and runs first"
这个示例刚开始我有点迷,为什么touch some_file会让 Makefile 可以多次编译呢,some-file 的时间戳是比other-file新的,其实这个不管 touch some-file 的事情,是因为 other-file 始终不是一个文件。
Make clean
some_file:touch some_file
clean:rm -f some_file
这里有两个需要我们注意的
- 它不是第一个目标(默认目标)也不是先决条件。这意味着除非显示调用 make clean,否则它永远不会被调用
- 它不是一个文件名。如果碰巧有一个名为“clean”的文件,则此目标将无法运行,这不是我们想要的结果 ,以后会使用 .PHONY 用来解决此问题
变量
变量只能是字符串。
示例
files:file1 file2
some_file:$(files)echo "Look at this variable:"$(this)touch some_file
file1:touch file1
file2:touch file2clean:rm -f file1 file2 some_file
使用$() 或 $() 引用变量
x := dudeall:echo $(x)echo ${x}
#不好的做法,但是有效echo $x
习惯上使用第一种用法
目标
all目标
可以人为的制作一个 all 目标
all: one two threeone:touch one
two:touch two
three:touch threeclean:rm -f one two three
由于这是列出的第一个规则,因此如果调用 make 而未指定目标,则默认情况下它将运行
多目标
all:f1.o f2.o
f1.o f2.o:echo $@
# 相当于:
#f1.o
# echo f1.o
#f2.o
# echo f2.o
$@ 是包含目标名称的自动变量