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