###############################################################################
###########      Generated by GRAPE Python SDK         ########################
###############################################################################

project(example C CXX)
cmake_minimum_required(VERSION 3.5)

option(CYTHON_PREGEL_APP "Whether to build cython pregel app." False)
option(CYTHON_PIE_APP "Whether to build cython pie app" False)
option(FLASH_APP "Whether to build flash app" False)
option(PROPERTY_GRAPH_FRAME "Whether to build property graph frame" False)
option(PROJECT_FRAME "Whether to build project frame" False)
option(ENABLE_PREGEL_COMBINE "Whether enable combinator in pregel app." False)
option(NETWORKX "networkx on?" ON)
option(ENABLE_JAVA_SDK "Build with support for java sdk" OFF)
option(WCC_USE_GID "Whether use gid as component id in wcc" OFF)

execute_process(COMMAND uname -m OUTPUT_VARIABLE SYSTEM_PROCESSOR)
string(REGEX REPLACE "\n$" "" SYSTEM_PROCESSOR "${SYSTEM_PROCESSOR}")

if (SYSTEM_PROCESSOR MATCHES "arm64")
    set(CMAKE_OSX_ARCHITECTURES "arm64")
endif()

set(DEFAULT_BUILD_TYPE "RelWithDebInfo")
if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
    message(STATUS "Setting build type to '${DEFAULT_BUILD_TYPE}' as none was specified.")
    set(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE STRING "Choose the type of build." FORCE)
    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
endif ()

if(NOT (CMAKE_CXX_COMPILER_LAUNCHER MATCHES "ccache") AND NOT (CMAKE_C_COMPILER_LAUNCHER MATCHES "ccache"))
    find_program(ccache_EXECUTABLE ccache)
    if(ccache_EXECUTABLE)
        set(CMAKE_C_COMPILER_LAUNCHER ${ccache_EXECUTABLE})
        set(CMAKE_CXX_COMPILER_LAUNCHER ${ccache_EXECUTABLE})
        add_custom_target(ccache-stats
            COMMAND ${ccache_EXECUTABLE} --show-stats
        )
    else()
        add_custom_target(ccache-stats
            COMMAND echo "ccache not found."
        )
    endif(ccache_EXECUTABLE)
endif()

if (NETWORKX)
    add_definitions(-DNETWORKX)
    add_definitions(-DRAPIDJSON_HAS_CXX11=1)
    add_definitions(-DRAPIDJSON_HAS_STDSTRING=1)
    add_definitions(-DRAPIDJSON_HAS_CXX11_RVALUE_REFS=1)
    add_definitions(-DRAPIDJSON_HAS_CXX11_RANGE_FOR=1)
endif ()

if (ENABLE_PREGEL_COMBINE)
    add_definitions(-D_ENABLE_COMBINE)
endif ()

if (WCC_USE_GID)
    add_definitions(-DWCC_USE_GID)
endif ()

include(CheckCXXCompilerFlag)
include(GNUInstallDirs)

include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++17" HAS_STDCXX_17)
if (HAS_STDCXX_17)
    set(CMAKE_CXX_STANDARD 17)
else()
    set(CMAKE_CXX_STANDARD 14)
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3 -g")
if (APPLE)
    set(CMAKE_MACOSX_RPATH ON)
else ()
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath,$ORIGIN")
endif ()

# Thread_NOT_FOUND
set(CMAKE_THREAD_LIBS_INIT "-lpthread")
set(CMAKE_HAVE_THREADS_LIBRARY 1)
set(CMAKE_USE_PTHREADS_INIT 1)
set(THREADS_PREFER_PTHREAD_FLAG ON)

