Makefile
赋值 #
- = 是最基本的赋值
 - := 是覆盖之前的值
 - ?= 是如果没有被赋值过就赋予等号后面的值
 - += 是添加等号后面的值
 
注意点 1: 赋值语句的处理顺序 #
“=” 赋值是等到最后才会执行的部分。
 x = foo
 y = $(x) bar  
 x = xyz
在上例中,y的值将会是 xyz bar ,而不是 foo bar 。
“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。
 x := foo
 y := $(x) bar
 x := xyz
在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。
基本全局变量 #
- MAKECMDGOALS, make xxx, 配置的目标:xxx。
 - OPT, make xxx -Dtest_ut, 后面的选项参数:-Dtest_ut
 - CXXFLAGS, CXX编译器的选项参数,与上面的OPT不同的是,OPT是来自于命令行,FLAGS是传递给编译器
 
判断选择 #
使用逗号隔开ifneq条件的两个变量,空就是空。 常用的if包括:ifeq, ifneq, ifdef, ifndef
ifneq ($(filter dbg, $(MAKECMDGOALS)),)
	DEBUG_LEVEL=2
else ifneq ($(filter shared_lib install-shared, $(MAKECMDGOALS)),)
	DEBUG_LEVEL=0
	LIB_MODE=shared
else ifneq ($(filter static_lib install-static, $(MAKECMDGOALS)),)
	DEBUG_LEVEL=0
	LIB_MODE=static
else ifneq ($(filter jtest rocksdbjava%, $(MAKECMDGOALS)),)
	OBJ_DIR=jl
	LIB_MODE=shared
	ifneq ($(findstring rocksdbjavastatic, $(MAKECMDGOALS)),)
		OBJ_DIR=jls
		ifneq ($(DEBUG_LEVEL),2)
			DEBUG_LEVEL=0
		endif
		ifeq ($(MAKECMDGOALS),rocksdbjavastaticpublish)
			DEBUG_LEVEL=0
		endif
	endif
endif
include #
引入xxx.mk 文件,一般将src.mk 中配置不同的target所对应的源代码文件列表。
# These are the sources from which librocksdb.a is built:
LIB_SOURCES =                                                   \
  cache/cache.cc                                                \
  cache/cache_entry_roles.cc                                    \
  cache/cache_key.cc                                            \
  cache/cache_reservation_manager.cc                            \
  cache/clock_cache.cc                                          \
  cache/fast_lru_cache.cc                                       \
  cache/lru_cache.cc                                            \
  cache/compressed_secondary_cache.cc                           \
  cache/sharded_cache.cc                                        \
  db/arena_wrapped_db_iter.cc                                   \
  db/blob/blob_fetcher.cc                                       \
  db/blob/blob_file_addition.cc                                 \
  db/blob/blob_file_builder.cc                                  \
  ...