(二)個人Makefile學習衝動&&編譯過程概述

前言

又到了成胖子每週一博的時間了,本週是第三週.
本週咱們繼續瞭解openwrt的編譯過程,若是還有沒寫過簡單ipk或者編譯過openwrt的朋友,能夠參見我以前的博客或者網上的其餘文章shell

一 年輕的衝動

爲何我在學習的過程當中,有先學習整個編譯過程和Makefile的衝動呢?bash

1.咱們知道電腦的運算速度是很快的.即便如此,一個完整的編譯過程每每須要好幾個小時.這中間到底發生了些什麼?屏幕上一閃而過的像天書同樣的東西,我怎麼纔能有所瞭解?
2. 經歷漫長的等待,咱們獲得了一個鏡像bin文件.這裏面到底包含了什麼東西?我能夠知道麼?
3. 編譯單個ipk的時候,我按照模板寫的Makefile怎麼和我在書上見的長的不太同樣呢?
4. 在單個ipk中,怎麼包含頭文件,動態庫,靜態庫?怎麼解決依賴關係?
5. 在輸入make menuconfig以後,又發生了什麼?彈出的圖形界面中,怎麼會有我放在package目錄中的源碼的信息?
6. 有的時候,編譯報錯了.提示信息它認識我,我不認識它.我要怎麼排查呢?
markdown

零零散散的老是有不少疑問困擾着我.我相信有不少剛接觸openwrt的朋友都和我有同感.而全部這些都是能夠經過完整學習編譯過程來解答的.這樣想一想是否是更有學習的動力了呢?工具

二 學習曲線

2.1 Makefile基本語法

咱們知道編譯過程是經過Makefile來控制的.這樣而言,Makefile的基本語法就必須有所瞭解.網上有不少零散的資料每每不成體系.推薦閱讀一個是陳皓本身寫的和翻譯的GNU Make的手冊.仍是比較全的.英文還湊合的朋友,我推薦仍是盡力讀讀官方的手冊,簡介精煉,沒事學點英文也是好的.後面的文章,假定讀者對Makefile有所瞭解.學習

2.2 bash基礎

Makefile中的執行部分(recipe)是有bash腳本組成的,因此咱們同時應當對bash shell有所瞭解.flex

2.3 world

有了這兩部分的預備知識,咱們將開始咱們的征途.咱們的目標是world.ui

三 編譯過程概述

在學習Makefile以前,咱們先對編譯的整體過程,有個感性的認識,請看下圖:es5

Created with Raphaël 2.1.0開始1.主機預裝工具2.編譯host工具3.編譯交叉工具鏈4.編譯內核模塊5.編譯ipk6.安裝ipk到文件系統7.編譯內核8.將內核和文件系統組合成最終bin文件.結束

3.1 主機預裝工具

在編譯源碼以前,咱們必須手動安裝一部分工具 .spa

sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils subversion libncurses5-dev ncurses-term zlib1g-dev

這部分是在執行編譯工做以前的..net

3.2 編譯host工具

除了咱們在第一步安裝的工具,編譯過程當中還須要其餘一些主機工具.這部分工具將首先編譯.

3.3 編譯交叉工具鏈

openwrt自帶交叉編譯鏈,固然在編譯目標平臺軟件前,須要先編譯.

3.4 編譯內核模塊

由於部份內核模塊將會生成獨立的ipk,因此內核模塊須要首先編譯.

3.5 編譯ipk

這裏將編譯package目錄下的各個軟件包,這也是和咱們最爲息息相關的.以後的博客將會重點介紹這個部分.

3.6 安裝ipk

將生成的ipk安裝到文件系統之中(好比build_dir/target-XXX/root-ramips目錄).

3.7 編譯內核

在完成ipk編譯以後,將會編譯內核,壓縮內核.同時使用mkimage工具,在內核前面生成一個用於uboot識別的頭部.

3.8 合成

在最後一步,將squashfs格式的文件系統和內核鏈接在一塊兒,即生成了目標鏡像文件.

尾聲

本週到此爲止,下一篇咱們將介紹根目錄下的Makefile,從而知道爲何編譯的大體過程是上面說起的八步.

相關文章
相關標籤/搜索