check_cxx_compiler_flag(-Wno-deprecated-declarations W_NO_DEPRECATED_DECLARATIONS)
check_cxx_compiler_flag(-Wno-attributes W_NO_ATTRIBUTES)
check_cxx_compiler_flag(-Wno-sign-compare W_NO_SIGN_COMPARE)
check_cxx_compiler_flag(-Wno-class-memaccess W_NO_CLASS_MEMACCESS)
check_cxx_compiler_flag(-Wno-undef-prefix W_NO_UNDEF_PREFIX)
check_cxx_compiler_flag(-Wno-unused-result W_NO_UNUSED_RESULT)
check_cxx_compiler_flag(-Wno-unused-lambda-capture W_NO_UNUSED_LAMBDA_CAPTURE)
check_cxx_compiler_flag(-Wno-unused-but-set-variable W_NO_UNUSED_BUT_SET_VARIABLE)
check_cxx_compiler_flag(-Wno-unknown-pragmas W_NO_UNKNOWN_PRAGMAS)
check_cxx_compiler_flag(-Wno-stringop-overflow W_NO_STRINGOP_OVERFLOW)
check_cxx_compiler_flag(-Wno-unused-variable W_NO_UNUSED_VARIABLE)
check_cxx_compiler_flag(-Wno-redundant-move W_NO_REDUNDANT_MOVE)
check_cxx_compiler_flag(-mllvm=-lto-embed-bitcode SUPPORTS_LTO_EMBED_BITCODE)

if(W_NO_CLASS_MEMACCESS)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-class-memaccess")
endif()
if (W_NO_DEPRECATED_DECLARATIONS)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
endif()
if (W_NO_ATTRIBUTES)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-attributes")
endif()
if (W_NO_SIGN_COMPARE)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-sign-compare")
endif()
if (W_NO_UNDEF_PREFIX)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-undef-prefix")
endif()
if (W_NO_UNUSED_RESULT)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-result")
endif()
if (W_NO_UNUSED_LAMBDA_CAPTURE)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-lambda-capture")
endif()
if (W_NO_UNUSED_BUT_SET_VARIABLE)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-but-set-variable")
endif()
if (W_NO_UNKNOWN_PRAGMAS)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-pragmas")
endif()
if (W_NO_STRINGOP_OVERFLOW)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-stringop-overflow")
endif()
if (W_NO_UNUSED_VARIABLE)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-variable")
endif()
if(W_NO_REDUNDANT_MOVE)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-redundant-move")
endif()

# eliminate a lot of warnings for newer version of boost library.
add_compile_options(-DBOOST_BIND_GLOBAL_PLACEHOLDERS)

# set analytical engine home--------------------------------------------------
set(ANALYTICAL_ENGINE_HOME /usr/local)

# force load the config make if it exists
include("${ANALYTICAL_ENGINE_HOME}/${CMAKE_INSTALL_LIBDIR}/cmake/graphscope-analytical/graphscope-analytical-config.cmake" OPTIONAL)

# try to find headers from package first----------------------------------------
include_directories(${CMAKE_SOURCE_DIR})
include_directories("${ANALYTICAL_ENGINE_HOME}/openmpi/include"
                    "${ANALYTICAL_ENGINE_HOME}/open-mpi/include"
                    "${ANALYTICAL_ENGINE_HOME}/include"
                    "${ANALYTICAL_ENGINE_HOME}/include/vineyard"
                    "${ANALYTICAL_ENGINE_HOME}/include/vineyard/contrib"
                    "${ANALYTICAL_ENGINE_HOME}/include/graphscope"
                    "${ANALYTICAL_ENGINE_HOME}/include/graphscope/apps"
                    "${ANALYTICAL_ENGINE_HOME}/include/grape/analytical_apps")

# find Threads------------------------------------------------------------------
set(CMAKE_THREAD_PREFER_PTHREAD ON)
find_package(Threads REQUIRED)

# find Python-------------------------------------------------------------------
if (${CYTHON_PREGEL_APP} OR ${CYTHON_PIE_APP})
  find_package (Python3 COMPONENTS Interpreter Development REQUIRED)
  include_directories(SYSTEM ${Python3_INCLUDE_DIRS})
endif ()

# find MPI----------------------------------------------------------------------
find_package(MPI QUIET)
if (MPI_FOUND)
  include_directories(AFTER SYSTEM ${MPI_CXX_INCLUDE_PATH})
endif()

# find libgrape-lite------------------------------------------------------------
find_package(libgrapelite QUIET)
if (libgrapelite_FOUND)
  include_directories(AFTER SYSTEM "${LIBGRAPELITE_INCLUDE_DIRS}")
  include_directories(AFTER SYSTEM "${LIBGRAPELITE_INCLUDE_DIRS}/grape/analytical_apps")
endif()

