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的基本格式

sanyue7758 ? 來(lái)源: ExASIC ? 2024-01-25 11:18 ? 次閱讀

Makefile可以做什么?

Makefile可以根據(jù)指定的依賴規(guī)則和文件是否有修改來(lái)執(zhí)行命令。常用來(lái)編譯軟件源代碼,只需要重新編譯修改過(guò)的文件,使得編譯速度大大加快。

Makefile的基本格式

目標(biāo):依賴

命令

目標(biāo)是要生成的結(jié)果,依賴是生成結(jié)果需要的源文件和上一步驟的結(jié)果,命令是當(dāng)目標(biāo)不存在或者依賴更新時(shí)執(zhí)行的命令。注意命令前必須用tab來(lái)縮進(jìn),不可以用空格。

示例一:

simv: tb.sv dut.v

vcs -full64 -sverilog tb.sv dut.v

這個(gè)例子中,simv是目標(biāo),是我們要生成的仿真執(zhí)行文件。tb.sv和dut.v是依賴,執(zhí)行命令前會(huì)先檢查tb.sv和dut.v是否存在,以及是否有修改。當(dāng)依賴文件有修改時(shí),或者目標(biāo)不存在時(shí),則執(zhí)行命令vcs -full64 -sverilog tb.sv dut.v來(lái)生成simv。

偽目標(biāo)

有時(shí)候目標(biāo)并不是真實(shí)要生成的文件,比如我們要用Makefile調(diào)用simv來(lái)仿真,并不存在一個(gè)叫做sim的目標(biāo)文件,這種情況我們稱之為偽目標(biāo)PHONY。

示例二:

sim: simv

./simv -xxx

這個(gè)例子中,sim并不是要生成的結(jié)果文件,而只是我們給操作起的一個(gè)名字。由于偽目標(biāo)總是不存在,所以命令也一定會(huì)重新執(zhí)行,即使simv沒(méi)有修改。

我們常常在Makefile的開頭來(lái)用.PHONY顯式指明偽目標(biāo)。

示例三:

.PHONY: sim

sim: simv

./simv -xxx

這樣,我們?cè)?a href="http://www.ttokpm.com/tags/te/" target="_blank">terminal里就可以用make sim來(lái)調(diào)用仿真命令。

默認(rèn)目標(biāo)

如果我們只是敲make(后面不跟目標(biāo)),那么將調(diào)用Makefile里的第一個(gè)目標(biāo)。那么我們?yōu)榱朔乐钩鲥e(cuò)通常把第一個(gè)目標(biāo)定義成all(執(zhí)行完整的流程)或者h(yuǎn)elp(顯示幫助菜單)。我更傾向于后者,可以幫助我們回憶如何使用Makefile腳本。

示例四:

.PHONY: help sim

help:

echo "make help"

echo "make simv to compile"

echo "make sim to run simulation"

simv: tb.sv dut.v

vcs -full64 -sverilog tb.sv dut.v

sim:

./simv -xxx

這樣,當(dāng)我們不記得如何使用Makefile的時(shí)候,直接敲make就會(huì)有使用幫助菜單。另外,我們還可以看到,一個(gè)目標(biāo)后面可以執(zhí)行多條命令,比如這里的三條echo命令。

隱藏回顯

在執(zhí)行命令前,make會(huì)先回顯命令(就是打印出命令)。上面的make help會(huì)輸出:

echo "make help"

make help

echo "make simv to compile"

make simv to compile

echo "make sim to run simulation"

make sim to run simulation

看起來(lái)有點(diǎn)重復(fù)了。在命令前加@可以關(guān)閉回顯示,這正是我們需要的。改進(jìn)過(guò)的Makefile如示例五。

示例五:

.PHONY: help

help:

@echo "make help"

@echo "make simv to compile"

@echo "make sim to run simulation"

makefile內(nèi)定義變量

當(dāng)源文件比較多,且常需要增減,我們可以把依賴定義成一個(gè)變量,放成文件開頭,如下。

示例六:

