CM/build/Makefile.global
2024-10-24 17:48:57 +08:00

363 lines
13 KiB
Makefile

##########################################################################
# Enable options
##########################################################################
ifeq ($(USE_BUILD_MAKE), ON)
ENABLE_MULTIPLE_NODES=$(MULTIPLE_NODES)
ENABLE_ETCD=$(ETCD)
ENABLE_HOTPATCH=$(HOTPATCH)
ENABLE_LIBPQ=$(LIBPQ)
ENABLE_KRB=$(KRB)
ENABLE_ALARM=$(ALARM)
ENABLE_UT=OFF
ENABLE_MEMCHECK=$(MEMCHECK)
ENABLE_GCOV=$(GCOV)
ENABLE_PRIVATEGAUSS=$(PRIVATEGAUSS)
BUILD_TYPE=$(MAKE_BUILD_TYPE)
else
ifndef BUILD_TYPE
BUILD_TYPE=Debug
endif
ifndef ENABLE_MEMCHECK
ENABLE_MEMCHECK=OFF
endif
ENABLE_MULTIPLE_NODES=OFF
ENABLE_ETCD=OFF
ENABLE_HOTPATCH=OFF
ENABLE_LIBPQ=ON
ENABLE_KRB=OFF
ENABLE_ALARM=ON
ENABLE_UT=OFF
ENABLE_GCOV=OFF
ENABLE_PRIVATEGAUSS=OFF
endif
##########################################################################
# Meta configuration
##########################################################################
PROJECT_SOURCE_DIR = $(CM_TOP_BUILDDIR)
SCRIPT_PATH=$(CM_TOP_BUILDDIR)/build
OUT_PATH=$(SCRIPT_PATH)/output
MAKE_INSTALL_PREFIX=$(OUT_PATH)
BUILD_MODE=Debug
CM_COMMON_FLAGS = -std=c++11
G_LIB_VERSION = 1
LIB_MODE = comm
LIB_MODE_COMM = comm
CC = g++
CXXFLAGS=
CPPFLAGS=
LDFLAGS=
LIBS=
ifeq ($(BUILD_TYPE), Debug)
BUILD_MODE = Debug
OPTIMIZE_LEVEL = -O0 -g
else ifeq ($(BUILD_TYPE), Release)
BUILD_MODE = Release
ENABLE_MEMCHECK = OFF
ENABLE_UT=OFF
OPTIMIZE_LEVEL = -O2 -g3
else
$(error unsupported BUILD_TYPE is $(BUILD_TYPE))
endif
ifeq ($(ENABLE_MEMCHECK)_$(ENABLE_UT), ON_ON)
$(error unsupported ENABLE_MEMCHECK and ENABLE_UT both true!)
endif
PLAT_FORM_NAME = $(shell sh $(SCRIPT_PATH)/get_PlatForm_str.sh)
BUILD_TUPLE = $(shell uname -m)
ifeq ($(BUILD_TUPLE), x86_64)
OS_OPTIONS = -msse4.2 -mcx16
COMPILE_MACRO += -DUSE_SSE42_CRC32C_WITH_RUNTIME_CHECK
else ifeq ($(BUILD_TUPLE), aarch64)
USE_SSE42_CRC32C_WITH_RUNTIME_CHECK = OFF
ifeq ($(ENABLE_MULTIPLE_NODES)_$(BUILD_TYPE) , ON_Release))
OS_OPTIONS = -march=armv8-a+crc+lse
else
OS_OPTIONS = -march=armv8-a+crc
endif
endif
ifeq ($(ENABLE_MULTIPLE_NODES)_$(ENABLE_PRIVATEGAUSS), OFF_OFF)
ENABLE_HOTPATCH = OFF
endif
HOTPATCH_PLATFORM_LIST = suse11_sp1_x86_64 suse12_sp5_x86_64 euleros2.0_sp8_aarch64 euleros2.0_sp9_aarch64 euleros2.0_sp10_aarch64 euleros2.0_sp2_x86_64 euleros2.0_sp5_x86_64 euleros2.0_sp10_x86_64 kylinv10_sp1_aarch64 kylinv10_sp1_x86_64
HOTPATCH_ARM_LIST = euleros2.0_sp8_aarch64 euleros2.0_sp9_aarch64 euleros2.0_sp10_aarch64 kylinv10_sp1_aarch64
RET_HOTPATCH = $(findstring $(PLAT_FORM_NAME),$(HOTPATCH_PLATFORM_LIST))
RET_ARM_HOTPATCH = $(findstring $(PLAT_FORM_NAME),$(HOTPATCH_ARM_LIST))
ifeq ($(ENABLE_HOTPATCH)_$(RET_HOTPATCH), ON_)
$(warning Current OS($(PLAT_FORM_NAME)) is not in os list, don't support ENABLE_HOTPATCH!!, supported plantform list is $(HOTPATCH_PLATFORM_LIST))
ENABLE_HOTPATCH = OFF
endif
ifeq ($(ENABLE_UT), ON)
BUILD_MODE = Ut
$(info ENABLE_UT is on!, we use llt lib, and build debug pkg.
LIB_MODE = llt
COMPILE_MACRO += -DENABLE_UT
endif
SECURE_OPTIONS = -fno-common -fstack-protector-strong
SECURE_LINK_OPTS = -Wl,-z,noexecstack -Wl,-z,relro,-z,now
PROTECT_OPTIONS = -fwrapv -std=c++11 $(OPTIMIZE_LEVEL)
WARNING_OPTIONS = -Wall -Wendif-labels -Werror -Wformat-security
OPTIMIZE_OPTIONS = -pipe -fno-aggressive-loop-optimizations -fno-expensive-optimizations -fno-omit-frame-pointer -fno-strict-aliasing -freg-struct-return
CHECK_OPTIONS = -Wmissing-format-attribute -Wno-attributes -Wno-unused-but-set-variable -Wno-write-strings -Wpointer-arith
COMM_INC = $(PROJECT_SOURCE_DIR)/src/include \
$(PROJECT_SOURCE_DIR)/src/include/cm \
$(PROJECT_SOURCE_DIR)/src/include/cm/cm_adapter \
$(PROJECT_SOURCE_DIR)/src/include/cm/cm_server \
$(PROJECT_SOURCE_DIR)/src/include/cm/cm_agent \
$(PROJECT_SOURCE_DIR)/src/include/cm/cm_ctl \
$(SSL_DIRECTORY_INC) \
$(SECURE_DIRECTORY_INC) \
$(CMAKE_BINARY_DIR) \
$(PROJECT_SOURCE_DIR)/src/include/opengauss \
$(PROJECT_SOURCE_DIR)/src/include/opengauss/cm \
$(PROJECT_SOURCE_DIR)/src/include/opengauss/alarm \
$(PROJECT_SOURCE_DIR)/src/include/opengauss/common/config
# third part
ifeq (x$(GCC_VERSION), x)
GCC_VERSION = 7.3.0
endif
# to avoid the different of binarylibs and library
CJSON_DIR = cjson
ZLIB_DIR = zlib1.2.11
3RD_PATH = $(THIRD_BIN_PATH)
ifeq ($(ENABLE_LIBPQ), OFF)
3RD_PATH = $(PROJECT_SOURCE_DIR)/library
LIB_MODE =
LIB_MODE_COMM =
3RD_DEPENDENCY_ROOT = $(3RD_PATH)
3RD_PLATFORM_ROOT = $(3RD_PATH)
3RD_BUILDTOOLS_ROOT = $(3RD_PATH)
CJSON_DIR = cJSON
ZLIB_DIR = zlib
ENABLE_HOTPATCH = OFF
else
ENABLE_LIBPQ = ON
ifeq (x$(3RD_PATH), x)
3RD_PATH = $(PROJECT_SOURCE_DIR)/binarylibs
endif
3RD_DEPENDENCY_ROOT = $(3RD_PATH)/kernel/dependency
3RD_PLATFORM_ROOT = $(3RD_PATH)/kernel/platform/
3RD_BUILDTOOLS_ROOT = $(3RD_PATH)/buildtools/
endif
ifeq ($(ENABLE_LIBPQ), OFF)
ENABLE_MULTIPLE_NODES = OFF
ENABLE_ALARM = OFF
else
COMPILE_MACRO += -DENABLE_LIBPQ
endif
ifeq ($(ENABLE_MULTIPLE_NODES), ON)
COMPILE_MACRO += -DENABLE_MULTIPLE_NODES
DIST_PATH = $(PROJECT_SOURCE_DIR)/distribute
endif
ifeq ($(ENABLE_PRIVATEGAUSS), ON)
COMPILE_MACRO += -DENABLE_PRIVATEGAUSS
DIST_PATH = $(PROJECT_SOURCE_DIR)/distribute
endif
PGPORT_HOME = $(PROJECT_SOURCE_DIR)/common_lib/port
LIB_DCC_HOME = $(PROJECT_SOURCE_DIR)/common_lib/dcc
SECURE_HOME = $(3RD_PLATFORM_ROOT)/Huawei_Secure_C/$(LIB_MODE_COMM)
KRB_HOME = $(3RD_DEPENDENCY_ROOT)/kerberos/$(LIB_MODE)
LIB_PSUTIL_HOME = $(3RD_DEPENDENCY_ROOT)/psutil
# hotpatch
3RD_HOTPATCH_HOME = $(3RD_PLATFORM_ROOT)/hotpatch
DCC_DIRECTORY_INC = $(LIB_DCC_HOME)/include
DCC_DIRECTORY_LIB = $(LIB_DCC_HOME)/lib
GSTOR_DIRECTORY_LIB = $(LIB_GSTOR_HOME)/lib
3RD_HOTPATCH_INC = $(3RD_HOTPATCH_HOME)/include
3RD_HOTPATCH_LIB = $(3RD_HOTPATCH_HOME)/lib
3RD_HOTPATCH_TOOL = $(3RD_HOTPATCH_HOME)/tool
3RD_HOTPATCH_CONFIG = $(3RD_HOTPATCH_HOME)/config
SECURE_DIRECTORY_INC = $(SECURE_HOME)/include
SECURE_DIRECTORY_LIB = $(SECURE_HOME)/lib
CJSON_DIRECTORY_INC = $(3RD_DEPENDENCY_ROOT)/$(CJSON_DIR)/$(LIB_MODE)/include
CJSON_DIRECTORY_LIB = $(3RD_DEPENDENCY_ROOT)/$(CJSON_DIR)/$(LIB_MODE)/lib
ifeq ($(ENABLE_MULTIPLE_NODES), ON)
CGROUP_DIRECTORY_INC = $(3RD_DEPENDENCY_ROOT)/libcgroup/$(LIB_MODE)/include
CGROUP_DIRECTORY_LIB = $(3RD_DEPENDENCY_ROOT)/libcgroup/$(LIB_MODE)/lib
endif
SSL_DIRECTORY_INC = $(3RD_DEPENDENCY_ROOT)/openssl/$(LIB_MODE)/include
SSL_DIRECTORY_LIB = $(3RD_DEPENDENCY_ROOT)/openssl/$(LIB_MODE)/lib
SSL_DIRECTORY_BIN = $(3RD_DEPENDENCY_ROOT)/openssl/$(LIB_MODE)/bin
ZLIB_DIRECTORY_INC = $(3RD_DEPENDENCY_ROOT)/$(ZLIB_DIR)/$(LIB_MODE)/include
ZLIB_DIRECTORY_LIB = $(3RD_DEPENDENCY_ROOT)/$(ZLIB_DIR)/$(LIB_MODE)/lib
# LZ4_DIRECTORY_INC $(3RD_DEPENDENCY_ROOT)/lz4/$(LIB_MODE)/include
LZ4_DIRECTORY_LIB = $(3RD_DEPENDENCY_ROOT)/lz4/$(LIB_MODE)/lib
ETCD_DIRECTORY_INC = $(3RD_DEPENDENCY_ROOT)/etcd/$(LIB_MODE_COMM)/include
ETCD_DIRECTORY_LIB = $(3RD_DEPENDENCY_ROOT)/etcd/$(LIB_MODE_COMM)/lib
ETCD_DIRECTORY_BIN = $(3RD_DEPENDENCY_ROOT)/etcd/$(LIB_MODE_COMM)/bin
# ZSTD_DIRECTORY_INC = $(3RD_DEPENDENCY_ROOT)/zstd/include
ZSTD_DIRECTORY_LIB = $(3RD_DEPENDENCY_ROOT)/zstd/lib
CM_ADAPTER_PATH = $(PROJECT_SOURCE_DIR)/src/cm_adapter
CM_ADAPTER_LIBS = libcmddbadapter.a libcmdccadapter.a libcmetcdadapter.a
ifeq ($(ENABLE_ETCD), ON)
CM_ADAPTER_LIBS += libetcdapi.a
endif
CM_BASE_LIBS = libconfig.a libalarmclient.a libcmcommon.a libcmclient.a libcmpq.a libcmprotocol.a libhotpatchclient.a
CM_LIB_PATH = $(PROJECT_SOURCE_DIR)/src/lib
CM_COMMUNICATION_PATH = $(PROJECT_SOURCE_DIR)/src/cm_communication
CM_COMMON_PATH = $(PROJECT_SOURCE_DIR)/src/cm_common
DCC_ALL_LIBS = $(DCC_DIRECTORY_LIB) $(SSL_DIRECTORY_LIB) $(ZSTD_DIRECTORY_LIB) $(LZ4_DIRECTORY_LIB)
3RD_LIB_PATH = $(CJSON_DIRECTORY_LIB) $(CGROUP_DIRECTORY_LIB) $(SSL_DIRECTORY_LIB) $(DCC_ALL_LIBS) $(PGPORT_HOME) $(SECURE_DIRECTORY_LIB)
# some objs
DCC_LIBS = dcc gstor dcf cjson zstd lz4 ssl crypto
ETCD_LIBS = clientv3
ifeq ($(ENABLE_ETCD), ON)
3RD_LIB_PATH += $(ETCD_DIRECTORY_LIB)
COMM_INC += $(ETCD_DIRECTORY_INC)
endif
ifeq ($(ENABLE_MEMCHECK), ON)
MEMCHECK_HOME = $(3RD_DEPENDENCY_ROOT)/memcheck/debug
MEMCHECK_LIB_PATH = $(MEMCHECK_HOME)/gcc$(GCC_VERSION)/lib
MEMCHECK_FLAGS = -fsanitize=address -fsanitize=leak -fno-omit-frame-pointer
MEMCHECK_LIBS = asan rt dl
MEMCHECK_LINK_DIRECTORIES = $(MEMCHECK_LIB_PATH)
SECURE_OPTIONS += -fstack-protector
COMPILE_OPTIONS += $(MEMCHECK_FLAGS)
endif
ifeq ($(ENABLE_GCOV), ON)
$(info add coverage dependencies.)
GCOV_FLAGS = -fprofile-arcs -ftest-coverage
GCOV_LIBS = gcov
LIBS += -l$(GCOV_LIBS)
COMPILE_OPTIONS += $(GCOV_FLAGS)
COMPILE_MACRO += -DENABLE_GCOV
endif
ifeq ($(ENABLE_HOTPATCH), ON)
ifneq (x$(RET_ARM_HOTPATCH), x)
ifeq ($(BUILD_TYPE), Debug)
HOTPATCH_ATOMIC_LDS = -Wl,-T$(3RD_HOTPATCH_TOOL)/atomic_debug.lds
else
HOTPATCH_ATOMIC_LDS = -Wl,-T$(3RD_HOTPATCH_TOOL)/atomic.lds
endif
endif
endif
G_BIN_EXT_LIBS = $(MEMCHECK_LIBS)
G_COMPILE_OPTIONS = $(OS_OPTIONS) $(CM_COMMON_FLAGS) $(OPTIMIZE_LEVEL) $(SECURE_OPTIONS) $(PROTECT_OPTIONS) $(WARNING_OPTIONS) $(OPTIMIZE_OPTIONS) $(CHECK_OPTIONS)
G_LINK_OPTIONS = $(CM_COMMON_FLAGS) $(SECURE_LINK_OPTS)
# secure opt
SKIP_RPATH = TRUE
COMPILE_OPTIONS += $(G_COMPILE_OPTIONS)
CXXFLAGS += $(COMPILE_OPTIONS)
CXXFLAGS += $(G_LINK_OPTIONS)
LDFLAGS += $(addprefix -L,$(3RD_LIB_PATH))
LDFLAGS += -L$(CM_COMMON_PATH)
LDFLAGS += -L$(CM_ADAPTER_PATH)/cm_dcc_adapter -L$(CM_ADAPTER_PATH)/cm_ddb_adapter -L$(CM_ADAPTER_PATH)/cm_etcd_adapter -L$(CM_ADAPTER_PATH)/cm_etcdapi
LDFLAGS += -L$(CM_LIB_PATH)/config -L$(CM_LIB_PATH)/alarm -L$(CM_LIB_PATH)/alarm -L$(CM_LIB_PATH)/hotpatch/client
LDFLAGS += -L$(CM_COMMUNICATION_PATH)/cm_feconnect -L$(CM_COMMUNICATION_PATH)/cm_libpq -L$(CM_COMMUNICATION_PATH)/cm_protocol
# libpq must need krb5
ifneq ($(ENABLE_KRB)_$(ENABLE_LIBPQ), OFF_OFF)
KRB_LIBS = gssapi_krb5_gauss krb5_gauss k5crypto_gauss com_err_gauss krb5support_gauss
LDFLAGS += -L$(KRB_HOME)/lib
COMM_INC += $(KRB_HOME)/include
ifeq ($(ENABLE_KRB), ON)
COMPILE_MACRO += -DKRB5
endif
endif
ifeq ($(ENABLE_LIBPQ), ON)
COMM_INC += $(PROJECT_SOURCE_DIR)/src/include/cm/cm_agent/clients/libpq
endif
CXXFLAGS += $(COMPILE_MACRO) -DDEF_CM_VERSION="\"$(CM_VERSION_STR)\""
CPPFLAGS += $(addprefix -I,$(COMM_INC))
# 3rd things that we needed:
##########################################################################
# Recursive make support
##########################################################################
# ----------------------
# Instead of recursing through subdirectories with a for loop or
# repeated $(MAKE) -C whatever calls, this is a little smarter: it
# allows parallel make across directories and lets make -k and -q work
# correctly.
# We need the $(eval) function and order-only prerequisites, which are
# available in GNU make 3.80. That also happens to be the version
# where the .VARIABLES variable was introduced, so this is a simple check.
ifndef .VARIABLES
$(error GNU make 3.80 or newer is required. You are using version $(MAKE_VERSION))
endif
# This function is only for internal use below. It should be called
# using $(eval). It will set up a target so that it recurses into
# a given subdirectory. Note that to avoid a nasty bug in make 3.80,
# this function has to avoid using any complicated constructs (like
# multiple targets on a line) and also not contain any lines that expand
# to more than about 200 bytes. This is why we make it apply to just one
# subdirectory at a time, rather than to a list of subdirectories.
# $1: target name, e.g., all
# $2: subdir name
# $3: target to run in subdir, usually same as $1
standard_targets = all install installdirs uninstall distprep clean distclean maintainer-clean coverage check installcheck maintainer-check 2pccheck
define _create_recursive_target
.PHONY: $(1)-$(2)-recurse
$(1): $(1)-$(2)-recurse
$(1)-$(2)-recurse:
$$(MAKE) -C $(2) $(3)
endef
# Note that the use of $$ on the last line above is important; we want
# $(MAKE) to be evaluated when the rule is run, not when the $(eval) is run
# to create the rule. This is necessary to get make -q working.
# Call this function in a makefile that needs to recurse into subdirectories.
# In the normal case all arguments can be defaulted.
# $1: targets to make recursive (defaults to list of standard targets)
# $2: list of subdirs (defaults to SUBDIRS variable)
# $3: target to run in subdir (defaults to current element of $1)
recurse = $(foreach target,$(if $1,$1,$(standard_targets)),$(foreach subdir,$(if $2,$2,$(SUBDIRS)),$(eval $(call _create_recursive_target,$(target),$(subdir),$(if $3,$3,$(target))))))
# If a makefile's list of SUBDIRS varies depending on configuration, then
# any subdirectories excluded from SUBDIRS should instead be added to
# ALWAYS_SUBDIRS, and then it must call recurse_always as well as recurse.
# This ensures that distprep, distclean, etc will apply to all subdirectories.
# In the normal case all arguments will be defaulted.
# $1: targets to make recursive (defaults to standard_always_targets)
# $2: list of subdirs (defaults to ALWAYS_SUBDIRS variable)
# $3: target to run in subdir (defaults to current element of $1)
recurse_always = $(foreach target,$(if $1,$1,$(standard_always_targets)),$(foreach subdir,$(if $2,$2,$(ALWAYS_SUBDIRS)),$(eval $(call _create_recursive_target,$(target),$(subdir),$(if $3,$3,$(target))))))