#
# Copyright (C) 2015-2015 Oleg Alexeenkov
# Copyright (C) 2015-2019 Felix Weinrank
#
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
# 3. Neither the name of the project nor the names of its contributors
#    may be used to endorse or promote products derived from this software
#    without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#


#################################################
# INCLUDE MODULES AND SETTINGS
#################################################

set(VERSION "1.0.0")

set(prefix 					${CMAKE_INSTALL_PREFIX})
set(exec_prefix 			${prefix})
set(libdir 					${exec_prefix}/lib)
set(includedir 				${prefix}/include/usrsctp)
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR})
set(CMAKE_MACOSX_RPATH 		1)

add_definitions(-D__Userspace__)
add_definitions(-D__Userspace_os_${CMAKE_SYSTEM_NAME})
add_definitions(-DSCTP_SIMPLE_ALLOCATOR)
add_definitions(-DSCTP_PROCESS_LEVEL_LOCKS)


#################################################
# OS DEPENDENT
#################################################

if (CMAKE_SYSTEM_NAME MATCHES "Linux")
	add_definitions(-D_GNU_SOURCE)
endif ()

if (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
	add_definitions(-U__FreeBSD__)
	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}     -Wno-address-of-packed-member")
endif ()

if (CMAKE_SYSTEM_NAME MATCHES "Darwin")
	add_definitions(-U__APPLE__)
	add_definitions(-D__APPLE_USE_RFC_2292)
	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}     -Wno-address-of-packed-member -Wno-deprecated-declarations")
endif ()

if (CMAKE_SYSTEM_NAME MATCHES "DragonFly")
	add_definitions(-U__DragonFly__)
endif ()

if (CMAKE_SYSTEM_NAME MATCHES "NetBSD")
	add_definitions(-U__NetBSD__)
endif ()

if (CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
	add_definitions(-U__OpenBSD__)
endif ()


#################################################
# LIBRARY FILES
#################################################

include_directories(${CMAKE_CURRENT_SOURCE_DIR})

list(APPEND usrsctp_root_headers
	user_atomic.h
	user_environment.h
	user_inpcb.h
	user_ip_icmp.h
	user_ip6_var.h
	user_malloc.h
	user_mbuf.h
	user_queue.h
	user_recv_thread.h
	user_route.h
	user_socketvar.h
	user_uma.h
	usrsctp.h
)

list(APPEND usrsctp_netinet_headers
	netinet/sctp_asconf.h
	netinet/sctp_auth.h
	netinet/sctp_bsd_addr.h
	netinet/sctp_callout.h
	netinet/sctp_constants.h
	netinet/sctp_crc32.h
	netinet/sctp_header.h
	netinet/sctp_indata.h
	netinet/sctp_input.h
	netinet/sctp_lock_userspace.h
	netinet/sctp_os_userspace.h
	netinet/sctp_os.h
	netinet/sctp_output.h
	netinet/sctp_pcb.h
	netinet/sctp_peeloff.h
	netinet/sctp_process_lock.h
	netinet/sctp_sha1.h
	netinet/sctp_structs.h
	netinet/sctp_sysctl.h
	netinet/sctp_timer.h
	netinet/sctp_uio.h
	netinet/sctp_var.h
	netinet/sctputil.h
	netinet/sctp.h
)

list(APPEND usrsctp_netinet6_headers
	netinet6/sctp6_var.h
)

list(APPEND usrsctp_headers
	${usrsctp_root_headers}
	${usrsctp_netinet_headers}
	${usrsctp_netinet6_headers}
)

list(APPEND usrsctp_sources
	netinet/sctp_asconf.c
	netinet/sctp_auth.c
	netinet/sctp_bsd_addr.c
	netinet/sctp_callout.c
	netinet/sctp_cc_functions.c
	netinet/sctp_crc32.c
	netinet/sctp_indata.c
	netinet/sctp_input.c
	netinet/sctp_output.c
	netinet/sctp_pcb.c
	netinet/sctp_peeloff.c
	netinet/sctp_sha1.c
	netinet/sctp_ss_functions.c
	netinet/sctp_sysctl.c
	netinet/sctp_timer.c
	netinet/sctp_userspace.c
	netinet/sctp_usrreq.c
	netinet/sctputil.c
	netinet6/sctp6_usrreq.c
	user_environment.c
	user_mbuf.c
	user_recv_thread.c
	user_socket.c
)

add_library(usrsctp SHARED ${usrsctp_sources} ${usrsctp_headers})
add_library(usrsctp-static STATIC ${usrsctp_sources} ${usrsctp_headers})

if (WIN32)
	message(STATUS "link library: ws2_32")
	target_link_libraries(usrsctp ws2_32 iphlpapi.lib)
	target_link_libraries(usrsctp-static ws2_32 iphlpapi.lib)
endif ()

set_target_properties(usrsctp-static PROPERTIES OUTPUT_NAME "usrsctp")
set_target_properties(usrsctp PROPERTIES IMPORT_SUFFIX "_import.lib")
set_target_properties(usrsctp PROPERTIES SOVERSION 1 VERSION 1.0.0)

if (NOT DEFINED CMAKE_INSTALL_LIBDIR)
	SET(CMAKE_INSTALL_LIBDIR lib)
endif ()


#################################################
# INSTALL LIBRARY AND HEADER
#################################################

install(TARGETS usrsctp usrsctp-static DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(FILES usrsctp.h DESTINATION include)
