#ifndef _HEADER_MGB_BUILD_CONFIG
#define _HEADER_MGB_BUILD_CONFIG

#cmakedefine01 MGB_CUDA
#cmakedefine01 MGB_ROCM
#cmakedefine01 MGB_CAMBRICON
#cmakedefine01 MGB_ATLAS
#cmakedefine01 MGB_ASSERT_LOC
#cmakedefine01 MGB_ENABLE_DEBUG_UTIL
#cmakedefine01 MGB_ENABLE_LOGGING
#cmakedefine01 MGB_ENABLE_GRAD
#cmakedefine01 MGB_ENABLE_CPUINFO
#cmakedefine01 MGB_ENABLE_DOT
#cmakedefine01 MGB_VERBOSE_TYPEINFO_NAME
#cmakedefine01 MGB_BUILD_SLIM_SERVING
#cmakedefine01 MGB_ENABLE_EXCEPTION
#cmakedefine01 MGB_JIT
#cmakedefine01 MGB_JIT_MLIR
#cmakedefine01 MGB_JIT_HALIDE
#cmakedefine01 MGB_ENABLE_TENSOR_RT
#cmakedefine01 MGB_ENABLE_JSON
#cmakedefine01 MGB_HAVE_THREAD
#cmakedefine01 MGB_ENABLE_OPR_MM
#cmakedefine01 MGB_ENABLE_FBS_SERIALIZATION
#cmakedefine01 MGB_IS_DEV
#cmakedefine01 MGB_CUSTOM_OP
#cmakedefine01 MGB_CUPTI
// DNN related flags
// Platform macro's
#cmakedefine01 MEGDNN_WITH_CUDA

#cmakedefine01 MEGDNN_WITH_ROCM
#cmakedefine01 MEGDNN_ARMV7
#cmakedefine01 MEGDNN_AARCH64
#cmakedefine01 MEGDNN_ENABLE_FP16_NEON

#cmakedefine01 MEGDNN_X86_WITH_MKL
#cmakedefine01 MEGDNN_X86_WITH_OPENBLAS
#cmakedefine01 MEGDNN_X86_WITH_MKL_DNN
#cmakedefine01 MEGDNN_ENABLE_RTTI
#cmakedefine01 MEGDNN_ENABLE_LOGGING
#cmakedefine01 MEGDNN_ENABLE_MANGLING
#cmakedefine01 MEGDNN_ENABLE_EXCEPTIONS
#cmakedefine01 MEGDNN_NAIVE
#cmakedefine01 MEGDNN_X86
#cmakedefine01 MEGDNN_X86_64
#cmakedefine01 MEGDNN_64_BIT
#cmakedefine01 MEGDNN_THREADS_512
#cmakedefine01 MEGDNN_ENABLE_MULTI_THREADS
#cmakedefine01 MEGDNN_WITH_BENCHMARK

// whether atlas is available
#ifndef MGB_ATLAS
#define MGB_ATLAS 0
#endif

// whether cuda is available
#ifndef MGB_CUDA
#define MGB_CUDA 1
#endif

// whether to include file/line location for assert message
#ifndef MGB_ASSERT_LOC
#define MGB_ASSERT_LOC 1
#endif

// whether to enable utils/debug.h and other debug methods
#ifndef MGB_ENABLE_DEBUG_UTIL
#define MGB_ENABLE_DEBUG_UTIL 1
#endif

// whether to enable logging
#ifndef MGB_ENABLE_LOGGING
#define MGB_ENABLE_LOGGING 1
#endif

// whether to enable registering opr grad functions
#ifndef MGB_ENABLE_GRAD
#define MGB_ENABLE_GRAD 1
#endif

// whether to enable cpuinfo
#ifndef MGB_ENABLE_CPUINFO
#define MGB_ENABLE_CPUINFO 1
#endif

//! use one MACRO indicate enable_arm_dotprod
#if __ARM_FEATURE_DOTPROD
#ifdef MGB_ENABLE_DOT
#undef MGB_ENABLE_DOT
#endif
#define MGB_ENABLE_DOT 1
#endif

//! ENABLE MGB DOT should enable CPUINFO
#if MGB_ENABLE_DOT
#if !defined(MGB_ENABLE_CPUINFO) || !MGB_ENABLE_CPUINFO
#ifdef MGB_ENABLE_CPUINFO
#undef MGB_ENABLE_CPUINFO
#endif
#define MGB_ENABLE_CPUINFO 1
#endif
#endif

//! IOS disabled cpuinfo and dotprod, cpuinfo has some problem on ios
#ifdef IOS
#undef MGB_ENABLE_CPUINFO
#define MGB_ENABLE_CPUINFO 0
#undef MGB_ENABLE_DOT
#endif

// whether to include actual class name in mgb::Typeinfo object; if this is
// disabled, mgb::serialization::OprRegistry::find_opr_by_name would not work.
#ifndef MGB_VERBOSE_TYPEINFO_NAME
#define MGB_VERBOSE_TYPEINFO_NAME 1
#endif

