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

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

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

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

sanyue7758 ? 來源: ExASIC ? 2024-01-25 11:18 ? 次閱讀

Makefile可以做什么?

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

Makefile的基本格式

目標(biāo):依賴

命令

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

示例一:

simv: tb.sv dut.v

vcs -full64 -sverilog tb.sv dut.v

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

偽目標(biāo)

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

示例二:

sim: simv

./simv -xxx

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

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

示例三:

.PHONY: sim

sim: simv

./simv -xxx

這樣,我們在terminal里就可以用make sim來調(diào)用仿真命令。

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

如果我們只是敲make(后面不跟目標(biāo)),那么將調(diào)用Makefile里的第一個目標(biāo)。那么我們?yōu)榱朔乐钩鲥e通常把第一個目標(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的時候,直接敲make就會有使用幫助菜單。另外,我們還可以看到,一個目標(biāo)后面可以執(zhí)行多條命令,比如這里的三條echo命令。

隱藏回顯

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

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

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

示例五:

.PHONY: help

help:

@echo "make help"

@echo "make simv to compile"

@echo "make sim to run simulation"

makefile內(nèi)定義變量

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

示例六:

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)要增減文件時,只需要修改文件開頭即可。

調(diào)用shell命令

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

示例七:

tbfile := $(shell ls *.sv)

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

simv: $(tbfile) ($rtlfile)

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

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

simv: $(tbfile) $(rtlfile)

vcs -full64 -sverilog $^

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

為makefile增加選項

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

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

那么,使用時就可以通過命令行控制選項開關(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的大殺器:目錄遞歸

另一個重要功能是目錄遞歸,目錄遞歸有一個典型的應(yīng)用:make clean。在頂層目錄里make clean時,將會自動調(diào)用子目錄的make clean。這個怎么實現(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 *~

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

Makefile的引用與復(fù)用

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

IC Flow的聯(lián)系

到這里,學(xué)了這么多,你已經(jīng)可以寫一些復(fù)雜的Makefile了。但重在應(yīng)用,在IC設(shè)計里,我們常常用Makefile串起多個工具,實現(xiàn)完整的流程。下面是一個啟發(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)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 命令
    +關(guān)注

    關(guān)注

    5

    文章

    669

    瀏覽量

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

    關(guān)注

    0

    文章

    647

    瀏覽量

    32743
  • Makefile
    +關(guān)注

    關(guān)注

    1

    文章

    125

    瀏覽量

    19153

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

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

收藏 人收藏

    評論

    相關(guān)推薦

    Makefile中文教程 -下載

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

    教你寫Makefile

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

    駕馭Makefile

    駕馭Makefile在網(wǎng)上你能找到很多關(guān)于Makefile的學(xué)習(xí)資料,但絕大部分給你的只是一個知識點,與將Makefile運(yùn)用到項目中(尤其是大型項目)的差距非常的大。因為,將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ì)編寫過程
    發(fā)表于 08-28 09:25 ?14次下載

    linux makefile教程

     什么是makefile?或許很多Winodws的程序員都不知道這個東西,因為那些Windows的IDE都為你做了這個工作,但我覺得要作一個好的和professional的程序員,makefile
    發(fā)表于 11-12 09:11 ?5267次閱讀

    makefile的基本語法

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

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

    Makefile的重要性 會不會寫makefile,從一個側(cè)面說明了一個人是否具備完成大型工程的能力 makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個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)下載

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

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

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

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

    Makefile】簡單實用的Makefile模板來了

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

    什么是Makefile

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