#-------------------------------------------------------------------------------
#===================
# GCC
#===================
#處理編譯任務時,分成下面4個步驟:
#1.前處理 (preprocessing):使用前處理器(cpp) 將程式檔轉換成 .i (or .ii): .c ->.i 或 .cpp -> .ii 檔
#2.編譯 (compiling):將前處理後的檔轉換成組合語言,轉換成 .s 檔
#3.組譯 (assembly):使用組譯器(gas)將組合語言組譯為 .o 檔
#4.鏈結 (linking):將 .o 檔鏈結成為可執行檔或是函式庫
#-------------------------------------------------------------------------------
#===================
# 常用參數
#===================
#-E -- 只進行前處理,不進行編譯,結果由 console 直接輸出。
#-C -- 進行前處理時保留註解。
#-S -- 產生組合語言程式碼(.s)。
#-I -- 指定 INCLUDE PATH (標頭檔.h的搜尋目錄)。
#-L -- 指定 LIBRARY PATH (連結時要用到的函式庫的搜尋目錄)。
#-O -- 最佳化程度,預設就是-O1,你可以指定成-O2或-O3,數字越大表示最佳化程度越好,但是會增加編譯時間。
#-c -- 只編譯不進行連結(產生一個跟原始碼相同名稱的目的檔 .o 檔),留待後面才來連結(link)。
#-l -- 指定要連結的函式庫,(e.g. libc)。
#-o -- 把建立的二位元檔給另外名字,因為可執行檔最後內定名字是a.out。
#-g -- 把偵錯資訊也編譯進去,這樣debug工具ddd,gdb才能除錯。
#-W -- 編譯時出錯時,顯示錯誤訊息的條件。
#-Wall -- 在編譯時顯示更多的警告訊息。這個參數相當有用,特別是找不到libs/headers之類的問題。事實上它並未完全顯示 cc 所能注意到的各項警告訊息。
#-ansi -- 使用相容ANSI標準的編譯方式。關閉 cc 特有的某些特殊非ANSI C標準功能。 事實上它並不保證你的程式會完全符合 ANSI 標準。
#-pedantic -- 全面關閉 cc 所特有的非 ANSI C 標準功能。
#-Dname -- 定義 macro,同 #define。 (條件編譯,搭配#ifdef #define用。如果有defined才編譯)
#-Uname -- 解除 macro 定義,同 #undef。 (條件編譯,搭配#ifdef #define用。如果有defined才編譯)
#Linking
#-static -- 只使用靜態函式庫
#-share -- 儘量使用共享函式庫
#-shared-libgcc -- 指定連結共享的 libgcc
#-static-libgcc -- 指定連結靜態的 libgcc
#-nostartfiles -- 不使用 standard system startup files (常用於 cross-compiling 時)
#-nodefaultlibs -- 不使用系統預設的標準函式庫
#-nostdlib -- 不使用標準函式庫及 startup files
#-nostdinc++ -- 不使用 c++ 標準的 #include 檔
#-fPIC -- 產生 position-independent code,常用於共享函式庫的產生
#-Wl,option -- 將 option 傳給 linker,如果有多個 option ,使用逗號(,)隔開。
#e.g. gcc -shared -o myshared -Wl,--whole-archive -llib1 -llib2 -Wl,--no-whole-archive a.o b.o c.o
#-------------------------------------------------------------------------------
#===================
# automatic variables
#===================
#$* 目標檔之主檔名(if the target is dir/a.foo.b and the target pattern is a.%.b then dir/a.foo)
# $@ 目標檔之全檔名
# $% 程式庫成員中的檔名元素
# $< 第一個prequeite的檔名
# $? Timestamp 在Target之後的Prequeite
# $^ 所有的Prequeite的檔名 但不包含重複部分
# $+ 所有的Prequeite的檔名
# $(@D) $( # $(@F) $( #-------------------------------------------------------------------------------
#.Phony 是一個偽目標,是假定該目標不存在,進行相應的更新或其他操作。若工作目錄存在同名文件,則.Phony 不工作。
#.Phony 後面跟著 Target name 這樣可以讓GNU Make得知folder下就算有與target相同名稱的檔案,這個target的command還是會跟著執行(不會出現 "xxx is up to date")。
#all :內定的編譯動作
#install :安裝binary檔的動作
#clean :清除obj檔的動作
#dist :產生configure的動作
#distclean :清除configure所產生的檔
#The prerequisites of the special target .PHONY are considered to be phony targets.
#When it is time to consider such a target, make will run its commands unconditionally,
#regardless of whether a file with that name exists or what its last-modification time is.
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
#
#
#
#-------------------------------------------------------------------------------
#產生出來的檔名,專案名
PROJ =
#輸出的目錄
BINDIR = ../bin
BINNAME = VP8
#-------------------------------------------------------------------------------
SRC_VP8 = vp8_api.c \
vp8_asic.c \
vp8_bool.c \
vp8_buffer.c \
vp8_coder.c \
vp8_dwl.c \
wmt_if.c
#所有 C 的原始碼檔案
CSRCS = $(SRC_VP8)
#把 $(CSRCS) 這個巨集裡所有 .c 改成 .o 目的檔
#object files will be generated from .c sourcefiles
COBJS = $(CSRCS:%.c=%.o)
#-------------------------------------------------------------------------------
#g_wmt_vp8-objs = main.o vp8_api.o
#obj-$(CONFIG_WMT_VP8) += g_wmt_vp8.o

