diff --git a/.gitignore b/.gitignore
index fc5e847..583ee11 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,10 @@
 # http://www.gnu.org/software/automake

 Makefile.in
+Makefile
+src/Makefile
+*.in
+config.h

 # http://www.gnu.org/software/autoconf

@@ -11,3 +15,12 @@ Makefile.in
 /depcomp
 /install-sh
 /missing
+*.status
+
+# other
+*.*~
+build/
+*.log
+*.tar.bz2
+*.tar.gz
+log
diff --git a/Makefile.in b/Makefile.in
deleted file mode 100644
index 8d8990f..0000000
--- a/Makefile.in
+++ /dev/null
@@ -1,79 +0,0 @@
-# 不要在每一行的后面名加注释，以免在变量后面引入空格，
-# 比如之前在prefix变量后面有注释，造成bindir的值为/usr/local /bin
-# 命令行传入可覆盖
-# @configure_input@
-
-package = @PACKAGE_NAME@
-version = @PACKAGE_VERSION@
-tarname = @PACKAGE_TARNAME@
-distdir = $(tarname)-$(version)
-
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-bindir = @bindir@
-
-# VPATH-specific substitution variables
-srcdir = @srcdir@
-VPATH = @srcdir@
-
-all clean check install uninstall jupiter:
-	cd src && $(MAKE) $@
-
-dist: $(distdir).tar.bz2
-
-# 如果$(distdir)已经存在，则不会执行下面的rule，直接打包，会造成错误，解决方法如*所示
-# ru前不加'-'，是为了确定上个command一定成功。
-$(distdir).tar.bz2: $(distdir)
-	tar -jcv -f $@ $(distdir)
-	rm -rf $(distdir)
-
-# * 可以将$(distdir)放在.PHONY中，不过，由于它本是一个真实的target，因此不合理
-# 解决方法是，让它依赖于.PHONY的target，从而每次都会执行
-$(distdir): FORCE
-	mkdir -p $(distdir)/src
-	cp $(srcdir)/configure.ac $(distdir)
-	cp $(srcdir)/configure $(distdir)
-	cp $(srcdir)/config.h.in $(distdir)
-	cp $(srcdir)/install-sh $(distdir)
-	cp $(srcdir)/Makefile.in $(distdir)
-	cp $(srcdir)/src/Makefile.in $(distdir)/src
-	cp $(srcdir)/src/main.c $(distdir)/src
-
-# make执行每个command后会向shell返回一个值，
-# 如果出错，会报出错误信息，并停止运行。
-# 在命令前加 '-' 可以忽略错误，并继续执行。
-FORCE:
-	-rm $(distdir).tar.bz2 >/dev/null 2>&1
-	-rm -rf $(distdir) >/dev/null 2>&1
-
-# 注意shell中等号两端不要有空格
-# 注意这个$$，这么用确保make将变量的引用传给shell
-# 而不是在执行make的时候就进行展开。
-# 学习一下，用多个shell命令，反斜线后面不能有空格
-# 无法对软连接，或是深层目录进行检查。
-# to supported staged installation, $(DESTDIR) 这个变量不用定义，提供给RPM或APT等包管理器进行处理
-# 包管理器会在一个临时路径下做一些操作，在这里使用distcheck测试时，会生成这样的测试路径
-# /home/tyrion/Document/_inst/usr/local/bin
-distcheck: $(distdir).tar.bz2
-	tar -jxv -f $(distdir).tar.bz2
-	cd $(distdir) && ./configure
-	cd $(distdir) && $(MAKE) all
-	cd $(distdir) && $(MAKE) check
-	cd $(distdir) && $(MAKE) DESTDIR=$${PWD}/_inst install
-	cd $(distdir) && $(MAKE) DESTDIR=$${PWD}/_inst uninstall
-	@remaining="`find $${PWD}/$(distdir)/_inst -type f | wc -l`"; \
-	if test "$${remaining}" -ne 0; then \
-		echo "*** $${remaining} file(s) remaining in stage directory!"; \
-		exit 1; \
-	fi
-	cd $(distdir) && $(MAKE) clean
-	rm -rf $(distdir)
-	@echo "*** Package $(distdir),tar.bz2 is ready for distribution."
-
-Makefile: Makefile.in config.status
-	./config.status $@
-
-config.status: configure
-	./config.status --recheck
-
-.PHONY: FORCE all clean check dist install uninstall distcheck
diff --git a/autogen.sh b/autogen.sh
deleted file mode 100644
index 57cceeb..0000000
--- a/autogen.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/usr/bin/env bash
-
-# Time-stamp: <2013-09-09 22:18:35 Monday by tyrion>
-
-# @version 1.0
-# @author ahei
-
-autoreconf --install
-automake --add-missing --copy >/dev/null 2>&1
diff --git a/src/Makefile.in b/src/Makefile.in
deleted file mode 100644
index 7df42ae..0000000
--- a/src/Makefile.in
+++ /dev/null
@@ -1,56 +0,0 @@
-# @configure_input@
-
-#Package-specific substitution variables
-package = @PACKAGE_NAME@
-version = @PACKAGE_VERSION@
-tarname = @PACKAGE_TARNAME@
-distdir = $(tarname)-$(version)
-
-# Prefix-specific substitution variables
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-bindir = @bindir@
-
-# VPATH-specific substitution variables
-srcdir = @srcdir@
-VPATH = @srcdir@
-
-CC = @CC@
-DEFS = @DEFS@
-LIBS = @LIBS@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-
-all: jupiter
-
-jupiter: main.c
-	$(CC) $(CFLAGS) $(DEFS) $(CPPFLAGS) -I. -I$(srcdir) -I.. -o $@ $(srcdir)/main.c $(LIBS)
-
-check: all
-	./jupiter | grep "Hello from ./jupiter!"
-	@echo "*** ALL TESTS PASSWD ***"
-
-# to supported staged installation, $(DESTDIR) 这个变量不用定义，提供给RPM或APT等包管理器进行处理
-
-install:
-	$(INSTALL) -d $(DESTDIR)$(bindir)
-	$(INSTALL_PROGRAM) -m 0755 jupiter $(DESTDIR)$(bindir)
-
-# 包管理器并不会按照DESTDIR去删除，它有自己的规则，在这里是为了完成distcheck目标
-uninstall:
-	-rm $(DESTDIR)$(bindir)/jupiter
-
-clean:
-	-rm jupiter
-
-Makefile: Makefile.in ../config.status
-	cd .. && ./config.status src/$@
-
-../config.status: ../configure
-	cd .. && ./config.status --recheck
-
-.PHONY: all clean check install
rm autogne.sh Makefile.in src/Makefile.in
diff --git a/Makefile.am b/Makefile.am
index af437a6..e8a476c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1 +1 @@
-SUBDIRS = src
+SUBDIRS = src temp
diff --git a/README.md b/README.md
index ddd77c8..0fb982f 100644
--- a/README.md
+++ b/README.md
@@ -409,3 +409,62 @@ AC_OUTPUT 所有其他的宏都应该在这个宏之前使用(附加的shell scr

 @<:@ == [
 @>:@ == ]
+
+
+
+
+
+-------------------------------------------------------
+Automake
+开启automake功能只需要在configure.ac文件中添加AM_INIT_AUTOMAKE即可。
+这个宏提供了一些可选参数：
+
+如check-news:
+当automake检查project的版本没有在NEWS文件中给出时，make dist就会报错。
+
+dist-bzip2, dist-lzma, dist-shar, dist-zip, dist-tarZ:
+可以使用dist-*选项改变默认的打包格式。
+
+
+readme-alpha
+
+-Wcategory, --warnings=category
+
+silent-rules
+
+parallel-tests
+
+version
+
+当添加这个宏时，autoreconf -(第一次执行时加i，以后就可以不加了)，i 会自动执行automake -i命令
+
+Automake 提供的target:
+all                  distdir         install
+install-strip        install-data    install-exec
+uninstall            install-dvi     install-html
+install-info         install-ps      install-pdf
+installdirs          check           installcheck
+mostlyclean          clean           distclean
+maintainer-clean     dvi             pdf
+ps                   info            html
+tags                 ctags           dist
+dist-bzip2           dist-gzip       dist-lzma
+dist-shar            dist=zip        dist-tarZ
+
+
+automake 可以自动解决依赖问题，限于C,C++,Fortran   *************************非常重要！！！！！！！！
+
+GNU 编译器提供-M(-M, -MM, -MF, -MG and so on)族选项，支持自动解析源文件和头文件之间的依赖，这些选项告诉编译器
+为指定的文件生成make依赖关系。
+比如，最简单的选项时-M选项，这个选项会使编译器为指定的源文件在标准输出生成依赖关系，这个rule会捕捉到一个文件，然后被makefile所包含，因此在make的第一阶段，依赖信息就被放入make的直方图信息，然后make去构建；
+如果编译器没有提供这样的选项，automake会根据depcomp脚本，执行编译器两次：一次为了依赖信息，一次为了编译源文件。
+
+
+Automake 规则：
+1、在Makefile.am文件中定义的变量被放置在生成的Makefile.in模板的顶部，紧随任何Automake所产生的变量定义；
+2、在Makefile.am文件中定义的rule被放置在生成的Makefile.in模板的最后，紧随任何Automake所产生的rule；
+3、大部分被config.status替换的autoconf变量，被转化为make变量，并初始化那些替换变量
+
+make工具并不在意规则的相互联系，因为它在处理规则之前，将每条阅读过的规则，放入一个内部的数据库；变量也是这样(只要它们在规则使用前定义)，automake为了避免任何变量绑定问题，将所有变量按照输入文件的顺序，放入到输出文件的开头。
+
+
diff --git a/configure.ac b/configure.ac
index 85340b8..e12b767 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,7 +2,8 @@
 # Process this file with autoconf to produce a configure script.

 AC_PREREQ([2.69])
-AC_INIT([Jupiter], [2.1], [Tyrion.Lannister.274AL@gmail.com])
+AC_INIT([Jupiter], [3.0], [Tyrion.Lannister.274AL@gmail.com])
+AM_INIT_AUTOMAKE
 AC_CONFIG_SRCDIR([src/main.c])
 AC_CONFIG_HEADERS([config.h])

@@ -80,7 +81,8 @@ fi
 # Checks for library functions.

 AC_CONFIG_FILES([Makefile
-                 src/Makefile])
+                 src/Makefile
+                 temp/Makefile])
 AC_OUTPUT

 echo \
