# SPDX-FileCopyrightText: 2006 Blender Authors
#
# SPDX-License-Identifier: GPL-2.0-or-later

set(INC
  ..
  ../../blenkernel
  ../../blenloader
  ../../blentranslation
  ../../depsgraph
  ../../editors/include
  ../../gpu
  ../../imbuf
  ../../imbuf/intern/oiio
  ../../makesrna
  ../../windowmanager
  ../../../../intern/clog
  ../../../../intern/mantaflow/extern
  ../../../../intern/opencolorio
  # RNA_prototypes.h
  ${CMAKE_BINARY_DIR}/source/blender/makesrna
)

set(INC_SYS
  ${PYTHON_INCLUDE_DIRS}
)

set(SRC
  bpy.cc
  bpy_app.cc
  bpy_app_alembic.cc
  bpy_app_build_options.cc
  bpy_app_ffmpeg.cc
  bpy_app_handlers.cc
  bpy_app_icons.cc
  bpy_app_ocio.cc
  bpy_app_oiio.cc
  bpy_app_opensubdiv.cc
  bpy_app_openvdb.cc
  bpy_app_sdl.cc
  bpy_app_timers.cc
  bpy_app_translations.cc
  bpy_app_usd.cc
  bpy_capi_utils.cc
  bpy_driver.cc
  bpy_gizmo_wrap.cc
  bpy_interface.cc
  bpy_interface_atexit.cc
  bpy_interface_run.cc
  bpy_intern_string.cc
  bpy_library_load.cc
  bpy_library_write.cc
  bpy_msgbus.cc
  bpy_operator.cc
  bpy_operator_wrap.cc
  bpy_path.cc
  bpy_props.cc
  bpy_rna.cc
  bpy_rna_anim.cc
  bpy_rna_array.cc
  bpy_rna_callback.cc
  bpy_rna_context.cc
  bpy_rna_data.cc
  bpy_rna_driver.cc
  bpy_rna_gizmo.cc
  bpy_rna_id_collection.cc
  bpy_rna_operator.cc
  bpy_rna_text.cc
  bpy_rna_types_capi.cc
  bpy_rna_ui.cc
  bpy_traceback.cc
  bpy_utils_previews.cc
  bpy_utils_units.cc
  stubs.cc

  bpy.h
  bpy_app.h
  bpy_app_alembic.h
  bpy_app_build_options.h
  bpy_app_ffmpeg.h
  bpy_app_handlers.h
  bpy_app_icons.h
  bpy_app_ocio.h
  bpy_app_oiio.h
  bpy_app_opensubdiv.h
  bpy_app_openvdb.h
  bpy_app_sdl.h
  bpy_app_timers.h
  bpy_app_translations.h
  bpy_app_usd.h
  bpy_capi_utils.h
  bpy_driver.h
  bpy_gizmo_wrap.h
  bpy_intern_string.h
  bpy_library.h
  bpy_msgbus.h
  bpy_operator.h
  bpy_operator_wrap.h
  bpy_path.h
  bpy_props.h
  bpy_rna.h
  bpy_rna_anim.h
  bpy_rna_callback.h
  bpy_rna_context.h
  bpy_rna_data.h
  bpy_rna_driver.h
  bpy_rna_gizmo.h
  bpy_rna_id_collection.h
  bpy_rna_operator.h
  bpy_rna_text.h
  bpy_rna_types_capi.h
  bpy_rna_ui.h
  bpy_traceback.h
  bpy_utils_previews.h
  bpy_utils_units.h
  ../BPY_extern.h
  ../BPY_extern_clog.h
  ../BPY_extern_python.h
  ../BPY_extern_run.h
)

set(LIB
  PRIVATE bf::blenlib
  PRIVATE bf::dna
  bf_editor_animation
  bf_editor_interface
  bf_editor_space_api
  PRIVATE bf::intern::guardedalloc
  bf_python_gpu

  ${PYTHON_LINKFLAGS}
  ${PYTHON_LIBRARIES}
)