# find vineyard-----------------------------------------
find_package(vineyard 0.8.2 QUIET)
if (vineyard_FOUND)
  include_directories(AFTER SYSTEM ${VINEYARD_INCLUDE_DIRS})
endif()
add_compile_options(-DENABLE_SELECTOR)

# force load the config make if it exists
include("${ANALYTICAL_ENGINE_HOME}/${CMAKE_INSTALL_LIBDIR}/cmake/graphscope-analytical/graphscope-analytical-config.cmake" OPTIONAL)
if("${GRAPHSCOPE_GCC_ABI_BACKWARDS_COMPATIBLE}" STREQUAL "0")
    add_definitions(-D_GLIBCXX_USE_CXX11_ABI=1)
elseif("${GRAPHSCOPE_GCC_ABI_BACKWARDS_COMPATIBLE}" STREQUAL "1")
    add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
endif()

# we still need openmp, as we use it in ParallelMessageManager from libgrape-lite. But we just need
# the preprocessor options
if (APPLE)
    if (POLICY CMP0056)
        cmake_policy(SET CMP0056 NEW)
    endif ()
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib")
endif ()
find_package(OpenMP QUIET)

# set frame dir--------------------------------------------------------------
set(ANALYTICAL_ENGINE_FRAME_DIR "${ANALYTICAL_ENGINE_HOME}/include/graphscope/frame")
set(FRAME_NAME d2c70e0162e46c20cb341a36f5fa6b4f3d08c0b7cc14e958e061ca93d63782ce)

# include jni------------------------------------------------------------------
if(PROPERTY_GRAPH_FRAME OR JAVA_PIE_APP)
    if (ENABLE_JAVA_SDK)
        find_package(JNI REQUIRED)
        include_directories(SYSTEM ${JAVA_INCLUDE_PATH})
        include_directories(SYSTEM ${JAVA_INCLUDE_PATH2})
    endif()
endif()

# set javasdk.cc--------------------------------------------------------------
if(EXISTS "${ANALYTICAL_ENGINE_HOME}/core/java/javasdk.cc")
    set(ANALYTICAL_JAVASDK_CC "${ANALYTICAL_ENGINE_HOME}/core/java/javasdk.cc")
else()
    set(ANALYTICAL_JAVASDK_CC "${ANALYTICAL_ENGINE_HOME}/include/graphscope/core/java/javasdk.cc")
endif()
# set dynamic.cc
if(EXISTS "${ANALYTICAL_ENGINE_HOME}/core/object/dynamic.cc")
    set(DYNAMIC_CC "${ANALYTICAL_ENGINE_HOME}/core/object/dynamic.cc")
else()
    set(DYNAMIC_CC "${ANALYTICAL_ENGINE_HOME}/include/graphscope/core/object/dynamic.cc")
endif()

# find Glog---------------------------------------------------------------------
if(GRAPHSCOPE_ANALYTICAL_HOME)
    include("${ANALYTICAL_ENGINE_HOME}/${CMAKE_INSTALL_LIBDIR}/cmake/graphscope-analytical/cmake/FindGlog.cmake")
else()
    include("${ANALYTICAL_ENGINE_HOME}/cmake/FindGlog.cmake")
endif()
include_directories(SYSTEM ${GLOG_INCLUDE_DIRS})

# find Arrow--------------------------------------------------------------------
if(NOT Arrow_FOUND)
    if(GRAPHSCOPE_ANALYTICAL_HOME)
        include("${ANALYTICAL_ENGINE_HOME}/${CMAKE_INSTALL_LIBDIR}/cmake/graphscope-analytical/cmake/FindArrow.cmake")
    else()
        include("${ANALYTICAL_ENGINE_HOME}/cmake/FindArrow.cmake")
    endif()
endif()
if(Arrow_FOUND AND Arrow_VERSION VERSION_GREATER 9.0.1)
    set(CMAKE_CXX_STANDARD 17)
endif()

# find Libunwind----------------------------------------------------------------
if(GRAPHSCOPE_ANALYTICAL_HOME)
    include("${ANALYTICAL_ENGINE_HOME}/${CMAKE_INSTALL_LIBDIR}/cmake/graphscope-analytical/cmake/FindLibUnwind.cmake")
else()
    include("${ANALYTICAL_ENGINE_HOME}/cmake/FindLibUnwind.cmake")
endif()

