set(ENABLE_NATIVE_FLATBUFFER "off")
if(EXISTS ${TOP_DIR}/mindspore-lite/providers/flatbuffer/native_flatbuffer.cfg)
    set(ENABLE_NATIVE_FLATBUFFER on)
endif()
if(ENABLE_NATIVE_FLATBUFFER)
    file(STRINGS ${TOP_DIR}/mindspore-lite/providers/flatbuffer/native_flatbuffer.cfg native_flatbuffer_path)
    set(FLATC "${native_flatbuffer_path}/bin")
    set(FLAT_BUFFERS "")
    set(flatbuffers_INC "${native_flatbuffer_path}/common")
    if(EXISTS ${native_flatbuffer_path}/template)
        set(FLATBUFFER_TEMPALTE "${native_flatbuffer_path}/template")
    endif()
    include_directories(${flatbuffers_INC})

else()
    if(MSVC)
        set(flatbuffers_CXXFLAGS "/DWIN32 /D_WINDOWS /W3 /GR /EHsc")
        set(flatbuffers_CFLAGS "${CMAKE_C_FLAGS}")
        set(flatbuffers_LDFLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
        set(_ms_tmp_CMAKE_STATIC_LIBRARY_PREFIX ${CMAKE_STATIC_LIBRARY_PREFIX})
        # flatbuffers.lib cimplied by msvc
        set(CMAKE_STATIC_LIBRARY_PREFIX "")
    else()
        set(flatbuffers_CXXFLAGS "-fPIC -fPIE -D_FORTIFY_SOURCE=2 -O2 -fstack-protector-strong -Wno-error=unused-but-set-variable")
        set(flatbuffers_CFLAGS "-fPIC -fPIE -D_FORTIFY_SOURCE=2 -O2 -fstack-protector-strong -Wno-error=unused-but-set-variable")
    endif()

    if(WIN32)
        set(flatbuffers_USE_STATIC_LIBS ON)
    endif()

    if(ENABLE_GITEE OR ENABLE_GITEE_EULER) # Channel GITEE_EULER is NOT supported now, use GITEE instead.
        set(REQ_URL "https://gitee.com/mirrors/flatbuffers/repository/archive/v25.2.10.tar.gz")
        set(SHA256 "b97b0ad5319f66f671bf060e9d624a41ae6437a623c9344d7f744a872d27c14d")
    else()
        set(REQ_URL "https://github.com/google/flatbuffers/archive/refs/tags/v25.2.10.tar.gz")
        set(SHA256 "b9c2df49707c57a48fc0923d52b8c73beb72d675f9d44b2211e4569be40a7421")
    endif()

    if(APPLE)
        set(flatbuffers_CXXFLAGS "${flatbuffers_CXXFLAGS} -Wno-deprecated")
    endif()
    if(APPLE)
        mindspore_add_pkg(flatbuffers
                VER 25.2.10
                LIBS flatbuffers
                EXE flatc
                URL ${REQ_URL}
                SHA256 ${SHA256}
                CMAKE_OPTION -DFLATBUFFERS_BUILD_TESTS=OFF -DCMAKE_INSTALL_LIBDIR=lib)
    else()
        if(TARGET_AOS_ARM)
            mindspore_add_pkg(flatbuffers
                    VER 25.2.10
                    LIBS flatbuffers
                    EXE flatc
                    URL ${REQ_URL}
                    SHA256 ${SHA256}
                    CMAKE_OPTION -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++
                    -DFLATBUFFERS_BUILD_TESTS=OFF -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_BUILD_TYPE=Release)
        else()
            mindspore_add_pkg(flatbuffers
                    VER 25.2.10
                    LIBS flatbuffers
                    EXE flatc
                    URL ${REQ_URL}
                    SHA256 ${SHA256}
                    DIR ${FLATBUFFER_DIR}
                    CMAKE_OPTION -DCMAKE_C_COMPILER=${FLATC_GCC_COMPILER} -DCMAKE_CXX_COMPILER=${FLATC_GXX_COMPILER}
                    -DFLATBUFFERS_BUILD_TESTS=OFF -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_BUILD_TYPE=Release)
        endif()
    endif()

    include_directories(${flatbuffers_INC})
    add_library(mindspore::flatbuffers ALIAS flatbuffers::flatbuffers)
    add_executable(mindspore::flatc ALIAS flatbuffers::flatc)
endif()

# recover original value
if(MSVC)
    set(CMAKE_STATIC_LIBRARY_PREFIX, ${_ms_tmp_CMAKE_STATIC_LIBRARY_PREFIX})
endif()

function(ms_build_flatbuffers source_schema_files
                              source_schema_dirs
                              custom_target_name
                              generated_output_dir)

    set(total_schema_dirs "")
    set(total_generated_files "")
    set(FLATC mindspore::flatc)
    foreach(schema_dir ${source_schema_dirs})
        set(total_schema_dirs -I ${schema_dir} ${total_schema_dirs})
    endforeach()

    foreach(schema IN LISTS ${source_schema_files})
        get_filename_component(filename ${schema} NAME_WE)
        if(NOT ${generated_output_dir} STREQUAL "")
            set(generated_file ${generated_output_dir}/${filename}_generated.h)
            add_custom_command(
                    OUTPUT ${generated_file}
                    COMMAND ${FLATC} --gen-mutable
                    --reflect-names --gen-object-api -o ${generated_output_dir}
                    ${total_schema_dirs}
                    -c -b --reflect-types ${schema}
                    DEPENDS ${FLATC} ${schema}
                    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
                    COMMENT "Running C++ flatbuffers compiler on ${schema}" VERBATIM)
            list(APPEND total_generated_files ${generated_file})
        endif()
    endforeach()

    add_custom_target(${custom_target_name} ALL
            DEPENDS ${total_generated_files})

    if(NOT ${generated_output_dir} STREQUAL "")
        include_directories(${generated_output_dir})
        set_property(TARGET ${custom_target_name}
                PROPERTY GENERATED_OUTPUT_DIR
                ${generated_output_dir})
    endif()
endfunction()

if(ENABLE_NATIVE_FLATBUFFER)
    function(ms_build_flatbuffers_lite
            source_schema_files source_schema_dirs custom_target_name generated_output_dir if_inner)
        set(total_schema_dirs "")
        set(total_generated_files "")
        foreach(schema_dir ${source_schema_dirs})
            set(total_schema_dirs -I ${schema_dir} ${total_schema_dirs})
        endforeach()
        file(MAKE_DIRECTORY ${generated_output_dir})
        foreach(schema IN LISTS ${source_schema_files})
            get_filename_component(filename ${schema} NAME_WE)
            if(NOT ${generated_output_dir} STREQUAL "")
                set(generated_file ${generated_output_dir}/${filename}_generated.h)
                if(if_inner MATCHES "inner")
                    add_custom_command(
                            OUTPUT ${generated_file}
                            COMMAND ${FLATC} --template ${FLATBUFFER_TEMPALTE} --cpp
                            -o ${generated_output_dir}
                            ${schema}
                            DEPENDS ${FLATC} ${schema}
                            WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
                            COMMENT "Running C++ flatbuffers compiler on ${schema}" VERBATIM)
                else()
                    add_custom_command(
                            OUTPUT ${generated_file}
                            COMMAND ${FLATC} --template ${FLATBUFFER_TEMPALTE} --cpp
                            -o ${generated_output_dir}
                            ${schema}
                            DEPENDS ${FLATC} ${schema}
                            WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
                            COMMENT "Running C++ flatbuffers compiler on ${schema}" VERBATIM)
                endif()
                list(APPEND total_generated_files ${generated_file})
            endif()
        endforeach()

        add_custom_target(${custom_target_name} ALL
                DEPENDS ${total_generated_files})

        if(NOT ${generated_output_dir} STREQUAL "")
            include_directories(${generated_output_dir})
            set_property(TARGET ${custom_target_name}
                    PROPERTY GENERATED_OUTPUT_DIR
                    ${generated_output_dir})
        endif()
    endfunction()
else()
    function(ms_build_flatbuffers_lite
      source_schema_files source_schema_dirs custom_target_name generated_output_dir if_inner)

        set(total_schema_dirs "")
        set(total_generated_files "")
        set(FLATC mindspore::flatc)
        foreach(schema_dir ${source_schema_dirs})
            set(total_schema_dirs -I ${schema_dir} ${total_schema_dirs})
        endforeach()

        foreach(schema IN LISTS ${source_schema_files})
            get_filename_component(filename ${schema} NAME_WE)
            if(NOT ${generated_output_dir} STREQUAL "")
                set(generated_file ${generated_output_dir}/${filename}_generated.h)
                if(if_inner MATCHES "inner")
                    add_custom_command(
                            OUTPUT ${generated_file}
                            COMMAND ${FLATC} --gen-mutable
                            --reflect-names --gen-object-api -o ${generated_output_dir}
                            ${total_schema_dirs}
                            -c -b --reflect-types ${schema}
                            DEPENDS ${FLATC} ${schema}
                            WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
                            COMMENT "Running C++ flatbuffers compiler on ${schema}" VERBATIM)
                else()
                    add_custom_command(
                            OUTPUT ${generated_file}
                            COMMAND ${FLATC} -o ${generated_output_dir}
                            ${total_schema_dirs}
                            -c -b  ${schema}
                            DEPENDS ${FLATC} ${schema}
                            WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
                            COMMENT "Running C++ flatbuffers compiler on ${schema}" VERBATIM)
                endif()
                list(APPEND total_generated_files ${generated_file})
            endif()
        endforeach()

        add_custom_target(${custom_target_name} ALL
                DEPENDS ${total_generated_files})

        if(NOT ${generated_output_dir} STREQUAL "")
            include_directories(${generated_output_dir})
            set_property(TARGET ${custom_target_name}
                    PROPERTY GENERATED_OUTPUT_DIR
                    ${generated_output_dir})
        endif()
    endfunction()
endif()