# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright 2006 Blender Foundation. All rights reserved.

set(INC
  .
  ../blenfont
  ../blenlib
  ../blenloader
  ../blentranslation
  ../bmesh
  ../depsgraph
  ../draw
  ../functions
  ../gpencil_modifiers
  ../gpu
  ../ikplugin
  ../imbuf
  ../makesdna
  ../makesrna
  ../modifiers
  ../nodes
  ../render
  ../sequencer
  ../shader_fx
  ../simulation
  ../../../intern/eigen
  ../../../intern/ghost
  ../../../intern/guardedalloc
  ../../../intern/iksolver/extern
  ../../../intern/atomic
  ../../../intern/clog
  ../../../intern/libmv
  ../../../intern/mantaflow/extern
  ../../../intern/memutil
  ../../../intern/mikktspace
  ../../../intern/opensubdiv
  ../../../extern/curve_fit_nd

  # dna_type_offsets.h
  ${CMAKE_CURRENT_BINARY_DIR}/../makesdna/intern
  # RNA_prototypes.h
  ${CMAKE_BINARY_DIR}/source/blender/makesrna
)

set(INC_SYS
  ${ZLIB_INCLUDE_DIRS}

  # For `vfontdata_freetype.c`.
  ${FREETYPE_INCLUDE_DIRS}
)

