#
#//===----------------------------------------------------------------------===//
#//
#//                     The LLVM Compiler Infrastructure
#//
#// This file is dual licensed under the MIT and the University of Illinois Open
#// Source Licenses. See LICENSE.txt for details.
#//
#//===----------------------------------------------------------------------===//
#

# void append_definitions(string new_flag);
# - appends new_flag to cpp_flags list
macro(append_definitions new_flag)
    list(APPEND local_cpp_flags "${new_flag}")
endmacro()

function(append_cpp_flags input_cpp_flags)
    set(local_cpp_flags)

    append_definitions("-D USE_ITT_BUILD")
    append_definitions("-D KMP_ARCH_STR=\"\\\\\"${legal_arch}\\\\\"\"")
    append_definitions("-D BUILD_I8")
    append_definitions("-D KMP_LIBRARY_FILE=\\\\\"${lib_file}\\\\\"") # yes... you need 5 backslashes...
    append_definitions("-D KMP_VERSION_MAJOR=${version}")
    
    # customize to 128 bytes for ppc64
    if(${PPC64})
    	append_definitions("-D CACHE_LINE=128")
    else()
    	append_definitions("-D CACHE_LINE=64")
    endif()
    
    append_definitions("-D KMP_ADJUST_BLOCKTIME=1")
    append_definitions("-D BUILD_PARALLEL_ORDERED")
    append_definitions("-D KMP_ASM_INTRINS")
    if(${USE_ITT_NOTIFY})
        append_definitions("-D USE_ITT_NOTIFY=1")
    else()
        append_definitions("-D USE_ITT_NOTIFY=0")
        append_definitions("-D INTEL_NO_ITTNOTIFY_API")
    endif()
    append_definitions("-D INTEL_ITTNOTIFY_PREFIX=__kmp_itt_")

    if(${USE_VERSION_SYMBOLS})
        append_definitions("-D KMP_USE_VERSION_SYMBOLS")
    endif()

    #####################
    # Windows definitions
    if(${WINDOWS})
        append_definitions("-D _CRT_SECURE_NO_WARNINGS")
        append_definitions("-D _CRT_SECURE_NO_DEPRECATE")
        append_definitions("-D _WINDOWS")
        append_definitions("-D _WINNT")
        append_definitions("-D _WIN32_WINNT=0x0501")
        append_definitions("-D KMP_WIN_CDECL")
        append_definitions("-D _USRDLL")
        if(${DEBUG_BUILD})
            append_definitions("-D _ITERATOR_DEBUG_LEVEL=0")
        endif()
    else() # Other than windows... (Unix based systems, Intel(R) Many Integrated Core Architecture (Intel(R) MIC Architecture), and Mac)
        append_definitions("-D _GNU_SOURCE")
        append_definitions("-D _REENTRANT")
        append_definitions("-D BUILD_TV")
        append_definitions("-D USE_CBLKDATA")
        if(NOT "${version}" STREQUAL "4")
            append_definitions("-D KMP_GOMP_COMPAT")
        endif()
    endif()

    #######################################
    # Intel(R) MIC Architecture definitions
    if(${MIC})
        append_definitions("-D KMP_TDATA_GTID")
    else() # Other than Intel(R) MIC Architecture...
        append_definitions("-D USE_LOAD_BALANCE")
    endif()

    ##################
    # Unix definitions
    if(${LINUX})
        append_definitions("-D KMP_TDATA_GTID")
    endif()

    ##################################
    # Other conditional definitions
    append_definitions("-D KMP_USE_ASSERT")
    append_definitions("-D GUIDEDLL_EXPORTS") 
    if(${STUBS_LIBRARY}) 
        append_definitions("-D KMP_STUB") 
    endif()
    if(${DEBUG_BUILD} OR ${RELWITHDEBINFO_BUILD}) 
        append_definitions("-D KMP_DEBUG") 
    endif()
    if(${DEBUG_BUILD})
        append_definitions("-D _DEBUG")
        append_definitions("-D BUILD_DEBUG")
    endif()
    if(${STATS_GATHERING})
        append_definitions("-D KMP_STATS_ENABLED=1")
    else()
        append_definitions("-D KMP_STATS_ENABLED=0")
    endif()

    # OpenMP version flags
    set(have_omp_50 0)
    set(have_omp_41 0)
    set(have_omp_40 0)
    set(have_omp_30 0)
    if(${omp_version} EQUAL 50 OR ${omp_version} GREATER 50)
        set(have_omp_50 1)
    endif()
    if(${omp_version} EQUAL 41 OR ${omp_version} GREATER 41)
        set(have_omp_41 1)
    endif()
    if(${omp_version} EQUAL 40 OR ${omp_version} GREATER 40)
        set(have_omp_40 1)
    endif()
    if(${omp_version} EQUAL 30 OR ${omp_version} GREATER 30)
        set(have_omp_30 1)
    endif()
    append_definitions("-D OMP_50_ENABLED=${have_omp_50}")
    append_definitions("-D OMP_41_ENABLED=${have_omp_41}")
    append_definitions("-D OMP_40_ENABLED=${have_omp_40}")
    append_definitions("-D OMP_30_ENABLED=${have_omp_30}")

    # Architectural definitions
    if(${INTEL64} OR ${IA32})
        if(${USE_ADAPTIVE_LOCKS})
            append_definitions("-D KMP_USE_ADAPTIVE_LOCKS=1")
        else()
            append_definitions("-D KMP_USE_ADAPTIVE_LOCKS=0")
        endif()
        append_definitions("-D KMP_DEBUG_ADAPTIVE_LOCKS=0")
    else()
        append_definitions("-D KMP_USE_ADAPTIVE_LOCKS=0")
        append_definitions("-D KMP_DEBUG_ADAPTIVE_LOCKS=0")
    endif()
    if(${USE_INTERNODE_ALIGNMENT})
        append_definitions("-D KMP_USE_INTERNODE_ALIGNMENT=1")
    else()
        append_definitions("-D KMP_USE_INTERNODE_ALIGNMENT=0")
    endif()
    set(${input_cpp_flags} "${${input_cpp_flags}}" "${local_cpp_flags}" "${USER_CPP_FLAGS}" "$ENV{CPPFLAGS}" PARENT_SCOPE)
endfunction()

