# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

# Check if the target architecture and compiler supports some special
# instruction sets that would boost performance.
include(CheckCXXCompilerFlag)
# Get cpu architecture

message(STATUS "System processor: ${CMAKE_SYSTEM_PROCESSOR}")

include("${CMAKE_CURRENT_LIST_DIR}/TargetArchitecture.cmake")
message(STATUS "Target processor: ${PAIMON_TARGET_PROCESSOR} "
               "(CPU family: ${PAIMON_TARGET_CPU_FAMILY})")

# Probe the architecture specific tuning flags. x86 deliberately gets none of its
# own, so there is nothing to probe there: the baseline stays whatever the
# toolchain defaults to, and no persisted value depends on it; see
# src/paimon/common/utils/crc32c.h.
if(PAIMON_TARGET_CPU_FAMILY STREQUAL "aarch64" AND NOT "${PAIMON_AARCH64_MARCH}" STREQUAL
                                                   "")
    set(PAIMON_AARCH64_MARCH_FLAG "-march=${PAIMON_AARCH64_MARCH}")
    # check_cxx_compiler_flag() caches under a fixed name, so a reconfigure in the
    # same build directory would otherwise reuse the old PAIMON_AARCH64_MARCH verdict.
    if(NOT "${PAIMON_AARCH64_MARCH_FLAG}" STREQUAL "${PAIMON_PROBED_AARCH64_MARCH_FLAG}")
        unset(CXX_SUPPORTS_AARCH64_MARCH CACHE)
        set(PAIMON_PROBED_AARCH64_MARCH_FLAG
            "${PAIMON_AARCH64_MARCH_FLAG}"
            CACHE INTERNAL "Arm64 arch flag that CXX_SUPPORTS_AARCH64_MARCH refers to")
    endif()
    check_cxx_compiler_flag("${PAIMON_AARCH64_MARCH_FLAG}" CXX_SUPPORTS_AARCH64_MARCH)
endif()

# Support C11
if(NOT DEFINED CMAKE_C_STANDARD)
    set(CMAKE_C_STANDARD 11)
endif()

# This ensures that things like c++11 get passed correctly
if(NOT DEFINED CMAKE_CXX_STANDARD)
    set(CMAKE_CXX_STANDARD 17)
endif()

# We require a C++11 compliant compiler
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_CXX_EXTENSIONS OFF)

# Build with -fPIC so that can static link our libraries into other people's
# shared libraries
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE)

set(UNKNOWN_COMPILER_MESSAGE
    "Unknown compiler: ${CMAKE_CXX_COMPILER_VERSION} ${CMAKE_CXX_COMPILER_VERSION}")

# Defaults BUILD_WARNING_LEVEL to `CHECKIN`, unless CMAKE_BUILD_TYPE is
# `RELEASE`, then it will default to `PRODUCTION`. The goal of defaulting to
# `CHECKIN` is to avoid friction with long response time from CI.
if(NOT BUILD_WARNING_LEVEL)
    if("${CMAKE_BUILD_TYPE}" STREQUAL "RELEASE")
        set(BUILD_WARNING_LEVEL PRODUCTION)
    else()
        set(BUILD_WARNING_LEVEL CHECKIN)
    endif()
endif(NOT BUILD_WARNING_LEVEL)
string(TOUPPER ${BUILD_WARNING_LEVEL} BUILD_WARNING_LEVEL)

message(STATUS "Paimon build warning level: ${BUILD_WARNING_LEVEL}")

set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Werror")

if("${BUILD_WARNING_LEVEL}" STREQUAL "CHECKIN")
    # Pre-checkin builds
    if(MSVC)
        # https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warnings-by-compiler-version
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /W3")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /wd4365")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /wd4267")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /wd4838")
    elseif(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID STREQUAL
                                                          "Clang")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wall")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wextra")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wdocumentation")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wglobal-constructors")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-missing-braces")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-unused-parameter")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-unknown-warning-option")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-constant-logical-operand")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-deprecated-declarations")
    elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wall")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-conversion")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-deprecated-declarations")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-sign-conversion")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-unused-variable")
    else()
        message(FATAL_ERROR "${UNKNOWN_COMPILER_MESSAGE}")
    endif()

elseif("${BUILD_WARNING_LEVEL}" STREQUAL "EVERYTHING")
    # Pedantic builds for fixing warnings
    if(MSVC)
        string(REPLACE "/W3" "" CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS}")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /Wall")
        # https://docs.microsoft.com/en-us/cpp/build/reference/compiler-option-warning-level
        # /wdnnnn disables a warning where "nnnn" is a warning number
    elseif(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID STREQUAL
                                                          "Clang")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Weverything")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-c++98-compat")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-c++98-compat-pedantic")
    elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wall")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wpedantic")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wextra")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-unused-parameter")
    else()
        message(FATAL_ERROR "${UNKNOWN_COMPILER_MESSAGE}")
    endif()

