亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 跟我一起寫 makefile.txt

?? 一篇比較經典的介紹MAKEFILE的技術文檔!
?? TXT
?? 第 1 頁 / 共 5 頁
字號:
三、命令出錯

每當命令運行完后,make會檢測每個命令的返回碼,如果命令返回成功,那么make會執行下一條命令,當規則中所有的命令成功返回后,這個規則就算是成功完成了。如果一個規則中的某個命令出錯了(命令退出碼非零),那么make就會終止執行當前規則,這將有可能終止所有規則的執行。

有些時候,命令的出錯并不表示就是錯誤的。例如mkdir命令,我們一定需要建立一個目錄,如果目錄不存在,那么mkdir就成功執行,萬事大吉,如果目錄存在,那么就出錯了。我們之所以使用mkdir的意思就是一定要有這樣的一個目錄,于是我們就不希望mkdir出錯而終止規則的運行。

為了做到這一點,忽略命令的出錯,我們可以在Makefile的命令行前加一個減號“-”(在Tab鍵之后),標記為不管命令出不出錯都認為是成功的。如:

clean:
-rm -f *.o

還有一個全局的辦法是,給make加上“-i”或是“--ignore-errors”參數,那么,Makefile中所有命令都會忽略錯誤。而如果一個規則是以“.IGNORE”作為目標的,那么這個規則中的所有命令將會忽略錯誤。這些是不同級別的防止命令出錯的方法,你可以根據你的不同喜歡設置。

還有一個要提一下的make的參數的是“-k”或是“--keep-going”,這個參數的意思是,如果某規則中的命令出錯了,那么就終目該規則的執行,但繼續執行其它規則。



四、嵌套執行make

在一些大的工程中,我們會把我們不同模塊或是不同功能的源文件放在不同的目錄中,我們可以在每個目錄中都書寫一個該目錄的Makefile,這有利于讓我們的Makefile變得更加地簡潔,而不至于把所有的東西全部寫在一個Makefile中,這樣會很難維護我們的Makefile,這個技術對于我們模塊編譯和分段編譯有著非常大的好處。

例如,我們有一個子目錄叫subdir,這個目錄下有個Makefile文件,來指明了這個目錄下文件的編譯規則。那么我們總控的Makefile可以這樣書寫:

subsystem:
cd subdir && $(MAKE)

其等價于:

subsystem:
$(MAKE) -C subdir

定義$(MAKE)宏變量的意思是,也許我們的make需要一些參數,所以定義成一個變量比較利于維護。這兩個例子的意思都是先進入“subdir”目錄,然后執行make命令。

我們把這個Makefile叫做“總控Makefile”,總控Makefile的變量可以傳遞到下級的Makefile中(如果你顯示的聲明),但是不會覆蓋下層的Makefile中所定義的變量,除非指定了“-e”參數。

如果你要傳遞變量到下級Makefile中,那么你可以使用這樣的聲明:

export <variable ...>

如果你不想讓某些變量傳遞到下級Makefile中,那么你可以這樣聲明: 

unexport <variable ...>

如:

示例一:

export variable = value

其等價于:

variable = value
export variable

其等價于:

export variable := value

其等價于:

variable := value
export variable

示例二:

export variable += value

其等價于:

variable += value
export variable

如果你要傳遞所有的變量,那么,只要一個export就行了。后面什么也不用跟,表示傳遞所有的變量。

需要注意的是,有兩個變量,一個是SHELL,一個是MAKEFLAGS,這兩個變量不管你是否export,其總是要傳遞到下層Makefile中,特別是MAKEFILES變量,其中包含了make的參數信息,如果我們執行“總控Makefile”時有make參數或是在上層Makefile中定義了這個變量,那么MAKEFILES變量將會是這些參數,并會傳遞到下層Makefile中,這是一個系統級的環境變量。

但是make命令中的有幾個參數并不往下傳遞,它們是“-C”,“-f”,“-h”“-o”和“-W”(有關Makefile參數的細節將在后面說明),如果你不想往下層傳遞參數,那么,你可以這樣來:

subsystem:
cd subdir && $(MAKE) MAKEFLAGS=

如果你定義了環境變量MAKEFLAGS,那么你得確信其中的選項是大家都會用到的,如果其中有“-t”,“-n”,和“-q”參數,那么將會有讓你意想不到的結果,或許會讓你異常地恐慌。

還有一個在“嵌套執行”中比較有用的參數,“-w”或是“--print-directory”會在make的過程中輸出一些信息,讓你看到目前的工作目錄。比如,如果我們的下級make目錄是“/home/hchen/gnu/make”,如果我們使用“make -w”來執行,那么當進入該目錄時,我們會看到:

