cmake_minimum_required(VERSION 3.20)
project(cf_basic_dev_v2 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Python3 REQUIRED COMPONENTS Interpreter)

set(CF_LOCAL_SDK_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../../../vendor/cogniflow_pipeline_sdk")
set(CF_LOCAL_SIGGEN "${CF_LOCAL_SDK_ROOT}/siggen.py")

if (EXISTS "${CF_LOCAL_SDK_ROOT}/include/cf_step_abi.h")
  set(CF_SDK_INCLUDE "${CF_LOCAL_SDK_ROOT}/include")
else()
  execute_process(
    COMMAND ${Python3_EXECUTABLE} -c "import cogniflow_pipeline_sdk as s; print(s.cf_sdk_include_path())"
    OUTPUT_VARIABLE CF_SDK_INCLUDE
    OUTPUT_STRIP_TRAILING_WHITESPACE
  )
endif()

if (NOT EXISTS "${CF_SDK_INCLUDE}/cf_step_abi.h")
  message(FATAL_ERROR "Cogniflow SDK headers not found in '${CF_SDK_INCLUDE}'. Reinstall cf-pipeline-sdk.")
endif()

set(GENERATED_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated)
file(MAKE_DIRECTORY ${GENERATED_DIR})

set(STEPS_DOCUMENT ${CMAKE_CURRENT_SOURCE_DIR}/../steps.nq)
set(SIG_HEADER ${GENERATED_DIR}/cf_basic_dev_signature_hashes.h)

set(CF_SIGGEN_COMMAND ${Python3_EXECUTABLE} -m cogniflow_pipeline_sdk.siggen)
if (EXISTS "${CF_LOCAL_SIGGEN}")
  set(CF_SIGGEN_COMMAND ${Python3_EXECUTABLE} "${CF_LOCAL_SIGGEN}")
endif()

add_custom_command(
  OUTPUT ${SIG_HEADER}
  COMMAND ${CF_SIGGEN_COMMAND} --document ${STEPS_DOCUMENT} --out ${SIG_HEADER} --scratch
  DEPENDS ${STEPS_DOCUMENT}
  COMMENT "Generating cf_basic_dev signature hashes"
)

add_library(cf_basic_dev_v2 SHARED
  ${CMAKE_CURRENT_SOURCE_DIR}/steps.cpp
  ${SIG_HEADER}
)

target_include_directories(cf_basic_dev_v2 PRIVATE
  ${CF_SDK_INCLUDE}
  ${GENERATED_DIR}
  ${CMAKE_CURRENT_SOURCE_DIR}
)

target_compile_definitions(cf_basic_dev_v2 PRIVATE CF_STEP_ABI_EXPORTS)

find_package(OpenMP QUIET)
if(OpenMP_CXX_FOUND)
  target_link_libraries(cf_basic_dev_v2 PRIVATE OpenMP::OpenMP_CXX)
  target_compile_definitions(cf_basic_dev_v2 PRIVATE CF_HAS_OPENMP=1)
endif()

add_custom_command(TARGET cf_basic_dev_v2 POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_SOURCE_DIR}/../bin
  COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:cf_basic_dev_v2> ${CMAKE_CURRENT_SOURCE_DIR}/../bin
)

if(DEFINED SKBUILD_PLATLIB_DIR AND NOT SKBUILD_PLATLIB_DIR STREQUAL "")
  add_custom_command(TARGET cf_basic_dev_v2 POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E make_directory ${SKBUILD_PLATLIB_DIR}/cf_basic_dev/bin
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:cf_basic_dev_v2> ${SKBUILD_PLATLIB_DIR}/cf_basic_dev/bin
  )
endif()
