diff --git a/configure.ac b/configure.ac
index e69de29..9e43fb9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -0,0 +1,3 @@
+AC_INIT([jupiter], [2.0])
+AC_OUTPUT
+
diff --git a/README.md b/README.md
index f5d44da..bb7f2b7 100644
--- a/README.md
+++ b/README.md
@@ -134,3 +134,33 @@ CFLAGS = -g -O0 改为 CFLAGS ?= -g -O0
 注意：?= 是GNU make的语法，不具有可移植性。
 ?= 只有当CFLAGS没有被定义时，才赋值。
 (通常情况下，在make命令行中指定，而不是在环境变量中指定比较好)
+
+
+
+configure 文件两个作用
+1、必要的平台检查
+2、生成并调用config.status
+
+
+
+config.log 文件主要包含下面信息：
+1、命令行调用的./configure及其参数；
+2、configure执行时检查的平台信息；
+3、configure执行的核心测试信息；
+4、生成config.status被configure生成并执行的行数(configure文件)
+=======
+config.status开始执行，并生成log信息
+1、命令行调用./config.status时的信息；
+=======
+config.status从它们的模板中生成所有的文件后，退出，configure继续执行
+1、config.status 工作时的cache variables；
+2、在模板中可能被替换的变量列表；
+3、configure执行完，返回shell的返回值
+注意：
+1、config.log文件对于调试configure时非常重要。
+2、将检查和生成文件分成两个脚本来完成是有好处的：
+   1）不同的操作和独立的make targets结合时，工作的效率更高；
+   2）可以单独执行config.status文件重新根据模板生成文件，节约了平台必要检查时间；
+   3）config.status记录了configure执行时的命令信息，当make监测到它需要升级build系统时，
+   它会调用config.status去重新执行configure(并使用保存在config.status中的参数)
+
diff --git a/README.md b/README.md
index bb7f2b7..89b9e00 100644
--- a/README.md
+++ b/README.md
@@ -162,5 +162,6 @@ config.status从它们的模板中生成所有的文件后，退出，configure
    1）不同的操作和独立的make targets结合时，工作的效率更高；
    2）可以单独执行config.status文件重新根据模板生成文件，节约了平台必要检查时间；
    3）config.status记录了configure执行时的命令信息，当make监测到它需要升级build系统时，