set(SRC
  ${CMAKE_SOURCE_DIR}/release/datafiles/userdef/userdef_default.c
  intern/CCGSubSurf.c
  intern/CCGSubSurf_legacy.c
  intern/CCGSubSurf_util.c
  intern/DerivedMesh.cc
  intern/action.c
  intern/action_bones.cc
  intern/action_mirror.c
  intern/addon.c
  intern/anim_data.c
  intern/anim_path.c
  intern/anim_sys.c
  intern/anim_visualization.c
  intern/anonymous_attribute.cc
  intern/appdir.c
  intern/armature.c
  intern/armature_deform.c
  intern/armature_pose.cc
  intern/armature_selection.cc
  intern/armature_update.c
  intern/asset.cc
  intern/asset_catalog.cc
  intern/asset_catalog_path.cc
  intern/asset_library.cc
  intern/asset_library_service.cc
  intern/attribute.cc
  intern/attribute_access.cc
  intern/attribute_math.cc
  intern/autoexec.c
  intern/blender.c
  intern/blender_copybuffer.c
  intern/blender_undo.c
  intern/blender_user_menu.c
  intern/blendfile.c
  intern/blendfile_link_append.c
  intern/boids.c
  intern/bpath.c
  intern/brush.cc
  intern/bvhutils.cc
  intern/cachefile.c
  intern/callbacks.c
  intern/camera.c
  intern/cdderivedmesh.c
  intern/cloth.c
  intern/collection.c
  intern/collision.c
  intern/colorband.c
  intern/colortools.c
  intern/compute_contexts.cc
  intern/constraint.c
  intern/context.c
  intern/crazyspace.cc
  intern/cryptomatte.cc
  intern/curve.cc
  intern/curve_bevel.c
  intern/curve_bezier.cc
  intern/curve_catmull_rom.cc
  intern/curve_convert.c
  intern/curve_decimate.c
  intern/curve_deform.c
  intern/curve_legacy_convert.cc
  intern/curve_nurbs.cc
  intern/curve_poly.cc
  intern/curve_to_mesh_convert.cc
  intern/curveprofile.cc
  intern/curves.cc
  intern/curves_geometry.cc
  intern/curves_utils.cc
  intern/customdata.cc
  intern/customdata_file.c
  intern/data_transfer.c
  intern/deform.c
  intern/displist.cc
  intern/dynamicpaint.c
  intern/editlattice.c
  intern/editmesh.cc
  intern/editmesh_bvh.c
  intern/editmesh_cache.cc
  intern/editmesh_tangent.cc
  intern/effect.c
  intern/fcurve.c
  intern/fcurve_cache.c
  intern/fcurve_driver.c
  intern/fluid.c
  intern/fmodifier.c
  intern/freestyle.c
  intern/geometry_component_curves.cc
  intern/geometry_component_edit_data.cc
  intern/geometry_component_instances.cc
  intern/geometry_component_mesh.cc
  intern/geometry_component_pointcloud.cc
  intern/geometry_component_volume.cc
  intern/geometry_fields.cc
  intern/geometry_set.cc
  intern/geometry_set_instances.cc
  intern/gpencil.c
  intern/gpencil_curve.c
  intern/gpencil_geom.cc
  intern/gpencil_modifier.c
  intern/gpencil_update_cache.c
  intern/icons.cc
  intern/icons_rasterize.c
  intern/idprop.c
  intern/idprop_create.cc
  intern/idprop_serialize.cc
  intern/idprop_utils.c
  intern/idtype.c
  intern/image.cc
  intern/image_format.cc
  intern/image_gen.c
  intern/image_gpu.cc
  intern/image_partial_update.cc
  intern/image_save.cc
  intern/instances.cc
  intern/ipo.c
  intern/kelvinlet.c
  intern/key.c
  intern/keyconfig.c
  intern/lattice.c
  intern/lattice_deform.c
  intern/layer.c
  intern/layer_utils.c
  intern/lib_id.c
  intern/lib_id_delete.c
  intern/lib_id_eval.c
  intern/lib_id_remapper.cc
  intern/lib_override.cc
  intern/lib_override_proxy_conversion.c
  intern/lib_query.c
  intern/lib_remap.c
  intern/library.c
  intern/light.c
  intern/lightprobe.c
  intern/linestyle.c
  intern/main.c
  intern/main_idmap.c
  intern/main_namemap.cc
  intern/mask.c
  intern/mask_evaluate.c
  intern/mask_rasterize.c
  intern/material.c
  intern/mball.cc
  intern/mball_tessellate.cc
  intern/mesh.cc
  intern/mesh_boolean_convert.cc
  intern/mesh_calc_edges.cc
  intern/mesh_convert.cc
  intern/mesh_debug.cc
  intern/mesh_evaluate.cc
  intern/mesh_fair.cc
  intern/mesh_iterators.cc
  intern/mesh_legacy_convert.cc
  intern/mesh_mapping.cc
  intern/mesh_merge.c
  intern/mesh_merge_customdata.cc
  intern/mesh_mirror.c
  intern/mesh_normals.cc
  intern/mesh_remap.c
  intern/mesh_remesh_voxel.cc
  intern/mesh_runtime.cc
  intern/mesh_sample.cc
  intern/mesh_tangent.cc
  intern/mesh_tessellate.cc
  intern/mesh_validate.cc
  intern/mesh_wrapper.cc
  intern/modifier.cc
  intern/movieclip.c
  intern/multires.cc
  intern/multires_reshape.c
  intern/multires_reshape_apply_base.c
  intern/multires_reshape_ccg.c
  intern/multires_reshape_smooth.c
  intern/multires_reshape_subdivide.c
  intern/multires_reshape_util.c
  intern/multires_reshape_vertcos.c
  intern/multires_subdiv.c
  intern/multires_unsubdivide.c
  intern/multires_versioning.c
  intern/nla.c
  intern/node.cc
  intern/node_runtime.cc
  intern/node_tree_update.cc
  intern/object.cc
  intern/object_deform.c
  intern/object_dupli.cc
  intern/object_facemap.c
  intern/object_update.cc
  intern/ocean.c
  intern/ocean_spectrum.c
  intern/outliner_treehash.cc
  intern/packedFile.c
  intern/paint.cc
  intern/paint_canvas.cc
  intern/paint_toolslots.c
  intern/particle.c
  intern/particle_child.c
  intern/particle_distribute.c
  intern/particle_system.c
  intern/pbvh.c
  intern/pbvh.cc
  intern/pbvh_bmesh.c
  intern/pbvh_pixels.cc
  intern/pointcache.c
  intern/pointcloud.cc
  intern/preferences.c
  intern/report.c
  intern/rigidbody.c
  intern/scene.cc
  intern/screen.c
  intern/shader_fx.c
  intern/shrinkwrap.cc
  intern/simulation.cc
  intern/softbody.c
  intern/sound.c
  intern/speaker.c
  intern/studiolight.c
  intern/subdiv.c
  intern/subdiv_ccg.cc
  intern/subdiv_ccg_mask.c
  intern/subdiv_ccg_material.c
  intern/subdiv_converter.c
  intern/subdiv_converter_mesh.c
  intern/subdiv_deform.c
  intern/subdiv_displacement.c
  intern/subdiv_displacement_multires.c
  intern/subdiv_eval.c
  intern/subdiv_foreach.c
  intern/subdiv_mesh.cc
  intern/subdiv_modifier.cc
  intern/subdiv_stats.c
  intern/subdiv_topology.c
  intern/subsurf_ccg.c
  intern/text.c
  intern/text_suggestions.c
  intern/texture.c
  intern/tracking.c
  intern/tracking_auto.c
  intern/tracking_detect.c
  intern/tracking_plane_tracker.c
  intern/tracking_region_tracker.c
  intern/tracking_solver.c
  intern/tracking_stabilize.c
  intern/tracking_util.c
  intern/type_conversions.cc
  intern/undo_system.c
  intern/unit.c
  intern/vfont.c
  intern/vfontdata_freetype.c
  intern/viewer_path.cc
  intern/volume.cc
  intern/volume_render.cc
  intern/volume_to_mesh.cc
  intern/workspace.cc
  intern/world.c
  intern/writeavi.c

  BKE_DerivedMesh.h
  BKE_action.h
  BKE_action.hh
  BKE_addon.h
  BKE_anim_data.h
  BKE_anim_path.h
  BKE_anim_visualization.h
  BKE_animsys.h
  BKE_anonymous_attribute.h
  BKE_anonymous_attribute.hh
  BKE_appdir.h
  BKE_armature.h
  BKE_armature.hh
  BKE_asset.h
  BKE_asset_catalog.hh
  BKE_asset_catalog_path.hh
  BKE_asset_library.h
  BKE_asset_library.hh
  BKE_attribute.h
  BKE_attribute.hh
  BKE_attribute_math.hh
  BKE_autoexec.h
  BKE_blender.h
  BKE_blender_copybuffer.h
  BKE_blender_undo.h
  BKE_blender_user_menu.h
  BKE_blender_version.h
  BKE_blendfile.h
  BKE_blendfile_link_append.h
  BKE_boids.h
  BKE_bpath.h
  BKE_brush.h
  BKE_bvhutils.h
  BKE_cachefile.h
  BKE_callbacks.h
  BKE_camera.h
  BKE_ccg.h
  BKE_cdderivedmesh.h
  BKE_cloth.h
  BKE_collection.h
  BKE_collision.h
  BKE_colorband.h
  BKE_colortools.h
  BKE_compute_contexts.hh
  BKE_constraint.h
  BKE_context.h
  BKE_crazyspace.h
  BKE_crazyspace.hh
  BKE_cryptomatte.h
  BKE_cryptomatte.hh
  BKE_curve.h
  BKE_curve_legacy_convert.hh
  BKE_curve_to_mesh.hh
  BKE_curveprofile.h
  BKE_curves.h
  BKE_curves.hh
  BKE_curves_utils.hh
  BKE_customdata.h
  BKE_customdata_file.h
  BKE_data_transfer.h
  BKE_deform.h
  BKE_displist.h
  BKE_duplilist.h
  BKE_dynamicpaint.h
  BKE_editlattice.h
  BKE_editmesh.h
  BKE_editmesh_bvh.h
  BKE_editmesh_cache.h
  BKE_editmesh_tangent.h
  BKE_effect.h
  BKE_fcurve.h
  BKE_fcurve_driver.h
  BKE_fluid.h
  BKE_freestyle.h
  BKE_geometry_fields.hh
  BKE_geometry_set.h
  BKE_geometry_set.hh
  BKE_geometry_set_instances.hh
  BKE_global.h
  BKE_gpencil.h
  BKE_gpencil_curve.h
  BKE_gpencil_geom.h
  BKE_gpencil_modifier.h
  BKE_gpencil_update_cache.h
  BKE_icons.h
  BKE_idprop.h
  BKE_idprop.hh
  BKE_idtype.h
  BKE_image.h
  BKE_image_format.h
  BKE_image_partial_update.hh
  BKE_image_save.h
  BKE_image_wrappers.hh
  BKE_instances.hh
  BKE_ipo.h
  BKE_kelvinlet.h
  BKE_key.h
  BKE_keyconfig.h
  BKE_lattice.h
  BKE_layer.h
  BKE_lib_id.h
  BKE_lib_override.h
  BKE_lib_query.h
  BKE_lib_remap.h
  BKE_library.h
  BKE_light.h
  BKE_lightprobe.h
  BKE_linestyle.h
  BKE_main.h
  BKE_main_idmap.h
  BKE_main_namemap.h
  BKE_mask.h
  BKE_material.h
  BKE_mball.h
  BKE_mball_tessellate.h
  BKE_mesh.h
  BKE_mesh_boolean_convert.hh
  BKE_mesh_fair.h
  BKE_mesh_iterators.h
  BKE_mesh_legacy_convert.h
  BKE_mesh_mapping.h
  BKE_mesh_mirror.h
  BKE_mesh_remap.h
  BKE_mesh_remesh_voxel.h
  BKE_mesh_runtime.h
  BKE_mesh_sample.hh
  BKE_mesh_tangent.h
  BKE_mesh_types.h
  BKE_mesh_wrapper.h
  BKE_modifier.h
  BKE_movieclip.h
  BKE_multires.h
  BKE_nla.h
  BKE_node.h
  BKE_node_runtime.hh
  BKE_node_tree_update.h
  BKE_object.h
  BKE_object_deform.h
  BKE_object_facemap.h
  BKE_ocean.h
  BKE_outliner_treehash.hh
  BKE_packedFile.h
  BKE_paint.h
  BKE_particle.h
  BKE_pbvh.h
  BKE_pbvh_pixels.hh
  BKE_pointcache.h
  BKE_pointcloud.h
  BKE_preferences.h
  BKE_report.h
  BKE_rigidbody.h
  BKE_scene.h
  BKE_screen.h
  BKE_sequencer_offscreen.h
  BKE_shader_fx.h
  BKE_shrinkwrap.h
  BKE_simulation.h
  BKE_softbody.h
  BKE_sound.h
  BKE_speaker.h
  BKE_studiolight.h
  BKE_subdiv.h
  BKE_subdiv_ccg.h
  BKE_subdiv_deform.h
  BKE_subdiv_eval.h
  BKE_subdiv_foreach.h
  BKE_subdiv_mesh.h
  BKE_subdiv_modifier.h
  BKE_subdiv_topology.h
  BKE_subsurf.h
  BKE_text.h
  BKE_text_suggestions.h
  BKE_texture.h
  BKE_tracking.h
  BKE_type_conversions.hh
  BKE_undo_system.h
  BKE_unit.h
  BKE_vfont.h
  BKE_vfontdata.h
  BKE_viewer_path.h
  BKE_volume.h
  BKE_volume_render.h
  BKE_volume_to_mesh.hh
  BKE_workspace.h
  BKE_world.h
  BKE_writeavi.h

  nla_private.h
  particle_private.h
  tracking_private.h
  intern/CCGSubSurf.h
  intern/CCGSubSurf_inline.h
  intern/CCGSubSurf_intern.h
  intern/asset_library_service.hh
  intern/attribute_access_intern.hh
  intern/data_transfer_intern.h
  intern/lib_intern.h
  intern/multires_inline.h
  intern/multires_reshape.h
  intern/multires_unsubdivide.h
  intern/ocean_intern.h
  intern/pbvh_intern.h
  intern/subdiv_converter.h
  intern/subdiv_inline.h
)

