日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

【Linux + Makefile】十分鐘教你學(xué)會(huì)Makefile的FORCE

 XeonGate 2021-01-27

https://blog.csdn.net/szullc/article/details/85036984

相信大家在使用Linux環(huán)境編程的時(shí)候,一定接觸過(guò)Makefile這個(gè)玩意。Makefile在搭建自定義的編譯環(huán)境,尤其是自動(dòng)化編譯、多功能一鍵編譯等功能上,還是發(fā)揮了很大的作用。如果接觸過(guò)Linux內(nèi)核編譯的童鞋,一定會(huì)看到編譯內(nèi)核中的各級(jí)Makefile中,有很多地方都會(huì)有 FORCE 這樣的字段出現(xiàn),那么這個(gè) FORCE 究竟是何方神圣呢?本文將給你答案,通過(guò)閱讀本文,你講了解到以下內(nèi)容:

  • Makefile的基本規(guī)則

  • FORCE 在Makefile的含義

  • FORCE在實(shí)際工程中的應(yīng)用


Makefile的基本規(guī)則


Makefile的基本形式如下所示:

TARGET : DEPENDENCESCMD# 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í)間比較舊,意味著依賴文件有更新了,所以TARGET要重新生成;反之,如果TARGET的時(shí)間比較新,意味著在TARGET生成后,依賴文件是沒(méi)有改變過(guò)的,自然就不用重新去生成TARGET。


FORCE 在Makefile的含義


有了上一小節(jié)中介紹的Makefile基本概念后,我們來(lái)進(jìn)一步分析下Makefile中的FORCE,以下是FORCE在Makefile中出現(xiàn)的最簡(jiǎn)化版本:

file = test.txtall: generate-a-filegenerate-a-file: $(file)$(file):@echo "Force to generate a test file for every make ..."rm -rf $(file) && echo `date "+%Y-%m-%d %H:%M:%S"` > $(file)FORCE:.PHONY: FORCE

這個(gè)Makefile不是用于真正的編譯工程,而是提供一個(gè)很簡(jiǎn)單的功能,生成一個(gè)test.txt,并且這個(gè)test.txt的內(nèi)容是記錄每次編譯的時(shí)間。但是使用這個(gè)makefile執(zhí)行make時(shí),發(fā)現(xiàn)只有第一次make的時(shí)候,才會(huì)生成test.txt,而其他時(shí)候只要test.txt還存在都不會(huì)重新生成,如下所示:

很明顯,它沒(méi)有達(dá)到我們期望的“每次編譯都重新生成test.txt”。這個(gè)時(shí)候 FORCE 就發(fā)揮作用了,我們?cè)?test.txt目標(biāo)的后面添加 FORCE作為它的依賴試試看,即如下所示:

file = test.txtall: generate-a-filegenerate-a-file: $(file)$(file): FORCE  #FORCE表示每次這段都要執(zhí)行@echo "Force to generate a test file for every make ..."rm -rf $(file) && echo `date "+%Y-%m-%d %H:%M:%S"` > $(file)FORCE:.PHONY: FORCE

執(zhí)行輸出如下所示: 我們可以看到,這達(dá)到了我們的目的,每次test.txt都是重新生成了,它記錄了每次make的時(shí)間。

這個(gè)就是要?dú)w功于 FORCE 的功勞了。我們來(lái)分析下,為何加了 FORCE 就能實(shí)現(xiàn)這樣的功能。

我們可以注意到FORCE這個(gè)目標(biāo),它的DEPENDENCES是空的,CMD部分也是空的;這個(gè)比較特殊了,在Makefile里,像這樣依賴為空、執(zhí)行命令也為空的TARGET,則需要每次都重新生成,而這個(gè)TARGET不一定是一個(gè)文件,可以是任意的符號(hào),而 FORCE 只是我們最常用的符號(hào),理論上它可以換成任意符號(hào),比如NO-FORCE、SOMETHING等等。


FORCE在實(shí)際工程中的應(yīng)用


上一小節(jié),我們講到可以用Makefile配合shell命令來(lái)自動(dòng)生成一些文件,自然我們很容易想到,在我們實(shí)際的編譯工程中,往往需要?jiǎng)討B(tài)生成一些配置項(xiàng),然后嵌入到代碼中,比如編譯版本號(hào)、編譯時(shí)間等。

假設(shè)我們有以下一個(gè)main.c:

#include <stdio.h>#include "build_info.h"  #這個(gè)頭文件需要每次編譯時(shí)自動(dòng)生成int main(int argc, const char *argv[]){printf("%s >>> APP_TIME=%s\n", __func__, APP_TIME);return 0;}

示例代碼很簡(jiǎn)單,就是再main函數(shù)中打印一個(gè) build_info.h中的一個(gè)宏定義APP_TIME,這個(gè)build_info.h要求每次編譯的時(shí)候都重新生成。我們給出的Makefile示例如下:

##拷貝時(shí),注意tab鍵SHELL           = /bin/bash #指定shell使用/bin/bash,否則echo -e可能會(huì)出問(wèn)題ECHO            = echoBIN             = testBUILG_INFO_H    = build_info.hSRC-C-y         = main.cSRC-O           = $(patsubst %.c, $(O)%.o, $(SRC-C-y))all: gen_build_info $(BIN)$(BIN) : $(SRC-O)gcc -o $(O)"$@" $(SRC-O)%.o : %.cgcc -c "$<" -o "$@"gen_build_info: $(BUILG_INFO_H)$(BUILG_INFO_H): FORCE     #強(qiáng)制生成build_info.h@$(RM) $@@$(ECHO) '  GEN     $@'@$(ECHO) -e   " #ifndef __BUILD_INFO_H__\n"\"#define __BUILD_INFO_H__\n"\"#define APP_TIME        \"`date "+%Y-%m-%d %H:%M:%S"`\"\n"\"#endif"  > $@FORCE:.PHONY: FORCE

make執(zhí)行輸出測(cè)試如下:

從輸出的測(cè)試,我們可以看出,make的每次執(zhí)行都觸發(fā)了生成build_info.h,但是運(yùn)行編譯出來(lái)的test可執(zhí)行程序,我們發(fā)現(xiàn)并不是每次生成的build_info.h的內(nèi)容都傳遞到了test里面;也就是當(dāng)build_info.h改變的時(shí)候,test沒(méi)有被重新編譯。這里先留下點(diǎn)疑問(wèn),為何會(huì)產(chǎn)生這樣的問(wèn)題。博主將會(huì)在后續(xù)的文章中解決這個(gè)問(wèn)題。


不管怎么樣,經(jīng)過(guò)對(duì)上文的學(xué)習(xí),我們至少掌握了 FORCE的基本用法,而在實(shí)際項(xiàng)目工程中,我們也見(jiàn)證了它的威力;那么,你學(xué)會(huì)了嗎?如果還有疑問(wèn),歡迎在評(píng)論席提出你的問(wèn)題和看法,博主定會(huì)盡力解決你的困惑。

版權(quán)申明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處!https://blog.csdn.net/szullc/article/details/85036984

原創(chuàng)作者:李路昌

電子郵箱:recan.szu@foxmail.com

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多