diff --git a/src/Makefile.am b/src/Makefile.am
index b7f259f..958a7a4 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,2 +1,2 @@
 bin_PROGRAMS = jupiter
-jupiter-SOURCES = main.c
+jupiter_SOURCES = main.c
diff --git a/README.md b/README.md
index 0fb982f..564372d 100644
--- a/README.md
+++ b/README.md
@@ -468,3 +468,47 @@ Automake 规则：
 make工具并不在意规则的相互联系，因为它在处理规则之前，将每条阅读过的规则，放入一个内部的数据库；变量也是这样(只要它们在规则使用前定义)，automake为了避免任何变量绑定问题，将所有变量按照输入文件的顺序，放入到输出文件的开头。

+SUBDIRS变量告诉atuomake几件事情：
+1、包含Makefile的路径都可以加在SUBDIRS变量中；
+2、按变量中的顺序依次处理变量中的路径‘
+3、这个变量中所有的路径会被所有主要的target递归调用；
+4、除了特殊情况，这些路径应作为要发布的产品中的一部分。
+如果需要先编译当前路径就在SUBDIRS的开始加上.即  SUBDIRS = . src等
+
+
+产品列表变量(PLV)：
+[modifier-list]prefix_PRIMARY = product1 product2 ... productN
+后缀为dir的都是和安装路径相关的变量(Installation location variables)，比如前缀是bin的，会被安装到$(bindir)中，lib会安装到$(libdir)中...
+还有四个特殊的pkg前缀的变量pkglibdir, pkgincludedir, pkgdatadir, pkglibexecdir，这些变量会安装到产品名称下，eg：pkglib == $(libdir)/jupiter
+可以在Makefile.am中自定义$(libdir)等变量，如果不希望安装某些东西，只需要在命令行的make后面追加eg:
+make bindir='' libdir='' install
+
+有三个prefix变量是不安装的：noinst, check, extra；
+1、noinst一般作为内部编译静态库或动态库等中间产品的；
+2、check用于检查；
+3、extra这个很重要，通常是由configure.ac中定义的带有条件选择的build，eg：
+AC_INIT(...)
+...
+optional_programs=
+AC_SUBST([optional_programs])
+...
+if test "x$(build_opt_prog)" = xyes; then
+    optional_programs=$(optional_programs) optprog ;; 这个地方optprog追加到optional_programs替换变量后面
+fi
+...
+然后在Makefile.am文件中定义：
+EXTRA_PROGRAMS = optprog                ;;将optprog定义为是可以选择的(这样写，保证无论$(optional_programs)是否有值，automake都会为它生成一个rule用于build)
+bin_PROGRAMS = myprog $(optional_programs) ;;根据configure决定$(optional_programs)是空还是optprog。
+
+
+PLV中主要的Primaries: make会根据不同的PRIMARY，会生成不同的rule去生成目标。
+PROGRAMS
+LIBARIES / LTLIBRARIES automake对这两个变量要求特别严格，规定它们只能被安装到$(libdir)和$(pkglibdir)
+PYTHON automake会生成规则，将py文件编译成pyc或pyo文件，这个阶段会发生在安装阶段而不是build阶段。
+JAVA
+SCRIPTS
+DATA
+HEADERS
+MANS
+TEXTINFOS
+
diff --git a/README.md b/README.md
index 564372d..59913b9 100644
--- a/README.md
+++ b/README.md
@@ -506,9 +506,10 @@ PROGRAMS
 LIBARIES / LTLIBRARIES automake对这两个变量要求特别严格，规定它们只能被安装到$(libdir)和$(pkglibdir)
 PYTHON automake会生成规则，将py文件编译成pyc或pyo文件，这个阶段会发生在安装阶段而不是build阶段。
 JAVA
