Sunplus DVD软件Makefile详解(二)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
正式开始--Makefile
Sunplus DVD使用的是基于Cygwin环境的GNU工具链,整个程序的构建是由各目录下的Makefile管理的。为了便于叙述,下文中的“根目录”都是指Source Code的主目录。各模块的Makefile关系如下:
根目录:Makefile.sult包含Makefile.ult
根目录:Makefile包含Makefile.ult
子目录:Makefile包含Makefile.sult
根目录下的文件Makefile.ult可看作是核心Makefile,其中定义各模块Makefile的公用部分;各目录下的文件Makefile可看作是该模块的主Makefile,定义各模块编译过程的差异部分。
下面以SPHE8104L软件为例,详细介绍Makefile中的各部分内容。
Makefile.ult
1 #
2 # Makefile.utl
3 #
4 .SUFFIXES:
5 .PHONY: all clean depends bak debug tar force
6
7 PREFIX = package/
8 PREFIX1 =
9 PERLPATH = pl/
10
11 CC = gcc
12 CPP = cpp -P -traditional
13 AS = as
14 LD = ld
15 AR = ar
16 OBJDUMP = objdump
17 OBJCOPY = objcopy
18 OBJDUMP2BIN = dump2bin
19 WECHO = wecho
20
21 # cross-compiling tools
22 DSP3 = dsp3/
23 XCC = $(CC)
24 XAS = $(AS)
25 XLD = $(LD)
26 XAR = $(AR)
27 XRANLIB = $(RANLIB)
28 XOBJDUMP = $(PREFIX1)$(OBJDUMP)
29
30 # CFLAGS
31 CFLAGS_MACHINE = -m728 -membedded-data
32 CFLAGS_ENDIAN = -DLITTLE_ENDIAN
33 CFLAGS_COPT = \
34 -fno-writable-strings \
35 -fstrength-reduce \
36 -fthread-jumps \
37 -ffixed-22 \
38 -fdata-sections \
39 -ffunction-sections
40
41 CFLAGS_C = \
42 -g \
43 -W -Wall -Werror\
44 $(CFLAGS_COPT) \
45 $(CFLAGS_MACHINE) $(CFLAGS_ENDIAN)
46
47 CFLAGS_S = \
48 -g1 -O2 \
49 $(CFLAGS_MACHINE) $(CFLAGS_ENDIAN)
50
51 INCLUDE_DIR = \
52 -<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />I. -I./h
53
54 CFLAGS_MIPS = -O2 -Os $(CFLAGS_C) $(CFLAGS_COMPILE) $(INCLUDE_DIR)
55 CFLAGS_MIPS_S = $(CFLAGS_S) $(CFLAGS_COMPILE) $(INCLUDE_DIR)
56 CFLAGS_MIPS_FAST = -O3 $(CFLAGS_C) $(CFLAGS_COMPILE) $(INCLUDE_DIR)
57
58 PERL = $(PREFIX1)perl
59 RM = rm
60 CP = cp
61
62 DUMP2BIN = $(PREFIX1)$(OBJDUMP2BIN)
63 ECHO = $(PREFIX1)$(WECHO)
64 MAKEIM = $(PREFIX)makeim
65 MAKEPM = $(PREFIX)makepm
66 FGZIP = $(PREFIX1)fgzip
67 FGZIP2 = $(PREFIX1)fgzip2
68 RZIP = $(PREFIX1)rzip
69 BINOBJ = $(PREFIX1)binobj
70 FONT_PARSER = $(PREFIX1)font_parse
71 MODUAL = $(PREFIX1)module
72 XB2 = $(PREFIX1)xb2
73 CHKSUM = $(PREFIX1)checksum8200
74 SRTFONTPARSE = $(PREFIX1)SrtFontParse
75
76 # perl tools
77 DUMP2HEX = $(PERL) $(PERLPATH)/dump2hex.pl
78 HEX2BIN = $(PERL) $(PERLPATH)/hex2bin.pl --byte
79 MAKEDEP = $(PERL) $(PERLPATH)/makedep.pl
80 #DATE := $(shell $(PERL) pl/date.pl)
81
82 # default rules
83 all:
84
85 clean:
86 @$(ECHO) \"remove all generated files\"
87 @-$(RM) -f core *.o *.d *.s *.map *.dis *.obj MIPS/*.d MIPS/*.o
88
89 depends: $(DEPENDS)
90 @$(ECHO) \"dependency made\"
91
92 # sub-rules
93 MIPS:
94 mkdir MIPS
95
96 MIPS/%.o : MIPS/%.d
97
98 MIPS/%.d : %.c
99 @$(ECHO) \"mkdep $*.c\"
100 @$(XCC) $(CFLAGS_MIPS) -M $< > depend.tmp
101 @$(MAKEDEP) depend.tmp $@
102
103 MIPS/%.o : %.c
104 @$(ECHO) \"compile $<\"
105 @$(XCC) $(CFLAGS_MIPS) -c -o $@ $<
106
107 MIPS/%.o : %.S
108 @$(ECHO) \"assemble $<\"
109 @$(XCC) $(CFLAGS_MIPS_S) -c -o $@ $<
110
111 MIPS/%.s : %.c
112 @$(ECHO) \"compile $<\"
113 @$(XCC) $(CFLAGS_MIPS) -S -fverbose-asm -o $@ $<
114
115 %.dis : MIPS/%.o
116 @$(XOBJDUMP) --source -d --syms $< > $@
117
前面的数字是行号,为了便于说明而加入的,不是Makefile.ult文件的内容。下面以行号进行详细解释。
2)以“#”开头的行是注释,这里是注明当前文件名。
4)Makefile本身包含有隐含的后缀规则,“.SUFFIXES”用于定义后缀列表,这里为空,表示删除默认的后缀,关闭隐含的后缀规则。例如,编译C程序的隐含规则是:“.o”的目标的依赖目标会自动推导为“.c”,并且其生成命令是“$(CC) –c $(CPPFLAGS) $(CFLAGS)”
5)声明伪目标。
7~9)定义工具软件的路径。
11~28)定义交叉工具链。工具链没有使用交叉工具前缀的名称,直接使用“gcc”,但这并不是通常所指的用于PC机的“gcc”,比较好的做法是加上前缀形成“mipsel-elf-gcc”,这样就不会混淆了,因为SPHE8104L CPU内核为MIPS R3000。我们看到的很多交叉工具链都是这样加以区别的。
30~56)定义编译工具的各种参数,有些参数在GCC资料中无法查到,可能是Sunplus加入的。
58~80)为各种可能用到的辅助工具定义别名。
82~116)定义各种目标的依赖规则和编译命令。从各模块Makefile文件之间的包含关系中,我们看到,该文件(Makefile.ult)总是包含在各模块主Makefile的最前面。因此,all总是成为默认目标,all目标的依赖关系和执行的命令则分别由各模块主Makefile定义。
Makefile.sult
1 #
2 # Makefile.sutl
3 #
4
5 sinclude ../Makefile.utl
6
7 PREFIX =
8 PREFIX1 = ../package/
9 PERLPATH = ../pl/
10
11 INCLUDE_DIR = \
12 -I./ -I../ -I../h/ -I../ir_vfd/
13
5)包含上一级目录下的文件Makefile.ult。关键字sinclude跟C语言中的#include的作用类似,被包含的文件会原模原样的放在当前文件的包含位置。
这个文件是供子模块的Makefile包含的。各子模块的Makefile都是位于根目录的一级子目录下。各种路径的搜寻都是采用相对路径的方式,因此,“../”都是指根目录。如果建立一个Makefile文件位于根目录的二级子目录下,直接包含这个文件就会造成路径错误。
『未完,待续...』
文章评论(0条评论)
登录后参与讨论