#-------------------------------------------------------------------------------
#===================
# cross tool
#===================
#source search path
COMDIR =
vpath %.c
vpath %.c $(COMDIR)/vp8 $(COMDIR)/common
vpath %.o
vpath %.o obj

#標頭檔目錄
#include header path
INCDIRS = -I . -I./include -I$(COMDIR)/include
INCS = $(INCDIRS)

#函式庫路徑
#linking library path
LIBDIRS = -L ../bin -L ../lib
LIBS = -lm $(LIBDIRS)

DEFFLAGS = -O3 -g -Wall $(INCS)

CROSS_PATH =
# Architecture flags for gcc
ARCH =
CROSS_TOOL = ${CROSS_PATH}arm-none-linux-gnueabi-
#-------------------------------------------------------------------------------
#C compile, can be replaced by another compiler(replace gcc)
CC = ${CROSS_TOOL}"gcc"
#給 CC 使用的參數
CFLAGS = $(ARCH) ${DEFFLAGS}
#C++ compile
CPPC = ${CROSS_TOOL}"g++"
#給 CPP 使用的參數
CPPFLAGS = ${CFLAGS}
#linker
#使用 g++,是怕 gcc 處理不了 C++ 的程式
#LD = g++
LD = ${CROSS_TOOL}"ld"
#給 linker 的參數,通常就是把函式庫附上
LFLAGS = ${LIBS}
#assembler compiler
AS = ${CROSS_TOOL}"as"
#給 AS 使用的參數
ASFLAGS =
#archive 產生 library(靜態函式庫)
AR = ${CROSS_TOOL}"ar" rcv
#產生函式庫中的索引
RANLIB = ${CROSS_TOOL}"ranlib"
#用來去除文件中所有的符號資訊
STRIP = ${CROSS_TOOL}"strip"
#用來列出 OBJ 檔的符號
NM = ${CROSS_TOOL}"nm"
#用來列出 OBJ 檔的資訊
OBJDUMP = ${CROSS_TOOL}"objdump"

#-------------------------------------------------------------------------------
#===================
# make rule
#===================
all : $(BINNAME).bin
ls -lh $?

#$(BINNAME).bin : $(BINNAME).axf
# $(OBJCOPY) -O binary --only-section=.text --only-section=.data $< $@
# $(OBJDUMP) -d -EL -h -M reg-names-raw --syms --full-contents -m zac2 $< > $(BINNAME).lst
# ls -lh $<

#$(BINNAME).axf: $(COBJS)
$(BINNAME).bin : $(COBJS)
$(CC) -nostartfiles -static -o $@ $(COBJS)

%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
#$(CC) $(CFLAGS) -c $< -o $@

%.o: %.S
$(CC) $(ASFLAGS) -c -o $@ $<

.PHONY: clean
clean:
#rm -rf $(BINNAME).bin $(BINNAME).axf $(BINNAME).lst *.o *~ */*~
rm -rf *.o *.bak
#if [ -f *.o ]; then rm -f *.o; fi;

#===================
# make the library
#===================
#all: $(PROJ)
#
## 這是 makedepend 的用法!會自動幫你找出相依性,只要輸入原始檔和參數即可
#cdepend: $(CSRCS)
#makedepend $(CFLAGS) $(INCLUDES) $(CSRCS)
#
#cppdepend: $(CPPSRCS)
#makedepend $(CPPFLAGS) $(INCLUDES) $(CPPSRCS)
#
#$(PROJ): $(COBJS) $(CPPOBJS)
#$(AR) $(ARFLAGS) $@ $(COBJS) $(CPPOBJS) # 合成函式庫
#$(RANLIB) $@ # 產生函式庫中的索引
#
#clean:
#rm -f $(PROJ) # 刪除二進位檔
#rm -f $(COBJS) # 刪除 C 的目的檔
#rm -f $(CPPOBJS) # 刪除 C++ 的目的檔
#-------------------------------------------------------------------------------

BB 發表在 痞客邦 PIXNET 留言(0) 人氣()