cmake_minimum_required(VERSION 3.12)
project(wolf2009_archive LANGUAGES C CXX)

# This project is intentionally independent of the engine/editor/game modules.
set(WOLF2009_MINIZ_SOURCE_DIR "" CACHE PATH "Optional upstream miniz directory containing miniz.c/miniz.h")
if(WOLF2009_MINIZ_SOURCE_DIR)
    add_library(wolf2009_miniz STATIC "${WOLF2009_MINIZ_SOURCE_DIR}/miniz.c")
    target_include_directories(wolf2009_miniz PUBLIC "${WOLF2009_MINIZ_SOURCE_DIR}")
    target_compile_definitions(wolf2009_miniz PUBLIC WOLF2009_USE_MINIZ)
    set(wolf2009_compression wolf2009_miniz)
else()
    find_package(ZLIB REQUIRED)
    set(wolf2009_compression ZLIB::ZLIB)
endif()

add_library(wolf2009_archive STATIC Archive.cpp StreamMounts.cpp)
target_compile_features(wolf2009_archive PUBLIC cxx_std_11)
target_include_directories(wolf2009_archive PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
target_link_libraries(wolf2009_archive PUBLIC ${wolf2009_compression})
add_executable(wolf2009-inspect Inspect.cpp SelfTest.cpp)
target_link_libraries(wolf2009-inspect PRIVATE wolf2009_archive)
enable_testing()
add_test(NAME wolf2009_archive_selftest COMMAND wolf2009-inspect --self-test)

add_library(wolf2009_geometry STATIC Geometry.cpp)
target_compile_features(wolf2009_geometry PUBLIC cxx_std_11)
target_include_directories(wolf2009_geometry PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
add_executable(wolf2009-scene SceneExport.cpp GeometryTest.cpp)
target_link_libraries(wolf2009-scene PRIVATE wolf2009_geometry wolf2009_archive)
add_test(NAME wolf2009_geometry_selftest COMMAND wolf2009-scene --self-test)

add_library(wolf2009_content STATIC Dds.cpp Entities.cpp Material.cpp SkinCatalog.cpp)
target_compile_features(wolf2009_content PUBLIC cxx_std_11)
target_include_directories(wolf2009_content PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
add_library(wolf2009_player_start STATIC PlayerStart.cpp)
target_link_libraries(wolf2009_player_start PUBLIC wolf2009_geometry wolf2009_content)
add_library(wolf2009_brain STATIC BrainGraph.cpp BrainFlow.cpp BrainTask.cpp BrainLiteralActions.cpp)
target_compile_features(wolf2009_brain PUBLIC cxx_std_11)
target_include_directories(wolf2009_brain PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
add_executable(wolf2009-brains BrainInspect.cpp BrainGraphTest.cpp)
target_link_libraries(wolf2009-brains PRIVATE wolf2009_brain wolf2009_archive)
add_test(NAME wolf2009_brain_selftest COMMAND wolf2009-brains --self-test)
add_executable(wolf2009-brain-flow BrainFlowTest.cpp)
target_compile_definitions(wolf2009-brain-flow PRIVATE WOLF2009_BRAIN_FLOW_TEST_MAIN=1)
target_link_libraries(wolf2009-brain-flow PRIVATE wolf2009_brain wolf2009_archive)
add_test(NAME wolf2009_brain_flow_selftest COMMAND wolf2009-brain-flow --self-test)
add_executable(wolf2009-brain-task BrainTaskTest.cpp)
target_compile_definitions(wolf2009-brain-task PRIVATE WOLF2009_BRAIN_TASK_TEST_MAIN=1)
target_link_libraries(wolf2009-brain-task PRIVATE wolf2009_brain wolf2009_archive)
add_test(NAME wolf2009_brain_task_selftest COMMAND wolf2009-brain-task --self-test)
add_executable(wolf2009-brain-literals BrainLiteralActionsTest.cpp)
target_compile_definitions(wolf2009-brain-literals PRIVATE WOLF2009_BRAIN_LITERAL_TEST_MAIN)
target_link_libraries(wolf2009-brain-literals PRIVATE wolf2009_brain)
add_test(NAME wolf2009_brain_literal_actions COMMAND wolf2009-brain-literals)
add_library(wolf2009_physics STATIC MapPhysics.cpp StaticCollision.cpp ConvexContact.cpp PlayerMove.cpp LinearMover.cpp MovingSupport.cpp BrainStartup.cpp)
target_link_libraries(wolf2009_physics PUBLIC wolf2009_player_start wolf2009_archive wolf2009_brain)
add_library(wolf2009_placement STATIC ModelPlacement.cpp)
target_link_libraries(wolf2009_placement PUBLIC wolf2009_content wolf2009_geometry wolf2009_archive)
target_sources(wolf2009_physics PRIVATE WagonScene.cpp TrainArrival.cpp DoorAnimation.cpp DoorModel.cpp TrainDoorSignal.cpp GreeterAnimation.cpp GreeterModel.cpp TrainStopScene.cpp RiderMovement.cpp)
target_link_libraries(wolf2009_physics PUBLIC wolf2009_placement)
target_sources(wolf2009-scene PRIVATE PlayerStartTest.cpp ModelPlacementTest.cpp)
target_link_libraries(wolf2009-scene PRIVATE wolf2009_physics)
target_link_libraries(wolf2009-scene PRIVATE wolf2009_placement)
add_executable(wolf2009-walk Walk.cpp StaticCollisionTest.cpp PlayerMoveTest.cpp LinearMoverTest.cpp MovingSupportTest.cpp ModelCollisionTest.cpp ConvexContactTest.cpp ModelConvexCollisionTest.cpp ModelPrimitiveCollisionTest.cpp BrainStartupTest.cpp WagonSceneTest.cpp TrainArrivalTest.cpp TrainDoorSignalTest.cpp DoorModelTest.cpp GreeterAnimationTest.cpp GreeterModelTest.cpp RiderMovementTest.cpp)
target_link_libraries(wolf2009-walk PRIVATE wolf2009_physics)
add_test(NAME wolf2009_walk_selftest COMMAND wolf2009-walk --self-test)
add_executable(wolf2009-trainyard-exit TrainyardExit.cpp TrainyardExitTest.cpp SourceMapBodies.cpp Entities.cpp)
target_compile_features(wolf2009-trainyard-exit PRIVATE cxx_std_11)
add_test(NAME wolf2009_trainyard_exit_synthetic COMMAND wolf2009-trainyard-exit)
add_library(wolf2009_world_collision STATIC WorldCollisionGeometry.cpp)
target_compile_features(wolf2009_world_collision PUBLIC cxx_std_11)
target_include_directories(wolf2009_world_collision PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
add_executable(wolf2009-world-collision ../idtech4a_gameplay/WorldCollisionGeometryTest.cpp)
target_link_libraries(wolf2009-world-collision PRIVATE wolf2009_world_collision wolf2009_physics)
add_test(NAME wolf2009_world_collision_selftest COMMAND wolf2009-world-collision)
add_library(wolf2009_havok_triangles STATIC HavokTriangleMesh.cpp HavokTriangleQuery.cpp)
target_compile_features(wolf2009_havok_triangles PUBLIC cxx_std_11)
target_include_directories(wolf2009_havok_triangles PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
add_executable(wolf2009-havok-triangles ../../tests/HavokTriangleMesh.cpp)
target_link_libraries(wolf2009-havok-triangles PRIVATE wolf2009_havok_triangles wolf2009_physics)
add_test(NAME wolf2009_havok_triangle_synthetic COMMAND wolf2009-havok-triangles)
add_executable(wolf2009-havok-triangle-query ../../tests/HavokTriangleQuery.cpp)
target_link_libraries(wolf2009-havok-triangle-query PRIVATE wolf2009_havok_triangles wolf2009_physics)
add_test(NAME wolf2009_havok_triangle_query_synthetic COMMAND wolf2009-havok-triangle-query)
add_library(wolf2009_world_triangles STATIC WorldTriangleGeometry.cpp)
target_compile_features(wolf2009_world_triangles PUBLIC cxx_std_11)
target_link_libraries(wolf2009_world_triangles PUBLIC wolf2009_world_collision wolf2009_havok_triangles)
target_link_libraries(wolf2009-havok-triangle-query PRIVATE wolf2009_world_triangles)
add_library(wolf2009_support_collision STATIC SupportCollisionWorld.cpp)
target_compile_features(wolf2009_support_collision PUBLIC cxx_std_11)
target_link_libraries(wolf2009_support_collision PUBLIC wolf2009_world_triangles)
add_executable(wolf2009-support-collision ../../tests/SupportCollisionWorld.cpp)
target_link_libraries(wolf2009-support-collision PRIVATE wolf2009_support_collision wolf2009_physics)
add_test(NAME wolf2009_support_collision_synthetic COMMAND wolf2009-support-collision)
add_library(wolf2009_havok_primitive_support STATIC HavokPrimitiveSupport.cpp)
target_compile_features(wolf2009_havok_primitive_support PUBLIC cxx_std_11)
target_include_directories(wolf2009_havok_primitive_support PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
add_executable(wolf2009-havok-primitive-support ../../tests/HavokPrimitiveSupport.cpp)
target_link_libraries(wolf2009-havok-primitive-support PRIVATE wolf2009_havok_primitive_support
    wolf2009_havok_triangles wolf2009_world_collision wolf2009_physics)
add_test(NAME wolf2009_havok_primitive_support_synthetic COMMAND wolf2009-havok-primitive-support)
target_link_libraries(wolf2009_support_collision PUBLIC wolf2009_havok_primitive_support)
add_executable(wolf2009-havok-cylinder-virtual ../../tests/HavokCylinderVirtual.cpp)
target_link_libraries(wolf2009-havok-cylinder-virtual PRIVATE wolf2009_support_collision wolf2009_physics)
add_test(NAME wolf2009_havok_cylinder_virtual_synthetic COMMAND wolf2009-havok-cylinder-virtual)
add_library(wolf2009_collision_filter STATIC CollisionFilter.cpp)
target_compile_features(wolf2009_collision_filter PUBLIC cxx_std_11)
target_include_directories(wolf2009_collision_filter PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
add_executable(wolf2009-collision-filter ../../tests/CollisionFilter.cpp)
target_link_libraries(wolf2009-collision-filter PRIVATE wolf2009_collision_filter)
add_test(NAME wolf2009_collision_filter_synthetic COMMAND wolf2009-collision-filter)
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../../third_party/bullet_narrowphase"
                 "${CMAKE_CURRENT_BINARY_DIR}/bullet_narrowphase")
add_library(wolf2009_rounded_convex STATIC RoundedConvex.cpp)
target_compile_features(wolf2009_rounded_convex PUBLIC cxx_std_11)
target_include_directories(wolf2009_rounded_convex PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
target_link_libraries(wolf2009_rounded_convex PRIVATE wolf2009_bullet_narrowphase)
add_executable(wolf2009-rounded-convex RoundedConvexTest.cpp)
target_link_libraries(wolf2009-rounded-convex PRIVATE wolf2009_rounded_convex)
add_test(NAME wolf2009_rounded_convex_synthetic COMMAND wolf2009-rounded-convex)
add_library(wolf2009_support_collision_index STATIC SupportCollisionIndex.cpp)
target_compile_features(wolf2009_support_collision_index PUBLIC cxx_std_11)
target_link_libraries(wolf2009_support_collision_index PUBLIC wolf2009_support_collision wolf2009_rounded_convex)
add_executable(wolf2009-support-collision-index ../../tests/SupportCollisionIndex.cpp)
target_link_libraries(wolf2009-support-collision-index PRIVATE wolf2009_support_collision_index wolf2009_physics)
add_test(NAME wolf2009_support_collision_index_synthetic COMMAND wolf2009-support-collision-index)
add_library(wolf2009_support_gameplay_map STATIC
    ../idtech4a_gameplay/SupportGameplayMap.cpp ../idtech4a_gameplay/GameplayMap.cpp SourceMapBodies.cpp SourceCollisionBinding.cpp)
target_compile_features(wolf2009_support_gameplay_map PRIVATE cxx_std_11)
target_include_directories(wolf2009_support_gameplay_map PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../idtech4a_gameplay")
target_link_libraries(wolf2009_support_gameplay_map PUBLIC wolf2009_support_collision_index wolf2009_physics)
add_executable(wolf2009-support-gameplay-map ../idtech4a_gameplay/SupportGameplayMapTest.cpp)
target_link_libraries(wolf2009-support-gameplay-map PRIVATE wolf2009_support_gameplay_map)
add_executable(wolf2009-source-collision-binding ../../tests/source-collision-binding/SourceCollisionBindingChecks.cpp)
target_link_libraries(wolf2009-source-collision-binding PRIVATE wolf2009_support_gameplay_map)
add_test(NAME wolf2009_source_collision_binding COMMAND wolf2009-source-collision-binding --self-test)
add_test(NAME wolf2009_source_support_map_synthetic COMMAND wolf2009-support-gameplay-map --self-test)
add_executable(wolf2009-world-triangles ../../tests/WorldTriangleGeometry.cpp)
target_link_libraries(wolf2009-world-triangles PRIVATE wolf2009_world_triangles wolf2009_physics)
add_test(NAME wolf2009_world_triangles_synthetic COMMAND wolf2009-world-triangles)
add_executable(wolf2009-world-material-profile ../idtech4a_gameplay/WorldCollisionMaterialProfileTest.cpp)
target_link_libraries(wolf2009-world-material-profile PRIVATE wolf2009_world_collision wolf2009_physics)
add_test(NAME wolf2009_world_material_profile COMMAND wolf2009-world-material-profile)
set(WOLF2009_TRAINYARD_MPK "" CACHE FILEPATH "Owner-supplied trainyard.mpk for the parked wagon contact test")
if(WOLF2009_TRAINYARD_MPK)
    add_test(NAME wolf2009_source_collision_binding_trainyard COMMAND wolf2009-source-collision-binding --source-map "${WOLF2009_TRAINYARD_MPK}")
    add_executable(wolf2009-wagon-contacts ../../tests/WagonContacts.cpp)
    target_link_libraries(wolf2009-wagon-contacts PRIVATE wolf2009_physics)
    add_test(NAME wolf2009_wagon_contacts COMMAND wolf2009-wagon-contacts "${WOLF2009_TRAINYARD_MPK}")
    add_executable(wolf2009-door-animation ../../tests/TrainDoorAnimation.cpp)
    target_link_libraries(wolf2009-door-animation PRIVATE wolf2009_physics)
    add_test(NAME wolf2009_door_animation COMMAND wolf2009-door-animation "${WOLF2009_TRAINYARD_MPK}")
    add_test(NAME wolf2009_world_collision_trainyard COMMAND wolf2009-world-collision "${WOLF2009_TRAINYARD_MPK}")
    add_test(NAME wolf2009_support_collision_trainyard COMMAND wolf2009-support-collision "${WOLF2009_TRAINYARD_MPK}")
    add_test(NAME wolf2009_support_collision_index_trainyard COMMAND wolf2009-support-collision-index --source-map "${WOLF2009_TRAINYARD_MPK}")
    add_test(NAME wolf2009_support_collision_index_trainyard_envelope COMMAND wolf2009-support-collision-index --cylinder-envelope --source-map "${WOLF2009_TRAINYARD_MPK}")
    add_test(NAME wolf2009_havok_primitive_support_trainyard COMMAND wolf2009-havok-primitive-support --survey "${WOLF2009_TRAINYARD_MPK}")
    add_test(NAME wolf2009_havok_cylinder_virtual_trainyard COMMAND wolf2009-havok-cylinder-virtual --source-map "${WOLF2009_TRAINYARD_MPK}")
    add_test(NAME wolf2009_havok_triangle_trainyard COMMAND wolf2009-havok-triangles "${WOLF2009_TRAINYARD_MPK}")
    add_test(NAME wolf2009_havok_triangle_query_trainyard COMMAND wolf2009-havok-triangle-query "${WOLF2009_TRAINYARD_MPK}")
    add_test(NAME wolf2009_world_triangles_trainyard COMMAND wolf2009-world-triangles "${WOLF2009_TRAINYARD_MPK}")
    add_test(NAME wolf2009_world_material_trainyard COMMAND wolf2009-world-material-profile "${WOLF2009_TRAINYARD_MPK}")
endif()
set(WOLF2009_SP_BASE "" CACHE PATH "Owner-supplied SP/base folder for the trainyard gameplay test")
if(WOLF2009_SP_BASE)
    add_executable(wolf2009-train-stop ../../tests/TrainStopScene.cpp)
    target_link_libraries(wolf2009-train-stop PRIVATE wolf2009_physics)
    add_test(NAME wolf2009_train_stop COMMAND wolf2009-train-stop "${WOLF2009_SP_BASE}")
    if(EXISTS "${WOLF2009_SP_BASE}/maps/game/mtw/mtw_ware.mpk")
        add_test(NAME wolf2009_world_collision_warehouse COMMAND wolf2009-world-collision "${WOLF2009_SP_BASE}/maps/game/mtw/mtw_ware.mpk")
        add_test(NAME wolf2009_support_collision_warehouse COMMAND wolf2009-support-collision "${WOLF2009_SP_BASE}/maps/game/mtw/mtw_ware.mpk")
        add_test(NAME wolf2009_support_collision_index_warehouse COMMAND wolf2009-support-collision-index --source-map "${WOLF2009_SP_BASE}/maps/game/mtw/mtw_ware.mpk")
        add_test(NAME wolf2009_support_collision_index_warehouse_envelope COMMAND wolf2009-support-collision-index --cylinder-envelope --source-map "${WOLF2009_SP_BASE}/maps/game/mtw/mtw_ware.mpk")
        add_test(NAME wolf2009_havok_primitive_support_warehouse COMMAND wolf2009-havok-primitive-support --survey "${WOLF2009_SP_BASE}/maps/game/mtw/mtw_ware.mpk")
        add_test(NAME wolf2009_havok_cylinder_virtual_warehouse COMMAND wolf2009-havok-cylinder-virtual --source-map "${WOLF2009_SP_BASE}/maps/game/mtw/mtw_ware.mpk")
        add_test(NAME wolf2009_havok_triangle_warehouse COMMAND wolf2009-havok-triangles "${WOLF2009_SP_BASE}/maps/game/mtw/mtw_ware.mpk")
        add_test(NAME wolf2009_havok_triangle_query_warehouse COMMAND wolf2009-havok-triangle-query "${WOLF2009_SP_BASE}/maps/game/mtw/mtw_ware.mpk")
        add_test(NAME wolf2009_world_triangles_warehouse COMMAND wolf2009-world-triangles "${WOLF2009_SP_BASE}/maps/game/mtw/mtw_ware.mpk")
        add_test(NAME wolf2009_world_material_warehouse COMMAND wolf2009-world-material-profile "${WOLF2009_SP_BASE}/maps/game/mtw/mtw_ware.mpk")
    endif()
    if(EXISTS "${WOLF2009_SP_BASE}/maps/game/empty/empty.mpk")
        add_test(NAME wolf2009_source_support_map_empty COMMAND wolf2009-support-gameplay-map
            --source-map "${WOLF2009_SP_BASE}/maps/game/empty/empty.mpk")
        add_test(NAME wolf2009_havok_cylinder_virtual_empty COMMAND wolf2009-havok-cylinder-virtual --source-map "${WOLF2009_SP_BASE}/maps/game/empty/empty.mpk")
        add_test(NAME wolf2009_support_collision_index_empty COMMAND wolf2009-support-collision-index --source-map "${WOLF2009_SP_BASE}/maps/game/empty/empty.mpk")
    endif()
endif()
add_library(wolf2009_zip STATIC ZipArchive.cpp)
target_compile_features(wolf2009_zip PUBLIC cxx_std_11)
target_include_directories(wolf2009_zip PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
target_link_libraries(wolf2009_zip PUBLIC ${wolf2009_compression})
target_sources(wolf2009_content PRIVATE DeclarationText.cpp ScriptedVoice.cpp)
target_link_libraries(wolf2009_content PUBLIC wolf2009_zip wolf2009_archive)
add_executable(wolf2009-content ContentTest.cpp DdsTest.cpp EntitiesTest.cpp MaterialTest.cpp SkinCatalogTest.cpp ZipTest.cpp StreamMountsTest.cpp ScriptedVoiceTest.cpp)
target_link_libraries(wolf2009-content PRIVATE wolf2009_content wolf2009_zip wolf2009_archive)
add_test(NAME wolf2009_content_selftest COMMAND wolf2009-content --self-test)
add_library(wolf2009_compiled_declarations STATIC CompiledDeclarations.cpp)
target_compile_features(wolf2009_compiled_declarations PUBLIC cxx_std_11)
target_include_directories(wolf2009_compiled_declarations PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
add_library(wolf2009_compiled_catalog STATIC CompiledDeclarationCatalog.cpp)
target_compile_features(wolf2009_compiled_catalog PUBLIC cxx_std_11)
target_include_directories(wolf2009_compiled_catalog PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
target_link_libraries(wolf2009_compiled_catalog PUBLIC wolf2009_compiled_declarations)
add_library(wolf2009_compiled_namespace STATIC CompiledDeclarationNamespace.cpp)
target_compile_features(wolf2009_compiled_namespace PUBLIC cxx_std_11)
target_include_directories(wolf2009_compiled_namespace PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
target_link_libraries(wolf2009_compiled_namespace PUBLIC wolf2009_compiled_catalog)
add_library(wolf2009_source_sound STATIC SourceSound.cpp)
target_compile_features(wolf2009_source_sound PUBLIC cxx_std_11)
target_link_libraries(wolf2009_source_sound PUBLIC wolf2009_compiled_catalog)
add_executable(wolf2009-source-sound ../../tests/source-sound/SourceSoundTest.cpp)
target_link_libraries(wolf2009-source-sound PRIVATE wolf2009_source_sound wolf2009_archive)
add_test(NAME wolf2009_source_sound_synthetic COMMAND wolf2009-source-sound --self-test)
if(WOLF2009_SP_BASE AND EXISTS "${WOLF2009_SP_BASE}/maps/game/trainyard/trainyard.mpk")
    add_test(NAME wolf2009_source_sound_original COMMAND wolf2009-source-sound
        --source-map "${WOLF2009_SP_BASE}/maps/game/trainyard/trainyard.mpk")
endif()
add_executable(wolf2009-compiled-declarations ../../tests/compiled-declarations/CompiledDeclarationsTest.cpp)
target_link_libraries(wolf2009-compiled-declarations PRIVATE wolf2009_compiled_declarations wolf2009_archive)
add_executable(wolf2009-compiled-catalog ../../tests/compiled-catalog/CompiledCatalogTest.cpp)
target_link_libraries(wolf2009-compiled-catalog PRIVATE wolf2009_compiled_catalog wolf2009_archive)
add_test(NAME wolf2009_compiled_declarations_synthetic COMMAND wolf2009-compiled-declarations --self-test)
add_test(NAME wolf2009_compiled_catalog_synthetic COMMAND wolf2009-compiled-catalog --self-test)
if(WOLF2009_SP_BASE AND EXISTS "${WOLF2009_SP_BASE}/maps/game/trainyard/trainyard.mpk")
    add_test(NAME wolf2009_compiled_declarations_original COMMAND wolf2009-compiled-declarations
        --source-map "${WOLF2009_SP_BASE}/maps/game/trainyard/trainyard.mpk")
    add_test(NAME wolf2009_compiled_catalog_original COMMAND wolf2009-compiled-catalog
        --source-map "${WOLF2009_SP_BASE}/maps/game/trainyard/trainyard.mpk")
endif()
if(WOLF2009_SP_BASE AND EXISTS "${WOLF2009_SP_BASE}/maps/game/empty/empty.mpk")
    add_test(NAME wolf2009_compiled_declarations_empty COMMAND wolf2009-compiled-declarations
        --source-package "${WOLF2009_SP_BASE}/maps/game/empty/empty.mpk" "maps/game/empty/empty")
endif()
if(WOLF2009_SP_BASE AND EXISTS "${WOLF2009_SP_BASE}/maps/game/global/global.spk")
    add_test(NAME wolf2009_compiled_declarations_global_decl_absence COMMAND wolf2009-compiled-declarations
        --source-decl-absence "${WOLF2009_SP_BASE}/maps/game/global/global.spk")
endif()
add_library(wolf2009_source_definitions STATIC SourceDefinitions.cpp)
target_compile_features(wolf2009_source_definitions PUBLIC cxx_std_11)
target_include_directories(wolf2009_source_definitions PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
add_library(wolf2009_source_entity_runtime STATIC ../idtech4a_gameplay/SourceEntityRuntime.cpp)
target_include_directories(wolf2009_source_entity_runtime PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../idtech4a_gameplay")
target_link_libraries(wolf2009_source_entity_runtime PUBLIC wolf2009_source_definitions wolf2009_compiled_catalog wolf2009_content)
add_executable(wolf2009-source-entity-runtime ../../tests/source-entity-runtime/SourceEntityRuntimeTest.cpp)
target_link_libraries(wolf2009-source-entity-runtime PRIVATE wolf2009_source_entity_runtime wolf2009_archive)
add_test(NAME wolf2009_source_entity_runtime_synthetic COMMAND wolf2009-source-entity-runtime --self-test)
add_library(wolf2009_source_actor_binding STATIC ../idtech4a_anim/SourceActorBinding.cpp)
target_include_directories(wolf2009_source_actor_binding PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../idtech4a_anim")
target_link_libraries(wolf2009_source_actor_binding PUBLIC wolf2009_source_definitions wolf2009_compiled_namespace)
if(NOT MSVC)
    target_compile_options(wolf2009_source_actor_binding PRIVATE -ffp-contract=off -fno-fast-math)
endif()
add_executable(wolf2009-source-actor-binding ../../tests/source-actor-binding/SourceActorBindingTest.cpp)
target_link_libraries(wolf2009-source-actor-binding PRIVATE wolf2009_source_actor_binding wolf2009_archive wolf2009_zip)
add_test(NAME wolf2009_source_actor_binding_synthetic COMMAND wolf2009-source-actor-binding --self-test)
if(WOLF2009_SP_BASE AND EXISTS "${WOLF2009_SP_BASE}/maps/game/trainyard/trainyard.mpk")
    add_test(NAME wolf2009_source_entity_runtime_original COMMAND wolf2009-source-entity-runtime
        --source-map "${WOLF2009_SP_BASE}/maps/game/trainyard/trainyard.mpk")
    add_test(NAME wolf2009_source_actor_binding_original COMMAND wolf2009-source-actor-binding --source-base "${WOLF2009_SP_BASE}")
endif()
add_executable(wolf2009-source-definitions ../../tests/source-definitions/SourceDefinitionsTest.cpp)
target_link_libraries(wolf2009-source-definitions PRIVATE wolf2009_source_definitions
    wolf2009_zip wolf2009_archive wolf2009_content)
add_test(NAME wolf2009_source_definitions_synthetic COMMAND wolf2009-source-definitions --self-test)
add_executable(wolf2009-compiled-definitions ../../tests/compiled-definitions/CompiledDefinitionsTest.cpp)
target_link_libraries(wolf2009-compiled-definitions PRIVATE wolf2009_source_definitions wolf2009_compiled_catalog wolf2009_archive)
add_test(NAME wolf2009_compiled_definitions_synthetic COMMAND wolf2009-compiled-definitions --self-test)
add_executable(wolf2009-compiled-namespace ../../tests/compiled-namespace/CompiledNamespaceTest.cpp)
target_link_libraries(wolf2009-compiled-namespace PRIVATE wolf2009_compiled_namespace wolf2009_source_definitions wolf2009_archive wolf2009_zip)
add_test(NAME wolf2009_compiled_namespace_synthetic COMMAND wolf2009-compiled-namespace --self-test)
if(WOLF2009_SP_BASE AND EXISTS "${WOLF2009_SP_BASE}/maps/game/trainyard/trainyard.mpk")
    add_test(NAME wolf2009_compiled_definitions_original COMMAND wolf2009-compiled-definitions
        --source-map "${WOLF2009_SP_BASE}/maps/game/trainyard/trainyard.mpk")
endif()
if(WOLF2009_SP_BASE AND EXISTS "${WOLF2009_SP_BASE}/assets.pk4" AND
   EXISTS "${WOLF2009_SP_BASE}/maps/game/trainyard/trainyard.mpk")
    add_test(NAME wolf2009_compiled_namespace_original COMMAND wolf2009-compiled-namespace --source-base "${WOLF2009_SP_BASE}")
    add_test(NAME wolf2009_source_definitions_trainyard COMMAND wolf2009-source-definitions
        --source-catalog "${WOLF2009_SP_BASE}/assets.pk4"
        --source-map "${WOLF2009_SP_BASE}/maps/game/trainyard/trainyard.mpk")
endif()
add_library(wolf2009_skeleton_data STATIC SkeletonData.cpp)
target_compile_features(wolf2009_skeleton_data PUBLIC cxx_std_11)
target_include_directories(wolf2009_skeleton_data PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
add_library(wolf2009_source_ragdoll STATIC SourceRagdoll.cpp)
target_compile_features(wolf2009_source_ragdoll PUBLIC cxx_std_11)
target_link_libraries(wolf2009_source_ragdoll PUBLIC wolf2009_skeleton_data)
if(NOT MSVC)
    target_compile_options(wolf2009_source_ragdoll PRIVATE -ffp-contract=off -fno-fast-math)
endif()
add_executable(wolf2009-source-ragdoll SourceRagdollTest.cpp)
target_compile_features(wolf2009-source-ragdoll PRIVATE cxx_std_11)
target_include_directories(wolf2009-source-ragdoll PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../tests")
target_link_libraries(wolf2009-source-ragdoll PRIVATE wolf2009_source_ragdoll)
add_test(NAME wolf2009_source_ragdoll_synthetic COMMAND wolf2009-source-ragdoll)
add_library(wolf2009_spline_codec STATIC SplineTransformCodec.cpp)
target_compile_features(wolf2009_spline_codec PUBLIC cxx_std_11)
target_include_directories(wolf2009_spline_codec PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
if(NOT MSVC)
    target_compile_options(wolf2009_spline_codec PRIVATE -ffp-contract=off -fno-fast-math)
endif()
add_executable(wolf2009-spline-codec ../../tests/spline-codec/SplineTransformCodecTest.cpp)
target_link_libraries(wolf2009-spline-codec PRIVATE wolf2009_spline_codec)
add_test(NAME wolf2009_spline_codec_synthetic COMMAND wolf2009-spline-codec)
if(WOLF2009_SP_BASE)
    add_executable(wolf2009-spline-source ../../tests/spline-codec/SourceCompatibility.cpp)
    target_link_libraries(wolf2009-spline-source PRIVATE wolf2009_spline_codec wolf2009_physics)
    add_test(NAME wolf2009_spline_codec_source COMMAND wolf2009-spline-source --source-base "${WOLF2009_SP_BASE}")
endif()
add_library(wolf2009_spline_clip STATIC SplineClipData.cpp)
target_compile_features(wolf2009_spline_clip PUBLIC cxx_std_11)
target_link_libraries(wolf2009_spline_clip PUBLIC wolf2009_spline_codec)
add_library(wolf2009_source_rig STATIC SourceRigAnimation.cpp)
target_compile_features(wolf2009_source_rig PUBLIC cxx_std_11)
target_link_libraries(wolf2009_source_rig PUBLIC wolf2009_spline_clip wolf2009_skeleton_data)
if(NOT MSVC)
    target_compile_options(wolf2009_spline_clip PRIVATE -ffp-contract=off -fno-fast-math)
    target_compile_options(wolf2009_source_rig PRIVATE -ffp-contract=off -fno-fast-math)
endif()
add_executable(wolf2009-spline-clip ../../tests/spline-clip/SplineClipDataTest.cpp)
target_link_libraries(wolf2009-spline-clip PRIVATE wolf2009_spline_clip)
add_test(NAME wolf2009_spline_clip_synthetic COMMAND wolf2009-spline-clip)
add_executable(wolf2009-source-rig ../../tests/rig-animation/SourceRigAnimationTest.cpp)
target_link_libraries(wolf2009-source-rig PRIVATE wolf2009_source_rig)
add_test(NAME wolf2009_source_rig_synthetic COMMAND wolf2009-source-rig)
if(WOLF2009_SP_BASE)
    add_executable(wolf2009-spline-clip-source ../../tests/spline-clip/SourceCompatibility.cpp)
    target_link_libraries(wolf2009-spline-clip-source PRIVATE wolf2009_spline_clip wolf2009_physics)
    add_test(NAME wolf2009_spline_clip_source COMMAND wolf2009-spline-clip-source --source-base "${WOLF2009_SP_BASE}")
    add_executable(wolf2009-source-rig-original ../../tests/rig-animation/SourceCompatibility.cpp)
    target_link_libraries(wolf2009-source-rig-original PRIVATE wolf2009_source_rig wolf2009_physics)
    add_test(NAME wolf2009_source_rig_original COMMAND wolf2009-source-rig-original --source-base "${WOLF2009_SP_BASE}")
endif()
add_executable(wolf2009-pack ../../tools/scene-pack.cpp)
add_library(wolf2009_animation_wire_v2 STATIC ../idtech4a_anim/AnimationWireV2.cpp)
target_compile_features(wolf2009_animation_wire_v2 PUBLIC cxx_std_11)
target_include_directories(wolf2009_animation_wire_v2 PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../idtech4a_anim")
if(NOT MSVC)
    target_compile_options(wolf2009_animation_wire_v2 PRIVATE -ffp-contract=off -fno-fast-math)
endif()
add_executable(wolf2009-animation-wire-v2 ../../tests/engine-animation-v2/AnimationWireV2Test.cpp)
target_link_libraries(wolf2009-animation-wire-v2 PRIVATE wolf2009_animation_wire_v2)
add_test(NAME wolf2009_animation_wire_v2 COMMAND wolf2009-animation-wire-v2)
target_link_libraries(wolf2009-pack PRIVATE wolf2009_content wolf2009_geometry wolf2009_archive wolf2009_zip)
add_library(wolf2009_aas STATIC AasFile140.cpp)
target_compile_features(wolf2009_aas PUBLIC cxx_std_11)
target_include_directories(wolf2009_aas PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
add_executable(wolf2009-aas140 ../../tests/source-aas/Aas140Test.cpp)
target_link_libraries(wolf2009-aas140 PRIVATE wolf2009_aas)
add_test(NAME wolf2009_aas140_synthetic COMMAND wolf2009-aas140)
