日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Makefile文件(四)_书写命令

發布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Makefile文件(四)_书写命令 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

變量說明:

$@ ? ? ? ---> ? ? ?目標文件

$^ ? ? ? ---> ? ? ? 所有的依賴文件

$< ? ? ? ---> ? ? ? 第一個依賴文件

?

一、顯示命令

  @echo 正在編譯xx模塊......

當make執行時,會輸出“正在編譯xx模塊......”,但不會輸出命令

  echo 正在編譯xx模塊......

make執行將輸出:echo 正在編譯xx模塊......

       ?正在編譯xx模塊......

說明:“@”字符在命令行前面,這個命令將不被make顯示出來。如果make執行帶參數“-n”或“--just-print”,那么只是顯示命令不執行。這有利于調試Makefile。而make參數“-s”或“--slient”則是全面禁止顯示命令

二、命令執行

如果要讓上一條命令的結果應用于下一條跳命令時,使用分號分隔這兩條命令。比如,第一條命令cd,第二條命令得在cd之后基礎上運行,那么就不能把這兩條命令寫在兩行上,而應該寫在一行上,用分號分割。

示例:

exec:

  cd /home/hchen

  pwd

示例:

exec:

  cd /home/hchen; pwd

當我們執行“make exec”時,第一個例子中的cd沒有作用,pwd會打印出當前的Makefile目錄,第二個例子中,cd就起作用了,pwd會打印出“/home/chen”。

三、命令出錯

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

有時,命令的出錯并不表示錯誤,例如mkdir命令。如果目錄不存在,mkdir成功執行,如果目錄存在則出錯。但此時我們不希望mkdir出錯而終止規則的運行。

忽略命令的出錯,可以在Makefile的命令行前加減號“-”,標記為不管命令出不出錯都認為成功。

全局的辦法:給make加上-i或是--ignore-errors參數,那么Makefile中的所有命令都會忽略錯誤。

如果一個規則以“.IGNORE”為目標,那么這個規則中的所有命令都會忽略錯誤。

make的參數“-k”或是“--keep-going”,表示如果規則中的某個命令出錯了,那么終止改規則,但繼續執行其他規則。

四、嵌套執行make

不同目錄下都有自己的Makefile文件。有利于Makefile簡介,易于維護,對于模塊編譯和分段編譯有著非常大的好處。

例如,子目錄subdir,該目錄下有個Makefile文件指明該目錄下文件的編譯規則。那么總控的Makefile可以這樣寫:

subsystem:

  cd subdir && $(MAKE)

等價于:

subsystem:

  $(MAKE) -C subdir

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

總控的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中,特別是MAEFLAGS變量,其中包含了make的參數信息。如果執行總控“Makefile”時有make參數或是在上層Makefile中定義了這個變量,那么MAKEFILES變量將會是這些參數,并會傳遞到下層Makefile中,這是一個系統級的環境變量。

但是make命令中的幾個參數不往下傳遞,“-C”,“-f”,“-h”,“-o”和“-W”,如果他們想往下層傳遞參數,可以:

subsystem:

  cd subdir && $(MAKE) MAKEFLAGS=

如果定義了環境變量MAKEFLAGS,那么得確信其中的選項是都會用到的。如果其中有“-t”,“-n”,“-q”,可能會有意想不到的后果。

參數“-w”或“--print-directory”會在make的過程中輸出一些信息,看到目前的工作目錄。比如下級make目錄是“/home/hchen/gun/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

說明:“yun-yacc”是命令包的名字,不要和Makefile中的變量重名。在“define”和“endef”中的兩行就是命令序列。這個命令包中的第一個命令是運行Yacc程序,因為Yacc程序總是生成“y.tab.c”的文件,所以第二行的命令就是把這個文件改名字。

實例:

foo.c:foo.y

  $(run-yacc)

在這個命令包的使用中,命令包“run-yacc”中的“$^”就是“foo.y”,“$@”就是“foo.c”,make執行命令包時,命令包中的每個命令會被依次獨立執行。

轉載于:https://www.cnblogs.com/weiyi-mgh/p/6941139.html

總結

以上是生活随笔為你收集整理的Makefile文件(四)_书写命令的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。