diff --git a/Makefile b/Makefile
index 3873c23..f2af667 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ version = 1.0
 tarname = $(package)
 distdir = $(tarname)-$(version)

-all clean jupiter:
+all clean check jupiter:
 	cd src && $(MAKE) $@

 dist: $(distdir).tar.bz2
@@ -28,8 +28,9 @@ FORCE:
 distcheck: $(distdir).tar.bz2
 	tar -jxv -f $(distdir).tar.bz2
 	cd $(distdir) && $(MAKE) all
+	cd $(distdir) && $(MAKE) check
 	cd $(distdir) && $(MAKE) clean
 	rm -rf $(distdir)
 	@echo "*** Package $(distdir),tar.bz2 is ready for distribution."

-.PHONY: all clean dist FORCE distcheck
+.PHONY: FORCE all clean check dist distcheck
diff --git a/src/Makefile b/src/Makefile
index 6209602..4e9cc01 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -3,6 +3,10 @@ all: jupiter
 jupiter: main.c
 	gcc -g -O0 -o $@ main.c

+check: all
+	./jupiter | grep "Hello from ./jupiter!"
+	@echo "*** ALL TESTS PASSWD ***"
+
 clean:
 	-rm jupiter

diff --git a/src/main.c b/src/main.c
index 8e3e7d9..7dae3bb 100644
--- a/src/main.c
+++ b/src/main.c
@@ -3,6 +3,6 @@

 int main(int argc, char *argv[])
 {
-    fprintf(stdout, "Hello from %s\n", argv[0]);
+    fprintf(stdout, "Hello from %s!\n", argv[0]);
     return 0;
 }
diff --git a/Makefile b/Makefile
index f2af667..7acf9cf 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ version = 1.0
 tarname = $(package)
 distdir = $(tarname)-$(version)

-all clean check jupiter:
+all clean check install jupiter:
 	cd src && $(MAKE) $@

 dist: $(distdir).tar.bz2
@@ -33,4 +33,4 @@ distcheck: $(distdir).tar.bz2
 	rm -rf $(distdir)
 	@echo "*** Package $(distdir),tar.bz2 is ready for distribution."

-.PHONY: FORCE all clean check dist distcheck
+.PHONY: FORCE all clean check dist install distcheck
diff --git a/src/Makefile b/src/Makefile
index 4e9cc01..99496ec 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -7,7 +7,12 @@ check: all
 	./jupiter | grep "Hello from ./jupiter!"
 	@echo "*** ALL TESTS PASSWD ***"

+install:
+	cp jupiter /usr/bin
+	chown root:root /usr/bin/jupiter
+	chmod +x /usr/bin/jupiter
+
 clean:
 	-rm jupiter

-.PHONY: all clean
+.PHONY: all clean check install
diff --git a/Makefile b/Makefile
index 7acf9cf..1597e4c 100644
--- a/Makefile
+++ b/Makefile
@@ -2,6 +2,8 @@ package = jupiter
 version = 1.0
 tarname = $(package)
 distdir = $(tarname)-$(version)
+prefix = /usr/local				# 命令行传入可覆盖
+export prefix					# 属于GNU make，不具有可移植性

 all clean check install jupiter:
 	cd src && $(MAKE) $@
diff --git a/src/Makefile b/src/Makefile
index 99496ec..55b1a50 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -8,9 +8,8 @@ check: all
 	@echo "*** ALL TESTS PASSWD ***"

 install:
-	cp jupiter /usr/bin
-	chown root:root /usr/bin/jupiter
-	chmod +x /usr/bin/jupiter
+	install -d $(prefix)/bin
+	install -m 0755 jupiter $(prefix)/bin

 clean:
 	-rm jupiter
diff --git a/Makefile b/Makefile
index 1597e4c..d96744a 100644
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,7 @@ distdir = $(tarname)-$(version)
 prefix = /usr/local				# 命令行传入可覆盖
 export prefix					# 属于GNU make，不具有可移植性

-all clean check install jupiter:
+all clean check install uninstall jupiter:
 	cd src && $(MAKE) $@

 dist: $(distdir).tar.bz2
