Makefile寫作過程小結

2021-06-21 00:00:14 字數 3165 閱讀 2547

makefile 的寫作思路小結:

1)偽目標

2)命令(cc mkdir...)

3)目錄(絕對路徑、相對路徑、臨時目錄、條件加入的目錄...)

4)實際目標(對空目標分開處理)

5)include(寫在all之下)

6)建立目錄(對寫好的目錄加上條件並建立、同時可選擇加入依賴中)

7)實際目標的生成方法

8)完善依賴關係

9)標頭檔案的查詢與鏈結

10)庫檔案依賴關係的裁剪與新增

11)自動生成依賴關係並修改加入字首(經典六句話)

12)提取公共部分至make.rule檔案中並修改模組生成檔案的路徑

13)各個子模組的目標庫檔案的寫入與刪除

14)編寫總體makefile放在指定的build目錄中

注:一下程式都**於《專業嵌入式軟體開發》一書,李雲著

.phony:all clean

cc             =        gcc

rm            =        rm

rmflags        =

-rfmkdir        =        mkdir

ar            =        ar

arflags        =        crs

dir_objs    =        objs

dir_deps    =        deps

dir_libs    =..

/../

../libs

dir_exes    =..

/../

../exes

dirs        =        $(dir_objs) $(dir_deps) $(dir_libs) $(dir_exes)

rms            =        $(dir_deps)    $(dir_objs)

lib            =        libfoo.a

ifneq (

"$(lib)",""

)lib            :

=        $(addprefix $(dir_libs)/,

$(lib)

)rms            +

=        $(lib)

endif

exe            =        complicated

ifneq (

"$(exe)",""

)exe         :

=        $(addprefix $(dir_exes)/,

$(exe)

)rms            +

=        $(exe)

endif

srcs        =        $(wildcard *

.c)objs        =        $(srcs:

.c=.o)

objs        :

=        $(addprefix $(dir_objs)/,

$(objs)

)deps        =        $(srcs:

.c=.dep)

deps        :

=        $(addprefix $(dir_deps)/,

$(deps)

)#如下寫法只是在判斷dir_exes這個變數是不是空,而不是../

../.

./#ifeq(

"$(dir_exes)",""

)ifeq (

"$(wildcard $(dir_exes))",""

)dep_dir_exes :

=    $(dir_exes)

endif

ifeq (

"$(wildcard $(dir_objs))",""

)dep_dir_objs :

=    $(dir_objs)

endif

ifeq (

"$(wildcard $(dir_deps))",""

)dep_dir_deps :

=    $(dir_deps)

endif

ifeq (

"$(wildcard $(dir_libs))",""

)dep_dir_libs :

=    $(dir_libs)

endif

all:

$(exe) $(lib)

ifneq (

$(makecmdgoals)

,clean)

include $(deps)

endif

$(dirs)

:$(mkdir) $@

$(exe)

: $(dep_dir_exes) $(objs)

$(cc)

-o $@ $(

filter

%.o,$^

)$(lib)

: $(dep_dir_libs) $(objs)

$(ar) $(arflags) $@ $(

filter

%.o,$^

)$(dir_objs)/%

.o: $(dep_dir_objs)%.c

$(cc)

-o $@ -c $(

filter

%.c,$^

)$(dir_deps)/%

.dep: $(dep_dir_deps)%.c

@echo "creating $@ ..."

@set

-e ;

\$(rm) $(rmflags) [email protected] ;

\$(cc)

-e -mm $(

filter

%.c,$^

)> [email protected] ;

\sed 's,\(

.*\)

\.o[:]

*,objs/

\1.o $@:

,g'< [email protected] > $@ ;

\$(rm) $(rmflags) [email protected]

clean:

$(rm)    $(rmflags) $(rms)

另外還有一篇很好的文章:

自己除錯通過的乙個通用makefile模板

DHCP工作過程

dhcp服務的工作過程 如果在區域網中部署了dhcp伺服器,並且客戶端設定為自動獲得ip位址。這樣當dhcp客戶端第一次登入網路的時候,也就是客戶端發現本機上沒有任何ip資料設定,它會向網路發出乙個dhcp discover封包。因為客戶端還不知道自己屬於哪乙個網路,所以封包的 位址會為 0.0.0...

FTP 工作過程

1 ftp伺服器執行ftpd守護程序,等待使用者的ftp請求。2 使用者執行ftp命令,請求ftp伺服器為其服務。例 ftp 202.119.2.197 3 ftpd守護程序收到使用者的ftp請求後,派生出子程序ftp與使用者程序ftp互動,建立檔案傳輸控制連線,使用tcp埠21。4 使用者輸入ft...

ping工作過程

dos 命令,一般用於檢測網路通與不通 也叫時延,其值越大,速度越慢 ping packet internet grope 網際網路包探索器,用於測試網路連線量的程式。ping 發 送乙個 icmp 回聲請求訊息給目的地並報告是否收到所希望的 icmp 回聲應答。它是用來檢查網路是否通暢或者網路連線...