option(WITH_LIB_CPP "Build C++ library?" ON)
if(WITH_LIB_CPP)
	add_subdirectory(cpp)
endif()

set(C_SRC
	actions_publish.c
	actions_subscribe.c
	actions_unsubscribe.c
	alias_mosq.c alias_mosq.h
	callbacks.c
	connect.c
	handle_auth.c
	handle_connack.c
	handle_disconnect.c
	handle_ping.c
	handle_pubackcomp.c
	handle_publish.c
	handle_pubrec.c
	handle_pubrel.c
	handle_suback.c
	handle_unsuback.c
	helpers.c
	http_client.c http_client.h
	logging_mosq.c logging_mosq.h
	loop.c
	memory_mosq.c memory_mosq.h
	messages_mosq.c messages_mosq.h
	../common/misc_mosq.c ../common/misc_mosq.h
	mosquitto.c ../include/mosquitto.h
	mosquitto_internal.h
	../include/mqtt_protocol.h
	net_mosq_ocsp.c net_mosq.c net_mosq.h
	net_ws.c
	options.c
	packet_datatypes.c
	packet_mosq.c packet_mosq.h
	property_mosq.c property_mosq.h
	read_handle.c read_handle.h
	send_connect.c
	send_disconnect.c
	send_mosq.c
	send_publish.c
	send_subscribe.c
	send_unsubscribe.c
	send_mosq.c send_mosq.h
	socks_mosq.c
	srv_mosq.c
	strings_mosq.c
	thread_mosq.c
	../common/time_mosq.c ../common/time_mosq.h
	tls_mosq.c
	utf8_mosq.c
	util_mosq.c util_topic.c util_mosq.h
	will_mosq.c will_mosq.h)

if (WITH_THREADING AND WIN32)
	list(APPEND C_SRC "../common/winthread_mosq.c" "../common/winthread_mosq.h")
endif()

set(LIBRARIES common-options)

if(WITH_TLS)
	set (LIBRARIES ${LIBRARIES} OpenSSL::SSL)
endif()

if(UNIX AND NOT APPLE AND NOT ANDROID)
	find_library(LIBRT rt)
	if(LIBRT)
		set (LIBRARIES ${LIBRARIES} rt)
	endif()
endif()

if(WIN32)
	set (LIBRARIES ${LIBRARIES} ws2_32)
endif()

if(WITH_SRV)
	# Simple detect c-ares
	find_path(ARES_HEADER ares.h)
	if(ARES_HEADER)
		add_definitions("-DWITH_SRV")
		set (LIBRARIES ${LIBRARIES} cares)
	else()
		message(WARNING "c-ares library not found.")
	endif()
endif()

if(WITH_WEBSOCKETS AND WITH_WEBSOCKETS_BUILTIN)
	add_definitions("-DWITH_WEBSOCKETS=WS_IS_BUILTIN")
	set(C_SRC ${C_SRC}
		../deps/picohttpparser/picohttpparser.c
		../common/base64_mosq.c ../common/base64_mosq.h
		http_client.c http_client.h
		net_ws.c
		)
endif()

add_library(libmosquitto SHARED
	${C_SRC}
)

if(WITH_WEBSOCKETS AND WITH_WEBSOCKETS_BUILTIN)
	target_include_directories(libmosquitto PRIVATE
		"${mosquitto_SOURCE_DIR}/deps/picohttpparser")
endif()

target_include_directories(libmosquitto
	PUBLIC
		"${mosquitto_SOURCE_DIR}/include"
		"${mosquitto_SOURCE_DIR}/lib"
	PRIVATE
		"${mosquitto_SOURCE_DIR}"
		"${mosquitto_SOURCE_DIR}/common"
)

if(WITH_BUNDLED_DEPS)
	target_include_directories(libmosquitto PRIVATE
		"${mosquitto_SOURCE_DIR}/deps"
	)
endif()

if (WITH_THREADING AND NOT WIN32)
	set(THREADS_PREFER_PTHREAD_FLAG ON)
	find_package(Threads REQUIRED)

	target_link_libraries(libmosquitto PRIVATE Threads::Threads)
endif()

target_link_libraries(libmosquitto PRIVATE ${LIBRARIES})

set_target_properties(libmosquitto PROPERTIES
	OUTPUT_NAME mosquitto
	VERSION ${VERSION}
	SOVERSION 1
	POSITION_INDEPENDENT_CODE 1
)

install(TARGETS libmosquitto
	RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
	ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
	LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
)

if(WITH_STATIC_LIBRARIES)
	add_library(libmosquitto_static STATIC ${C_SRC})
	if(WITH_PIC)
		set_target_properties(libmosquitto_static PROPERTIES
			POSITION_INDEPENDENT_CODE 1
		)
	endif()

	target_link_libraries(libmosquitto_static PRIVATE ${LIBRARIES})

	target_include_directories(libmosquitto_static PRIVATE
		"${mosquitto_SOURCE_DIR}"
		"${mosquitto_SOURCE_DIR}/include"
		"${mosquitto_SOURCE_DIR}/lib"
	)

	set_target_properties(libmosquitto_static PROPERTIES
		OUTPUT_NAME mosquitto_static
		VERSION ${VERSION}
	)

	target_compile_definitions(libmosquitto_static PUBLIC "LIBMOSQUITTO_STATIC")
	install(TARGETS libmosquitto_static
		ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
	)
endif()

install(FILES ${mosquitto_SOURCE_DIR}/include/mosquitto.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
install(FILES ${mosquitto_SOURCE_DIR}/include/mqtt_protocol.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