set(LIB
  bf_blenfont
  bf_blenlib
  bf_blenloader
  bf_blentranslation
  bf_bmesh
  bf_depsgraph
  bf_draw
  bf_functions
  bf_gpencil_modifiers
  bf_gpu
  bf_ikplugin
  bf_imbuf
  bf_intern_clog
  bf_intern_ghost
  bf_intern_guardedalloc
  bf_intern_libmv  # Uses stub when disabled.
  bf_intern_mikktspace
  bf_intern_opensubdiv  # Uses stub when disabled.
  bf_modifiers
  bf_nodes
  bf_rna
  bf_shader_fx
  bf_simulation

  # For `vfontdata_freetype.c`.
  ${FREETYPE_LIBRARIES} ${BROTLI_LIBRARIES}
)

if(WITH_BINRELOC)
  list(APPEND INC_SYS
    ${BINRELOC_INCLUDE_DIRS}
  )
  list(APPEND LIB
    extern_binreloc
  )
  add_definitions(-DWITH_BINRELOC)
endif()


if(WIN32)
  list(APPEND INC
    ../../../intern/utfconv
  )
endif()

if(WITH_AUDASPACE)
  add_definitions(-DWITH_AUDASPACE)

  list(APPEND INC_SYS
    ${AUDASPACE_C_INCLUDE_DIRS}
  )
  list(APPEND LIB
    ${AUDASPACE_C_LIBRARIES}
    ${AUDASPACE_PY_LIBRARIES}
  )
