基本規(guī)則
makefile的規(guī)則,一般由以下組成
目標(biāo): 依賴列表
命令列表
1、其中第一條規(guī)則中的”目標(biāo)“,將會(huì)成為終極目標(biāo)。我們最終目的,就是為了生成這個(gè)目標(biāo)的
2、每一個(gè)規(guī)則中的目標(biāo)。都可以是一個(gè)文件,也可以是一個(gè)標(biāo)簽
3、每一個(gè)規(guī)則中的目標(biāo),不一定要有依賴
目標(biāo):
命令列表
此時(shí)的目標(biāo),我們成為”偽目標(biāo)“
4、每一個(gè)規(guī)則,也不一定有命令列表
案例
假設(shè)我們有三個(gè).c源文件,main.c、f1.c、f2.c
f1.c
#include "stdio.h"
void f1()
{
printf("This is f1
);}
f2.c
#include "stdio.h"
void f2()
{
printf("This is f2
);}
然后我們?cè)趍ain里面調(diào)用f1與f2這兩個(gè)函數(shù),接著編譯、運(yùn)行即可
下面我們編寫一下Makefile
target:main.c f1.c f2.c
gcc f1.c f2.c main.c
輸入命令 make
即可完成編譯
如果不想打印出gcc f1.c f2.c main.c
這條命令,可以在Makefile
文件中的命令列表前加上一個(gè)@
符號(hào)
變量
創(chuàng)建變量,與shell類似
number = '56',此時(shí),變量number的值就是56,
可以使用echo驗(yàn)證: echo &$number
其中這個(gè)符號(hào)$
就是使用已聲明的變量
變量的三種賦值方式
第一種:'=' 稱為”延時(shí)展開(kāi)賦值“
例如:
temp = $number
number = '56'
此時(shí)你輸出'temp'等于56,所謂延時(shí)展開(kāi)賦值就是當(dāng)number成功賦值之后,再把number的值賦給temp
第二種:':='稱為”立即展開(kāi)賦值“
例如:
temp := $number
number = '56'
此時(shí)你輸出'temp'就為空
第三種:'?='稱為條件賦值
例如:
temp ?= $number
假如在這之前沒(méi)有給變量temp賦過(guò)值,那么就會(huì)把number的值賦給temp,反之就不會(huì)把number的值賦給temp
特殊變量
$@
: 當(dāng)前規(guī)則中的目標(biāo)
$^
: 當(dāng)前規(guī)則中的所有依賴
$<
: 當(dāng)前依賴中的第一個(gè)
$$
: 當(dāng)前執(zhí)行的進(jìn)程的進(jìn)程編號(hào)
$*
: 模式規(guī)則中的所有%匹配的部分
$?
: 模式規(guī)則中所有比所在規(guī)則中的目標(biāo)更 新的文件組成的列表
下面借助變量?jī)?yōu)化一下上述案例的Makefile
SOURCE=main.c f1.c f2.c
target:$(SOURCE)
gcc $^
模式規(guī)則
%.o: %.c
gcc -c $<
%.c
會(huì)匹配.c文件前面的部分,相當(dāng)于shell
中的*.c
模式規(guī)則執(zhí)行時(shí),是一個(gè)循環(huán)取出的過(guò)程,每次取出一個(gè).c
,調(diào)用命令生成對(duì)應(yīng)的.o
模式規(guī)則舉例
#strat
TARGET = a.out
SRCS = main.c
$(TARGET): $(SRCS:.c = .o)
gcc $^ -o $@
#$(SRCS:.c=.o) 可以理解為目標(biāo)所依賴文件是由.c文件生成的.o文件
#模式規(guī)則
%.o: %.c
gcc -c $< #模式規(guī)則每次取出一個(gè),所以這里用$<
#end
寫Makefile系列的文章是做個(gè)筆記,為了以后方便復(fù)習(xí),里面應(yīng)該有許多BUG,等學(xué)一段時(shí)間后會(huì)繼續(xù)完善
審核編輯:湯梓紅
-
Makefile
+關(guān)注
關(guān)注
1文章
125瀏覽量
19145
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論