-SCRIPTS
-DATA
-HEADERS
-MANS
-TEXTINFOS
+SCRIPTS 可以是shell，Perl，Python，Tcl/Tk等脚本，automake对脚本安装位置要求严格，只允许安装到$(bindir), $(sbindir), $(libexecdir) 和 $(pkgdatadir)，同时，automake不会为脚本生成rule，脚本通常在Makefile.am中手动定义规则，有时通过sed或awk等工具。默认情况下，SCRIPTS不会自动作为发布的一部分。如果想要automake添加到发布包中，应该将SCRIPTS加入到dist中。
+DATA  automake严格管理安装DATA的路径，只允许安装到$(datadir), $(sysconfdir), $(sharedstatedir), $(localstatedir), 和$(pkgdatadir)中。数据文件也不是自动发布的，因此，如果要发布，需要修改dist
+HEADERS  通常情况下，安装在$(include_HEADERS)和$(pkginclude_HEADERS)，和其他的源码文件一样，头文件会自动发布。
+MANS 默认不是自动发布，因为它是生成的，可以修改dist来安装。
+TEXTINFOS 支持多种文件格式，只有.info会被默认安装。
+
diff --git a/Makefile.am b/Makefile.am
index e8a476c..af437a6 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1 +1 @@
-SUBDIRS = src temp
+SUBDIRS = src
diff --git a/README.md b/README.md
index 59913b9..a7703a4 100644
--- a/README.md
+++ b/README.md
@@ -513,3 +513,39 @@ MANS 默认不是自动发布，因为它是生成的，可以修改dist来安
 TEXTINFOS 支持多种文件格式，只有.info会被默认安装。