if(LIBUNWIND_FOUND)
    add_definitions(-DWITH_LIBUNWIND)
endif()

# include Analytical Engine-----------------------------------------------------
if(GRAPHSCOPE_ANALYTICAL_HOME)
    include_directories("${GRAPHSCOPE_ANALYTICAL_INCLUDE_DIRS}")
    include_directories("${GRAPHSCOPE_ANALYTICAL_HOME}/include/graphscope/apps")
    include_directories("${GRAPHSCOPE_ANALYTICAL_HOME}/include/graphscope")
    # include vineyard----------------------------------------------------------
    include_directories("${GRAPHSCOPE_ANALYTICAL_HOME}/include/vineyard")
else()
    include_directories("${ANALYTICAL_ENGINE_HOME}")
    include_directories("${ANALYTICAL_ENGINE_HOME}/apps")
    include_directories("${ANALYTICAL_ENGINE_HOME}/proto")
endif()

if(GRAPHSCOPE_ANALYTICAL_HOME)
    find_library(PROTO NAMES gs_proto HINTS "${GRAPHSCOPE_ANALYTICAL_HOME}/lib")
else()
    find_library(PROTO NAMES gs_proto HINTS "${ANALYTICAL_ENGINE_HOME}/build")
endif()

if(GRAPHSCOPE_ANALYTICAL_HOME)
    set(ANALYTICAL_ENGINE_FRAME_DIR "${GRAPHSCOPE_ANALYTICAL_HOME}/include/graphscope/frame")
else()
    set(ANALYTICAL_ENGINE_FRAME_DIR "${ANALYTICAL_ENGINE_HOME}/frame")
endif()