# only to check if buildinfo is available
if(WITH_BUILDINFO)
  add_definitions(-DBUILD_DATE)
endif()

if(WITH_PYTHON_MODULE)
  add_definitions(-DWITH_PYTHON_MODULE)
endif()


# Find the SSL certificate for the portable Blender installation.
# Without this, the absolute path on the builder is used, causing HTTPS access to fail.
# For example `urllib.request.urlopen("https://projects.blender.org")` fails
# (or any other HTTPS site). see: #102300 for details.
# NOTE: that this isn't necessary on WIN32.
if(WITH_PYTHON AND WITH_PYTHON_INSTALL AND (APPLE OR WITH_INSTALL_PORTABLE) AND (NOT WIN32))
  # - `PYTHON_SSL_CERT_FILE` absolute path to the PEM file.
  find_python_module_file("certifi/cacert.pem" PYTHON_SSL_CERT_FILE _python_ssl_cert_file_relative)
  mark_as_advanced(PYTHON_SSL_CERT_FILE)
  if (PYTHON_SSL_CERT_FILE)
    # This always moves up one level (even if there is a trailing slash).
    add_definitions(-DPYTHON_SSL_CERT_FILE="${_python_ssl_cert_file_relative}")
  else()
    message(WARNING
      "Unable to find \"certifi/cacert.pem\" within \"${PYTHON_LIBPATH}\", "
      "this build will not be able to use bundled certificates with the \"ssl\" module!"
    )
  endif()
  unset(_python_ssl_cert_file_relative)
endif()

if(WITH_PYTHON_SAFETY)
  add_definitions(-DWITH_PYTHON_SAFETY)
endif()

if(WITH_AUDASPACE)
  # It's possible to build with AUDASPACE (for file IO) but without the `aud` Python API,
  # when building without NUMPY so define both `WITH_AUDASPACE` & `DWITH_AUDASPACE_PY`.
  add_definitions(-DWITH_AUDASPACE)
  if(WITH_PYTHON_NUMPY)
    add_definitions(-DWITH_AUDASPACE_PY)
  endif()
endif()

if(WITH_BULLET)
  add_definitions(-DWITH_BULLET)
endif()

if(WITH_CODEC_AVI)
  add_definitions(-DWITH_AVI)
endif()

if(WITH_CODEC_FFMPEG)
  list(APPEND INC_SYS
    ${FFMPEG_INCLUDE_DIRS}
  )
  list(APPEND LIB
    ${FFMPEG_LIBRARIES}
  )
  add_definitions(-DWITH_FFMPEG)
endif()

if(WITH_CODEC_SNDFILE)
  add_definitions(-DWITH_SNDFILE)
endif()

if(WITH_COMPOSITOR_CPU)
  add_definitions(-DWITH_COMPOSITOR_CPU)
endif()

if(WITH_CYCLES)
  list(APPEND INC
    ../../../../intern/cycles/blender
  )
  list(APPEND LIB
    bf_intern_cycles
  )
  add_definitions(-DWITH_CYCLES)
endif()

if(WITH_CYCLES_OSL)
  add_definitions(-DWITH_CYCLES_OSL)
endif()

if(WITH_CYCLES_EMBREE)
  add_definitions(-DWITH_CYCLES_EMBREE)
endif()

if(WITH_FREESTYLE)
  list(APPEND INC
    ../../freestyle/intern/python
  )
  add_definitions(-DWITH_FREESTYLE)
endif()

if(WITH_IMAGE_CINEON)
  add_definitions(-DWITH_CINEON)
endif()

if(WITH_IMAGE_OPENEXR)
  add_definitions(-DWITH_OPENEXR)
endif()

if(WITH_IMAGE_OPENJPEG)
  add_definitions(-DWITH_OPENJPEG)
endif()

if(WITH_WEBP)
  add_definitions(-DWITH_WEBP)
endif()