+产品源码变量(PSV)：
+[modifier-list]product_SOURCES = file1 file2 ... fileN
+make 变量PSV只允许包含字符，数字和下划线，因此，automake会对PLV到PSV的名字进行转换，automake会将非法字符转换为下划线，如下所示：
+lib_LIBRARIES = libc++.a
+lib___a_SOURCES = ... (三个下划线)
+
+
+PLV and PSV Modifiers
+modifier-list = modifier_[modifier-list]
+Modifiers可以改变变量的默认行为，比较重要的几个变量如：dist, nodist, nobase 和 notrans。
+
+dist用于表明一组要发布的文件，当执行make dist时会被发行包所包含。
+eg: 在发布包中，发布.c文件
+dist_myprog_SOURCES = file1.c file2.c
+nodist_myprog_SOURCES = file3.c file4.c
+
+automake通常跳过相对路径的头文件信息，nobase modifier用来
+eg: nobase_pkginclude_HEADERS = mylib.h sys/constants.h， 通常情况下，两个文件都将被安装到$(pkgincludedir)，但如果使用nobase modifier，automake将保留sys/到安装路径的第二层，即：mylib.h安装在$(pkgincludedir)下，而constants.h会被安装到$(pkgincludedir)/sys/下，这个功能非常重要！
+
+notrans modifier用于man page，被指定的在安装过程中将不会被transform。
+
+
+也可以使用EXTRA前缀作为一个modifier。当和一个产品源码变量使用时，EXTRA指定extra源文件直接集成到产品中，eg:
+EXTRA_jupiter_SOURCES = possibly.c
+
+注意: possibly.c文件不一定被编译，这取决于在configure.ac中定义的一些条件。
+
+
+
+automake 对单元测试的支持，Supporting make check
+
+check_SCRIPTS 是一个PLV变量，是在构建过程中创建的，用来引用脚本。因为前缀是check，因此，只有在用户执行make check时才会被构建；CLEANFILES这个变量用于在执行make clean时删除这些文件。
+
+TESTS变量是执行make check时调用的，check_SCRIPTS包含一个包含所有这类脚本文件列表；check_SCRIPTS很重要，
+autoamek在tests被执行前，就会为TESTS里的所有脚本生成rule，当有其他的辅助脚本或程序必须在TESTS执行前被构建的话，
+check_* PLV变量就变得非常重要了！
diff --git a/configure.ac b/configure.ac
index e12b767..b0b9659 100644
--- a/configure.ac
+++ b/configure.ac
@@ -81,8 +81,7 @@ fi
 # Checks for library functions.

 AC_CONFIG_FILES([Makefile
-                 src/Makefile
-                 temp/Makefile])
+                 src/Makefile])
 AC_OUTPUT

 echo \
