语法规范
<target> : <prerequisites>
[tab] <commands>
target 是一个目标,一般是一个文件,指明要构建的对象
也可以是一个操作的名字,这称为"伪目标"(phony target)。
比如 make clean 要删除一些文件,如果在当前目录中正好有个文件叫作clean
make clean 就不会执行了,就认为没有必要重新构建了。为了避免这种情况
一般明确声明clean是"伪目标":
.PHONY: clean
clean:
rm *.o temp
如果Make命令运行时没有指定目标,默认会执行Makefile文件的第一个目标。
比如Makefile 内容如下
.PHONY: install
install:
bash test.sh
执行 make 和 执行make install 都会去执行 install target
下面的配置中,构建gotofile 的前置条件是 fromfile,如果当前目录中,fromfile存在,
则 make gotofile 可以正常运行。如果fromfile 不存在则需要写一条规则,来生成fromfile
如下:
gotofile:fromfile cp fromfile gotofile fromfile: echo "11111" > fromfile
如果一次需要构建多个文件,可以使用下面的写法
gotofile 是个伪目标,只有3个前置文件,没有任何对应命令
gotofile:file1 file2 file3 file1: echo "11111" > file1 file2: echo "22222" > file2 file3: echo "22222" > file3
执行 make gotofile 就会一次性生成 file1 file2 file3
不需要要执行3次 make file1 ; make file2 ; make file3
一些语法
【1】 关闭回声
file1:
echo "11111" > file1
上面的makefile 在构建时会打印出命令,然后去执行,叫作“echoing” 回声。
[root@jinkang-centos7 make]# make
echo "11111" > file1
关闭回声
file1:
@echo "11111" > file1
【2】 变量
txt = "hello world"
test:
@echo $(txt)
#输出 hello world
调用Shell变量是 需要在$符号前,再加个$符号
test:
@echo $$SHELL
@echo $$HOME
#输出
# /bin/bash
# /root
每行命令在一个单独的shell 中执行,因此两个相关联的命令要写在一起
test:
export name="kangkang";echo $$name
或者在换行前用反斜杠转义。
test:
export name="kangkang";
echo $$name
【3】循环
循环demo1
list=one two three
test:
for i in $(list);do
echo $$i;
done
循环demo2
.PHONY: test
test:
for file in `find ./test/ -type f`;do
echo test >> $$file;
done
4 【make 传参】
install:
mkdir -p $(DIR)/usr/bin/
gcc helle.c -o $(DIR)/usr/bin/hello
make 时传参 make install DIR=xxx