# Copyright 2020-2025, Collabora, Ltd.
# Copyright 2025-2026, NVIDIA CORPORATION.
# SPDX-License-Identifier: BSL-1.0

# Catch2
if(BUILD_TESTING)
	add_library(xrt-external-catch2 STATIC Catch2/catch_amalgamated.cpp)
	target_include_directories(
		xrt-external-catch2 SYSTEM INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/Catch2
		)
	if(MSVC)
		# Needed for Visual Studio 2019.
		# https://github.com/catchorg/Catch2/issues/2916#issuecomment-2404082203
		target_compile_options(xrt-external-catch2 PRIVATE "/Zc:hiddenFriend-")
	endif()
endif()

# OpenVR
add_library(xrt-external-openvr INTERFACE)
target_include_directories(
	xrt-external-openvr SYSTEM INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/openvr_includes
	)

# cJSON
add_library(xrt-external-cjson INTERFACE)
if(XRT_HAVE_SYSTEM_CJSON)
	target_link_libraries(xrt-external-cjson INTERFACE cJSON::cJSON)
else()
	target_include_directories(
		xrt-external-cjson SYSTEM INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/cjson
		)
	target_compile_definitions(xrt-external-cjson INTERFACE CJSON_HIDE_SYMBOLS)
endif()

# FlexKalman
add_library(xrt-external-flexkalman INTERFACE)
target_include_directories(xrt-external-flexkalman INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/flexkalman)

# FlexKalman
add_library(xrt-external-util-headers INTERFACE)
target_include_directories(
	xrt-external-util-headers INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/util-headers
	)

# Glad
add_library(xrt-external-glad INTERFACE)
target_include_directories(
	xrt-external-glad SYSTEM INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/glad/include
	)

# Hungarian graph algorithm
add_library(xrt-external-hungarian INTERFACE)
target_include_directories(
	xrt-external-hungarian SYSTEM INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/hungarian
	)

# JNIPP and Android JNI wrappers
if(ANDROID)
	add_library(xrt-external-jnipp STATIC jnipp/jnipp.cpp)
	target_include_directories(
		xrt-external-jnipp SYSTEM PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/jnipp
		)

	file(GLOB WRAP_SOURCES android-jni-wrap/wrap/*.cpp)
	add_library(xrt-external-jni-wrap STATIC ${WRAP_SOURCES})
	target_include_directories(
		xrt-external-jni-wrap PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/android-jni-wrap
		)
	target_link_libraries(xrt-external-jni-wrap PUBLIC xrt-external-jnipp)
endif()

# Nano Protobuf
add_library(
	xrt-external-nanopb STATIC
	nanopb/monado_metrics.pb.c
	nanopb/monado_metrics.pb.h
	nanopb/pb.h
	nanopb/pb_common.c
	nanopb/pb_common.h
	nanopb/pb_decode.c
	nanopb/pb_decode.h
	nanopb/pb_encode.c
	nanopb/pb_encode.h
	)
target_include_directories(xrt-external-nanopb PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/nanopb)

if(ANDROID)
	add_library(
		xrt-external-cardboard STATIC cardboard/cardboard_device.pb.h
					      cardboard/cardboard_device.pb.c
		)

	target_include_directories(
		xrt-external-cardboard PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/cardboard/
		)
	target_link_libraries(xrt-external-cardboard PUBLIC xrt-external-nanopb)
endif()

# OpenXR
add_subdirectory(openxr_includes)

# External VIT interface
if(XRT_FEATURE_SLAM)
	add_library(xrt-external-vit INTERFACE)
	target_include_directories(
		xrt-external-vit INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/vit_includes
		)
endif()

# Vulkan
if(XRT_HAVE_VULKAN)
	add_subdirectory(vulkan)
endif()

# SDL
if(XRT_HAVE_SDL2)
	add_library(xrt-external-sdl2 INTERFACE)
	target_link_libraries(xrt-external-sdl2 INTERFACE SDL2::SDL2)

	# Fix SDL2 build include for Alpine Linux
	find_path(SDL2_DIRECTFB_INCLUDE_DIR directfb.h PATH_SUFFIXES directfb)
	if(SDL2_DIRECTFB_INCLUDE_DIR)
		target_include_directories(xrt-external-sdl2 INTERFACE ${SDL2_DIRECTFB_INCLUDE_DIR})
	endif()
endif()

# STB
add_library(xrt-external-stb INTERFACE)
target_include_directories(xrt-external-stb SYSTEM INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/stb)

# bcdec
add_library(xrt-external-bcdec INTERFACE)
target_include_directories(xrt-external-bcdec SYSTEM INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/bcdec)

# renderdoc
add_library(xrt-external-renderdoc INTERFACE)
target_include_directories(
	xrt-external-renderdoc SYSTEM INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/renderdoc_api
	)

# imgui
if(XRT_HAVE_OPENGL)
	add_subdirectory(imgui)
endif()

# tinyceres
add_library(xrt-external-tinyceres INTERFACE)
target_include_directories(
	xrt-external-tinyceres SYSTEM INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/tinyceres/include
	)

# Tracy
if(XRT_HAVE_TRACY)
	add_library(xrt-external-tracy STATIC tracy/TracyClient.cpp)
	target_include_directories(
		xrt-external-tracy SYSTEM PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/tracy
		)
	target_compile_definitions(xrt-external-tracy PRIVATE TRACY_ENABLE)
	target_link_libraries(xrt-external-tracy PRIVATE ${CMAKE_DL_LIBS})
endif()

# Valve VDF parser
add_library(xrt-external-vdf INTERFACE)
target_include_directories(
	xrt-external-vdf SYSTEM INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/valve-file-vdf
	)