if (APPLE AND "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
    set(CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS "${CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS} -undefined dynamic_lookup")
endif()

# address the "illegal thread local variable reference to regular symbol" error
# in recent version of brew installed protobuf on macOS
set(BUNDLED_Protobuf_LIBRARIES)
set(BUNDLED_Protobuf_LIBRARIES_DLC)  # generated by delocate-wheel, see also: https://github.com/matthew-brett/delocate/issues/150
if (APPLE)
    # find bundled protobuf library
    if (EXISTS "${ANALYTICAL_ENGINE_HOME}/lib/libprotobuf.dylib")
        set(BUNDLED_Protobuf_LIBRARIES "${ANALYTICAL_ENGINE_HOME}/lib/libprotobuf.dylib")
    elseif(EXISTS "${GRAPHSCOPE_ANALYTICAL_HOME}/lib/libprotobuf.dylib")
        set(BUNDLED_Protobuf_LIBRARIES "${GRAPHSCOPE_ANALYTICAL_HOME}/lib/libprotobuf.dylib")
    endif()
    if (NOT BUNDLED_Protobuf_LIBRARIES)
        # search libprotobuf.xx.xxx.dylib in graphscope.dylibs
        file(GLOB PROTOBUF_LIBS "${ANALYTICAL_ENGINE_HOME}/../graphscope.dylibs/libprotobuf.*.dylib")
        if (PROTOBUF_LIBS)
            list(GET PROTOBUF_LIBS 0 BUNDLED_Protobuf_LIBRARIES)
            string(REPLACE "${ANALYTICAL_ENGINE_HOME}/../" "/DLC/" BUNDLED_Protobuf_LIBRARIES_DLC ${BUNDLED_Protobuf_LIBRARIES})
        endif()
    endif()
    if (NOT BUNDLED_Protobuf_LIBRARIES)
        # search libprotobuf.xx.xxx.dylib in graphscope_runtime/.dylibs
        file(GLOB PROTOBUF_LIBS "${ANALYTICAL_ENGINE_HOME}/../graphscope_runtime/.dylibs/libprotobuf.*.dylib")
        if (PROTOBUF_LIBS)
            list(GET PROTOBUF_LIBS 0 BUNDLED_Protobuf_LIBRARIES)
            string(REPLACE "${ANALYTICAL_ENGINE_HOME}/../" "/DLC/" BUNDLED_Protobuf_LIBRARIES_DLC ${BUNDLED_Protobuf_LIBRARIES})
        endif()
    endif()
    if (NOT BUNDLED_Protobuf_LIBRARIES)
        # search system-wide protobuf
        find_package (Protobuf QUIET)
        if (NOT Protobuf_FOUND)
            find_package (protobuf CONFIG REQUIRED)
        endif()
        if (Protobuf_FOUND)
            set(BUNDLED_Protobuf_LIBRARIES ${Protobuf_LIBRARIES})
        endif()
    endif()
    message(STATUS "Using BUNDLED_Protobuf_LIBRARIES: ${BUNDLED_Protobuf_LIBRARIES}")
    message(STATUS "Using BUNDLED_Protobuf_LIBRARIES_DLC: ${BUNDLED_Protobuf_LIBRARIES_DLC}")
endif()

set(GRAPH_TYPE "gs::ArrowProjectedFragment<int64_t,uint64_t,int64_t,int64_t,vineyard::ArrowVertexMap<int64_t,uint64_t>,false>")
# message("GRAPH_TYPE = ${GRAPH_TYPE}")

set(APP_TYPE "gs::Clustering<_GRAPH_TYPE>")
# message("APP_TYPE = ${APP_TYPE}")

if (CYTHON_PREGEL_APP)
    file(GLOB_RECURSE FILES_NEED_COMPILE "*.cc")
    add_library(${FRAME_NAME} SHARED ${FILES_NEED_COMPILE}
                                     ${ANALYTICAL_ENGINE_FRAME_DIR}/cython_app_frame.cc)
    target_compile_definitions(${FRAME_NAME} PRIVATE _OID_TYPE=$_oid_type
                                                     _VID_TYPE=$_vid_type
                                                     _VD_TYPE=$_vd_type
                                                     _MD_TYPE=$_md_type
                                                     _MODULE_NAME=$_module_name
                                                     _GRAPH_TYPE=${GRAPH_TYPE}
                                                     _GRAPH_HEADER=core/fragment/arrow_projected_fragment.h
                                                     _APP_HEADER=apps/clustering/clustering.h)
    target_link_libraries(${FRAME_NAME} ${Python3_LIBRARIES})
    set_target_properties(${FRAME_NAME} PROPERTIES COMPILE_FLAGS "-fPIC")
elseif (CYTHON_PIE_APP)
    file(GLOB_RECURSE FILES_NEED_COMPILE "*.cc")
    add_library(${FRAME_NAME} SHARED ${FILES_NEED_COMPILE}
                                     ${ANALYTICAL_ENGINE_FRAME_DIR}/cython_pie_app_frame.cc)
    target_compile_definitions(${FRAME_NAME} PRIVATE _OID_TYPE=$_oid_type
                                                     _VID_TYPE=$_vid_type
                                                     _VD_TYPE=$_vd_type
                                                     _MD_TYPE=$_md_type
                                                     _MODULE_NAME=$_module_name
                                                     _GRAPH_TYPE=${GRAPH_TYPE}
                                                     _GRAPH_HEADER=core/fragment/arrow_projected_fragment.h
                                                     _APP_HEADER=apps/clustering/clustering.h)
    target_link_libraries(${FRAME_NAME} ${Python3_LIBRARIES})
    set_target_properties(${FRAME_NAME} PROPERTIES COMPILE_FLAGS "-fPIC")
elseif (JAVA_PIE_APP)
    if (ENABLE_JAVA_SDK)
        #check whether we are using clang.
        if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
            message(STATUS "Using Clang compiler: ${CMAKE_CXX_COMPILER}")
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fforce-emit-vtables")
            if (NOT APPLE)
                message(STATUS "Try to find ld.lld under same directory..")
                set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto")
                get_filename_component(COMPILER_DIR ${CMAKE_CXX_COMPILER} DIRECTORY)
                message(STATUS "Obtain directory: ${COMPILER_DIR}")
                set(CMAKE_JNI_LINKER_FLAGS "-fuse-ld=${COMPILER_DIR}/ld.lld -Xlinker")
                if (SUPPORTS_LTO_EMBED_BITCODE)
                    set(CMAKE_JNI_LINKER_FLAGS "${CMAKE_JNI_LINKER_FLAGS} -mllvm=-lto-embed-bitcode")
                endif()
            endif()
        else()
            message(WARNING "Compiling with ENABLE_JAVA_SDK ON expects a minimum Clang-11 compiler, "
                            "current compiler is ${CMAKE_CXX_COMPILER}. The build process will continue, "
                            "BUT llvm4jni-based acceleration will be unavailable for generated libs.")
        endif()
    endif()

    # 0. codegen
    if (JAVA_APP_CODEGEN)
        execute_process(COMMAND java -cp ${PRE_CP} ${PROCESSOR_MAIN_CLASS} ${JAR_PATH} ${OUTPUT_DIR} gs::ArrowProjectedFragment<int64_t,uint64_t,int64_t,int64_t,vineyard::ArrowVertexMap<int64_t,uint64_t>,false> $_vd_type
                    RESULT_VARIABLE ret)
            message(STATUS "java -cp ${PRE_CP} ${PROCESSOR_MAIN_CLASS} ${JAR_PATH} ${OUTPUT_DIR} gs::ArrowProjectedFragment<int64_t,uint64_t,int64_t,int64_t,vineyard::ArrowVertexMap<int64_t,uint64_t>,false> $_vd_type")
        if (ret EQUAL "1")
            message(FATAL_ERROR "Preprocess failed")
        endif()
    endif()
    # find jni---------------------------------------------------------------------
    find_package(JNI REQUIRED)
    include_directories(SYSTEM ${JAVA_INCLUDE_PATH})
    include_directories(SYSTEM ${JAVA_INCLUDE_PATH2})

    # 1. cmake
    file(GLOB_RECURSE FILES_NEED_COMPILE "${OUTPUT_DIR}/SOURCE_OUTPUT/*.cc" ${ANALYTICAL_JAVASDK_CC})
    add_library(${FRAME_NAME} SHARED ${FILES_NEED_COMPILE}
                                    ${ANALYTICAL_ENGINE_FRAME_DIR}/app_frame.cc)
    target_include_directories(${FRAME_NAME} PRIVATE ${OUTPUT_DIR}/SOURCE_OUTPUT/)
    target_compile_definitions(${FRAME_NAME} PRIVATE ENABLE_JAVA_SDK
                                                    _GRAPH_TYPE=${GRAPH_TYPE}
                                                    _GRAPH_HEADER=core/fragment/arrow_projected_fragment.h
                                                    _APP_TYPE=gs::Clustering<_GRAPH_TYPE>
                                                    _APP_HEADER=apps/clustering/clustering.h)
    target_link_libraries(${FRAME_NAME} ${CMAKE_JNI_LINKER_FLAGS} ${JAVA_JVM_LIBRARY} ${JNI_LIBRARIES})
    set_target_properties(${FRAME_NAME} PROPERTIES COMPILE_FLAGS "-fPIC")
    # 2.Post build after compilation, run run-llvm4jni.sh to generate bitcode, if clang enabled.
    if ((CMAKE_CXX_COMPILER_ID MATCHES "Clang") AND (RUN_LLVM4JNI_SH AND (EXISTS ${RUN_LLVM4JNI_SH})))
        add_custom_command(TARGET ${FRAME_NAME}
                        POST_BUILD COMMAND bash ${RUN_LLVM4JNI_SH}
                                            "-output" ${LLVM4JNI_OUTPUT}
                                            "-cp" ${OUTPUT_DIR}/CLASS_OUTPUT
                                            "-lib" $<TARGET_FILE:${FRAME_NAME}>
                                            "-v" "WARN" "-no-verify"
                        COMMENT "Running run-llvm4jni.sh: ${RUN_LLVM4JNI_SH}
                                -output ${LLVM4JNI_OUTPUT}
                                -cp ${OUTPUT_DIR}/CLASS_OUTPUT
                                -lib ${LIB_PATH} -v WARN -no-verify")
    else()
        message(STATUS "Skip llvm4jni bitcode gen since lib is not compiled with clang or run-llvm4jni.sh not found")
    endif()
elseif (FLASH_APP)
    add_library(${FRAME_NAME} SHARED ${ANALYTICAL_ENGINE_FRAME_DIR}/flash_app_frame.cc)
    target_compile_definitions(${FRAME_NAME} PRIVATE _GRAPH_TYPE=${GRAPH_TYPE} _GRAPH_HEADER=core/fragment/arrow_projected_fragment.h
                                                     _APP_TYPE=gs::Clustering<_GRAPH_TYPE> _APP_HEADER=apps/clustering/clustering.h)
    target_include_directories(${FRAME_NAME} PRIVATE utils apps)
    set_target_properties(${FRAME_NAME} PROPERTIES COMPILE_FLAGS "-fPIC")
elseif (PROPERTY_GRAPH_FRAME)
    set(SOURCES ${ANALYTICAL_ENGINE_FRAME_DIR}/property_graph_frame.cc ${DYNAMIC_CC})
    if (ENABLE_JAVA_SDK)
        set(SOURCES ${SOURCES} ${ANALYTICAL_JAVASDK_CC})
    endif()
    add_library(${FRAME_NAME} SHARED ${SOURCES})
    target_compile_definitions(${FRAME_NAME} PRIVATE _GRAPH_TYPE=${GRAPH_TYPE})
    if (ENABLE_JAVA_SDK)
        target_compile_definitions(${FRAME_NAME} PRIVATE ENABLE_JAVA_SDK)
    endif()
    # check if vineyard built with GAR and if the vertex map is ArrowVertexMap
    if(BUILD_VINEYARD_GRAPH_WITH_GAR AND gs::ArrowProjectedFragment<int64_t,uint64_t,int64_t,int64_t,vineyard::ArrowVertexMap<int64_t,uint64_t>,false> MATCHES "ArrowVertexMap")
        target_compile_definitions(${FRAME_NAME} PRIVATE -DENABLE_GAR)
    endif()
    target_include_directories(${FRAME_NAME} PRIVATE utils)
    set_target_properties(${FRAME_NAME} PROPERTIES COMPILE_FLAGS "-fPIC")
elseif (PROJECT_FRAME)
    add_library(${FRAME_NAME} SHARED ${ANALYTICAL_ENGINE_FRAME_DIR}/project_frame.cc)
    target_compile_definitions(${FRAME_NAME} PRIVATE _PROJECTED_GRAPH_TYPE=${GRAPH_TYPE})
    target_include_directories(${FRAME_NAME} PRIVATE utils)
    set_target_properties(${FRAME_NAME} PROPERTIES COMPILE_FLAGS "-fPIC")
else ()
    add_library(${FRAME_NAME} SHARED ${ANALYTICAL_ENGINE_FRAME_DIR}/app_frame.cc)
    target_compile_definitions(${FRAME_NAME} PRIVATE _GRAPH_TYPE=${GRAPH_TYPE} _GRAPH_HEADER=core/fragment/arrow_projected_fragment.h
                                                     _APP_TYPE=gs::Clustering<_GRAPH_TYPE> _APP_HEADER=apps/clustering/clustering.h)
    target_include_directories(${FRAME_NAME} PRIVATE utils apps)
    set_target_properties(${FRAME_NAME} PROPERTIES COMPILE_FLAGS "-fPIC")
endif ()

if (OpenMP_FOUND)
    target_link_libraries(${FRAME_NAME} OpenMP::OpenMP_CXX)
endif ()

if (APPLE AND BUNDLED_Protobuf_LIBRARIES)
    target_link_libraries(${FRAME_NAME} ${BUNDLED_Protobuf_LIBRARIES})

    if (BUNDLED_Protobuf_LIBRARIES_DLC)
        add_custom_command(TARGET ${FRAME_NAME}
            POST_BUILD COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change
            "${BUNDLED_Protobuf_LIBRARIES_DLC}" "${BUNDLED_Protobuf_LIBRARIES}"
            $<TARGET_FILE:${FRAME_NAME}>
        )
    endif ()
endif ()

# include the inplace cmake config at the end, to avoid affecting the CMake search path
include("${ANALYTICAL_ENGINE_HOME}/build/graphscope-analytical-config.cmake" OPTIONAL)

# setup the CXX ABI options after fully loaded the environment
# message("GCC ABI backwards compatible: ${GRAPHSCOPE_GCC_ABI_BACKWARDS_COMPATIBLE}")
if("${GRAPHSCOPE_GCC_ABI_BACKWARDS_COMPATIBLE}" STREQUAL "0")
    add_definitions(-D_GLIBCXX_USE_CXX11_ABI=1)
elseif("${GRAPHSCOPE_GCC_ABI_BACKWARDS_COMPATIBLE}" STREQUAL "1")
    add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
endif()