diff --git a/src/Makefile.am b/src/Makefile.am
index 958a7a4..e07dad6 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,2 +1,12 @@
 bin_PROGRAMS = jupiter
 jupiter_SOURCES = main.c
+
+
+check_SCRIPTS = greptest.sh
+TESTS = $(check_SCRIPTS)
+
+greptest.sh:
+	echo './jupiter | grep "Hello from .*jupiter!"' > greptest.sh
+	chmod +x greptest.sh
+
+CLEANFILES = greptest.sh
diff --git a/temp/Makefile.am b/temp/Makefile.am
deleted file mode 100644
index bcc9792..0000000
--- a/temp/Makefile.am
+++ /dev/null
@@ -1,12 +0,0 @@
-# Onlyu used to test variable and rule's generate order in Makefile.in
-
-
-MY_VAR1 = 0
-MY_VAR2 = 1
-
-
-MY_TARGET1:
-	ls
-
-MY_TARGET2:
-	ls -l
diff --git a/src/Makefile.am b/src/Makefile.am
index e07dad6..01781bd 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -6,7 +6,7 @@ check_SCRIPTS = greptest.sh
 TESTS = $(check_SCRIPTS)

 greptest.sh:
-	echo './jupiter | grep "Hello from .*jupiter!"' > greptest.sh
-	chmod +x greptest.sh
+	@echo './jupiter | grep "Hello from .*jupiter!"' > greptest.sh
+	@chmod +x greptest.sh

 CLEANFILES = greptest.sh
diff --git a/Makefile.am b/Makefile.am
index af437a6..6c7749b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1 +1 @@
-SUBDIRS = src
+SUBDIRS = common src
diff --git a/README.md b/README.md
index a7703a4..2bdb4ba 100644
--- a/README.md
+++ b/README.md
@@ -549,3 +549,32 @@ check_SCRIPTS 是一个PLV变量，是在构建过程中创建的，用来引用
 TESTS变量是执行make check时调用的，check_SCRIPTS包含一个包含所有这类脚本文件列表；check_SCRIPTS很重要，
 autoamek在tests被执行前，就会为TESTS里的所有脚本生成rule，当有其他的辅助脚本或程序必须在TESTS执行前被构建的话，
 check_* PLV变量就变得非常重要了！
