快乐虾
http://blog.csdn.net/lights_joy/
本文适用于
gcc- 4.3.1
configure –target=bfin-uclinux-gnu
Blackfin系列DSP
Cygwin gcc 3.4.4
欢迎转载,但请保留作者信息
在cygwin gcc 3.4.4 环境下构建交叉编译器bfin-uclinux-gcc时,首先执行的是configure –target=bfin-uclinux-gnu命令,然后执行make操作,它将创建host-i686-pc-cygwin/ libcpp子目录,并调用gcc-4.3.1/libcpp/configure脚本生成Makefile,然后在主控Makefile中调用make生成目标,此时传递进来的目标为all。
本文就是分析这个动态生成的host-i686-pc-cygwin/ libcpp /Makefile。
all目标的依赖关系为:
all: libcpp.a makedepend$(EXEEXT) $(USED_CATALOGS)
因而这个Makefile将生成libcpp.a和makedepend.exe两个文件。
这个依赖关系定义为:
libcpp.a: $(libcpp_a_OBJS)
-rm -f libcpp.a
$(AR) $(ARFLAGS) libcpp.a $(libcpp_a_OBJS)
$(RANLIB) libcpp.a
在生成所有的.o文件后,这段脚本将它们链接到libcpp.a文件。
这个变量定义为:
libcpp_a_OBJS = charset.o directives.o directives-only.o errors.o /
expr.o files.o identifiers.o init.o lex.o line-map.o macro.o /
mkdeps.o pch.o symtab.o traditional.o
除了init.o文件外,在Makefile中并没有为这些文件定义显式规则,只定义了一个统一的规则:
.c.o:
$(COMPILE) $<
这里COMPILE变量定义为:
# Dependency rule.
COMPILE.base = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(ALL_CFLAGS) -c
ifeq ($(DEPMODE),depmode=gcc3)
COMPILE = $(COMPILE.base) -o $@ -MT $@ -MMD -MP -MF $(DEPDIR)/$*.Po
else
COMPILE = source='$<' object='$@' libtool=no DEPDIR=$(DEPDIR) $(DEPMODE) /
$(depcomp) $(COMPILE.base)
endif
DEFS未定义。INCLUDES的值为:
INCLUDES = -I$(srcdir) - I. -I$(srcdir)/../include /
-I$(srcdir)/include
$(srcdir)指向gcc- 4.3.1 /libcpp。
这个规则定义为:
init.o: localedir.h
# It is not possible to get LOCALEDIR defined in config.h because
# the value it needs to be defined to is only determined in the
# Makefile. Hence we do this instead.
localedir.h: localedir.hs; @true
localedir.hs: Makefile
echo "#define LOCALEDIR /"$(localedir)/"" > localedir.new
$(srcdir)/../move-if-change localedir.new localedir.h
echo timestamp > localedir.hs
无非就是生成一个localedir.h的文件,其内容为:
#define LOCALEDIR "/usr/local/share/locale"
这个依赖关系定义为:
makedepend$(EXEEXT): $(makedepend_OBJS) libcpp.a ../libiberty/libiberty.a
@rm -f makedepend$(EXEEXT)
$(CC) $(CFLAGS) $(LDFLAGS) -o makedepend$(EXEEXT) /
$(makedepend_OBJS) libcpp.a ../libiberty/libiberty.a /
$(LIBINTL) $(LIBICONV)
在这里libcpp.a和libiberty.a已经生成,因此只要先生成$(makedepend_OBJS)即可。这个变量定义为:
makedepend_OBJS = makedepend.o
没有makedepend.o的显式规则,将使用.c .o:这个默认规则。
在生成makedepend.o后,将它链接成为makedepend.exe文件。
host-i686-pc-cygwin/libiberty/Makefile解析( 2008-8-19 )
host-i686-pc-cygwin/fixincludes/Makefile分析( 2008-8-19 )