-   它会调用config.status去重新执行configure(并使用保存在config.status中的参数)
-
+   它会调用config.status去重新执行configure(并使用保存在config.status中的参数)；
+   4）当make监测到makefile依赖的模板比makefile新的时候，make会调用config.status重新生成makefile，
+   然后自己继续根据它的命令继续执行(make自己调用自己)
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 8656db8..0000000
--- a/Makefile
+++ /dev/null
@@ -1,66 +0,0 @@
-# 不要在每一行的后面名加注释，以免在变量后面引入空格，
-# 比如之前在prefix变量后面有注释，造成bindir的值为/usr/local /bin
-# 命令行传入可覆盖
-package = jupiter
-version = 1.0
-tarname = $(package)
-distdir = $(tarname)-$(version)
-prefix = /usr/local
-exec_prefix = $(prefix)
-bindir = $(exec_prefix)/bin
-
-# export 属于GNU make，不具有可移植性
-export prefix
-export exec_prefix
-export bindir
-
-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 Makefile $(distdir)
-	cp src/Makefile $(distdir)/src
-	cp 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) && $(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."
-
-.PHONY: FORCE all clean check dist install uninstall distcheck
diff --git a/configure.ac b/configure.ac
index 9e43fb9..8983f75 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,3 +1,4 @@
 AC_INIT([jupiter], [2.0])
+AC_CONFIG_FILES([Makefile src/Makefile])
 AC_OUTPUT

diff --git a/src/Makefile b/src/Makefile
deleted file mode 100644
index 0454222..0000000
--- a/src/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-CFLAGS ?= -g -O0
-
-all: jupiter
-
-jupiter: main.c
-	$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ main.c
-
-check: all
-	./jupiter | grep "Hello from ./jupiter!"
-	@echo "*** ALL TESTS PASSWD ***"
-
-# to supported staged installation, $(DESTDIR) 这个变量不用定义，提供给RPM或APT等包管理器进行处理
-
-install:
-	install -d $(DESTDIR)$(bindir)
-	install -m 0755 jupiter $(DESTDIR)$(bindir)
-
-# 包管理器并不会按照DESTDIR去删除，它有自己的规则，在这里是为了完成distcheck目标
-uninstall:
-	-rm $(DESTDIR)$(bindir)/jupiter
-
-clean:
-	-rm jupiter
-
-.PHONY: all clean check install
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 8656db8..0000000
--- a/Makefile
+++ /dev/null
@@ -1,66 +0,0 @@
-# 不要在每一行的后面名加注释，以免在变量后面引入空格，
-# 比如之前在prefix变量后面有注释，造成bindir的值为/usr/local /bin
-# 命令行传入可覆盖
-package = jupiter
-version = 1.0
-tarname = $(package)
-distdir = $(tarname)-$(version)
-prefix = /usr/local
-exec_prefix = $(prefix)
-bindir = $(exec_prefix)/bin
-
-# export 属于GNU make，不具有可移植性
-export prefix
-export exec_prefix
-export bindir
-
-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 Makefile $(distdir)
-	cp src/Makefile $(distdir)/src
-	cp 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) && $(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."
-
-.PHONY: FORCE all clean check dist install uninstall distcheck
diff --git a/Makefile.in b/Makefile.in
index 8656db8..1c4a7fe 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,18 +1,16 @@
 # 不要在每一行的后面名加注释，以免在变量后面引入空格，
 # 比如之前在prefix变量后面有注释，造成bindir的值为/usr/local /bin
-# 命令行传入可覆盖
-package = jupiter
-version = 1.0
-tarname = $(package)
+# 命令行传入可覆盖
+# @configure_input@
+
+package = @PACKAGE_NAME@
+version = @PACKAGE_VERSION@
+tarname = @PACKAGE_TARNAME@
 distdir = $(tarname)-$(version)
-prefix = /usr/local
-exec_prefix = $(prefix)
-bindir = $(exec_prefix)/bin

-# export 属于GNU make，不具有可移植性
-export prefix
-export exec_prefix
-export bindir
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@

 all clean check install uninstall jupiter:
 	cd src && $(MAKE) $@
@@ -29,8 +27,9 @@ $(distdir).tar.bz2: $(distdir)
 # 解决方法是，让它依赖于.PHONY的target，从而每次都会执行
 $(distdir): FORCE
 	mkdir -p $(distdir)/src
-	cp Makefile $(distdir)
-	cp src/Makefile $(distdir)/src
+	cp configure.ac $(distdir)
+	cp Makefile.in $(distdir)
+	cp src/Makefile.in $(distdir)/src
 	cp src/main.c $(distdir)/src

 # make执行每个command后会向shell返回一个值，
@@ -50,6 +49,7 @@ FORCE:
 # /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
@@ -63,4 +63,10 @@ distcheck: $(distdir).tar.bz2
 	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/README.md b/README.md
index 89b9e00..eba8bae 100644
--- a/README.md
+++ b/README.md
@@ -137,6 +137,13 @@ CFLAGS = -g -O0 改为 CFLAGS ?= -g -O0

+
+
+
+
+
+
+;;;; 下面是v2.0的说明
 configure 文件两个作用
 1、必要的平台检查
 2、生成并调用config.status
@@ -165,3 +172,12 @@ config.status从它们的模板中生成所有的文件后，退出，configure
    它会调用config.status去重新执行configure(并使用保存在config.status中的参数)；
    4）当make监测到makefile依赖的模板比makefile新的时候，make会调用config.status重新生成makefile，
    然后自己继续根据它的命令继续执行(make自己调用自己)
+
+
+
+Makefile.in文件中，包含autoconf替代变量，语法形式是：@VARIABLE@
+
+
+
+去掉顶层Makefile文件中的export，在子路径下添加同样的变量，缺点看上去有重复代码，优点是可以可以在任何子路径下
+执行make，而不用担心存在从高层传递进来的未初始化变量。
diff --git a/configure.ac b/configure.ac
index 9e43fb9..8983f75 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,3 +1,4 @@
 AC_INIT([jupiter], [2.0])
+AC_CONFIG_FILES([Makefile src/Makefile])
 AC_OUTPUT

diff --git a/src/Makefile b/src/Makefile
deleted file mode 100644
index 0454222..0000000
--- a/src/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-CFLAGS ?= -g -O0
-
-all: jupiter
-
-jupiter: main.c
-	$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ main.c
-
-check: all
-	./jupiter | grep "Hello from ./jupiter!"
-	@echo "*** ALL TESTS PASSWD ***"
-
-# to supported staged installation, $(DESTDIR) 这个变量不用定义，提供给RPM或APT等包管理器进行处理
-
-install:
-	install -d $(DESTDIR)$(bindir)
-	install -m 0755 jupiter $(DESTDIR)$(bindir)
-
-# 包管理器并不会按照DESTDIR去删除，它有自己的规则，在这里是为了完成distcheck目标
-uninstall:
-	-rm $(DESTDIR)$(bindir)/jupiter
-
-clean:
-	-rm jupiter
-
-.PHONY: all clean check install
diff --git a/src/Makefile.in b/src/Makefile.in
index 0454222..8d132de 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -1,3 +1,16 @@
+# @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@
+
 CFLAGS ?= -g -O0

 all: jupiter
@@ -22,4 +35,10 @@ uninstall:
 clean:
 	-rm jupiter

+Makefile: Makefile.in ../config.status
+	cd .. && ./config.status src/$@
+
+../config.status: ../configure
+	cd .. && ./config.status --recheck
+
 .PHONY: all clean check install
diff --git a/README.md b/README.md
index eba8bae..f27dd04 100644
--- a/README.md
+++ b/README.md
@@ -181,3 +181,9 @@ Makefile.in文件中，包含autoconf替代变量，语法形式是：@VARIABLE@

 去掉顶层Makefile文件中的export，在子路径下添加同样的变量，缺点看上去有重复代码，优点是可以可以在任何子路径下
 执行make，而不用担心存在从高层传递进来的未初始化变量。
+
+
+AC_CONFIG_FILES 可以根据当前路径下任何同名的.in文件生成文本文件。.in是AC_CONFIG_FILES宏默认的模板扩展名，
+这个规则可以修改。
+autoconf生成sed，awk表达式，这些表达式被copy到config.status文件中，config.status脚本使用这些表达式实现
+对template files中字符串的替换。
diff --git a/Makefile.in b/Makefile.in
index 1c4a7fe..d37b3cc 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -28,6 +28,7 @@ $(distdir).tar.bz2: $(distdir)
 $(distdir): FORCE
 	mkdir -p $(distdir)/src
 	cp configure.ac $(distdir)
+	cp configure $(distdir)
 	cp Makefile.in $(distdir)
 	cp src/Makefile.in $(distdir)/src
 	cp src/main.c $(distdir)/src
diff --git a/Makefile.in b/Makefile.in
index d37b3cc..c9c6999 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -12,6 +12,10 @@ 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) $@