tbfile := tb.sv env_pkg.sv test_pkg.sv

rtlfile := dut.v a.v b.v c.v

simv: $(tbfile) $(rtlfile)

vcs -full64 -sverilog $(tbfile) $(rtlfile)

當(dāng)要增減文件時(shí),只需要修改文件開頭即可。

調(diào)用shell命令

如果rtl文件太多,還可以在Makefile里調(diào)用shell命令來(lái)幫助生成。如下面的例子:

示例七:

tbfile := $(shell ls *.sv)

rtlfile := $(shell find rtl -name "*.v")

simv: $(tbfile) ($rtlfile)

vcs -full64 -sverilog $(tbfile) $(rtlfile)

例七中的tb和rtl文件寫兩遍,是不是有點(diǎn)麻煩。我們最好能簡(jiǎn)化一下。在Makefile中有幾個(gè)特殊變量,如$@表示目標(biāo),$^表示依賴。所以示例七中的命令可以簡(jiǎn)化成:

simv: $(tbfile) $(rtlfile)

vcs -full64 -sverilog $^

學(xué)到到這里你已經(jīng)可以寫出大部分的Makefile腳本了。

為makefile增加選項(xiàng)

但我們還需要進(jìn)一步學(xué)習(xí)兩個(gè)重要功能:選項(xiàng)和目錄遞歸。

我們常需要在仿真時(shí)提供一些選項(xiàng),比如testcase名,是否是post仿真,是否要dump波形。那么怎么實(shí)現(xiàn)呢?其實(shí)Makefile允許從命令行提供額外的變量,格式為OPTION=value。如下面的例子,假設(shè)有三個(gè)選項(xiàng),TC、POST、DUMP:

示例八:

ifeq ($(POST),1)

SRC := "netlist.v"

else

SRC := "rtl.v"

endif

ifeq ($(DUMP),1)

DUMP_DEF := "+define+DUMP"

else

DUMP_DEF := ""

endif

sim:

@echo "vcs -full64 -sverilog $(SRC) $(DUMP_DEF) +UVM_TESTNAME=$(TC)"

那么,使用時(shí)就可以通過(guò)命令行控制選項(xiàng)開關(guān):

make sim TC=basic_test

make sim TC=basic_test POST=1

make sim TC=basic_test DUMP=1

make sim TC=basic_test POST=1 DUMP=1

makefile的大殺器:目錄遞歸

另一個(gè)重要功能是目錄遞歸,目錄遞歸有一個(gè)典型的應(yīng)用:make clean。在頂層目錄里make clean時(shí),將會(huì)自動(dòng)調(diào)用子目錄的make clean。這個(gè)怎么實(shí)現(xiàn)呢?看下面的例子:

示例九:

./Makefile

clean:

rm -f *~

make -C a clean

make -C b clean

./a/Makefile

clean:

rm -f *~

./b/Makefile

clean:

rm -f *~

make -C c clean

./b/c/Makefile

clean:

rm -f *~

我們看到一個(gè)make -C subdir clean,就是說(shuō)可以通過(guò)-C來(lái)把目標(biāo)clean傳遞給子目錄,相當(dāng)于在Makefile里調(diào)用了另一個(gè)Makefile。這樣在頂?shù)絤ake clean時(shí),將自動(dòng)遞歸到所有的子目錄。

Makefile的引用與復(fù)用

最后還有一點(diǎn),我們也會(huì)經(jīng)常遇到,把共用的Makefile腳本寫到common.mk,然后再include common.mk,這樣可以讓Makefile看起來(lái)更簡(jiǎn)潔。

IC Flow的聯(lián)系

到這里,學(xué)了這么多,你已經(jīng)可以寫一些復(fù)雜的Makefile了。但重在應(yīng)用,在IC設(shè)計(jì)里,我們常常用Makefile串起多個(gè)工具,實(shí)現(xiàn)完整的流程。下面是一個(gè)啟發(fā)型的例子。

示例十:

.PHONY: help clean rtl lint sim syn lec pr pt lvs

help:

