contiki 3.x:關於源碼Makefile架構邏輯(1)

認識了源碼結構,如今終於能夠學習怎麼編譯了。linux

上一次的帖子說道,源碼的目錄結構,如今咱們看看makefile的目錄:web

[leonard@Archlinux contiki]$ tree -L 5 | grep Makefile 
│   │   └── Makefile.about
│   │   ├── Makefile.antelope
│   │   └── Makefile.at-master
.
.
.
│   │   ├── Makefile.webbrowser
│   │   ├── Makefile.webserver
│       ├── Makefile.webserver-nano
│   │   │       ├── Makefile.tsch
│   │   │   ├── Makefile
│   │   │   ├── Makefile.c128.defines
│   │   │   ├── Makefile.c64.defines
│   │   │   └── Makefile.target
│   │   │   ├── Makefile
│   │   │   ├── Makefile.apple2enh.defines
│   │   │   ├── Makefile.atarixl.defines
│   │   │   ├── Makefile.c128.defines
│   │   │   ├── Makefile.c64.defines
│   │   │   └── Makefile.target
│   │   ├── Makefile.6502
│   │   ├── Makefile.customrules-6502
│   │   │   ├── Makefile.aducrf101
│   │   │   ├── Makefile.aducrf101.gnu
│   │   │   ├── Makefile.aducrf101.iar
│   │   │   ├── Makefile.at91sam7s
│   │   │   │   ├── Makefile.sdcard
│   │   │       ├── Makefile.usb
│   │   │   ├── Makefile.stm32f103
│   │       ├── Makefile.stm32l152
│   │       ├── Makefile.stm32l152.gnu
│   │       ├── Makefile.stm32l152.iar
│   │   ├── Makefile.avr
│   │   │   │   └── Makefile.ieee-manager
│   │   │   │   ├── Makefile.mac
│   │   │   ├── Makefile.radio
│   │   │   │   ├── Makefile.rf230
│   │   │       ├── Makefile.rf230bb
│   │   ├── Makefile.cc2538
│   │   ├── Makefile.cc253x
│   │   ├── Makefile.customrules-cc253x
│   │       ├── Makefile.usb
│   │   ├── Makefile.cc13xx
│   │   ├── Makefile.cc26xx
│   │   ├── Makefile.cc26xx-cc13xx
│   │   │   ├── Makefile.lib
│   │   ├── Makefile.include
│   │   ├── Makefile.mc1322x
│   │   │   ├── Makefile.src
│   │   │   ├── Makefile
│   │   │   │   └── Makefile
│   │   ├── Makefile.msp430
│   │   ├── Makefile.native
│   │   ├── Makefile.nrf52832
│   │   ├── Makefile.pic32
│   │   ├── Makefile.rl78
│   │   │   ├── Makefile
│   │   ├── Makefile.stm32w108
│   │   │   ├── Makefile
│       ├── Makefile.x86_common
│       ├
    .
    .
    .
    .
    .
│   ├── Makefile
│   ├── Makefile.compile-test
│   ├── Makefile.simulation-test
│   │   └── Makefile
│   │   └── Makefile
│   │   ├── Makefile
│   │   ├── Makefile
│   ├── Makefile
│   │   ├── Makefile
│   │       ├── Makefile
│   │   ├── Makefile.powertrace
│   │   │   └── Makefile
│   │   │   ├── Makefile
│   │   │   └── Makefile.platform
│   │   ├── Makefile
│   │   ├── Makefile.raven
│   │   ├── Makefile.sky
│   │   ├── Makefile
│   │   │   ├── Makefile.am
│   │       ├── Makefile
│   │   ├── Makefile
│   │   │   ├── Makefile
│   │       ├── Makefile
│   │   ├── Makefile
│   │   │   ├── Makefile
    ├── Makefile
    ├── Makefile.target

找找規律看,經過打印信息,咱們看一看到Makefile文件是否是頗有特色的,我總結一下,app

Makefile
Makefile.include
Makefile.{APP}
Makgefie.{TARGET}
Makefile.target
Makefile.TARGET.defines

Makefile確定是入口了,那麼其餘的是幹什麼用的呢,那咱們一塊兒繼續往下探究。從簡單到複雜,從example的helloword開始找頭緒。ide

CONTIKI_PROJECT = hello-world
all: $(CONTIKI_PROJECT)

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

這麼簡單,。。。。原來主體的Makefile 是Makefile.include,那咱們來本身建立一個helloword試試,回到contiki的主目錄,建立一個ts文件夾,Makefile,仿照helloword的源碼,寫一個hellocontiki.c,以下學習

#include "contiki.h"

#include <stdio.h> /* For printf() */
/*---------------------------------------------------------------------------*/
PROCESS(hello_world_process, "Hello Contiki");
AUTOSTART_PROCESSES(&hello_world_process);
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(hello_world_process, ev, data)
{
  PROCESS_BEGIN();

  printf("Hello, Contiki\n");

  PROCESS_END();
}
/*---------------------------------------------------------------------------*/

Makefilecode

CONTIKI_PROJECT = hellocontiki
all: $(CONTIKI_PROJECT)


include ../Makefile.include

OK。。咱們Make一下,orm

[leonard@Archlinux ts]$ make
../Makefile.include:4: *** CONTIKI not defined! You must specify where Contiki resides。 中止。

出錯了... 看看提示,原來那個CONTIKI = ../.. 不單單是賦值的語句這個應該是全局的path,咱們加進去看看server

CONTIKI_PROJECT = hellocontiki
all: $(CONTIKI_PROJECT)

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

繼續Make下ci

[leonard@Archlinux ts]$ make
TARGET not defined, using target 'native'
mkdir obj_native
  .....
  CC        ../core/net/mac/nullrdc.c
  CC        ../core/ctk/ctk-textentry-cmdline.c
  CC        ../core/ctk/ctk-filedialog.c
  CC        ../core/ctk/ctk-textentry-checkbox.c
  CC        ../core/ctk/ctk-textentry-multiline.c
  CC        ../core/ctk/ctk.c
  CC        ../core/net/llsec/nullsec.c
  CC        ../core/net/llsec/anti-replay.c
  CC        ../core/net/llsec/ccm-star-packetbuf.c
cp ../tools/empty-symbols.c symbols.c
cp ../tools/empty-symbols.h symbols.h
  CC        symbols.c
  AR        contiki-native.a
  CC        hellocontiki.c
  LD        hellocontiki.native
rm hellocontiki.co
[leonard@Archlinux ts]$

看來咱們猜的沒錯。。。。。。。。。編譯成功了。最後LD文件是 hellocontiki.native,運行下試試。get

[leonard@Archlinux ts]$ ./hellocontiki.native 
Contiki-3.x-2904-g6157dce started with IPV6, RPL
Rime started with address 1.2.3.4.5.6.7.8
MAC nullmac RDC nullrdc NETWORK sicslowpan
Tentative link-local IPv6 address fe80:0000:0000:0000:0302:0304:0506:0708
Hello, Contiki

哈哈哈,竟然能夠運行。咱們對比一下編譯先後的目錄。

contiki-native.a    hellocontiki.c       Makefile    symbols.c
contiki-native.map  hellocontiki.native  obj_native  symbols.h

增長了項目目錄和執行的文件還有symbols.c.有個案例結束了,咱們就能夠看Makefile.include源碼了。。

同時,到這兒咱們也能夠開始建立本身最簡單的helloword了

由於時間緣由,其餘的makefile下次再說。。

相關文章
相關標籤/搜索