diff --git a/README.md b/README.md
index 1155754..a030494 100644
--- a/README.md
+++ b/README.md
@@ -81,3 +81,34 @@ manext                          .1
 manNext                         .N (N = 1..9)
 srcdir                          The source-tree directory corresponding to the
                                 current directory in the build tree
+
+
+Notice:
+1、在编写makefile时，不要让$(prefix)变量与install目标紧密结合。
+实际意义是将build阶段与install阶段分离开。
+2、prefix在build阶段非常有用，eg:
+# Makefile
+program: main.c
+    gcc -DCFGDIRS="\"$(sysconfdir)\"" -o $@ main.c
+# main.c
+#ifndef CFGDIR
+#define CFGDIR "/etc"
+#endif
+
+const char cfgdir[FILENAME_MAX] = CFGDIR;
+3、包管理器经常在build和install阶段会重载prefix变量，在build阶段，实际的运行时目录被硬编码
+到执行命令中。eg:
+%build
+%setup
+./configure prefix=/usr sysconfdir=/etc
+make
+包管理的安装命令，eg:
+%install
+make DESTDIR=%BUILDROOT% install
+在install阶段使用DESTDIR会临时重载所有的installation的prefix variables，因此无需记忆在configuration阶段的任何被重载的变量。上例等同于：
+%install
+make prefix=%BUILDROOT%/usr sysconfdir=%BUILDROOT%/etc install
+4、关键的一点————绝不要在编写makefile的install target时，添加build all，或part信息。
+install target 应尽可能的少copy文件。否则，当用户重载prefix时，stage installations功能就无法使用了；
+令一方面可以让用户自由安装包到制定的路径，进行测试；同时当用户执行sudo make install时，如果没有build，会
+直接报错，而不是用root权限进行build。
diff --git a/README.md b/README.md
index a030494..5011eda 100644
--- a/README.md
+++ b/README.md
@@ -112,3 +112,15 @@ make prefix=%BUILDROOT%/usr sysconfdir=%BUILDROOT%/etc install
 install target 应尽可能的少copy文件。否则，当用户重载prefix时，stage installations功能就无法使用了；
 令一方面可以让用户自由安装包到制定的路径，进行测试；同时当用户执行sudo make install时，如果没有build，会
 直接报错，而不是用root权限进行build。
+
+
+
+C/C++ User Variables (完整列表参见"Variables Used by Implicit Rules" section of the GNU Make Manual)
+
+Variable                      Purpose
+CC                            A reference to the system C compiler
+CFLAGS                        Desired C compiler flags
+CXX                           A reference to the system C++ compiler
+CXXFLAGS                      Desired C++ compiler flags
+LDFLAGS                       Desired linker flags
+CPPFLAGS                      Desired C/C++ preprocessor flags
diff --git a/src/Makefile b/src/Makefile
index fc3fc8f..fb8b3e6 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1,7 +1,9 @@
+CFLAGS = -g -O0
+
 all: jupiter

 jupiter: main.c
-	gcc -g -O0 -o $@ main.c
+	$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ main.c

 check: all
 	./jupiter | grep "Hello from ./jupiter!"
diff --git a/README.md b/README.md
index 5011eda..f5d44da 100644
--- a/README.md
+++ b/README.md
@@ -124,3 +124,13 @@ CXX                           A reference to the system C++ compiler
 CXXFLAGS                      Desired C++ compiler flags
 LDFLAGS                       Desired linker flags
 CPPFLAGS                      Desired C/C++ preprocessor flags
+
+
+
+# Makefile
+CFLAGS = -g -O0 改为 CFLAGS ?= -g -O0
+原因是makefile不接受从shell环境变量引入值。
+执行make CFLAGS='-g -O2'是没有问题的，但是运行CFLAGS='-g -O2' make时，则无法传递环境变量给makefile。
+注意：?= 是GNU make的语法，不具有可移植性。
+?= 只有当CFLAGS没有被定义时，才赋值。
+(通常情况下，在make命令行中指定，而不是在环境变量中指定比较好)
diff --git a/src/Makefile b/src/Makefile
index fb8b3e6..0454222 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1,4 +1,4 @@
-CFLAGS = -g -O0
+CFLAGS ?= -g -O0

 all: jupiter