chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【Makefile】Makefile與shell命令的聯(lián)系

嵌入式物聯(lián)網(wǎng)開(kāi)發(fā) ? 來(lái)源:嵌入式物聯(lián)網(wǎng)開(kāi)發(fā) ? 作者:嵌入式物聯(lián)網(wǎng)開(kāi)發(fā) ? 2022-07-11 09:06 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

【Makefile】Makefile與shell命令為何總是藕斷絲連?

1 寫在前面

博主最近在項(xiàng)目實(shí)踐過(guò)程中,需要深度定制項(xiàng)目的Makefile,其中有些復(fù)雜的流程必須得借助shell腳本才能高效地完成,為此博主特意深入學(xué)習(xí)了在Makefile種調(diào)用shell命令的方法。

大家都知道shell命令是Linux的神器,學(xué)會(huì)靈活應(yīng)用它可以大大提升執(zhí)行的自動(dòng)化效率。

Makefile也是GNU的另一大神器,大家要知道,大名鼎鼎的Linux內(nèi)核的編譯就是靠Makefile來(lái)支撐的,連這么龐大、復(fù)雜的系統(tǒng)編譯它都可以輕松駕馭,可想而知,它也是牛逼哄哄的存在。

我們?cè)囅胍幌?,如果把Makefile和shell命令這兩大神器聯(lián)合在一起,會(huì)有怎樣的效果,我們一起來(lái)看下。

2 什么是Makefile?

這個(gè)問(wèn)題,我在之前的博文中就有介紹過(guò),感興趣的可以點(diǎn)過(guò)去看一看:【Linux + Makefile】十分鐘教你學(xué)會(huì)Makefile的FORCE。

下面我再總結(jié)下,到底什么是Makefile?

Makefile的基本形式如下所示:

TARGET : DEPENDENCES CMD

# TARGET:生成的目標(biāo),可以是一個(gè)文件,也可以是一個(gè)虛擬符號(hào)(非真實(shí)文件) # DEPENDENCES: 生成目標(biāo)的所有依賴,它是一個(gè)集合,可以只有一個(gè)文件,或者很多文件;也可以是虛擬符號(hào) # CMD:把所有依賴生成目標(biāo)的執(zhí)行命令,其中CMD前面是一個(gè)TAB鍵,而不能是空格 Makefile的基本規(guī)則,歸納起來(lái)就是一句話:【當(dāng)一個(gè)TARGET (欲生成的目標(biāo))比它的任何一個(gè)DEPENDENCES(依賴的文件)舊時(shí),這個(gè)TARGET就要重新生成】。

這段話讀起來(lái)很簡(jiǎn)單,就是Makefile在執(zhí)行編譯的時(shí)候,會(huì)先去判斷TARGET和其依賴文件的時(shí)間差,如果TARGET的時(shí)間比較舊,意味著依賴文件已經(jīng)更新了,那么TARGET就要重新生成;反之,如果TARGET的時(shí)間比較新,意味著在TARGET生成后,依賴文件是沒(méi)有改變過(guò)的,自然就不用重新去生成TARGET。

說(shuō)白了,就是搞清楚【TARGET 和 DEPENDENCES 的時(shí)間關(guān)系】,弄明白了這個(gè),你就可以讀懂Makefile了。

3 如何調(diào)試Makefile?

以下Makefile給大家演示下如何在Makefile中寫注釋以及如何調(diào)試Makefile的變量。

# This is an annotation for this Makefile.

# Call shell cmd in these ways ...
CUR_PATH = `pwd`
LS_FILES = "`ls`"
LS_TEST_FILES = "$(shell ls test*)"
DEBUG_VARIABLE = "debug"

# Debug your Makefile variables ...
$(info "This is a info msg ...")
$(warning "This is a warning msg ... DEBUG_VARIABLE=$(DEBUG_VARIABLE)")
$(error "This is a error msg ... It will make this Makefile to exist beacuse of an 'error' accur.")

# Begin you targets and dependences

info:
    @echo "CUR_PATH = $(CUR_PATH)"
    @echo "LS_FILES = $(LS_FILES)"
    @echo "LS_TEST_FILES = $(LS_TEST_FILES)"

我們執(zhí)行下make info可以看下,輸出信息:

img