+
+
+common/Makefile.am: 第二行没有使用noinst_HEADERS，因为不必要，通常只有在没有源码的路径中(/include)才使用noinst_HEADERS，使用noist_HEADERS唯一的影响就是将列出的头文件简单的添加到项目的发布文件列表中。
+
+
+
+(产品可选变量)POV
+仅仅是当需要将库编译成产品的一部分时， 才将库添加到program_LDADD或library_LIBADD；如果库已经安装到系统中，需要在confiure.ac中添加AC_CHECK_LIB或AC_SEARCH_LIBS，使链接器通过LIBS变量链接合适的库。
+
+POV大部分继承与用户变量，重要的几个如下：
+1、product_CPPFLAGS
+2、product_CFLAGS
+3、product_LDFLAGS                      ;; 动态库
+4、program_LDADD                        ;; 静态库
+5、library_LIBADD                       ;; non-Libtool to ar command
+6、ltlibrary_LIBADD                     ;; Libtool
+
+Pre-Makefile Option Variables
+如在Makefile.am文件中的AM_CPPFLAGS，AM_LDFLAGS变量，这些变量用于将一组flag用于Makefile.am中所有的产品，例如，
+如果需要将一组预编译符号用于Makefile.am中所有的产品，并为一个特殊的产品(prog1)添加额外的标志，可以这样实现：
+AM_CFLAGS = ... some flags ...
+...
+prog1_CFLAGS = ... more flags ... $(AM_CFLAGS)
+注：因为存在的pre-product变量会覆盖Automake's pre-makefile变量，因此要将pre-makefile变量添加在pre-product变量后面。
+
+注意：用户变量不应被configure scripts或makefiles改变。
+
+
+当使用静态库时，必须在configure.ac中包含AC_PROG_RANLIB宏，并且为了同时支持-c -o选项，需要使用AM_PROG_CC_C_O宏。
diff --git a/common/Makefile.am b/common/Makefile.am
index e69de29..d879710 100644
--- a/common/Makefile.am
+++ b/common/Makefile.am
@@ -0,0 +1,3 @@
+noinst_LIBRARIES = libjupcommon.a
+libjupcommon_a_SOURCES = jupcommon.h print.c
+
diff --git a/common/jupcommon.h b/common/jupcommon.h
index e69de29..5d6e4a7 100644
--- a/common/jupcommon.h
+++ b/common/jupcommon.h
@@ -0,0 +1,6 @@
+#ifndef JUPCOMMON_H
+#define JUPCOMMON_H
+
+int print_routine(const char *name);
+
+#endif
diff --git a/common/print.c b/common/print.c
index a7b14da..1f4a5c9 100644
--- a/common/print.c
+++ b/common/print.c
@@ -2,35 +2,27 @@
 #include <config.h>
 #endif

+#include "jupcommon.h"
+
 #include <stdio.h>
 #include <stdlib.h>
+
 #if HAVE_PTHREAD_H
 #include <pthread.h>
 #endif

-#if 0
-#if HAVE_STDINT_H
-#include <stdint.h>
-#elif HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
-
-uint16_t x;
-#endif
-
 static void* print_it(void* data) {
     fprintf(stdout, "Hello from %s!\n", (const char *)data);
     return NULL;
 }

