enable_language(C)

include(CTest)

find_package(Python3 REQUIRED COMPONENTS Interpreter Development.SABIModule)
if (NOT Python3_FOUND)
  message (FATAL_ERROR "Failed to find Python 3")
endif()
if (Python3_Development_FOUND)
  message (FATAL_ERROR "Python 3, COMPONENT 'Development' unexpectedly found")
endif()
if (Python3_Development.Embed_FOUND)
  message (FATAL_ERROR "Python 3, COMPONENT 'Development.Embed' unexpectedly found")
endif()
if (Python3_Development.Module_FOUND)
  message (FATAL_ERROR "Python 3, COMPONENT 'Development.Module' unexpectedly found")
endif()
if (NOT Python3_Development.SABIModule_FOUND)
  message (FATAL_ERROR "Python 3, COMPONENT 'Development.SABIModule' not found")
endif()

if(NOT TARGET Python3::Interpreter)
  message(SEND_ERROR "Python3::Interpreter not found")
endif()

if(TARGET Python3::Python)
  message(SEND_ERROR "Python3::Python unexpectedly found")
endif()
if(TARGET Python3::Module)
  message(SEND_ERROR "Python3::Module unexpectedly found")
endif()
if(NOT TARGET Python3::SABIModule)
  message(SEND_ERROR "Python3::SABIModule not found")
endif()

if (Python3_VERSION VERSION_GREATER_EQUAL "3.2" AND NOT DEFINED Python3_SOSABI)
  message(FATAL_ERROR "Python3_SOSABI unexpectedly not defined")
endif()

Python3_add_library (spam3 MODULE USE_SABI 3 WITH_SOABI spam.c)
target_compile_definitions (spam3 PRIVATE PYTHON3)

if (Python3_SOSABI)
  get_property (suffix TARGET spam3 PROPERTY SUFFIX)
  if (NOT suffix MATCHES "^\\.${Python3_SOSABI}")
    message(FATAL_ERROR "Module suffix do not include Python3_SOSABI")
  endif()
endif()


add_test (NAME python3_spam3
          COMMAND "${CMAKE_COMMAND}" -E env "PYTHONPATH=$<TARGET_FILE_DIR:spam3>"
          "${Python3_INTERPRETER}" -c "import spam3; spam3.system(\"cd\")")