else()
    # Production builds (warning are not treated as errors)
    if(MSVC)
        # https://docs.microsoft.com/en-us/cpp/build/reference/compiler-option-warning-level
        # TODO: Enable /Wall and disable individual warnings until build compiles without errors
        # /wdnnnn disables a warning where "nnnn" is a warning number
        string(REPLACE "/W3" "" CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS}")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /W3")
    elseif(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang"
           OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang"
           OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wall")
    else()
        message(FATAL_ERROR "${UNKNOWN_COMPILER_MESSAGE}")
    endif()

endif()

if(MSVC)
    # Disable annoying "performance warning" about int-to-bool conversion
    set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /wd4800")

    # Disable unchecked iterator warnings, equivalent to /D_SCL_SECURE_NO_WARNINGS
    set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /wd4996")

    # Disable "switch statement contains 'default' but no 'case' labels" warning
    # (required for protobuf, see https://github.com/protocolbuffers/protobuf/issues/6885)
    set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /wd4065")
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
    if(CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL "7.0" OR CMAKE_CXX_COMPILER_VERSION
                                                         VERSION_GREATER "7.0")
        # Without this, gcc >= 7 warns related to changes in C++17
        set(CXX_ONLY_FLAGS
            "${CXX_ONLY_FLAGS} -Wno-noexcept-type -Wno-stringop-overflow -Wno-free-nonheap-object"
        )
    endif()

    if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "4.9")
        # Add colors when paired with ninja
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color=always")
    endif()

    if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "6.0")
        # Work around https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43407
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-attributes")
    endif()

    if(CMAKE_UNITY_BUILD)
        # Work around issue similar to https://bugs.webkit.org/show_bug.cgi?id=176869
        set(CXX_ONLY_FLAGS "${CXX_ONLY_FLAGS} -Wno-subobject-linkage")
    endif()

    if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "8.0"
       AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "9.0")
        # When using the C++17 filesystem library (<filesystem>) with GCC 8, you do need to explicitly link stdc++fs.
        link_libraries(stdc++fs)
    endif()

elseif(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID STREQUAL
                                                      "Clang")
    # Clang options for all builds

    # Using Clang with ccache causes a bunch of spurious warnings that are
    # purportedly fixed in the next version of ccache. See the following for details:
    #
    #   http://petereisentraut.blogspot.com/2011/05/ccache-and-clang.html
    #   http://petereisentraut.blogspot.com/2011/09/ccache-and-clang-part-2.html
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Qunused-arguments")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Qunused-arguments")

    # Avoid clang error when an unknown warning flag is passed
    set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-unknown-warning-option")
    # Add colors when paired with ninja
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcolor-diagnostics")

    # Don't complain about optimization passes that were not possible
    set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-pass-failed")
    set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-deprecated-declarations")

    if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
        # Depending on the default OSX_DEPLOYMENT_TARGET (< 10.9), libstdc++ may be
        # the default standard library which does not support C++11. libc++ is the
        # default from 10.9 onward.
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -stdlib=libc++")
    elseif(APPLE AND PAIMON_USE_APPLE_LIBCXX_WITH_CLANG)
        execute_process(COMMAND xcrun --show-sdk-path
                        OUTPUT_VARIABLE PAIMON_MACOS_SDK_PATH
                        OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
        if(NOT PAIMON_MACOS_SDK_PATH)
            message(FATAL_ERROR "PAIMON_USE_APPLE_LIBCXX_WITH_CLANG is enabled, but xcrun could not find the macOS SDK"
            )
        endif()
        set(PAIMON_MACOS_LIBCXX_INCLUDE_DIR "${PAIMON_MACOS_SDK_PATH}/usr/include/c++/v1")
        if(NOT EXISTS "${PAIMON_MACOS_LIBCXX_INCLUDE_DIR}/cstdlib")
            message(FATAL_ERROR "PAIMON_USE_APPLE_LIBCXX_WITH_CLANG is enabled, but libc++ headers were not found at ${PAIMON_MACOS_LIBCXX_INCLUDE_DIR}"
            )
        endif()
        message(STATUS "Using Apple libc++ headers with Clang: ${PAIMON_MACOS_LIBCXX_INCLUDE_DIR}"
        )
        set(CMAKE_CXX_FLAGS
            "${CMAKE_CXX_FLAGS} -nostdinc++ -isystem ${PAIMON_MACOS_LIBCXX_INCLUDE_DIR} -include cstdlib"
        )
    endif()
endif()

# if build warning flags is set, add to CXX_COMMON_FLAGS
if(BUILD_WARNING_FLAGS)
    # Use BUILD_WARNING_FLAGS with BUILD_WARNING_LEVEL=everything to disable
    # warnings (use with Clang's -Weverything flag to find potential errors)
    set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} ${BUILD_WARNING_FLAGS}")
