if (DEFINED LAMMPS_SOURCE_ROOT OR DEFINED LAMMPS_VERSION)
  message(STATUS "enable LAMMPS plugin mode")
  add_library(lammps_interface INTERFACE)
  if (DEFINED LAMMPS_VERSION)
    cmake_minimum_required(VERSION 3.11)
    include(FetchContent)
    FetchContent_Declare(lammps_download
      GIT_REPOSITORY    https://github.com/lammps/lammps
      GIT_TAG           ${LAMMPS_VERSION}
    )
    FetchContent_GetProperties(lammps_download)
    if(NOT lammps_download_POPULATED)
      FetchContent_Populate(lammps_download)
      set(LAMMPS_SOURCE_ROOT ${lammps_download_SOURCE_DIR})
    endif()
  endif()
  set(LAMMPS_HEADER_DIR ${LAMMPS_SOURCE_ROOT}/src)
  message(STATUS "LAMMPS_HEADER_DIR is ${LAMMPS_HEADER_DIR}")
  
  target_include_directories(lammps_interface INTERFACE ${LAMMPS_HEADER_DIR})

  find_package(MPI)
  if(MPI_FOUND)
    set(LAMMPS_MPI_INCLUDE_DIRS ${MPI_CXX_INCLUDE_DIRS})
    # LAMMPS has linked MPI; do not link twice
    # target_link_libraries(lammps_interface INTERFACE MPI::MPI_CXX)
    target_include_directories(lammps_interface INTERFACE ${LAMMPS_MPI_INCLUDE_DIRS})
  else()
    # Use LAMMPS serial mpi.h header
    target_include_directories(lammps_interface INTERFACE "${LAMMPS_HEADER_DIR}/STUBS")
  endif()

  # get_lammps_version
  # https://github.com/lammps/lammps/blob/c2a12f97c5f665852fb38fdd4922f7dd2e77a0a1/cmake/Modules/LAMMPSUtils.cmake#L27-L46
  include(${LAMMPS_SOURCE_ROOT}/cmake/Modules/LAMMPSUtils.cmake)
  get_lammps_version(${LAMMPS_HEADER_DIR}/version.h LAMMPS_VERSION_NUMBER)
  set(LAMMPS_VERSION_NUMBER ${LAMMPS_VERSION_NUMBER} PARENT_SCOPE)
  message(STATUS "LAMMPS version is ${LAMMPS_VERSION_NUMBER}")

  configure_file("../pair_deepmd.h.in" "${CMAKE_CURRENT_BINARY_DIR}/pair_deepmd.h" @ONLY)

  file(GLOB LMP_SRC
    deepmdplugin.cpp
    ../*.cpp
    ${LAMMPS_SOURCE_ROOT}/src/kspace.cpp # for pppm_dplr
    ${LAMMPS_SOURCE_ROOT}/src/KSPACE/pppm.cpp
  )
  if (LAMMPS_VERSION_NUMBER GREATER 20210831)
    list(APPEND LMP_SRC ${LAMMPS_SOURCE_ROOT}/src/EXTRA-FIX/fix_ttm.cpp) # for ttm
  endif()

  function(_add_lmp_plugin_variant variant_name prec_def)
  set (libname "deepmd_lmp${variant_name}")

  add_library(${libname} MODULE ${LMP_SRC})

  # link: libdeepmd
  target_link_libraries (${libname} PUBLIC
    lammps_interface
    ${LIB_DEEPMD_CC}
  )
  target_include_directories(${libname} PRIVATE
    ${CMAKE_CURRENT_BINARY_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/..
    ${LAMMPS_SOURCE_ROOT}/src/PLUGIN
    ${LAMMPS_SOURCE_ROOT}/src/KSPACE
    ${LAMMPS_SOURCE_ROOT}/src
  )
  if (LAMMPS_VERSION_NUMBER GREATER 20210831)
    target_include_directories(${libname} PRIVATE ${LAMMPS_SOURCE_ROOT}/src/EXTRA-FIX) # for ttm
  endif()
  if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
    set_target_properties(${libname} PROPERTIES LINK_FLAGS "-Wl,-undefined,dynamic_lookup")
  else()
  set_target_properties(
    ${libname} 
    PROPERTIES 
    INSTALL_RPATH "$ORIGIN;${TensorFlow_LIBRARY_PATH}"
    LINK_FLAGS "-rdynamic"
  )
  endif()
  target_compile_definitions(${libname}
    PUBLIC ${prec_def}
    PRIVATE "LMPPLUGIN" # fix header path
    PRIVATE "LAMMPS_VERSION_NUMBER=${LAMMPS_VERSION_NUMBER}"
  )

  if (CMAKE_TESTING_ENABLED)
    target_link_libraries(${libname} PRIVATE coverage_config)
  endif()

  if(BUILD_PY_IF)
    install(TARGETS ${libname} DESTINATION deepmd/op/)
  else(BUILD_PY_IF)
  install(TARGETS ${libname} DESTINATION lib/)

  if (${LAMMPS_VERSION_NUMBER} GREATER_EQUAL 20220324)
    set(PLUGINNAME "dpplugin.so")
    INSTALL(CODE "execute_process( \
        COMMAND ${CMAKE_COMMAND} -E make_directory \
		${CMAKE_INSTALL_PREFIX}/lib/${libname}/   \
        )"
	)
    INSTALL(CODE "execute_process( \
        COMMAND ${CMAKE_COMMAND} -E create_symlink \
		../${CMAKE_SHARED_LIBRARY_PREFIX}${libname}${CMAKE_SHARED_LIBRARY_SUFFIX} \
        ${CMAKE_INSTALL_PREFIX}/lib/${libname}/${PLUGINNAME}   \
        )"
    )
  endif()
  endif(BUILD_PY_IF)

  endfunction()
  if(BUILD_PY_IF)
    _add_lmp_plugin_variant("plugin" "${HIGH_PREC_DEF}")
  else(BUILD_PY_IF)
  _add_lmp_plugin_variant("${HIGH_PREC_VARIANT}" "${HIGH_PREC_DEF}")
  _add_lmp_plugin_variant("${LOW_PREC_VARIANT}" "${LOW_PREC_DEF}")
  endif()

else()
  message(STATUS "disable LAMMPS plugin mode")
endif()