@@ -22,17 +22,20 @@ $(distdir): FORCE				# * 可以将$(distdir)放在.PHONY中，不过，由于它
 	cp src/main.c $(distdir)/src

 FORCE:
-	-rm $(distdir).tar.bz2 >/dev/null 2>&1 # make执行每个command后会向shell返回一个值，
-                                           # 如果出错，会报出错误信息，并停止运行。
-                                           # 在命令前加 '-' 可以忽略错误，并继续执行。
+	-rm $(distdir).tar.bz2 >/dev/null 2>&1  # make执行每个command后会向shell返回一个值，
+                                            # 如果出错，会报出错误信息，并停止运行。
+                                            # 在命令前加 '-' 可以忽略错误，并继续执行。
 	-rm -rf $(distdir) >/dev/null 2>&1

 distcheck: $(distdir).tar.bz2
 	tar -jxv -f $(distdir).tar.bz2
 	cd $(distdir) && $(MAKE) all
 	cd $(distdir) && $(MAKE) check
+	cd $(distdir) && $(MAKE) prefix=$${PWD}/_inst install  # 注意等号两端不要有空格
+														   # 注意这个$$，这么用确保make将变量的引用传给shell                                                           # 而不是在执行make的时候就进行展开。
+	cd $(distdir) && $(MAKE) prefix=$${PWD}/_inst uninstall
 	cd $(distdir) && $(MAKE) clean
 	rm -rf $(distdir)
 	@echo "*** Package $(distdir),tar.bz2 is ready for distribution."

-.PHONY: FORCE all clean check dist install distcheck
+.PHONY: FORCE all clean check dist install uninstall distcheck
diff --git a/src/Makefile b/src/Makefile
index 55b1a50..b2c4c6c 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -11,6 +11,9 @@ install:
 	install -d $(prefix)/bin
 	install -m 0755 jupiter $(prefix)/bin

+uninstall:
+	-rm $(prefix)/bin/jupiter
+
 clean:
 	-rm jupiter
diff --git a/Makefile b/Makefile
index d96744a..38abb42 100644
--- a/Makefile
+++ b/Makefile
@@ -34,6 +34,11 @@ distcheck: $(distdir).tar.bz2
 	cd $(distdir) && $(MAKE) prefix=$${PWD}/_inst install  # 注意等号两端不要有空格
 														   # 注意这个$$，这么用确保make将变量的引用传给shell                                                           # 而不是在执行make的时候就进行展开。
 	cd $(distdir) && $(MAKE) prefix=$${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."
diff --git a/Makefile b/Makefile
index 38abb42..c1dc091 100644
--- a/Makefile
+++ b/Makefile
@@ -34,7 +34,7 @@ distcheck: $(distdir).tar.bz2
 	cd $(distdir) && $(MAKE) prefix=$${PWD}/_inst install  # 注意等号两端不要有空格
 														   # 注意这个$$，这么用确保make将变量的引用传给shell                                                           # 而不是在执行make的时候就进行展开。
 	cd $(distdir) && $(MAKE) prefix=$${PWD}/_inst uninstall
-	@remaining="`find $${PWD}/$(distdir)/_inst -type f | wc -l`"; \
+	@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; \
diff --git a/Makefile b/Makefile
index c1dc091..44275cf 100644
--- a/Makefile
+++ b/Makefile
@@ -35,7 +35,7 @@ distcheck: $(distdir).tar.bz2
 														   # 注意这个$$，这么用确保make将变量的引用传给shell                                                           # 而不是在执行make的时候就进行展开。
 	cd $(distdir) && $(MAKE) prefix=$${PWD}/_inst uninstall
 	@remaining="`find $${PWD}/$(distdir)/_inst -type f | wc -l`"; \                          # 学习一下
-	if test "$${remaining}" -ne 0; then \
+	if test "$${remaining}" -ne 0; then \                                                    # 只能检查一般文件，无法对软连接，或是深层目录进行检查。
 		echo "*** $${remaining} file(s) remaining in stage directory!"; \
 		exit 1; \
 	fi