-int main(int argc, char *argv[])
-{
+int print_routine(const char *name) {
 #if ASYNC_EXEC
     pthread_t tid;
-    pthread_create(&tid, 0, print_it, argv[0]);
+    pthread_create(&tid, 0, print_it, (void*)name);
     pthread_join(tid, 0);
 #else
-    print_it(argv[0]);
+    print_it((void*)name);
 #endif
     return 0;
 }
diff --git a/configure.ac b/configure.ac
index b0b9659..d951fd5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -13,6 +13,8 @@ _DEBUG_START_
 AC_CHECK_PROG([bash_var], [bash], [yes], [no], , [/usr/sbin/bash])
 _DEBUG_END_
 AC_PROG_INSTALL
+AC_PROG_RANLIB
+AM_PROG_CC_C_O

 # Checks for command-line options
 #AC_ARG_ENABLE([async-exec],
@@ -81,6 +83,7 @@ fi
 # Checks for library functions.

 AC_CONFIG_FILES([Makefile
+                 common/Makefile
                  src/Makefile])
 AC_OUTPUT

diff --git a/src/Makefile.am b/src/Makefile.am
index 01781bd..0f14601 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,6 +1,7 @@
 bin_PROGRAMS = jupiter
 jupiter_SOURCES = main.c
-
+jupiter_CPPFLAGS = -I$(top_srcdir)/common
+jupiter_LDADD = ../common/libjupcommon.a

 check_SCRIPTS = greptest.sh
 TESTS = $(check_SCRIPTS)
diff --git a/src/main.c b/src/main.c
index a7b14da..b759f67 100644
--- a/src/main.c
+++ b/src/main.c
@@ -25,12 +25,5 @@ static void* print_it(void* data) {

 int main(int argc, char *argv[])
 {
-#if ASYNC_EXEC
-    pthread_t tid;
-    pthread_create(&tid, 0, print_it, argv[0]);
-    pthread_join(tid, 0);
-#else
-    print_it(argv[0]);
-#endif
-    return 0;
+    return print_routine(argv[0]);
 }
diff --git a/Makefile.am b/Makefile.am
index af437a6..6c7749b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1 +1 @@
-SUBDIRS = src
+SUBDIRS = common src
diff --git a/README.md b/README.md
index a7703a4..2bdb4ba 100644
--- a/README.md
+++ b/README.md
@@ -549,3 +549,32 @@ check_SCRIPTS 是一个PLV变量，是在构建过程中创建的，用来引用
 TESTS变量是执行make check时调用的，check_SCRIPTS包含一个包含所有这类脚本文件列表；check_SCRIPTS很重要，
 autoamek在tests被执行前，就会为TESTS里的所有脚本生成rule，当有其他的辅助脚本或程序必须在TESTS执行前被构建的话，
 check_* PLV变量就变得非常重要了！
+
+
+common/Makefile.am: 第二行没有使用noinst_HEADERS，因为不必要，通常只有在没有源码的路径中(/include)才使用noinst_HEADERS，使用noist_HEADERS唯一的影响就是将列出的头文件简单的添加到项目的发布文件列表中。
+
+
+
+(产品可选变量)POV
+仅仅是当需要将库编译成产品的一部分时， 才将库添加到program_LDADD或library_LIBADD；如果库已经安装到系统中，需要在confiure.ac中添加AC_CHECK_LIB或AC_SEARCH_LIBS，使链接器通过LIBS变量链接合适的库。
+
+POV大部分继承与用户变量，重要的几个如下：
+1、product_CPPFLAGS
+2、product_CFLAGS
+3、product_LDFLAGS                      ;; 动态库
+4、program_LDADD                        ;; 静态库
+5、library_LIBADD                       ;; non-Libtool to ar command
+6、ltlibrary_LIBADD                     ;; Libtool
+
+Pre-Makefile Option Variables
+如在Makefile.am文件中的AM_CPPFLAGS，AM_LDFLAGS变量，这些变量用于将一组flag用于Makefile.am中所有的产品，例如，
+如果需要将一组预编译符号用于Makefile.am中所有的产品，并为一个特殊的产品(prog1)添加额外的标志，可以这样实现：
+AM_CFLAGS = ... some flags ...
+...
+prog1_CFLAGS = ... more flags ... $(AM_CFLAGS)
+注：因为存在的pre-product变量会覆盖Automake's pre-makefile变量，因此要将pre-makefile变量添加在pre-product变量后面。
+
+注意：用户变量不应被configure scripts或makefiles改变。
+
+
+当使用静态库时，必须在configure.ac中包含AC_PROG_RANLIB宏，并且为了同时支持-c -o选项，需要使用AM_PROG_CC_C_O宏。
diff --git a/common/Makefile.am b/common/Makefile.am
index e69de29..d879710 100644
--- a/common/Makefile.am
+++ b/common/Makefile.am
@@ -0,0 +1,3 @@
+noinst_LIBRARIES = libjupcommon.a
+libjupcommon_a_SOURCES = jupcommon.h print.c
+
diff --git a/common/jupcommon.h b/common/jupcommon.h
index e69de29..5d6e4a7 100644
--- a/common/jupcommon.h
+++ b/common/jupcommon.h
@@ -0,0 +1,6 @@
+#ifndef JUPCOMMON_H
+#define JUPCOMMON_H
+
+int print_routine(const char *name);
+
+#endif
diff --git a/common/print.c b/common/print.c
index a7b14da..1f4a5c9 100644
--- a/common/print.c
+++ b/common/print.c
@@ -2,35 +2,27 @@
 #include <config.h>
 #endif

+#include "jupcommon.h"
+
 #include <stdio.h>
 #include <stdlib.h>
+
 #if HAVE_PTHREAD_H
 #include <pthread.h>
 #endif

-#if 0
-#if HAVE_STDINT_H
-#include <stdint.h>
-#elif HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
-
-uint16_t x;
-#endif
-
 static void* print_it(void* data) {
     fprintf(stdout, "Hello from %s!\n", (const char *)data);
     return NULL;
 }

-int main(int argc, char *argv[])
-{
+int print_routine(const char *name) {
 #if ASYNC_EXEC
     pthread_t tid;
-    pthread_create(&tid, 0, print_it, argv[0]);
+    pthread_create(&tid, 0, print_it, (void*)name);
     pthread_join(tid, 0);
 #else
-    print_it(argv[0]);
+    print_it((void*)name);
 #endif
     return 0;
 }
diff --git a/configure.ac b/configure.ac
index b0b9659..d951fd5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -13,6 +13,8 @@ _DEBUG_START_
 AC_CHECK_PROG([bash_var], [bash], [yes], [no], , [/usr/sbin/bash])
 _DEBUG_END_
 AC_PROG_INSTALL
+AC_PROG_RANLIB
+AM_PROG_CC_C_O

 # Checks for command-line options
 #AC_ARG_ENABLE([async-exec],
@@ -81,6 +83,7 @@ fi
 # Checks for library functions.

 AC_CONFIG_FILES([Makefile
+                 common/Makefile
                  src/Makefile])
 AC_OUTPUT

diff --git a/src/Makefile.am b/src/Makefile.am
index 01781bd..0f14601 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,6 +1,7 @@
 bin_PROGRAMS = jupiter
 jupiter_SOURCES = main.c
-
+jupiter_CPPFLAGS = -I$(top_srcdir)/common
+jupiter_LDADD = ../common/libjupcommon.a

 check_SCRIPTS = greptest.sh
 TESTS = $(check_SCRIPTS)
diff --git a/src/main.c b/src/main.c
index a7b14da..b759f67 100644
--- a/src/main.c
+++ b/src/main.c
@@ -25,12 +25,5 @@ static void* print_it(void* data) {

 int main(int argc, char *argv[])
 {
-#if ASYNC_EXEC
-    pthread_t tid;
-    pthread_create(&tid, 0, print_it, argv[0]);
-    pthread_join(tid, 0);
-#else
-    print_it(argv[0]);
-#endif
-    return 0;
+    return print_routine(argv[0]);
 }
diff --git a/README.md b/README.md
index 5d7ffb2..c6fdd9f 100644
--- a/README.md
+++ b/README.md
@@ -586,3 +586,9 @@ EXTRA_DIST = windows
 在这里windows是一个文件夹，而不是一个文件，automake自动递归添加路径中的每一个文件到发行包中，这里面存在一个问题，就是svn等隐藏为文件，这个问题是可以解决的，在automake -hook and -local Rules中提到。

+
+Maintainer Mode
+在configure.ac文件中使用AM_MAINTAINER_MODE宏，关闭maintainer-level make rules。目的是因为用户可能没有安装autotools，当构建的系统发生变化时，可能会调用这个autotools去生成configure和makefile.in。maintainer或用户可以通过在命令行--enable-maintainer-mode来更新configure和makefile.in
+
+
+通过在命令行上加 --enable-silent-rules来减少noisy，也可以通过在configure.ac中添加AM_SILENT_RULES宏，或为AM_INIT_AUTOMAKE添加参数slient-rules