diff --git a/Makefile b/Makefile
index 84dd206..36d266b 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,21 @@
+package = jupiter
+version = 1.0
+tarname = $(package)
+distdir = $(tarname)-$(version)
+
 all clean jupiter:
-	cd src && $(MAKE) $@				# 当有tab时，make就认为这是一个命令
+	cd src && $(MAKE) $@
+
+dist: $(distdir).tar.bz2
+
+$(distdir).tar.bz2: $(distdir)
+	tar -jcv -f $@ $(distdir)
+	rm -rf $(distdir)
+
+$(distdir):
+	mkdir -p $(distdir)/src
+	cp Makefile $(distdir)
+	cp src/Makefile $(distdir)/src
+	cp src/main.c $(distdir)/src

-.PHONY: all clean
+.PHONY: all clean dist
diff --git a/Makefile b/Makefile
index 36d266b..901956d 100644
--- a/Makefile
+++ b/Makefile
@@ -18,4 +18,4 @@ $(distdir):
 	cp src/Makefile $(distdir)/src
 	cp src/main.c $(distdir)/src

-.PHONY: all clean dist
+.PHONY: all clean dist			# 注意这个地方，将dist设置为.PHONY，这样无论何时，只要执行make dist，都会打包。
diff --git a/Makefile b/Makefile
index 901956d..2be798b 100644
--- a/Makefile
+++ b/Makefile
@@ -8,14 +8,21 @@ all clean jupiter:

 dist: $(distdir).tar.bz2

-$(distdir).tar.bz2: $(distdir)
+$(distdir).tar.bz2: $(distdir)	# 如果$(distdir)已经存在，则不会执行下面的rule，直接打包，会造成错误，解决方法如*所示
 	tar -jcv -f $@ $(distdir)
 	rm -rf $(distdir)

-$(distdir):
+$(distdir): FORCE				# * 可以将$(distdir)放在.PHONY中，不过，由于它本是一个真实的target，因此不合理
+                                # 解决方法是，让它依赖于.PHONY的target，从而每次都会执行
 	mkdir -p $(distdir)/src
 	cp Makefile $(distdir)
 	cp src/Makefile $(distdir)/src
 	cp src/main.c $(distdir)/src

-.PHONY: all clean dist			# 注意这个地方，将dist设置为.PHONY，这样无论何时，只要执行make dist，都会打包。
+FORCE:
+	-rm $(distdir).tar.bz2 >/dev/null 2>&1 # make执行每个command后会向shell返回一个值，
+                                           # 如果出错，会报出错误信息，并停止运行。
+                                           # 在命令前加 '-' 可以忽略错误，并继续执行。
+	-rm -rf $(distdir) >/dev/null 2>&1
+
+.PHONY: all clean dist FORCE
diff --git a/Makefile b/Makefile
index 2be798b..59805b2 100644
--- a/Makefile
+++ b/Makefile
@@ -10,7 +10,7 @@ dist: $(distdir).tar.bz2

 $(distdir).tar.bz2: $(distdir)	# 如果$(distdir)已经存在，则不会执行下面的rule，直接打包，会造成错误，解决方法如*所示
 	tar -jcv -f $@ $(distdir)
-	rm -rf $(distdir)
+	rm -rf $(distdir)			# 这个地方不加'-'，是为了确定上个command一定成功。

 $(distdir): FORCE				# * 可以将$(distdir)放在.PHONY中，不过，由于它本是一个真实的target，因此不合理
                                 # 解决方法是，让它依赖于.PHONY的target，从而每次都会执行