endif(BUILD_WARNING_FLAGS)

# Only enable additional instruction sets if they are supported
if(PAIMON_TARGET_CPU_FAMILY STREQUAL "aarch64")
    if("${PAIMON_AARCH64_MARCH}" STREQUAL "")
        # An explicitly empty PAIMON_AARCH64_MARCH opts out of -march entirely, for
        # toolchains that reject the flag, such as AppleClang targeting arm64.
        message(STATUS "PAIMON_AARCH64_MARCH is empty: passing no -march flag")
    else()
        if(NOT CXX_SUPPORTS_AARCH64_MARCH)
            message(FATAL_ERROR "The compiler does not accept ${PAIMON_AARCH64_MARCH_FLAG}. "
                                "Set -DPAIMON_AARCH64_MARCH to a value it accepts, or to an "
                                "empty string to pass no -march flag.")
        endif()
        if(PAIMON_AARCH64_MARCH_FLAG MATCHES "native")
            message(FATAL_ERROR "native arch not allowed, please specify arch explicitly."
            )
        endif()
        set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} ${PAIMON_AARCH64_MARCH_FLAG}")
    endif()
endif()

# ----------------------------------------------------------------------
# Setup Gold linker, if available. Code originally from Apache Kudu

# Interrogates the linker version via the C++ compiler to determine whether
# we're using the gold linker, and if so, extracts its version.
#
# If the gold linker is being used, sets GOLD_VERSION in the parent scope with
# the extracted version.
#
# Any additional arguments are passed verbatim into the C++ compiler invocation.
function(GET_GOLD_VERSION)
    # The gold linker is only for ELF binaries, which macOS doesn't use.
    execute_process(COMMAND ${CMAKE_CXX_COMPILER} "-Wl,--version" ${ARGN}
                    ERROR_QUIET
                    OUTPUT_VARIABLE LINKER_OUTPUT)
    # We're expecting LINKER_OUTPUT to look like one of these:
    #   GNU gold (version 2.24) 1.11
    #   GNU gold (GNU Binutils for Ubuntu 2.30) 1.15
    if(LINKER_OUTPUT MATCHES "GNU gold")
        string(REGEX MATCH "GNU gold \\([^\\)]*\\) (([0-9]+\\.?)+)" _ "${LINKER_OUTPUT}")
        if(NOT CMAKE_MATCH_1)
            message(SEND_ERROR "Could not extract GNU gold version. "
                               "Linker version output: ${LINKER_OUTPUT}")
        endif()
        set(GOLD_VERSION
            "${CMAKE_MATCH_1}"
            PARENT_SCOPE)
    endif()
endfunction()

