contiki2.6之Makefile詳細解讀一

     下載contiki2.6源碼:

      http://download.csdn.net/detail/crystal736/5149740

     打開makefile.include文件,這個是在contiki系統根目錄中,而非工程目錄,在contiki源碼中有很多工程,在example目錄裏面,每一個目錄對應一個工程,比如cc2530dk目錄中就對應的是cc2530平臺的工程,記住有makefile文件的當前目錄纔是工程目錄,所以makefile.include的當前目錄就不是工程目錄。

  本文將從makefile.include開始解讀,一步一步深入包含contiki操作系統的工程的編譯過程(以cc2530dk爲例)。其中會涉及到makefile和shell相關知識,我會一一解釋清楚。

  先打開example/cc2530dk/makfile文件

CONTIKI_PROJECT = hello-world blink-hello timer-test sensors-demo

all: $(CONTIKI_PROJECT)

CONTIKI = ../..
include $(CONTIKI)/Makefile.include

    CONTILI_PROJECT變量定義的是最後生成的目標文件,即可執行文件,這裏生成了四個可執行文件,爲什麼要這麼做呢?因爲通常來講makefile只能生成一個終極目標,這裏用到了all僞目標(沒有命令行的規則,或者沒有規則的命令),即all依賴於以上四個可執行的文件。如果不這樣做的話,即沒有用all僞目標,則最終只能生成一個可執行文件hello-world 或 blin-hello

   第三句定義變量CONTIKI 爲上級目錄的上級目錄,即爲contiki的根目錄,因爲要用下面一句

include $(CONTIKI)/Makefile.include  包含根目錄裏面的makefile.include ,此時make就會停止讀取當前的Makefile,轉而去讀Makefile.include

   用souceinsight打開Makefile.include,內容較多,我們逐步來解析。

ifndef CONTIKI
  ${error CONTIKI not defined! You must specify where CONTIKI resides}
endif

這裏ifndef是用來判斷一個變量是否已經定義,因爲之前定義了CONTIKI,所以不會執行,即不會報錯!

ifeq ($(TARGET),)
  -include Makefile.target
  ifeq ($(TARGET),)
    ${info TARGET not defined, using target 'native'}
    TARGET=native
  else
    ${info using saved target '$(TARGET)'}
  endif
endif

ifeq是用來判斷兩個參數是否相等,如果相等,則往下執行。因爲之前沒有的定義TARGET變量,所以其爲空,即條件判斷爲真,往下執行...

    包含Makefile.target,記住此時還是在makefile的當前目錄中工作,而不是轉到根目錄了。所以會在工程目錄裏面包含Makefile.target文件,我們找到打開它:

TARGET = cc2530dk

只有這一句就是定義TARGET變量爲cc2530dk

繼續上面的第二個ifeq,此時TARGET變量不爲空了,所以下面一句不會執行,而執行else語句

info爲一個顯示信息的工具,顯示using saved target cc2530dk

 

ifeq ($(DEFINES),)
  -include Makefile.$(TARGET).defines
  ifneq ($(DEFINES),)
    ${info using saved defines '$(DEFINES)'}
  endif
endif

這幾句和上面的意思一樣,只不過換成DEFINES變量,工程目錄中沒有Makefile.cc2530dk.defines文件,所以DEFINES仍爲空,所以ifneq條件判斷爲假,所以什麼也不執行。

 

ifndef HOST_OS
  ifeq ($(OS),Windows_NT)
  ## TODO: detect more specific Windows set-ups,
  ## e.g. CygWin, MingW, VisualC, Watcom, Interix
    HOST_OS := Windows
  else
    HOST_OS := $(shell uname)
  endif
endif

這幾句就不用解釋了,提一下$(shell uname)值爲Linux,所以HOST_OS要麼爲Windows,要麼爲Linux。

 

usage:
 @echo "make MAKETARGETS... [TARGET=(TARGET)] [savetarget] [targets]"

這一句是將usage作爲僞目標,如果執行make的時候,指定了終極目標爲usage,即make usage,則回顯

make MAKETARGETS... [TARGET=(TARGET)] [savetarget] [targets],這句是指導我們怎麼用make命令來編譯contiki源碼。記住echo前要加@,要不然會顯示echo"make MAKETARGETS... [TARGET=(TARGET)] [savetarget] [targets]"。

 

targets:
 @ls -1 $(CONTIKI)/platform $(TARGETDIRS) | grep -v CVS

這句同樣以targets爲終極目標時,將會列出contiki/platform目錄下的所有文件(TARGETDIRS變量此時爲空),

grep -v CVS 是顯示所有不包含CVS的行,這裏還沒弄清楚CVS是啥意思!我們不用管,例如我們執行

make targets 則出現 

             

 

savetarget:
 
-@rm -f Makefile.target
 @echo "saving Makefile.target"
 @echo >Makefile.target "TARGET = $(TARGET)"

這裏也是將savetarget作爲終極目標,第一句是強制刪除Makefile.target文件,然後回顯saving Makefile.target,這裏提一下在@rm前面的'-',它的作用就是如果這條命令執行失敗的話,make工作照常進行,即往下執行。

然後將TARGET=cc2530dk重定向到Makefile.target文件中,這裏將>Makefile.target放在"TARGET = $(TARGET)"的後面也可以,這裏面有一個問題就是,當我執行這個命令的時候,會提示權限不夠,只有進入了root,纔會順利執行這個命令,但是當我們執行make命令的時候,權限爲普通用戶,那麼如果執行savetarget怎麼會執行第三句呢?

那麼以savetarget爲終極目標有啥用呢?答案在 根目錄中的README-BUILDING文件

 


savedefines:
 
-@rm -f Makefile.$(TARGET).defines
 @echo "saving Makefile.$(TARGET).defines"
 @echo >Makefile.$(TARGET).defines "DEFINES = $(DEFINES)"

這三句的意思和上面一樣,這裏只不過是保存宏定義。

 

OBJECTDIR = obj_$(TARGET)

定義變量OBJECTDIR爲obj_cc2530dk

 

LOWERCASE = -abcdefghijklmnopqrstuvwxyz
UPPERCASE = _ABCDEFGHIJKLMNOPQRSTUVWXYZ
TARGET_UPPERCASE := ${strip ${shell echo $(TARGET) | sed y!$(LOWERCASE)!$(UPPERCASE)!}}
CFLAGS += -DCONTIKI=1 -DCONTIKI_TARGET_$(TARGET_UPPERCASE)=1

首先定義了LOWERCASE和UPPERCASE變量,第三局看起來有點複雜,我們從最裏面一層一層往外剝,首先看sed命令,可以去這個博客看sed的用法http://lsscto.blog.51cto.com/779396/880538,!爲分隔符(/ ,也可以) ,y表示轉換資料中的字元,即將echo顯示的內容作爲sed的輸入或資料進行轉換,將其中的小寫字母轉換成大寫字母,即將cc2530dk轉換成CC2530DK,然後作爲shell的返回值提供給strip,strip是make的內置函數,其作用是去掉該字串中開頭和結尾的空格符,並將中間多個連續空字符合併爲一個空字符。則最終TARGET_UPPERCASE變量的值爲CC2530DK。第四句追加變量CFLAGS,此爲c編譯器的命令行選項變量,定義了CONTIKI=1

CONTIKI_TARGET_CC2530DK=1

 

由於Makefile.include內容過多,我們分幾章來詳細解讀。

 

 

 

 

 

 

 

 

 

 

 

 


 

  

  

 

   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章