自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

重新發(fā)現(xiàn)make: 規(guī)則背后的力量

系統(tǒng) Linux
我過(guò)去認(rèn)為 makefile 只是一種將一組組的 shell 命令列出來(lái)的簡(jiǎn)便方法;過(guò)了一段時(shí)間我了解到它們是有多么的強(qiáng)大、靈活以及功能齊全。這篇文章帶你領(lǐng)略其中一些有關(guān)規(guī)則的特性。

[[261493]]

我過(guò)去認(rèn)為 makefile 只是一種將一組組的 shell 命令列出來(lái)的簡(jiǎn)便方法;過(guò)了一段時(shí)間我了解到它們是有多么的強(qiáng)大、靈活以及功能齊全。這篇文章帶你領(lǐng)略其中一些有關(guān)規(guī)則的特性。

備注:這些全是針對(duì) GNU Makefile 的,如果你希望支持 BSD Makefile ,你會(huì)發(fā)現(xiàn)有些新的功能缺失。感謝 zge 指出這點(diǎn)。

規(guī)則

規(guī)則rule是指示 make 應(yīng)該如何并且何時(shí)構(gòu)建一個(gè)被稱作為目標(biāo)target的文件的指令。目標(biāo)可以依賴于其它被稱作為前提prerequisite的文件。

你會(huì)指示 make 如何按步驟recipe構(gòu)建目標(biāo),那就是一套按照出現(xiàn)順序一次執(zhí)行一個(gè)的 shell 命令。語(yǔ)法像這樣:

  1. target_name : prerequisites
  2. recipe

一但你定義好了規(guī)則,你就可以通過(guò)從命令行執(zhí)行以下命令構(gòu)建目標(biāo):

  1. $ make target_name

目標(biāo)一經(jīng)構(gòu)建,除非前提改變,否則 make 會(huì)足夠聰明地不再去運(yùn)行該步驟。

關(guān)于前提的更多信息

前提表明了兩件事情:

  • 當(dāng)目標(biāo)應(yīng)當(dāng)被構(gòu)建時(shí):如果其中一個(gè)前提比目標(biāo)更新,make 假定目的應(yīng)當(dāng)被構(gòu)建。
  • 執(zhí)行的順序:鑒于前提可以反過(guò)來(lái)在 makefile 中由另一套規(guī)則所構(gòu)建,它們同樣暗示了一個(gè)執(zhí)行規(guī)則的順序。

如果你想要定義一個(gè)順序但是你不想在前提改變的時(shí)候重新構(gòu)建目標(biāo),你可以使用一種特別的叫做“唯順序order only”的前提。這種前提可以被放在普通的前提之后,用管道符(|)進(jìn)行分隔。

樣式

為了便利,make 接受目標(biāo)和前提的樣式。通過(guò)包含 % 符號(hào)可以定義一種樣式。這個(gè)符號(hào)是一個(gè)可以匹配任何長(zhǎng)度的文字符號(hào)或者空隔的通配符。以下有一些示例:

  • %:匹配任何文件
  • %.md:匹配所有 .md 結(jié)尾的文件
  • prefix%.go:匹配所有以 prefix 開頭以 .go 結(jié)尾的文件

特殊目標(biāo)

有一系列目標(biāo)名字,它們對(duì)于 make 來(lái)說(shuō)有特殊的意義,被稱作特殊目標(biāo)special target。

你可以在這個(gè)文檔發(fā)現(xiàn)全套特殊目標(biāo)。作為一種經(jīng)驗(yàn)法則,特殊目標(biāo)以點(diǎn)開始后面跟著大寫字母。

以下是幾個(gè)有用的特殊目標(biāo):

  • .PHONY:向 make 表明此目標(biāo)的前提可以被當(dāng)成偽目標(biāo)。這意味著 make 將總是運(yùn)行,無(wú)論有那個(gè)名字的文件是否存在或者上次被修改的時(shí)間是什么。
  • .DEFAULT:被用于任何沒有指定規(guī)則的目標(biāo)。
  • .IGNORE:如果你指定 .IGNORE 為前提,make 將忽略執(zhí)行步驟中的錯(cuò)誤。

替代

當(dāng)你需要以你指定的改動(dòng)方式改變一個(gè)變量的值,替代substitution就十分有用了。

替代的格式是 $(var:a=b),它的意思是獲取變量 var 的值,用值里面的 b 替代詞末尾的每個(gè) a 以代替最終的字符串。例如:

  1. foo := a.o
  2. bar : = $(foo:.o=.c) # sets bar to a.c

注意:特別感謝 Luis Lavena 讓我們知道替代的存在。

檔案文件

檔案文件是用來(lái)一起將多個(gè)數(shù)據(jù)文檔(類似于壓縮文件的概念)收集成一個(gè)文件。它們由 ar Unix 工具所構(gòu)建。ar 可以用于為任何目的創(chuàng)建檔案,但除了靜態(tài)庫(kù),它已經(jīng)被 tar 大量替代。

make 中,你可以使用一個(gè)檔案文件中的單獨(dú)一個(gè)成員作為目標(biāo)或者前提,就像這樣:

  1. archive(member) : prerequisite
  2. recipe

***的想法

關(guān)于 make 還有更多可探索的,但是至少這是一個(gè)起點(diǎn),我強(qiáng)烈鼓勵(lì)你去查看文檔,創(chuàng)建一個(gè)笨拙的 makefile 然后就可以探索它了。 

責(zé)任編輯:龐桂玉 來(lái)源: Linux中國(guó)
相關(guān)推薦

2021-10-15 10:11:00

遠(yuǎn)程管理監(jiān)控數(shù)據(jù)中心

2016-10-09 13:19:43

2016-07-06 11:38:10

移動(dòng) 出海

2022-08-16 08:35:45

Black Hat網(wǎng)絡(luò)安全

2012-06-20 09:39:02

惡意網(wǎng)站

2013-02-28 10:24:18

2021-01-15 07:22:51

APP時(shí)間規(guī)劃局證件照相機(jī)

2021-03-03 11:13:30

APP手機(jī)打車軟件

2009-05-05 11:06:19

存儲(chǔ)技術(shù)藍(lán)寶石高數(shù)據(jù)存儲(chǔ)

2010-03-26 17:50:17

Python設(shè)計(jì)理念

2023-02-21 21:50:07

2013-03-05 09:04:38

Java 60day

2021-06-06 16:19:46

微軟Windows 10Windows

2020-05-08 10:12:25

腦機(jī)接口機(jī)器翻譯人工智能

2021-10-18 13:10:41

勒索軟件攻擊信息安全

2014-09-25 09:59:00

2019-03-25 22:04:19

編程PythonJava

2021-07-01 14:52:17

Windows 11操作系統(tǒng)微軟

2022-04-19 16:10:47

漏洞網(wǎng)絡(luò)攻擊
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)