make: Entering directory `/home/hchen/gnu/make'.

而在完成下層make后離開目錄時,我們會看到:

make: Leaving directory `/home/hchen/gnu/make'

當你使用“-C”參數來指定make下層Makefile時,“-w”會被自動打開的。如果參數中有“-s”(“--slient”)或是“--no-print-directory”,那么,“-w”總是失效的。



五、定義命令包

如果Makefile中出現一些相同命令序列,那么我們可以為這些相同的命令序列定義一個變量。定義這種命令序列的語法以“define”開始,以“endef”結束,如:

define run-yacc
yacc $(firstword $^)
mv y.tab.c $@
endef

這里,“run-yacc”是這個命令包的名字,其不要和Makefile中的變量重名。在“define”和“endef”中的兩行就是命令序列。這個命令包中的第一個命令是運行Yacc程序,因為Yacc程序總是生成“y.tab.c”的文件,所以第二行的命令就是把這個文件改改名字。還是把這個命令包放到一個示例中來看看吧。

foo.c : foo.y
$(run-yacc)

我們可以看見,要使用這個命令包,我們就好像使用變量一樣。在這個命令包的使用中,命令包“run-yacc”中的“$^”就是“foo.y”,“$@”就是“foo.c”(有關這種以“$”開頭的特殊變量,我們會在后面介紹),make在執行命令包時,命令包中的每個命令會被依次獨立執行。

使用變量
————

在Makefile中的定義的變量,就像是C/C++語言中的宏一樣,他代表了一個文本字串,在Makefile中執行的時候其會自動原模原樣地展開在所使用的地方。其與C/C++所不同的是,你可以在Makefile中改變其值。在Makefile中,變量可以使用在“目標”,“依賴目標”,“命令”或是Makefile的其它部分中。

變量的命名字可以包含字符、數字,下劃線(可以是數字開頭),但不應該含有“:”、“#”、“=”或是空字符(空格、回車等)。變量是大小寫敏感的,“foo”、“Foo”和“FOO”是三個不同的變量名。傳統的Makefile的變量名是全大寫的命名方式,但我推薦使用大小寫搭配的變量名,如:MakeFlags。這樣可以避免和系統的變量沖突,而發生意外的事情。

有一些變量是很奇怪字串,如“$<”、“$@”等,這些是自動化變量,我會在后面介紹。

一、變量的基礎

變量在聲明時需要給予初值,而在使用時,需要給在變量名前加上“$”符號,但最好用小括號“()”或是大括號“{}”把變量給包括起來。如果你要使用真實的“$”字符,那么你需要用“$$”來表示。

變量可以使用在許多地方,如規則中的“目標”、“依賴”、“命令”以及新的變量中。先看一個例子:

objects = program.o foo.o utils.o
program : $(objects)
cc -o program $(objects)

$(objects) : defs.h

變量會在使用它的地方精確地展開,就像C/C++中的宏一樣,例如:

foo = c
prog.o : prog.$(foo)
$(foo)$(foo) -$(foo) prog.$(foo)

展開后得到:

prog.o : prog.c
cc -c prog.c

當然,千萬不要在你的Makefile中這樣干,這里只是舉個例子來表明Makefile中的變量在使用處展開的真實樣子。可見其就是一個“替代”的原理。

另外,給變量加上括號完全是為了更加安全地使用這個變量,在上面的例子中,如果你不想給變量加上括號,那也可以,但我還是強烈建議你給變量加上括號。


二、變量中的變量

在定義變量的值時,我們可以使用其它變量來構造變量的值,在Makefile中有兩種方式來在用變量定義變量的值。

先看第一種方式,也就是簡單的使用“=”號,在“=”左側是變量,右側是變量的值,右側變量的值可以定義在文件的任何一處,也就是說,右側中的變量不一定非要是已定義好的值,其也可以使用后面定義的值。如:

foo = $(bar)
bar = $(ugh)
ugh = Huh?

all:
echo $(foo)

我們執行“make all”將會打出變量$(foo)的值是“Huh?”( $(foo)的值是$(bar),$(bar)的值是$(ugh),$(ugh)的值是“Huh?”)可見,變量是可以使用后面的變量來定義的。

這個功能有好的地方,也有不好的地方,好的地方是,我們可以把變量的真實值推到后面來定義,如:

CFLAGS = $(include_dirs) -O
include_dirs = -Ifoo -Ibar

當“CFLAGS”在命令中被展開時,會是“-Ifoo -Ibar -O”。但這種形式也有不好的地方,那就是遞歸定義,如:

