Sunday, March 13, 2011

Embedded System 修課紀錄(1)

第三堂課助教所上的課程核心是 Toolchain,而不同於上禮拜的平台,今天是在 Linux Ubuntu 8.04 系統上面進行的教學。

Autotools

Autotool 是一套 GNU project 提供用來包裝 Source Code的工具。GNU Compiler Collection(GCC) 它支援許多語言和不同處理器的編譯處理,因此也是最多人常使用的一個工具集。


準備要編譯的檔案目錄架構
// test
drwxrwxrwx 2 sn sn 4096 2011-03-08 16:18 include
drwxrwxrwx 4 sn sn 4096 2011-03-14 02:41 lib_add
drwxrwxrwx 3 sn sn 4096 2011-03-14 02:42 lib_mul
-rw-r--r-- 1 sn sn   29 2011-03-14 02:31 Makefile.am
drwxrwxrwx 4 sn sn 4096 2011-03-14 02:42 src

// include
-rwxrwxrwx 1 sn sn 98 2010-04-07 23:57 test.h

// lib_add
-rwxrwxrwx 1 sn sn 74 2010-04-07 23:56 ad.c
-rwxrwxrwx 1 sn sn 58 2010-04-07 23:57 d.c
-rw-r--r-- 1 sn sn 90 2011-03-14 02:30 Makefile.am

// lib_mul
-rw-r--r-- 1 sn sn 71 2011-03-14 02:30 Makefile.am
-rwxrwxrwx 1 sn sn 62 2010-04-07 23:58 mul.c

// src 
-rwxrwxrwx 1 sn sn  63 2010-04-07 23:59 main.c
-rw-r--r-- 1 sn sn 174 2011-03-14 02:35 Makefile.am

目標

用automake產生Makefile,其 lib_add, 要compile成dynamic library 且 lib_mul 要compile成static library

操作流程
  • 編寫 Makefile.am
檔案架構之下,Makefile.am 為 Automake 的設定檔,以下首先說明如何編制此設定檔,一共有四個 Makefile.am 如下所示
// 靜態連結編譯
// path: ./lib_mul
noinst_LIBRARIES=libmul.a
libmul_a_SOURCES=mul.c
INCLUDES=-I../include

INCLUDES=-I../include 等同於 INCLUDES=-I$(top_srcdir)/include
標色為可自行命名的地方。

// 動態連結編譯
// path: ./lib_add
lib_LTLIBRARIES=libhello.la
libhello_la_SOURCES=ad.c d.c
INCLUDES=-I$(top_srcdir)/include

標色為可自行命名的地方。

// 主程式存在的目錄
// path: ./src
AUTOMAKE_OPTIONS = foreign
INCLUDES=-I../include
bin_PROGRAMS= main
main_SOURCES= main.c

// 靜態連結
main_LDADD= ../lib_mul/libmul.a

// 動態連結
LIBS = -lhello
main_LDFLAGS= -L$(top_srcdir)/lib_add

// 專案資料夾
// path: ./
SUBDIRS= lib_mul lib_add src

將程式運行會編譯到的連結庫之目錄寫上即可。若想要該換產生出來的執行檔名稱,可以更改 bin_PROGRAMS 參數為你想要的,例如: abc。因此,連帶的 abc_SOURCES, abc_LDADD 等等對應的部分要做修正

  • 執行 autoscan
產生 configure.scan 以及 autoscan.log
  • 編輯 configure.scan 並另存 configure.in
// 註解
#AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
#AC_CONFIG_HEADER([config.h])
// 新增
AC_INIT(main, 1.0)
AM_INIT_AUTOMAKE
// 在 # Checks for libraries. 之後新增
AC_PROG_LIBTOOL
  • 執行 aclocal
產生 aclocal.m4 以及 autom4te.cache
  • 執行 autoconf
產生 configure
  • 產生 GNU 套件都必備的四項文件
touch README NEWS AUTHORS ChangeLog
  • 執行 libtoolize 以及 執行編譯 GNU 套件所缺乏的資源
// --force 參數是強制寫覆蓋
// 第一次執行此指令可以省略
// 建立 shared library 之用
libtoolize -- force

// 產生 Makefile.in
automake --add-missing

產生 Makefile.in 它是最終編譯 Makefile 的範本
  • 接著是 Tarball 安裝三部曲
./configure --prefix=/home/sn/lab2_project/
make
make install

如果編譯的過程發生錯誤,或是有任何要更新的地方。只要把東西或是文件補齊,從 aclocal 指令往下實作即可,不用重新 autoscan 和編寫修改 configure.scan

確認執行結果

# ./main
add
mul

以上大致是本次實驗課學習的 Autotools on Linux 過程,另外,還有本次實驗加分題( build toolchain )的練習,是一個利用其他函式去編譯到給特定平台的組譯碼,這部分未來寫完專案燒板子也會用到。

延伸學習

  1. 如何利用 GCC 指令編譯程式
  2. 撰寫 Makefile 語言

Reference

[1.] GNU Autotools 初探 & share library 的蠢事
[2.] 陳雍穆, Automake 入門文件

No comments:

Post a Comment