endif()

if(WITH_BULLET)
  list(APPEND INC_SYS
    ${BULLET_INCLUDE_DIRS}
  )
  list(APPEND INC
    ../../../intern/rigidbody
  )

  if(NOT WITH_SYSTEM_BULLET)
    list(APPEND LIB
      extern_bullet
    )
  endif()

  list(APPEND LIB
    bf_intern_rigidbody

    ${BULLET_LIBRARIES}
  )
  add_definitions(-DWITH_BULLET)
endif()

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

if(WITH_IMAGE_TIFF)
  add_definitions(-DWITH_TIFF)
endif()

if(WITH_OPENIMAGEIO)
  add_definitions(-DWITH_OPENIMAGEIO)
endif()

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

if(WITH_IMAGE_DDS)
  add_definitions(-DWITH_DDS)
endif()

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

if(WITH_IMAGE_HDR)
  add_definitions(-DWITH_HDR)
endif()

if(WITH_IMAGE_WEBP)
  add_definitions(-DWITH_WEBP)
endif()

if(WITH_CODEC_AVI)
  list(APPEND INC
    ../io/avi
  )
  add_definitions(-DWITH_AVI)
endif()

if(WITH_CODEC_FFMPEG)
  list(APPEND SRC
    intern/writeffmpeg.c
    BKE_writeffmpeg.h
  )
  list(APPEND INC
    ../../../intern/ffmpeg
  )
  list(APPEND INC_SYS
    ${FFMPEG_INCLUDE_DIRS}
  )
  list(APPEND LIB
    ${FFMPEG_LIBRARIES}
  )
  add_definitions(-DWITH_FFMPEG)