CFLAGS = $(CFLAGS) -O

或:

A = $(B)
B = $(A)

這會讓make陷入無限的變量展開過程中去,當然,我們的make是有能力檢測這樣的定義,并會報錯。還有就是如果在變量中使用函數,那么,這種方式會讓我們的make運行時非常慢,更糟糕的是,他會使用得兩個make的函數“wildcard”和“shell”發生不可預知的錯誤。因為你不會知道這兩個函數會被調用多少次。

為了避免上面的這種方法,我們可以使用make中的另一種用變量來定義變量的方法。這種方法使用的是“:=”操作符,如:

x := foo
y := $(x) bar
x := later

其等價于:

y := foo bar
x := later

值得一提的是,這種方法,前面的變量不能使用后面的變量,只能使用前面已定義好了的變量。如果是這樣:

y := $(x) bar
x := foo

那么,y的值是“bar”,而不是“foo bar”。

上面都是一些比較簡單的變量使用了,讓我們來看一個復雜的例子,其中包括了make的函數、條件表達式和一個系統變量“MAKELEVEL”的使用:

ifeq (0,${MAKELEVEL})
cur-dir := $(shell pwd)
whoami := $(shell whoami)
host-type := $(shell arch)
MAKE := ${MAKE} host-type=${host-type} whoami=${whoami}
endif

關于條件表達式和函數,我們在后面再說,對于系統變量“MAKELEVEL”,其意思是,如果我們的make有一個嵌套執行的動作(參見前面的“嵌套使用make”),那么,這個變量會記錄了我們的當前Makefile的調用層數。

下面再介紹兩個定義變量時我們需要知道的,請先看一個例子,如果我們要定義一個變量,其值是一個空格,那么我們可以這樣來:

nullstring :=
space := $(nullstring) # end of the line

nullstring是一個Empty變量,其中什么也沒有,而我們的space的值是一個空格。因為在操作符的右邊是很難描述一個空格的,這里采用的技術很管用,先用一個Empty變量來標明變量的值開始了,而后面采用“#”注釋符來表示變量定義的終止,這樣,我們可以定義出其值是一個空格的變量。請注意這里關于“#”的使用,注釋符“#”的這種特性值得我們注意,如果我們這樣定義一個變量:

dir := /foo/bar # directory to put the frobs in

dir這個變量的值是“/foo/bar”,后面還跟了4個空格,如果我們這樣使用這樣變量來指定別的目錄——“$(dir)/file”那么就完蛋了。

還有一個比較有用的操作符是“?=”,先看示例:

