openwrt頂層Makefile分析

2021-06-23 01:40:39 字數 1898 閱讀 8378

openwrt

這裡主要介紹openwrt的主makefile,並未對各個目錄下的makefile和相關檔案進行介紹。

在makefile裡是兩個主要的分支,由if語句根據openwrt_build的值進行不同的處理。第乙個部分主要是執行編譯前的準備,第二個部分是執行編譯。

開啟makefile檔案,可以看到預設的make目標world,這個目標沒有依賴檔案和執行命令。

執行make的時候,首先進入第乙個部分,此時openwrt_build的值為0,然後將openwrt_build的值賦為1,在這裡用到了override指示符,override指示符的作用的忽略make命令列的引數的賦值,可以對該變數進行賦值。

載入include下的相關檔案,在toplevel.mk可以看到

%::@+$(prep_mk) $(no_trace_make) -r -s prereq

@+$(submake) -r $@

預設的目標就會執行這裡。

在toplevel.mk的頂部定義了prep_mk= openwrt_build= quiet=0,將openwrt_build的值賦為0。

在執行@+$(prep_mk) $(no_trace_make) -r -s prereq命令的時候,在make命令列裡有$(prep_mk)變數,而由於openwrt_build的值為0,在verbose.mk檔案裡,所以會執行頂層

目錄的makefile第乙個分支部分的目標prereq,即toplevel.mk檔案中的目標prereq: prereq:: prepare-tmpinfo .config

@+$(make) -r -s tmp/.prereq-build $(prep_mk)

@+$(no_trace_make) -r -s $@

這裡會進行一些編譯前的準備工作,然後執行@+$(no_trace_make) -r -s $@,再次去執行頂層makefile,此時,並沒有$(prep_mk)變數,所以會執行頂層makefile的第乙個部分,載入include下的相關檔案,和一些必要的makefile檔案,在頂層makefile去尋找prereq目標,

prereq: $(target/stamp-prereq) tmp/.prereq_packages

處理它的依賴檔案。

然後再接著執行toplevel.mk

%::@+$(prep_mk) $(no_trace_make) -r -s prereq

@+$(submake) -r $@

在@+$(submake) -r $@命令中也沒有$(prep_mk)變數,所以在頂層makefile的第二個部分,尋找makefile的預設目標,即world。

world: prepare $(target/stamp-compile) $(package/stamp-cleanup) $(package/stamp-compile) $(package/stamp-install) $(package/stamp-rootfs-prepare) $(target/stamp-install) force $(_single)$(submake) -r package/index

根據各個依賴檔案進行相應的編譯,最終完成編譯。

在頂層makefile裡比較麻煩的是,將makefile分為了兩個主要分支,在每個分支裡通過include載入相應的檔案,在這些檔案裡包含相應的目標執行命令,在命令中多次用make + 目標 + 引數 的方式,則會再次執行makefile檔案,就形成了makefile的巢狀執行。

在巢狀執行的過程中,通過變數openwrt_build來區分是執行頂層makefile的那個部分,如果在make命令列中有openwrt_build為0,則執行第乙個部分,沒有加openwrt_build變數則執行第二個部分。

由於openwrt_build是make命令列引數,所以在makefile中如果要改變它的值,就用到了override指示符。

openwrt 編譯環境搭建及Makefile

openwrt編譯環境搭建 作業系統 centos 5.8 64位 安裝gnome,可使用xmanager yum y groupinstall x window system yum y groupinstall desktop 安裝svn yum install subversion make ...

OpenWrt整合非官方包之Makefile規則

其他可參考 首先進入原始碼包根目錄裡的package 建立個資料夾 自己起個名字 然後進入那個資料夾 建立makefile 注意 一定要用linux文字編輯器建立 否則不認 或者用ultraedit轉換成unix換行符 檔案內容 方括號為需要自己修改的內容 cpp view plain copy i...

C 頂層const,頂層const,引用總結

頂層 const 表示的是指標本身是乙個常量,底層const 表示的是指標所指的物件是乙個常量。頂層const拷貝遵守原則 1.const常量不能改變。2.頂層可忽略。const int a 12 int b a 頂層忽略3 非常量可向常量轉換,const int c b 底層const拷貝,則要求...