@@ -27,11 +31,11 @@ $(distdir).tar.bz2: $(distdir)
 # 解决方法是，让它依赖于.PHONY的target，从而每次都会执行
 $(distdir): FORCE
 	mkdir -p $(distdir)/src
-	cp configure.ac $(distdir)
-	cp configure $(distdir)
-	cp Makefile.in $(distdir)
-	cp src/Makefile.in $(distdir)/src
-	cp src/main.c $(distdir)/src
+	cp $(srcdir)/configure.ac $(distdir)
+	cp $(srcdir)/configure $(distdir)
+	cp $(srcdir)/Makefile.in $(distdir)
+	cp $(srcdir)/src/Makefile.in $(distdir)/src
+	cp $(srcdir)/src/main.c $(distdir)/src

 # make执行每个command后会向shell返回一个值，
 # 如果出错，会报出错误信息，并停止运行。
diff --git a/README.md b/README.md
index f27dd04..3fc5478 100644
--- a/README.md
+++ b/README.md
@@ -187,3 +187,14 @@ AC_CONFIG_FILES 可以根据当前路径下任何同名的.in文件生成文本
 这个规则可以修改。
 autoconf生成sed，awk表达式，这些表达式被copy到config.status文件中，config.status脚本使用这些表达式实现
 对template files中字符串的替换。
