Makefile

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                                  \
  ...