cmake_minimum_required (VERSION 3.7)
project (libjuice
	DESCRIPTION "JUICE is a UDP ICE library"
	VERSION 0.4.4
	LANGUAGES C)

option(USE_NETTLE "Use Nettle instead of OpenSSL for HMAC computation" OFF)
if(MSVC)
	option(NO_ATOMICS "Force disabling C11 atomics" ON)
else()
	option(NO_ATOMICS "Force disabling C11 atomics" OFF)
endif()

set(C_STANDARD 11)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules)

if(WIN32)
	add_definitions(-DWIN32_LEAN_AND_MEAN)
	if (MSVC)
		add_definitions(-DNOMINMAX)
		add_definitions(-D_CRT_SECURE_NO_WARNINGS)
	endif()
endif()

set(LIBJUICE_SOURCES
	${CMAKE_CURRENT_SOURCE_DIR}/src/addr.c
	${CMAKE_CURRENT_SOURCE_DIR}/src/agent.c
	${CMAKE_CURRENT_SOURCE_DIR}/src/crc32.c
	${CMAKE_CURRENT_SOURCE_DIR}/src/hmac.c
	${CMAKE_CURRENT_SOURCE_DIR}/src/ice.c
	${CMAKE_CURRENT_SOURCE_DIR}/src/juice.c
	${CMAKE_CURRENT_SOURCE_DIR}/src/log.c
	${CMAKE_CURRENT_SOURCE_DIR}/src/random.c
	${CMAKE_CURRENT_SOURCE_DIR}/src/stun.c
	${CMAKE_CURRENT_SOURCE_DIR}/src/udp.c
)

set(LIBJUICE_HEADERS
	${CMAKE_CURRENT_SOURCE_DIR}/include/juice.h
)

set(TESTS_SOURCES
    ${CMAKE_CURRENT_SOURCE_DIR}/test/main.c
    ${CMAKE_CURRENT_SOURCE_DIR}/test/crc32.c
    ${CMAKE_CURRENT_SOURCE_DIR}/test/stun.c
    ${CMAKE_CURRENT_SOURCE_DIR}/test/connectivity.c
    ${CMAKE_CURRENT_SOURCE_DIR}/test/notrickle.c
    ${CMAKE_CURRENT_SOURCE_DIR}/test/server.c
)

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)

add_library(juice SHARED ${LIBJUICE_SOURCES})
set_target_properties(juice PROPERTIES VERSION ${PROJECT_VERSION})

target_include_directories(juice PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_include_directories(juice PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/juice)
target_include_directories(juice PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
target_link_libraries(juice PUBLIC Threads::Threads)

add_library(juice-static STATIC EXCLUDE_FROM_ALL ${LIBJUICE_SOURCES})
set_target_properties(juice-static PROPERTIES VERSION ${PROJECT_VERSION})

target_include_directories(juice-static PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_include_directories(juice-static PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/juice)
target_include_directories(juice-static PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
target_link_libraries(juice-static PUBLIC Threads::Threads)

if(WIN32)
	target_link_libraries(juice PRIVATE wsock32 ws2_32) # winsock2
	target_link_libraries(juice-static PRIVATE wsock32 ws2_32) # winsock2
endif()

if (USE_NETTLE)
	find_package(Nettle REQUIRED)
    target_compile_definitions(juice PRIVATE USE_NETTLE=1)
    target_link_libraries(juice PRIVATE Nettle::Nettle)
    target_compile_definitions(juice-static PRIVATE USE_NETTLE=1)
    target_link_libraries(juice-static PRIVATE Nettle::Nettle)
else()
    find_package(OpenSSL REQUIRED)
    target_compile_definitions(juice PRIVATE USE_NETTLE=0)
    target_link_libraries(juice PRIVATE OpenSSL::SSL)
    target_compile_definitions(juice-static PRIVATE USE_NETTLE=0)
    target_link_libraries(juice-static PRIVATE OpenSSL::SSL)
endif()

if (NO_ATOMICS)
	target_compile_definitions(juice PRIVATE NO_ATOMICS)
	target_compile_definitions(juice-static PRIVATE NO_ATOMICS)
endif()

if(APPLE)
	# This seems to be necessary on MacOS
	target_include_directories(juice PRIVATE /usr/local/include)
	target_include_directories(juice-static PRIVATE /usr/local/include)
endif()

add_library(LibJuice::LibJuice ALIAS juice)
add_library(LibJuice::LibJuiceStatic ALIAS juice-static)

install(TARGETS juice LIBRARY DESTINATION lib)
install(FILES ${LIBJUICE_HEADERS} DESTINATION include/juice)

# Main Test
add_executable(juice-tests ${TESTS_SOURCES})
target_include_directories(juice-tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
target_include_directories(juice-tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/juice)
set_target_properties(juice-tests PROPERTIES VERSION ${PROJECT_VERSION})
set_target_properties(juice-tests PROPERTIES OUTPUT_NAME tests)
target_link_libraries(juice-tests juice)