+
+
+
+VPATH(virtual search path): 这是一种方式，允许在src路径外进行configure和build。这种方法很重要，可以解决以下几种情况
+1、保留一个分离的debug configure；
+2、并排测试不同的configure；
+3、保持一个干净的src路径，在本地修改后，可以patch diffs；
+4、在只读的src路径下build
+
+
+
diff --git a/src/Makefile.in b/src/Makefile.in
index 8d132de..b3ea612 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -11,12 +11,16 @@ prefix = @prefix@
 exec_prefix = @exec_prefix@
 bindir = @bindir@

+# VPATH-specific substitution variables
+srcdir = @srcdir@
+VPATH = @srcdir@
+
 CFLAGS ?= -g -O0

 all: jupiter

 jupiter: main.c
-	$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ main.c
+	$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $(srcdir)/main.c

 check: all
 	./jupiter | grep "Hello from ./jupiter!"
diff --git a/Makefile.in b/Makefile.in
index c9c6999..8d8990f 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -33,6 +33,8 @@ $(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
diff --git a/README.md b/README.md
index 3fc5478..8ca3a45 100644
--- a/README.md
+++ b/README.md
@@ -198,3 +198,16 @@ VPATH(virtual search path): 这是一种方式，允许在src路径外进行conf

+只使用autoscan（autoconf的一部分），而没有使用automake，需要执行下面的命令，来解决文件缺失的问题：
+1、autoreconf --install
+2、automake --add-missing --copy >/dev/null 2>&1
+
+
+
+当使用install(不是target)时，autoscan会检测到，并在configure.scan文件中生成AC_PROG_INSTALL宏
+
+
+
+若路径下有config.h.in文件生成时，说明autoreconf执行了autoheader。
+
+
diff --git a/configure.ac b/configure.ac
index 8983f75..43afb31 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,4 +1,24 @@
-AC_INIT([jupiter], [2.0])
-AC_CONFIG_FILES([Makefile src/Makefile])
-AC_OUTPUT
+#                                               -*- Autoconf -*-
+# 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_CONFIG_SRCDIR([src/main.c])
+AC_CONFIG_HEADERS([config.h])
+
+# Checks for programs.
+AC_PROG_CC
+AC_PROG_INSTALL
+
+# Checks for libraries.

+# Checks for header files.
+AC_CHECK_HEADERS([stdlib.h])
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+AC_CONFIG_FILES([Makefile
+                 src/Makefile])
+AC_OUTPUT
diff --git a/README.md b/README.md
index 8ca3a45..c15ff59 100644
--- a/README.md
+++ b/README.md
@@ -208,6 +208,4 @@ VPATH(virtual search path): 这是一种方式，允许在src路径外进行conf

-若路径下有config.h.in文件生成时，说明autoreconf执行了autoheader。
-
-
+若路径下有config.h.in文件生成时，说明autoreconf执行了autoheader; install-sh是由automake拷贝过来的。