endif()

if(WITH_PYTHON)
  list(APPEND INC
    ../python
  )
  list(APPEND LIB
    bf_python
    bf_python_bmesh
  )
  add_definitions(-DWITH_PYTHON)

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

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

  if(WITH_PYTHON_SECURITY)
    add_definitions(-DWITH_PYTHON_SECURITY)
  endif()


  if(PYTHON_EXECUTABLE)
    get_filename_component(_python_exe_name ${PYTHON_EXECUTABLE} NAME)
    add_definitions(-DPYTHON_EXECUTABLE_NAME=${_python_exe_name})
    unset(_python_exe_name)
  endif()
endif()

if(WITH_MOD_FLUID)
  list(APPEND LIB
    bf_intern_mantaflow
  )
  add_definitions(-DWITH_FLUID)
endif()

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

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

if(WITH_LZO)
  if(WITH_SYSTEM_LZO)
    list(APPEND INC_SYS
      ${LZO_INCLUDE_DIR}
    )
    list(APPEND LIB
      ${LZO_LIBRARIES}
    )
    add_definitions(-DWITH_SYSTEM_LZO)
  else()
    list(APPEND INC_SYS
      ../../../extern/lzo/minilzo
    )
    list(APPEND LIB
      extern_minilzo
    )
  endif()
  add_definitions(-DWITH_LZO)