if(WITH_INPUT_NDOF)
  add_definitions(-DWITH_INPUT_NDOF)
endif()

if(WITH_INTERNATIONAL)
  add_definitions(-DWITH_INTERNATIONAL)
endif()

if(WITH_OPENAL)
  add_definitions(-DWITH_OPENAL)
endif()

if(WITH_OPENSUBDIV)
  add_definitions(-DWITH_OPENSUBDIV)
endif()

if(WITH_SDL)
  list(APPEND INC_SYS
    ${SDL_INCLUDE_DIR}
  )
  if(WITH_SDL_DYNLOAD)
    list(APPEND LIB
      extern_sdlew
    )
  else()
    list(APPEND LIB
      ${SDL_LIBRARY}
    )
  endif()
  add_definitions(-DWITH_SDL)
endif()

if(WITH_SDL_DYNLOAD)
  list(APPEND INC
    ../../../../extern/sdlew/include
  )
  add_definitions(-DWITH_SDL_DYNLOAD)
endif()

if(WITH_JACK)
  add_definitions(-DWITH_JACK)
endif()

if(WITH_COREAUDIO)
  add_definitions(-DWITH_COREAUDIO)
endif()

if(WITH_LIBMV)
  add_definitions(-DWITH_LIBMV)
endif()

if(WITH_PULSEAUDIO)
  add_definitions(-DWITH_PULSEAUDIO)
endif()

if(WITH_WASAPI)
  add_definitions(-DWITH_WASAPI)
endif()

if(WITH_MOD_OCEANSIM)
  add_definitions(-DWITH_OCEANSIM)
endif()

if(WITH_MOD_REMESH)
  add_definitions(-DWITH_MOD_REMESH)
endif()

if(WITH_MOD_FLUID)
  add_definitions(-DWITH_FLUID)
endif()

if(WITH_OPENCOLLADA)
  add_definitions(-DWITH_COLLADA)
endif()

if(WITH_IO_WAVEFRONT_OBJ)
  add_definitions(-DWITH_IO_WAVEFRONT_OBJ)
endif()

if(WITH_IO_PLY)
  add_definitions(-DWITH_IO_PLY)
endif()

if(WITH_IO_STL)
  add_definitions(-DWITH_IO_STL)
endif()

if(WITH_IO_GPENCIL)
  add_definitions(-DWITH_IO_GPENCIL)
endif()

if(WITH_ALEMBIC)
  add_definitions(-DWITH_ALEMBIC)
endif()

if(WITH_OPENCOLORIO)
  add_definitions(-DWITH_OCIO)
endif()

if(WITH_OPENVDB)
  add_definitions(-DWITH_OPENVDB)
  list(APPEND INC
    ../../../../intern/openvdb
  )
endif()

if(WITH_ALEMBIC)
  add_definitions(-DWITH_ALEMBIC)
  list(APPEND INC
    ../../io/alembic
  )
endif()

if(WITH_USD)
  add_definitions(-DWITH_USD)
  list(APPEND INC
    ../../io/usd
  )
endif()

if(WITH_OPENSUBDIV)
  add_definitions(-DWITH_OPENSUBDIV)
  list(APPEND INC
    ../../../../intern/opensubdiv
  )
endif()

if(WITH_XR_OPENXR)
  add_definitions(-DWITH_XR_OPENXR)
endif()

if(WITH_POTRACE)
  add_definitions(-DWITH_POTRACE)
endif()

if(WITH_PUGIXML)
  add_definitions(-DWITH_PUGIXML)
endif()

if(WITH_HARU)
  add_definitions(-DWITH_HARU)
endif()

if(WITH_HYDRA)
  list(APPEND LIB
    bf_render_hydra
  )
  add_definitions(-DWITH_HYDRA)
endif()

blender_add_lib(bf_python "${SRC}" "${INC}" "${INC_SYS}" "${LIB}")

# RNA_prototypes.h
add_dependencies(bf_python bf_rna)