FOO ?= bar

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕乱码日本亚洲一区二区| 国产大片一区二区| 久久久噜噜噜久噜久久综合| 欧美一级片免费看| 欧美一级高清片| 6080午夜不卡| 精品国产一区二区三区av性色| 欧美精品三级日韩久久| 在线不卡欧美精品一区二区三区| 欧美日韩视频在线第一区| 欧美日韩国产经典色站一区二区三区| 在线观看免费一区| 欧美精品成人一区二区三区四区| 日韩欧美一级二级三级| 欧美电视剧免费观看| 久久久久久久久久久黄色 | 亚洲欧美另类图片小说| 亚洲品质自拍视频| 亚洲777理论| 精品一区二区三区欧美| 成人一区在线看| 色又黄又爽网站www久久| 欧美日韩一区不卡| 欧美成人vps| 国产精品黄色在线观看| 一区二区视频在线看| 亚洲大片免费看| 久久电影网站中文字幕| 成人v精品蜜桃久久一区| 欧洲中文字幕精品| 欧美不卡一二三| 国产精品污www在线观看| 国产精品国产a级| 日韩电影免费一区| 成人av电影在线观看| 91精品久久久久久久99蜜桃| 日本一区二区三区久久久久久久久不 | 国产女人aaa级久久久级 | 日韩影院免费视频| 懂色av中文字幕一区二区三区 | 国产亚洲欧美激情| 亚洲精品国产成人久久av盗摄| 奇米777欧美一区二区| 国产a区久久久| 欧美日韩在线播放一区| 国产片一区二区| 视频一区二区国产| 成人教育av在线| 日韩女优av电影| 亚洲视频在线一区| 国产一本一道久久香蕉| 777午夜精品视频在线播放| 中文字幕精品一区二区精品绿巨人 | 狠狠色丁香婷婷综合久久片| 色哟哟日韩精品| 亚洲国产精品ⅴa在线观看| 天天综合日日夜夜精品| 91美女在线观看| 久久亚区不卡日本| 久久精品国产99| 欧美日韩电影在线播放| 亚洲最大色网站| va亚洲va日韩不卡在线观看| 久久丝袜美腿综合| 日本大胆欧美人术艺术动态| 欧美日韩国产首页| 亚洲一区二区三区四区不卡| 成人av电影在线| 中文字幕中文字幕中文字幕亚洲无线| 日本欧美大码aⅴ在线播放| 欧美日韩国产bt| 婷婷久久综合九色综合伊人色| 色婷婷综合久久| 一区二区三区在线视频免费| 色噜噜偷拍精品综合在线| 中文一区二区在线观看| 国产成人午夜99999| 日本一区二区免费在线 | 亚洲一二三级电影| 一本到不卡免费一区二区| 国产精品久久久久久久岛一牛影视| 国产一区二区电影| 久久人人超碰精品| 国产精品影视网| 国产三级精品视频| 不卡一区中文字幕| 国产精品成人网| 在线观看视频欧美| 日韩电影一二三区| 久久综合狠狠综合久久激情| 国产麻豆一精品一av一免费| xf在线a精品一区二区视频网站| 久久99久久久欧美国产| 国产亚洲人成网站| 99视频在线精品| 亚洲国产日韩一区二区| 欧美一区二区在线看| 国产一区二区按摩在线观看| 国产精品欧美极品| 欧美性色黄大片| 麻豆精品久久久| 中文字幕在线不卡国产视频| 99re66热这里只有精品3直播| 樱花草国产18久久久久| 日韩亚洲欧美高清| 国产精品小仙女| 亚洲精品欧美激情| 欧美军同video69gay| 韩国欧美国产1区| 自拍偷拍亚洲激情| 91麻豆精品国产91久久久久久| 精品一区二区在线观看| 中文字幕综合网| 欧美一区日本一区韩国一区| 国产成人综合网站| 日韩影视精彩在线| 国产精品久久久久久久久图文区| 欧美日韩一卡二卡三卡| 丁香婷婷综合色啪| 午夜精品视频在线观看| 中文字幕av在线一区二区三区| 欧美午夜精品久久久久久超碰| 蜜桃av一区二区| 亚洲亚洲人成综合网络| 中文一区二区在线观看| 日韩欧美资源站| 欧美在线观看你懂的| 国产麻豆精品视频| 伦理电影国产精品| 一区二区三区精品视频| 国产亚洲欧美日韩在线一区| 欧美电影一区二区| 欧美日韩久久久| 99久久久国产精品免费蜜臀| 国产在线不卡一卡二卡三卡四卡| 午夜av电影一区| 日韩理论片网站| 国产精品日韩成人| 欧美电影免费观看高清完整版在线 | 国产精品一区二区视频| 一区二区三区在线影院| 国产精品麻豆视频| 久久久久久电影| 精品久久久久久亚洲综合网| 91精品国产高清一区二区三区| 91福利在线观看| 日本韩国视频一区二区| 91亚洲精品一区二区乱码| av在线这里只有精品| 成人免费不卡视频| 成人性生交大片免费看中文网站 | 国产精品国产精品国产专区不蜜| 欧美mv日韩mv国产网站app| 精品毛片乱码1区2区3区| 日韩欧美在线1卡| 日韩丝袜情趣美女图片| 欧美一区午夜视频在线观看 | 国产欧美精品在线观看| 欧美国产精品中文字幕| 中文字幕av一区二区三区免费看| 国产婷婷精品av在线| 国产亚洲精品久| 国产精品青草综合久久久久99| 中文字幕精品综合| 亚洲美女视频一区| 亚洲成人高清在线| 免费观看在线色综合| 精品一区二区三区免费| 久久99国产精品久久99果冻传媒| 精品无码三级在线观看视频| 经典三级视频一区| av在线不卡观看免费观看| 色婷婷av一区二区三区gif | 久久久99久久精品欧美| 中文一区在线播放| 亚洲第一精品在线| 国产真实乱子伦精品视频| 成人高清视频在线| 在线视频综合导航| 日韩一区二区电影在线| 国产视频不卡一区| 亚洲另类在线制服丝袜| 五月天激情综合| 国产一二精品视频| 欧美日韩一级大片网址| 欧美成人国产一区二区| 中文字幕一区av| 久久精品国产精品亚洲精品| 91片黄在线观看| 日韩精品一区二区三区视频播放 | 91免费版在线| 制服丝袜在线91| 国产精品久久久久久久蜜臀 | 欧美激情中文字幕| 一区二区三区蜜桃网| 国产一区二区三区免费在线观看 | 欧美性生交片4| 国产人成亚洲第一网站在线播放| 亚洲网友自拍偷拍| 丁香婷婷深情五月亚洲|