分別對(duì)應(yīng)info,warning,error;這三個(gè)函數(shù)是Makefile中內(nèi)置的,在任意Makefile中都可以使用。但是需要注意的,這三個(gè)函數(shù)可以在Makefile的任意位置調(diào)用,但是必須符合語(yǔ)法規(guī)則,比如在CMD部分(見(jiàn)第一章節(jié)的引用內(nèi)容)調(diào)用時(shí),必須時(shí)TAB開(kāi)頭。

我們?cè)囅逻@個(gè)的效果:

imgimg

4 Makefile定義變量的時(shí)候調(diào)用shell命令

還是拿上面的Makefile來(lái)分析,我們一開(kāi)始定義了幾個(gè)變量:

CUR_PATH = `pwd`
LS_FILES = "`ls`"
LS_TEST_FILES = "$(shell ls test*)"

其中CURPATH是保存當(dāng)前Makefile的路徑,我們都知道shell命令有個(gè)pwd可以獲取到當(dāng)前目錄的路徑,所以 CURPATH 變量正是利用了這個(gè)命令來(lái)取得當(dāng)前路徑。其中,值得注意的是 表示的是獲取pwd命令的返回值,這個(gè),不是分號(hào) ' ',而是鍵盤左上角數(shù)字1左邊的那個(gè)鍵值,新手一般非常容易搞錯(cuò)這一點(diǎn)。

第二個(gè)變量LS_FILES的定義,使用同樣的方式調(diào)用了 ls 命令,但是它在返回值的左右,加了 “ ”;這樣做的主要目的是,ls的返回值通常是一個(gè)字符串,中間每個(gè)文件名用空格隔開(kāi)的;如果我們想把這一系列的字符串連起來(lái)而不是分散的,我們就必須使用 " "把它們包起來(lái),這樣Makefile變量就會(huì)把它當(dāng)作一個(gè)字符串整體來(lái)處理。

第三個(gè)變量LSTESTFILES,它就換了一種方式來(lái)調(diào)用shell命令,它的格式是 $(shell xxx),其中xxx就是一個(gè)可以在shell環(huán)境下執(zhí)行的shell命令,比如本例子中,xxx就是 ls test*。

兩者方法沒(méi)有本質(zhì)的區(qū)別,結(jié)合自己的實(shí)際情況來(lái)使用即可,從易讀性來(lái)說(shuō),推薦使用$(shell xxx)的調(diào)用方式。

5 Makefile在執(zhí)行命令的時(shí)候調(diào)用shell命令

以下面的Makefile為例子:

# This is an annotation for this Makefile.

shell_cmd:
    @ls test*
    @pwd
    @echo "shell_cmd test ..."

執(zhí)行make shell_cmd,我們可以看到輸出:

img

只要是shell執(zhí)行的命令,都可以運(yùn)行,這就方便我們做一些自動(dòng)化操作,比如創(chuàng)建目錄、刪除文件、下載文件、上傳文件等等。

6 Makefile以函數(shù)的形式調(diào)用shell命令

請(qǐng)看下面的Makefile內(nèi)容

# This is an annotation for this Makefile.

DEBUG_VARIABLE = "debug"

# This is a shell function.
define function_test_shell
    param1=$1;\
    local_variable=12345678;\
    debug_variable=$(DEBUG_VARIABLE);\
    echo "param1=$$param1";\
    echo "local_variable=$$local_variable";\
    echo "debug_variable=$$debug_variable";\
    i=0;\
    cnt=10;\
    for i in `seq $$cnt`; do\
        echo "i=$$i";\
    done;\
    ls -al;\
    ls -al test*
endef

# Begin you targets and dependences

shell_function:
    @$(call function_test_shell,$(DEBUG_VARIABLE))

我們執(zhí)行make shell_function可以看到輸出:

pYYBAGLK8s2ACqvEAABZItmdNSQ889.png

對(duì)應(yīng)就是shell函數(shù)里面的操作。

在Makefile調(diào)用shell函數(shù)的寫法上,有幾點(diǎn)特別需要注意:

1)Makefile定義函數(shù)是使用define 和 endef,務(wù)必配對(duì)使用;函數(shù)里面的實(shí)現(xiàn)可以調(diào)用shell命令,也可以調(diào)用Makefile內(nèi)置的函數(shù),也可以調(diào)用自定義的Makefile函數(shù);

2)Makefile函數(shù)的調(diào)用方式是$(call function,xx,yy,zz),其中function是函數(shù)名,也就是define后面的名字,xx/yy/zz分別是函數(shù)的三個(gè)入?yún)?;?dāng)然有幾個(gè)參數(shù)就填幾個(gè),每一個(gè)使用 , 隔開(kāi);