# Is the compiler hard-wired to use the gold linker?
if(NOT WIN32 AND NOT APPLE)
    get_gold_version()
    if(GOLD_VERSION)
        set(MUST_USE_GOLD 1)
    elseif(PAIMON_USE_LD_GOLD)
        # Can the compiler optionally enable the gold linker?
        get_gold_version("-fuse-ld=gold")

        # We can't use the gold linker if it's inside devtoolset because the compiler
        # won't find it when invoked directly from make/ninja (which is typically
        # done outside devtoolset).
        execute_process(COMMAND which ld.gold
                        OUTPUT_VARIABLE GOLD_LOCATION
                        OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
        if("${GOLD_LOCATION}" MATCHES "^/opt/rh/devtoolset")
            message("Skipping optional gold linker (version ${GOLD_VERSION}) because "
                    "it's in devtoolset")
            set(GOLD_VERSION)
        endif()
    endif()

    if(GOLD_VERSION)
        # Older versions of the gold linker are vulnerable to a bug [1] which
        # prevents weak symbols from being overridden properly. This leads to
        # omitting of dependencies like tcmalloc (used in Kudu, where this
        # workaround was written originally)
        #
        # How we handle this situation depends on other factors:
        # - If gold is optional, we won't use it.
        # - If gold is required, we'll either:
        #   - Raise an error in RELEASE builds (we shouldn't release such a product), or
        #   - Drop tcmalloc in all other builds.
        #
        # 1. https://sourceware.org/bugzilla/show_bug.cgi?id=16979.
        if("${GOLD_VERSION}" VERSION_LESS "1.12")
            set(PAIMON_BUGGY_GOLD 1)
        endif()
        if(MUST_USE_GOLD)
            message("Using hard-wired gold linker (version ${GOLD_VERSION})")
            if(PAIMON_BUGGY_GOLD)
                if("${PAIMON_LINK}" STREQUAL "d" AND "${CMAKE_BUILD_TYPE}" STREQUAL
                                                     "RELEASE")
                    message(SEND_ERROR "Configured to use buggy gold with dynamic linking "
                                       "in a RELEASE build")
                endif()
            endif()
        elseif(NOT PAIMON_BUGGY_GOLD)
            # The Gold linker must be manually enabled.
            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fuse-ld=gold")
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fuse-ld=gold")
            message("Using optional gold linker (version ${GOLD_VERSION})")
        else()
            message("Optional gold linker is buggy, using ld linker instead")
        endif()
    else()
        message("Using ld linker")
    endif()
endif()

# compiler flags for different build types (run 'cmake -DCMAKE_BUILD_TYPE=<type> .')
# For all builds:
# For CMAKE_BUILD_TYPE=Debug
#   -ggdb: Enable gdb debugging
# For CMAKE_BUILD_TYPE=FastDebug
#   Same as DEBUG, except with some optimizations on.
# For CMAKE_BUILD_TYPE=Release
#   -O3: Enable all compiler optimizations
#   Debug symbols are stripped for reduced binary size. Add
#   -DPAIMON_CXXFLAGS="-g" to add them
if(NOT MSVC)
    if(PAIMON_GGDB_DEBUG)
        set(PAIMON_DEBUG_SYMBOL_TYPE "gdb")
        set(C_FLAGS_DEBUG "-g${PAIMON_DEBUG_SYMBOL_TYPE} -O0")
        set(C_FLAGS_FASTDEBUG "-g${PAIMON_DEBUG_SYMBOL_TYPE} -O1")
        set(CXX_FLAGS_DEBUG "-g${PAIMON_DEBUG_SYMBOL_TYPE} -O0")
        set(CXX_FLAGS_FASTDEBUG "-g${PAIMON_DEBUG_SYMBOL_TYPE} -O1")
    else()
        set(C_FLAGS_DEBUG "-g -O0")
        set(C_FLAGS_FASTDEBUG "-g -O1")
        set(CXX_FLAGS_DEBUG "-g -O0")
        set(CXX_FLAGS_FASTDEBUG "-g -O1")
    endif()

    set(C_FLAGS_RELEASE "-O3 -DNDEBUG")
    set(CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
endif()

set(C_FLAGS_PROFILE_GEN "${CXX_FLAGS_RELEASE} -fprofile-generate")
set(C_FLAGS_PROFILE_BUILD "${CXX_FLAGS_RELEASE} -fprofile-use")
set(CXX_FLAGS_PROFILE_GEN "${CXX_FLAGS_RELEASE} -fprofile-generate")
set(CXX_FLAGS_PROFILE_BUILD "${CXX_FLAGS_RELEASE} -fprofile-use")

# Set compile flags based on the build type.
message("Configured for ${CMAKE_BUILD_TYPE} build (set with cmake -DCMAKE_BUILD_TYPE={release,debug,...})"
)
if("${CMAKE_BUILD_TYPE}" STREQUAL "DEBUG")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${C_FLAGS_DEBUG}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_FLAGS_DEBUG}")
elseif("${CMAKE_BUILD_TYPE}" STREQUAL "RELWITHDEBINFO")

elseif("${CMAKE_BUILD_TYPE}" STREQUAL "FASTDEBUG")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${C_FLAGS_FASTDEBUG}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_FLAGS_FASTDEBUG}")
elseif("${CMAKE_BUILD_TYPE}" STREQUAL "RELEASE")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${C_FLAGS_RELEASE}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_FLAGS_RELEASE}")
elseif("${CMAKE_BUILD_TYPE}" STREQUAL "PROFILE_GEN")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${C_FLAGS_PROFILE_GEN}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_FLAGS_PROFILE_GEN}")
elseif("${CMAKE_BUILD_TYPE}" STREQUAL "PROFILE_BUILD")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${C_FLAGS_PROFILE_BUILD}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_FLAGS_PROFILE_BUILD}")
else()
    message(FATAL_ERROR "Unknown build type: ${CMAKE_BUILD_TYPE}")
endif()

if("${CMAKE_CXX_FLAGS}" MATCHES "-DNDEBUG")
    set(PAIMON_DEFINITION_FLAGS "-DNDEBUG")
else()
    set(PAIMON_DEFINITION_FLAGS "")
endif()

message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}")

# ----------------------------------------------------------------------
# MSVC-specific linker options

if(MSVC)
    set(MSVC_LINKER_FLAGS)
    if(MSVC_LINK_VERBOSE)
        set(MSVC_LINKER_FLAGS "${MSVC_LINKER_FLAGS} /VERBOSE:LIB")
    endif()
    if(NOT PAIMON_USE_STATIC_CRT)
        set(MSVC_LINKER_FLAGS "${MSVC_LINKER_FLAGS} /NODEFAULTLIB:LIBCMT")
        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${MSVC_LINKER_FLAGS}")
        set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${MSVC_LINKER_FLAGS}")
        set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${MSVC_LINKER_FLAGS}")
    endif()
endif()
