cmake_minimum_required(VERSION 3.14)
project(libwifi C)

option(HAS_WIFI "Enable WiFi modules" OFF)

if(NOT DEFINED WIFI_TYPE)
	set(WIFI_TYPE "DEFAULT" CACHE STRING "Type of WiFi implementation (e.g. BROADCOM, MEDIATEK, TEST)")
endif()

if(NOT HAS_WIFI)
	message(FATAL_ERROR "HAS_WIFI must be enabled to build this project. Use -DHAS_WIFI=ON")
endif()

add_definitions(-DHAS_WIFI)
find_library(wifiutils_library NAMES wifiutils)
find_library(libeasy NAMES easy)

include(FindPkgConfig)
pkg_check_modules(NL3 REQUIRED libnl-3.0)
pkg_check_modules(NLROUTE3 REQUIRED libnl-route-3.0)
pkg_check_modules(NLGENL3 REQUIRED libnl-genl-3.0)

include_directories(${NL3_INCLUDE_DIRS} ${NLROUTE3_INCLUDE_DIRS} ${NLGENL3_INCLUDE_DIRS})
link_directories(${NL3_LIBRARY_DIRS}  ${NLROUTE3_LIBRARY_DIRS} ${NLGENL3_LIBRARY_DIRS})

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../libwifiutils)

# generate libwifi version
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/genversion.sh")
	execute_process(
		COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/genversion.sh
		OUTPUT_VARIABLE VERSION_RAW
		OUTPUT_STRIP_TRAILING_WHITESPACE
	)

	string(REPLACE "." ";" VERSION_LIST ${VERSION_RAW})
	list(GET VERSION_LIST 0 LIBWIFI_MAJOR)
	list(GET VERSION_LIST 1 LIBWIFI_MINOR)
	list(GET VERSION_LIST 2 LIBWIFI_REV)

	add_definitions(
		-DLIBWIFI_MAJOR=${LIBWIFI_MAJOR}
		-DLIBWIFI_MINOR=${LIBWIFI_MINOR}
		-DLIBWIFI_REV=${LIBWIFI_REV}
	)
endif()

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -g -Wall -fPIC")

message(WIFI_TYPE="${WIFI_TYPE}")
message(PLATFORM="${PLATFORM}")
message(CMAKE_CFLAGS="${CMAKE_C_FLAGS}")

include_directories(${CMAKE_CURRENT_SOURCE_DIR})

set(LIBWIFI_SRC
	debug.c
	wifiops.c
	chlist.c
	drivers.c
)

if(WIFI_TYPE STREQUAL "TEST")
	add_definitions(-DWIFI_TEST)
	list(APPEND LIBWIFI_SRC modules/test/test.c)
endif()

if(WIFI_TYPE STREQUAL "MEDIATEK")
	add_definitions(-DWIFI_MEDIATEK)
if(CMAKE_C_FLAGS MATCHES "(^| )-DCONFIG_MTK( |$)")
	list(APPEND LIBWIFI_SRC modules/mediatek/mtk.c)
else()
	list(APPEND LIBWIFI_SRC modules/mediatek/mt.c)
endif()
endif()

if(WIFI_TYPE STREQUAL "BROADCOM")
	add_definitions(-DWIFI_BROADCOM)
if(CMAKE_C_FLAGS MATCHES "(^| )-DCONFIG_BCM963138( |$)")
	list(APPEND LIBWIFI_SRC modules/broadcom/bcm.c)
else()
	list(APPEND LIBWIFI_SRC
		modules/broadcom/brcm.c
		modules/broadcom/wlctrl.c
	)
endif()
endif()

if(WIFI_TYPE STREQUAL "QUALCOMM")
	add_definitions(-DWIFI_QUALCOMM)
	list(APPEND LIBWIFI_SRC
		modules/qualcomm/qca.c
	)
endif()

# default driver
list(APPEND LIBWIFI_SRC
	modules/wpactrl/hostapd_ctrl.c
	modules/wpactrl/supplicant_ctrl.c
	modules/wpactrl/wpactrl.c
	modules/nl80211/nlwifi.c
	modules/default/wifi.c
)

include_directories(modules/nl80211 modules/wpactrl)

add_library(wifi SHARED ${LIBWIFI_SRC})
set_target_properties(wifi PROPERTIES
	OUTPUT_NAME "wifi-7"
	VERSION ${VERSION_RAW}
	SOVERSION ${LIBWIFI_MAJOR}
)

target_link_libraries(wifi
	${NL3_LIBRARIES}
	${NLROUTE3_LIBRARIES}
	${NLGENL3_LIBRARIES}
	${libeasy}
)

if(EXISTS ${wifiutils_library})
	target_link_libraries(wifi ${wifiutils_library})
endif()

install(TARGETS wifi DESTINATION /usr/lib)
install(FILES wifiops.h wifi.h DESTINATION /usr/include)

add_custom_target(docs
	COMMAND doxygen ${CMAKE_CURRENT_SOURCE_DIR}/docs/Doxyfile
	COMMAND ${CMAKE_MAKE_PROGRAM} -C ${CMAKE_CURRENT_SOURCE_DIR}/docs/latex
	COMMAND ${CMAKE_COMMAND} -E copy
			${CMAKE_CURRENT_SOURCE_DIR}/docs/latex/refman.pdf
			${CMAKE_CURRENT_SOURCE_DIR}/docs/libwifi.pdf
	WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/docs
	COMMENT "Generating documentation..."
)
