host-i686-pc-cygwin/libcpp/Makefile分析

快乐虾

http://blog.csdn.net/lights_joy/

[email protected]

   

 

本文适用于

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.amakedepend.exe两个文件。

1.1    libcpp.a

这个依赖关系定义为:

libcpp.a: $(libcpp_a_OBJS)

       -rm -f libcpp.a

       $(AR) $(ARFLAGS) libcpp.a $(libcpp_a_OBJS)

       $(RANLIB) libcpp.a

在生成所有的.o文件后,这段脚本将它们链接到libcpp.a文件。

 

1.1.1   $(libcpp_a_OBJS)

这个变量定义为:

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

1.1.2   init.o

这个规则定义为:

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"

1.2    makedepend $(EXEEXT)

这个依赖关系定义为:

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.alibiberty.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 )

 

 

 

 

 

你可能感兴趣的:(object,脚本,gcc,makefile,编译器)