3) 在函數(shù)里面使用$1 $2 $3獲取輸入的參數(shù),即$+數(shù)字的方式獲取入?yún)ⅲ?/p>

4)如果函數(shù)里面使用的是shell組合命令,請(qǐng)務(wù)必在每一條shell命令后面加上 ; 符號(hào),并且每一行加上 \ 連起來(lái);這樣對(duì)于shell解析器而言,它會(huì)認(rèn)為是一條長(zhǎng)長(zhǎng)的組合輸入命令,而不報(bào)語(yǔ)法錯(cuò)誤;

5)函數(shù)內(nèi)部使用shell的變量,比如是變量a,正確的寫法是$$a;而不是常規(guī)的shell寫法$a,也不是Makefile獲取變量的方法$(a)或${a};這一點(diǎn)特別需要注意。

6)如果函數(shù)內(nèi)部訪問(wèn)的是Makefile定義的變量,比如示例中的訪問(wèn)DEBUGVARIABLE變量,還是采用$(DEBUGVARIABLE)的方式。


好了,本期分享就到這里,有疑問(wèn)的話,歡迎聯(lián)系我。

7 更多分享

歡迎關(guān)注我的github倉(cāng)庫(kù)01workstation,日常分享一些開(kāi)發(fā)筆記和項(xiàng)目實(shí)戰(zhàn),歡迎指正問(wèn)題。

同時(shí)也非常歡迎關(guān)注我的CSDN主頁(yè)和專欄:

【CSDN主頁(yè)-架構(gòu)師李肯】

RT-Thread主頁(yè)-架構(gòu)師李肯】

【C/C++語(yǔ)言編程專欄】

【GCC專欄】

【信息安全專欄】

【RT-Thread開(kāi)發(fā)筆記】

freeRTOS開(kāi)發(fā)筆記】

【BLE藍(lán)牙開(kāi)發(fā)筆記】

ARM開(kāi)發(fā)筆記】

RISC-V開(kāi)發(fā)筆記】

