快乐虾
http://blog.csdn.net/lights_joy/
lights@hb165.com
本文适用于
Cygwin-1.16
Vs2008
欢迎转载,但请保留作者信息
这个Makefile由上一级目录的makefile调用make all执行。All目标定义为:
all: all-am
all-am: Makefile $(LIBRARIES) $(LTLIBRARIES) $(DATA)
LIBRARIES = $(noinst_LIBRARIES)
noinst_LIBRARIES = lib.a
LTLIBRARIES = $(noinst_LTLIBRARIES)
noinst_LTLIBRARIES未定义
DATA = $(noinst_DATA)
noinst_DATA =
因而此目标将依赖于lib.a目标,其定义为:
lib.a: $(lib_a_OBJECTS) $(lib_a_DEPENDENCIES)
-rm -f lib.a
$(lib_a_AR) lib.a $(lib_a_OBJECTS) $(lib_a_LIBADD)
$(RANLIB) lib.a
在生成所需要的目标文件后,上述脚本将它们打包成lib.a文件。这个库将用于实现libc/include/argz.h和libc/include/envz.h中定义的几个函数。关于这几个函数,kernel.org上的文档是这样描述的:
argz_*相关的函数:
These functions are glibc-specific.
An argz vector is a pointer to a character buffer together with a length. The
intended interpretation of the character buffer is an array of strings, where
the strings are separated by null bytes ('/0'). If the length is non-zero,
the last byte of the buffer must be a null byte.
These functions are for handling argz vectors. The pair (NULL,0) is an argz
vector, and, conversely, argz vectors of length 0 must have NULL pointer.
Allocation of non-empty argz vectors is done using malloc(3), so that free(3)
can be used to dispose of them again.
envz_*相关的函数:
These functions are glibc-specific.
An argz vector is a pointer to a character buffer together with a length, see
argz_add(3). An envz vector is a special argz vector, namely one where the
strings have the form "name=value". Everything after the first '=' is
considered to be the value. If there is no '=', the value is taken to be
NULL. (While the value in case of a trailing '=' is the empty string "".)
These functions are for handling envz vectors.
envz_add() adds the string "name=value" (in case value is non-NULL) or "name"
(in case value is NULL) to the envz vector (*envz, *envz_len) and updates
*envz and *envz_len. If an entry with the same name existed, it is removed.
envz_entry() looks for name in the envz vector (envz, envz_len) and returns
the entry if found, or NULL if not.
envz_get() looks for name in the envz vector (envz, envz_len) and returns the
value if found, or NULL if not. (Note that the value can also be NULL, namely
when there is an entry for name without '=' sign.)
envz_merge() adds each entry in envz2 to *envz, as if with envz_add(). If
override is true, then values in envz2 will supersede those with the same name
in *envz, otherwise not.
envz_remove() removes the entry for name from (*envz, *envz_len) if there was
one.
envz_strip() removes all entries with value NULL.
在这个库的实现上,只使用了字符串处理函数,因而直接使用VC自带的函数即可,cygwin也没有特殊的实现。
由于有以下定义:
lib_a_OBJECTS = $(am_lib_a_OBJECTS)
am_lib_a_OBJECTS = lib_a-dummy.$(OBJEXT) $(am__objects_1)
am__objects_1 = lib_a-argz_add.$(OBJEXT) /
lib_a-argz_add_sep.$(OBJEXT) /
lib_a-argz_append.$(OBJEXT) /
lib_a-argz_count.$(OBJEXT) /
lib_a-argz_create.$(OBJEXT) /
lib_a-argz_create_sep.$(OBJEXT) /
lib_a-argz_delete.$(OBJEXT) /
lib_a-argz_extract.$(OBJEXT) /
lib_a-argz_insert.$(OBJEXT) /
lib_a-argz_next.$(OBJEXT) /
lib_a-argz_replace.$(OBJEXT) /
lib_a-argz_stringify.$(OBJEXT) /
lib_a-buf_findstr.$(OBJEXT) /
lib_a-envz_entry.$(OBJEXT) /
lib_a-envz_get.$(OBJEXT) /
lib_a-envz_add.$(OBJEXT) /
lib_a-envz_remove.$(OBJEXT) /
lib_a-envz_merge.$(OBJEXT) /
lib_a-envz_strip.$(OBJEXT)
lib_a_DEPENDENCIES未定义。
lib_a_LIBADD =
因而此目标有以下的依赖关系。
1.1.1.1 lib_a-dummy.$(OBJEXT)
这个目标定义为:
lib_a-dummy.o: dummy.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-dummy.o `test -f 'dummy.c' || echo '$(srcdir)/'`dummy.c
没啥可说的,直接编译。
1.1.1.2 lib_a-argz_add.$(OBJEXT)
这条规则定义为:
lib_a-argz_add.o: argz_add.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-argz_add.o `test -f 'argz_add.c' || echo '$(srcdir)/'`argz_add.c;
直接编译即可。
1.1.1.3 lib_a-argz_add_sep.$(OBJEXT)
这条规则定义为:
lib_a-argz_add_sep.o: argz_add_sep.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-argz_add_sep.o `test -f 'argz_add_sep.c' || echo '$(srcdir)/'`argz_add_sep.c
直接编译即可。
1.1.1.4 lib_a-argz_append.$(OBJEXT)
这条规则定义为:
lib_a-argz_append.o: argz_append.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-argz_append.o `test -f 'argz_append.c' || echo '$(srcdir)/'`argz_append.c;/
直接编译即可。
1.1.1.5 lib_a-argz_count.$(OBJEXT)
这条规则定义为:
lib_a-argz_count.o: argz_count.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-argz_count.o `test -f 'argz_count.c' || echo '$(srcdir)/'`argz_count.c
直接编译即可。
1.1.1.6 lib_a-argz_create.$(OBJEXT)
这条规则定义为:
lib_a-argz_create.o: argz_create.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-argz_create.o `test -f 'argz_create.c' || echo '$(srcdir)/'`argz_create.c
直接编译即可。
1.1.1.7 lib_a-argz_create_sep.$(OBJEXT)
这条规则定义为:
lib_a-argz_create_sep.o: argz_create_sep.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-argz_create_sep.o `test -f 'argz_create_sep.c' || echo '$(srcdir)/'`argz_create_sep.c
直接编译即可。
1.1.1.8 lib_a-argz_delete.$(OBJEXT)
这条规则定义为:
lib_a-argz_delete.o: argz_delete.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-argz_delete.o `test -f 'argz_delete.c' || echo '$(srcdir)/'`argz_delete.c
直接编译即可。
1.1.1.9 lib_a-argz_extract.$(OBJEXT)
这条规则定义为:
lib_a-argz_extract.o: argz_extract.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-argz_extract.o `test -f 'argz_extract.c' || echo '$(srcdir)/'`argz_extract.c
直接编译即可。
1.1.1.10 lib_a-argz_insert.$(OBJEXT)
这条规则定义为:
lib_a-argz_insert.o: argz_insert.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-argz_insert.o `test -f 'argz_insert.c' || echo '$(srcdir)/'`argz_insert.c
直接编译即可。
1.1.1.11 lib_a-argz_next.$(OBJEXT)
这条规则定义为:
lib_a-argz_next.o: argz_next.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-argz_next.o `test -f 'argz_next.c' || echo '$(srcdir)/'`argz_next.c
直接编译即可。
1.1.1.12 lib_a-argz_replace.$(OBJEXT)
这条规则定义为:
lib_a-argz_replace.o: argz_replace.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-argz_replace.o `test -f 'argz_replace.c' || echo '$(srcdir)/'`argz_replace.c
直接编译即可。
1.1.1.13 lib_a-argz_stringify.$(OBJEXT)
这条规则定义为:
lib_a-argz_stringify.o: argz_stringify.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-argz_stringify.o `test -f 'argz_stringify.c' || echo '$(srcdir)/'`argz_stringify.c
直接编译即可。
1.1.1.14 lib_a-buf_findstr.$(OBJEXT)
这条规则定义为:
lib_a-buf_findstr.o: buf_findstr.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-buf_findstr.o `test -f 'buf_findstr.c' || echo '$(srcdir)/'`buf_findstr.c
直接编译即可。
1.1.1.15 lib_a-envz_entry.$(OBJEXT)
这条规则定义为:
lib_a-envz_entry.o: envz_entry.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-envz_entry.o `test -f 'envz_entry.c' || echo '$(srcdir)/'`envz_entry.c
直接编译即可。
1.1.1.16 lib_a-envz_get.$(OBJEXT)
这条规则定义为:
lib_a-envz_get.o: envz_get.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-envz_get.o `test -f 'envz_get.c' || echo '$(srcdir)/'`envz_get.c
直接编译即可。
1.1.1.17 lib_a-envz_add.$(OBJEXT)
这条规则定义为:
lib_a-envz_add.o: envz_add.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-envz_add.o `test -f 'envz_add.c' || echo '$(srcdir)/'`envz_add.c
直接编译即可。
1.1.1.18 lib_a-envz_remove.$(OBJEXT)
这条规则定义为:
lib_a-envz_remove.o: envz_remove.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-envz_remove.o `test -f 'envz_remove.c' || echo '$(srcdir)/'`envz_remove.c
直接编译即可。
1.1.1.19 lib_a-envz_merge.$(OBJEXT)
这条规则定义为:
lib_a-envz_merge.o: envz_merge.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-envz_merge.o `test -f 'envz_merge.c' || echo '$(srcdir)/'`envz_merge.c
直接编译即可。
1.1.1.20 lib_a-envz_strip.$(OBJEXT)
这条规则定义为:
lib_a-envz_strip.o: envz_strip.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-envz_strip.o `test -f 'envz_strip.c' || echo '$(srcdir)/'`envz_strip.c
直接编译即可。
参考资料
在vs2008下使用cygwin(1):前言( 2008-10-16 )
在vs2008下使用cygwin(2):i686-pc-cygwin/newlib/Makefile分析( 2008-10-16 )
在vs2008下使用cygwin(3):i686-pc-cygwin/newlib/libc/Makefile分析( 2008-10-16 )