// whether to enbale configuing megbrain internals through env vars
#ifndef MGB_ENABLE_GETENV
#define MGB_ENABLE_GETENV MGB_ASSERT_LOC
#endif

// whether to remove unnecessary features when used for serving
#ifndef MGB_BUILD_SLIM_SERVING
#define MGB_BUILD_SLIM_SERVING 0
#endif

// whether to enable exception
#ifndef MGB_ENABLE_EXCEPTION
#if __EXCEPTIONS
#define MGB_ENABLE_EXCEPTION 1
#else
#define MGB_ENABLE_EXCEPTION 0
#endif
#endif

// whether <thread> is available and usable
#ifndef MGB_HAVE_THREAD
#define MGB_HAVE_THREAD 1
#endif

// whether to trade thread safety for memory usage
#ifndef MGB_THREAD_SAFE
#define MGB_THREAD_SAFE MGB_HAVE_THREAD
#endif

// whether to enable JIT
#ifndef MGB_JIT
#define MGB_JIT 1
#endif
#ifndef MGB_JIT_HALIDE
#define MGB_JIT_HALIDE 0
#endif

#ifndef MGB_CUSTOM_OP
#define MGB_CUSTOM_OP 0
#endif

#ifndef MEGDNN_WITH_CAMBRICON
#define MEGDNN_WITH_CAMBRICON 0
#endif

#ifndef MGB_CAMBRICON
#define MGB_CAMBRICON MEGDNN_WITH_CAMBRICON
#endif

// whether to enable TensorRT support
#ifndef MGB_ENABLE_TENSOR_RT
#define MGB_ENABLE_TENSOR_RT MGB_CUDA
#endif

// whether to enable fastrun profile
#ifndef MGB_ENABLE_FASTRUN
#define MGB_ENABLE_FASTRUN 1
#endif

/* ================= following are more finegrind controls ================= */

// whether to enable json dumper
#ifndef MGB_ENABLE_JSON
#define MGB_ENABLE_JSON !MGB_BUILD_SLIM_SERVING
#endif

// whether to enable distributed communication
#ifndef MGB_ENABLE_OPR_MM
#define MGB_ENABLE_OPR_MM 0
#endif

/* ================= DNN related flags ================= */

// whether to use mkl lib
#ifndef MEGDNN_X86_WITH_MKL
#define MEGDNN_X86_WITH_MKL 0
#endif

// whether to enable rtti
#ifndef MEGDNN_ENABLE_RTTI
#define MEGDNN_ENABLE_RTTI 1
#endif

// whether to enable mangling
#ifndef MEGDNN_ENABLE_MANGLING
#define MEGDNN_ENABLE_MANGLING !MEGDNN_ENABLE_RTTI
#endif

// whether to enable logging
#ifndef MEGDNN_ENABLE_LOGGING
#define MEGDNN_ENABLE_LOGGING MGB_ENABLE_LOGGING
#endif

// whether to enable exception
#ifndef MEGDNN_ENABLE_EXCEPTIONS
#define MEGDNN_ENABLE_EXCEPTIONS MGB_ENABLE_EXCEPTION
#endif

// whether to build naive
#ifndef MEGDNN_NAIVE
#define MEGDNN_NAIVE 0
#endif

// whether to build x86
#ifndef MEGDNN_X86
#define MEGDNN_X86 0
#endif

// whether to use cuda thread 512
#ifndef MEGDNN_THREADS_512
#define MEGDNN_THREADS_512 0
#endif

// whether to enable intra-op multi threads
#ifndef MEGDNN_ENABLE_MULTI_THREADS
#define MEGDNN_ENABLE_MULTI_THREADS 1
#endif

#ifndef MEGDNN_X86_WITH_OPENBLAS
#define MEGDNN_X86_WITH_OPENBLAS 0
#endif

#ifndef MEGDNN_X86_WITH_MKL_DNN
#define MEGDNN_X86_WITH_MKL_DNN 0
#endif

#ifdef WIN32
#ifdef MGE_DLL_EXPORT
#define MGE_WIN_DECLSPEC_FUC  __declspec(dllexport)
#define MGE_WIN_DECLSPEC_DATA __declspec(dllexport)
#elif defined(MGE_WINDOWS_STATIC_LINK)
#define MGE_WIN_DECLSPEC_FUC
#define MGE_WIN_DECLSPEC_DATA
#else
#define MGE_WIN_DECLSPEC_FUC
#define MGE_WIN_DECLSPEC_DATA __declspec(dllimport)
#endif
#else
#define MGE_WIN_DECLSPEC_FUC
#define MGE_WIN_DECLSPEC_DATA
#endif

#ifndef MEGDNN_WITH_BENCHMARK
#define MEGDNN_WITH_BENCHMARK 0
#endif

#endif  // _HEADER_MGB_BUILD_CONFIG