@echo "make help"

clean:

rm -rf *~ *.log *.fsdb csrc simv* ...

make -C xxx clean

rtl:

python3 ...

lint:

sg_shell/nLint ...

sim:

vcs/irun ...

syn:

dc_shell -64bit -topographical -f run_syn.tcl | tee log/syn.log

lec:

fm_shell/lec ...

pt:

pt_shell ...

pr:

innovus/icc ...

lvs:

calibre ...

習(xí)題:

根據(jù)自己公司的情況,把示例十補(bǔ)充完整。

審核編輯:湯梓紅

聲明:本文內(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)投訴
  • 命令
    +關(guān)注

    關(guān)注

    5

    文章

    658

    瀏覽量

    21928
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    646

    瀏覽量

    32668
  • Makefile
    +關(guān)注

    關(guān)注

    1

    文章

    125

    瀏覽量

    19145

原文標(biāo)題:【手把手系列】:芯片設(shè)計(jì)中的Makefile簡(jiǎn)明教程

文章出處:【微信號(hào):處芯積律,微信公眾號(hào):處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Makefile中文教程 -下載

    Makefile中文教程,免費(fèi)下載哦。
    發(fā)表于 03-25 08:57 ?67次下載

    教你寫Makefile

    教你寫Makefile 什么是makefile?或許很多Winodws的程序員都不知道這個(gè)東西,因?yàn)槟切¦indows的IDE都為你做了這個(gè)工作,但我覺得要作一個(gè)好的和professional的程序員,
    發(fā)表于 02-10 14:24 ?37次下載

    駕馭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次下載

    Makefile教程

    Linux開發(fā)必備的Makefile文件編譯教本,講解的很到位,新手基本上看上幾天就可以上手了
    發(fā)表于 01-05 17:05 ?0次下載

    跟我一起學(xué)makefile

    關(guān)于makefile學(xué)習(xí),深入了解嵌入式下makefile的編寫
    發(fā)表于 05-23 18:21 ?0次下載

    駕馭makefile

    一本Makefile的經(jīng)典教程,深入淺出,易學(xué)易懂
    發(fā)表于 06-17 16:16 ?9次下載

    跟我一起寫makefile

    想了解Makefile可以看看
    發(fā)表于 03-04 18:39 ?0次下載

    Linux內(nèi)核Makefile文件

    Makefile文件的詳細(xì)編寫過(guò)程
    發(fā)表于 08-28 09:25 ?14次下載

    linux makefile教程

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

    makefile的基本語(yǔ)法

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

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

    Makefile的重要性 會(huì)不會(huì)寫makefile,從一個(gè)側(cè)面說(shuō)明了一個(gè)人是否具備完成大型工程的能力 makefile帶來(lái)的好處就是——“自動(dòng)化編譯”,一旦寫好,只需要一個(gè)make命令,整個(gè)工程完全自動(dòng)編譯,極大的提高了軟件
    發(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)下載

    嵌入式中的Makefile應(yīng)用

    文章目錄一.Makefile 引入二. Makefile語(yǔ)法1.通配符2.假象目標(biāo)3.變量三.Makefile函數(shù)四.實(shí)例本文主要總結(jié)一下嵌入式開發(fā)中的Makefile,一般項(xiàng)目中都需
    發(fā)表于 11-03 17:06 ?11次下載
    嵌入式中的<b class='flag-5'>Makefile</b>應(yīng)用

    MakefileMakefile與shell命令的聯(lián)系

    博主最近在項(xiàng)目實(shí)踐過(guò)程中,需要深度定制項(xiàng)目的Makefile,其中有些復(fù)雜的流程必須得借助shell腳本才能高效地完成,為此博主特意深入學(xué)習(xí)了在Makefile種調(diào)用shell命令的方法。
    的頭像 發(fā)表于 07-11 09:06 ?3145次閱讀
    【<b class='flag-5'>Makefile</b>】<b class='flag-5'>Makefile</b>與shell命令的聯(lián)系

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

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

    什么是Makefile?

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