endif()

if(WITH_LZMA)
  list(APPEND INC_SYS
    ../../../extern/lzma
  )
  list(APPEND LIB
    extern_lzma
  )
  add_definitions(-DWITH_LZMA)
endif()

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

if(WITH_FFTW3)
  list(APPEND INC_SYS
    ${FFTW3_INCLUDE_DIRS}
  )
  list(APPEND LIB
    ${FFTW3_LIBRARIES}
  )
  add_definitions(-DFFTW3=1)
endif()

if(WITH_FREESTYLE)
  add_definitions(-DWITH_FREESTYLE)
endif()

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

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

if(WITH_OPENSUBDIV)
  list(APPEND INC_SYS
    ${OPENSUBDIV_INCLUDE_DIRS}
  )
  list(APPEND LIB
    ${OPENSUBDIV_LIBRARIES}
  )
  add_definitions(-DWITH_OPENSUBDIV)
endif()

if(WITH_OPENVDB)
  list(APPEND INC
    ../../../intern/openvdb
  )
  list(APPEND INC_SYS
    ${OPENVDB_INCLUDE_DIRS}
  )
  list(APPEND LIB
    bf_intern_openvdb
    ${OPENVDB_LIBRARIES}
  )
  add_definitions(-DWITH_OPENVDB ${OPENVDB_DEFINITIONS})
endif()

if(WITH_QUADRIFLOW)
  list(APPEND INC
    ../../../intern/quadriflow
  )
  list(APPEND LIB
    bf_intern_quadriflow
  )
  add_definitions(-DWITH_QUADRIFLOW)
endif()

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

if(WITH_TBB)
  add_definitions(-DWITH_TBB)

  list(APPEND INC_SYS
    ${TBB_INCLUDE_DIRS}
  )

  list(APPEND LIB
    ${TBB_LIBRARIES}
  )
endif()

if(WITH_GMP)
  add_definitions(-DWITH_GMP)

  list(APPEND INC_SYS
    ${GMP_INCLUDE_DIRS}
  )
endif()

# # Warnings as errors, this is too strict!
# if(MSVC)
#    string(APPEND CMAKE_C_FLAGS " /WX")
# endif()

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

# Needed so we can use dna_type_offsets.h for defaults initialization.
add_dependencies(bf_blenkernel bf_dna)
# RNA_prototypes.h
add_dependencies(bf_blenkernel bf_rna)


if(WITH_GTESTS)
  set(TEST_SRC
    intern/action_test.cc
    intern/armature_test.cc
    intern/asset_catalog_path_test.cc
    intern/asset_catalog_test.cc
    intern/asset_library_service_test.cc
    intern/asset_library_test.cc
    intern/asset_test.cc
    intern/bpath_test.cc
    intern/cryptomatte_test.cc
    intern/curves_geometry_test.cc
    intern/fcurve_test.cc
    intern/idprop_serialize_test.cc
    intern/image_partial_update_test.cc
    intern/image_test.cc
    intern/lattice_deform_test.cc
    intern/layer_test.cc
    intern/lib_id_remapper_test.cc
    intern/lib_id_test.cc
    intern/lib_remap_test.cc
    intern/tracking_test.cc
  )
  set(TEST_INC
    ../editors/include
  )
  include(GTestTesting)
  blender_add_test_lib(bf_blenkernel_tests "${TEST_SRC}" "${INC};${TEST_INC}" "${INC_SYS}" "${LIB}")

  # RNA_prototypes.h
  add_dependencies(bf_blenkernel_tests bf_rna)
endif()
