IF(MNN_BUILD_CONVERTER)
  SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/../../)
  option(MNN_BUILD_TORCH "Build Converter support TorchScript." OFF)
  IF(MNN_BUILD_PROTOBUFFER)
      SET(Protobuf_LIBRARIES libprotobuf)
      include_directories(${CMAKE_CURRENT_LIST_DIR}/../../3rd_party/protobuf/src)
  ELSE()
      find_package(Protobuf REQUIRED)
      if (${CMAKE_VERSION} VERSION_LESS "3.6.0")
          set(Protobuf_LIBRARIES ${PROTOBUF_LIBRARIES})
          set(Protobuf_INCLUDE_DIRS ${PROTOBUF_INCLUDE_DIRS})
      endif()
  ENDIF()
  SET(Protobuf_LIBRARIES ${Protobuf_LIBRARIES} PARENT_SCOPE)
  add_definitions(-DGOOGLE_PROTOBUF_NO_RTTI)
  include_directories(${CMAKE_CURRENT_LIST_DIR}/include/)
  include_directories(${CMAKE_CURRENT_LIST_DIR}/source/tflite/schema/)
  include_directories(${Protobuf_INCLUDE_DIRS})
  SET(MNN_CONVERTER_BACKENDS_TARGETS "")
  SET(MNN_CONVERTER_BACKENDS_OBJECTS "")
  include_directories(${CMAKE_CURRENT_LIST_DIR}/include)
  include_directories(${CMAKE_CURRENT_LIST_DIR}/source/tflite/schema)
  include_directories(${CMAKE_CURRENT_BINARY_DIR})
  include(${CMAKE_CURRENT_LIST_DIR}/source/compression/CMakeLists.txt)
  include(${CMAKE_CURRENT_LIST_DIR}/source/tensorflow/CMakeLists.txt)
  include(${CMAKE_CURRENT_LIST_DIR}/source/onnx/CMakeLists.txt)
  include(${CMAKE_CURRENT_LIST_DIR}/source/caffe/CMakeLists.txt)
  include(${CMAKE_CURRENT_LIST_DIR}/source/MNN/CMakeLists.txt)
  include(${CMAKE_CURRENT_LIST_DIR}/source/optimizer/CMakeLists.txt)
  include(${CMAKE_CURRENT_LIST_DIR}/source/tflite/CMakeLists.txt)
  if (MNN_BUILD_TORCH)
    add_definitions(-DMNN_BUILD_TORCH)
    include(${CMAKE_CURRENT_LIST_DIR}/source/torch/CMakeLists.txt)
  endif()

  file(GLOB COMMON_SRC ${CMAKE_CURRENT_LIST_DIR}/source/common/*.cpp ${CMAKE_CURRENT_LIST_DIR}/source/common/*.h ${CMAKE_CURRENT_LIST_DIR}/source/common/*.hpp)
  add_executable(MNNConvert
    ${CMAKE_CURRENT_LIST_DIR}/source/MNNConverter.cpp
  )
  IF(MNN_BUILD_SHARED_LIBS)
     add_library(MNNConvertDeps SHARED ${COMMON_SRC} ${MNN_CONVERTER_BACKENDS_OBJECTS} ${CMAKE_CURRENT_LIST_DIR}/../../3rd_party/flatbuffers/src/util.cpp $<TARGET_OBJECTS:MNNUtils>)
     add_dependencies(MNNConvertDeps MNN)
  ELSE()
    add_library(MNNConvertDeps STATIC ${COMMON_SRC} ${MNN_CONVERTER_BACKENDS_OBJECTS} ${CMAKE_CURRENT_LIST_DIR}/../../3rd_party/flatbuffers/src/util.cpp)
  ENDIF()
  
  
  IF(NOT MNN_BUILD_SHARED_LIBS)
    target_link_libraries(MNNConvertDeps PUBLIC ${Protobuf_LIBRARIES})
    if (MNN_BUILD_TORCH)
        target_link_libraries(MNNConvertDeps PUBLIC ${TORCH_LIBRARIES})
    endif()
    if(APPLE)
        target_link_libraries(MNNConvert -Wl,-all_load MNNConvertDeps ${MNN_DEPS})
    elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
        # See also /path/to/MNN/CMakeLists.txt:481 when you are confused with -lpthread here.
        target_link_libraries(MNNConvert -Wl,--whole-archive MNNConvertDeps ${MNN_DEPS} -lpthread -Wl,--no-whole-archive)
    elseif (MSVC)
        target_link_libraries(MNNConvert MNNConvertDeps)
        target_link_options(MNNConvert PRIVATE /WHOLEARCHIVE:$<TARGET_FILE:MNNConvertDeps>)
        foreach (DEPEND ${MNN_DEPS})
            target_link_libraries(MNNConvert ${DEPEND})
            target_link_options(MNNConvert PRIVATE /WHOLEARCHIVE:$<TARGET_FILE:${DEPEND}>)
        endforeach ()
    ELSE()
        target_link_libraries(MNNConvert MNNConvertDeps)
    endif()
  ELSE()
    target_link_libraries(MNNConvertDeps PUBLIC ${MNN_DEPS} ${Protobuf_LIBRARIES})
    if (MNN_BUILD_TORCH)
        target_link_libraries(MNNConvertDeps PUBLIC ${TORCH_LIBRARIES})
    endif()
    add_executable(MNNRevert2Buffer ${CMAKE_CURRENT_LIST_DIR}/source/MNNRevert2Buffer.cpp)
    target_link_libraries(MNNRevert2Buffer MNNConvertDeps)
    add_executable(MNNDump2Json ${CMAKE_CURRENT_LIST_DIR}/source/MNNDump2Json.cpp)
    target_link_libraries(MNNDump2Json MNNConvertDeps)
    add_executable(TestConvertResult ${CMAKE_CURRENT_LIST_DIR}/source/TestConvertResult.cpp)
    target_link_libraries(TestConvertResult MNNConvertDeps)
    add_executable(TestOnnxResize
      ${CMAKE_CURRENT_LIST_DIR}/source/TestOnnxResize.cpp
      ${COMMON_SRC}
      ${MNN_CONVERTER_BACKENDS_OBJECTS}
      ${CMAKE_CURRENT_LIST_DIR}/../../3rd_party/flatbuffers/src/util.cpp
      $<TARGET_OBJECTS:MNNUtils>
    )
    target_link_libraries(TestOnnxResize ${MNN_DEPS} ${Protobuf_LIBRARIES})
    add_executable(TestOnnxEinsum
      ${CMAKE_CURRENT_LIST_DIR}/source/TestOnnxEinsum.cpp
      ${COMMON_SRC}
      ${MNN_CONVERTER_BACKENDS_OBJECTS}
      ${CMAKE_CURRENT_LIST_DIR}/../../3rd_party/flatbuffers/src/util.cpp
      $<TARGET_OBJECTS:MNNUtils>
    )
    target_link_libraries(TestOnnxEinsum ${MNN_DEPS} ${Protobuf_LIBRARIES})
    add_executable(TestPassManager ${CMAKE_CURRENT_LIST_DIR}/source/TestPassManager.cpp)
    target_link_libraries(TestPassManager MNNConvertDeps)
    target_link_libraries(MNNConvert MNNConvertDeps)
  ENDIF()
ENDIF()