有問(wèn)題的話,可以跟我討論,知無(wú)不答,謝謝大家。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11763

    瀏覽量

    219071
  • Makefile
    +關(guān)注

    關(guān)注

    1

    文章

    125

    瀏覽量

    20351
  • Shell
    +關(guān)注

    關(guān)注

    1

    文章

    375

    瀏覽量

    25398
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    linux系統(tǒng)中Makefile的使用方法

    Makefile是一種編譯控制文件,廣泛用于項(xiàng)目的自動(dòng)化構(gòu)建。它定義了一系列的規(guī)則來(lái)指導(dǎo)構(gòu)建的過(guò)程。通過(guò)Makefile,開(kāi)發(fā)者可以輕松管理大型項(xiàng)目的編譯鏈接、清理等任務(wù)。本文將從Makefile
    的頭像 發(fā)表于 05-11 08:49 ?2456次閱讀

    Linux中makefileshell的區(qū)別

    :*** missing separator.Stop. 5、在Makefile中執(zhí)行shell命令,一行創(chuàng)建一個(gè)進(jìn)程來(lái)執(zhí)行。更多學(xué)習(xí)信息交流盧工3311615775,這也是為什么很多Make
    發(fā)表于 09-22 14:29

    Makefile編寫

    )shell函數(shù) 執(zhí)行shell命令例如:$(shell ls -d */)當(dāng)我們學(xué)會(huì)了Makefile編寫就可以讓其為我們所用了,有什么疑
    發(fā)表于 11-02 15:59

    C語(yǔ)言入門教程-makefile

    makefile 重復(fù)鍵入上一節(jié)的gcc命令很是麻煩,尤其是當(dāng)您要不斷修改的代碼,且使用了好幾個(gè)函數(shù)庫(kù)的時(shí)候。make工具解決了這個(gè)問(wèn)題。您可以用下面的makefile代替前面的一串編
    發(fā)表于 07-29 11:20 ?1041次閱讀

    駕馭Makefile

    駕馭Makefile在網(wǎng)上你能找到很多關(guān)于Makefile的學(xué)習(xí)資料,但絕大部分給你的只是一個(gè)知識(shí)點(diǎn),與將Makefile運(yùn)用到項(xiàng)目中(尤其是大型項(xiàng)目)的差距非常的大。因?yàn)?,?b class='flag-5'>Makefile
    發(fā)表于 01-05 17:05 ?9次下載

    linux makefile教程

     什么是makefile?或許很多Winodws的程序員都不知道這個(gè)東西,因?yàn)槟切¦indows的IDE都為你做了這個(gè)工作,但我覺(jué)得要作一個(gè)好的和professional的程序員,makefile
    發(fā)表于 11-12 09:11 ?1.7w次閱讀

    makefile的基本語(yǔ)法

     在Makefile中,最重要的三個(gè)概念是:目標(biāo)(target)、依賴關(guān)系(dependency)和命令(command)。目標(biāo)是指要干什么,即運(yùn)行make后生成什么;依賴是指明目標(biāo)所依賴的其他目標(biāo);命令則告訴make如何生成目
    發(fā)表于 11-12 10:15 ?1.2w次閱讀

    如何寫Makefile編譯匯編和C文件

    經(jīng)常在一個(gè)項(xiàng)目中包含多個(gè).c源文件,而且一個(gè).c源文件包含了一堆的頭文件,這種情況下如何編寫makefile,使得能成功編譯整個(gè)項(xiàng)目?本博文對(duì)這些問(wèn)題提出自己淺析的理解。涉及到對(duì)gcc命令使用與編譯流程理解及多文件時(shí)makefile
    發(fā)表于 11-24 09:03 ?1.6w次閱讀
    如何寫<b class='flag-5'>Makefile</b>編譯匯編和C文件

    嵌入式系統(tǒng)Kconfig .config Makefile聯(lián)系和區(qū)別

    2.6內(nèi)核的Makefile分為5個(gè)組成部分: 1. 最頂層的Makefile :讀取 .config文件的內(nèi)容,并總體上負(fù)責(zé)build內(nèi)核和模塊。 2. 內(nèi)核的.config配置文件 3. 在
    的頭像 發(fā)表于 08-01 16:20 ?6166次閱讀

    Makefile是什么?Makefile工作原理是怎樣的?Makefile經(jīng)典教程免費(fèi)下載

    Makefile的重要性 會(huì)不會(huì)寫makefile,從一個(gè)側(cè)面說(shuō)明了一個(gè)人是否具備完成大型工程的能力 makefile帶來(lái)的好處就是——“自動(dòng)化編譯”,一旦寫好,只需要一個(gè)make命令
    發(fā)表于 09-12 17:19 ?0次下載
    <b class='flag-5'>Makefile</b>是什么?<b class='flag-5'>Makefile</b>工作原理是怎樣的?<b class='flag-5'>Makefile</b>經(jīng)典教程免費(fèi)下載

    芯片設(shè)計(jì)中的Makefile簡(jiǎn)單教程

    Makefile可以根據(jù)指定的依賴規(guī)則和文件是否有修改來(lái)執(zhí)行命令。常用來(lái)編譯軟件源代碼,只需要重新編譯修改過(guò)的文件,使得編譯速度大大加快。
    的頭像 發(fā)表于 12-24 17:41 ?1553次閱讀

    Makefile】簡(jiǎn)單實(shí)用的Makefile模板來(lái)了

    【Linux + Makefile】簡(jiǎn)單實(shí)用的Makefile模板來(lái)了
    的頭像 發(fā)表于 08-31 12:46 ?2750次閱讀
    【<b class='flag-5'>Makefile</b>】簡(jiǎn)單實(shí)用的<b class='flag-5'>Makefile</b>模板來(lái)了

    Linux開(kāi)發(fā)_Makefile規(guī)則與Shell腳本語(yǔ)言

    介紹Linux下Makefile編程知識(shí)點(diǎn),Shell腳本知識(shí)點(diǎn)。
    的頭像 發(fā)表于 09-17 15:40 ?2261次閱讀

    什么是Makefile

    如果您有多個(gè) c、c++ 和其他語(yǔ)言的文件,并且想通過(guò)終端命令編譯它們,我們?cè)撊绾尉幾g他們呢?為了解決這類問(wèn)題,Makefile就出現(xiàn)了。
    的頭像 發(fā)表于 02-17 10:41 ?6057次閱讀
    什么是<b class='flag-5'>Makefile</b>?

    Makefile可以做什么?Makefile的基本格式

    Makefile可以根據(jù)指定的依賴規(guī)則和文件是否有修改來(lái)執(zhí)行命令。常用來(lái)編譯軟件源代碼,只需要重新編譯修改過(guò)的文件,使得編譯速度大大加快。
    的頭像 發(fā)表于 01-25 11:18 ?1418次閱讀