SET(LIBCAER_SOURCES
	ringbuffer.c
	log.c
	frame_utils.c
	filters_dvs_noise.c
	usb_utils.c
	autoexposure.c
	device_discover.c
	device.c
	dvs128.c
	davis.c
	dynapse.c
	dvs132s.c
	dvxplorer.c
	samsung_evk.c)

# This is often the case due to how we try to have multiple compatible definitions of functions in C.
IF(NOT CC_MSVC)
	SET(LIBCAER_COMPILE_OPTIONS "-Wno-unused-function")
ENDIF()

SET(LIBCAER_LINK_LIBRARIES_PRIVATE ${BASE_LIBS})

IF(ENABLE_SERIALDEV)
	# Add serial devices.
	SET(LIBCAER_SOURCES ${LIBCAER_SOURCES} edvs.c)

	SET(LIBCAER_LINK_LIBRARIES_PRIVATE ${LIBCAER_LINK_LIBRARIES_PRIVATE} PkgConfig::libserialport)
ENDIF()

IF(ENABLE_OPENCV)
	# Add C++ OpenCV support.
	SET(LIBCAER_SOURCES ${LIBCAER_SOURCES} frame_utils_opencv.cpp)

	SET(LIBCAER_LINK_LIBRARIES_PUBLIC ${OpenCV_LIBS})

	IF(NOT CC_MSVC)
		# The included C headers need to do this (NULL is 0, nullptr not available).
		SET(LIBCAER_COMPILE_OPTIONS ${LIBCAER_COMPILE_OPTIONS}
									$<$<COMPILE_LANGUAGE:CXX>:-Wno-zero-as-null-pointer-constant>)
	ENDIF()

	# Clang weirdness: also looks into the C code, which of course will use old-style casts (the only cast available
	# there).
	IF(CC_CLANG)
		SET(LIBCAER_COMPILE_OPTIONS ${LIBCAER_COMPILE_OPTIONS} $<$<COMPILE_LANGUAGE:CXX>:-Wno-old-style-cast>)
	ENDIF()
ENDIF()

IF(CC_MSVC)
	LIST(APPEND LIBCAER_SOURCES ../thirdparty/simple-stdatomic/stdatomic.c)
	INCLUDE_DIRECTORIES(${LIBUSB_INCLUDE_DIRS})
	LIST(APPEND LIBCAER_LINK_LIBRARIES_PRIVATE ${LIBUSB_LIBRARIES})
ELSE()
	LIST(APPEND LIBCAER_LINK_LIBRARIES_PRIVATE PkgConfig::libusb)
ENDIF()

# Set full RPATH
SET(CMAKE_INSTALL_RPATH ${USER_LOCAL_PREFIX}/${CMAKE_INSTALL_LIBDIR})

ADD_LIBRARY(caer ${LIBCAER_SOURCES})
IF(CC_MSVC)
	# This flag needs to be propagated down to depending targets to avoid compilation errors
	TARGET_COMPILE_OPTIONS(caer INTERFACE -DWIN32_LEAN_AND_MEAN=ON)
ENDIF()
TARGET_COMPILE_OPTIONS(caer PRIVATE ${LIBCAER_COMPILE_OPTIONS})
TARGET_LINK_LIBRARIES(caer PRIVATE ${LIBCAER_LINK_LIBRARIES_PRIVATE})
TARGET_LINK_LIBRARIES(caer PUBLIC ${LIBCAER_LINK_LIBRARIES_PUBLIC})
TARGET_INCLUDE_DIRECTORIES(caer INTERFACE $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)

SET_TARGET_PROPERTIES(caer PROPERTIES SOVERSION ${PROJECT_VERSION_MAJOR} VERSION ${PROJECT_VERSION})

IF(OS_WINDOWS)
	INSTALL(
		TARGETS caer
		EXPORT libcaer-exports
		RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
		ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
ELSE()
	INSTALL(TARGETS caer EXPORT libcaer-exports DESTINATION ${CMAKE_INSTALL_LIBDIR})
ENDIF()

IF(ENABLE_STATIC)
	ADD_LIBRARY(caerStatic STATIC ${LIBCAER_SOURCES})
	TARGET_COMPILE_OPTIONS(caerStatic PRIVATE ${LIBCAER_COMPILE_OPTIONS})
	TARGET_LINK_LIBRARIES(caerStatic PRIVATE ${LIBCAER_LINK_LIBRARIES_PRIVATE})
	TARGET_LINK_LIBRARIES(caerStatic PUBLIC ${LIBCAER_LINK_LIBRARIES_PUBLIC})
	TARGET_INCLUDE_DIRECTORIES(caerStatic INTERFACE $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)

	SET_TARGET_PROPERTIES(caerStatic PROPERTIES OUTPUT_NAME caer)

	IF(OS_WINDOWS)
		INSTALL(
			TARGETS caerStatic
			EXPORT libcaer-exports
			RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
			ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
	ELSE()
		INSTALL(TARGETS caerStatic EXPORT libcaer-exports DESTINATION ${CMAKE_INSTALL_LIBDIR})
	ENDIF()
ENDIF()
