cmake_minimum_required(VERSION 2.6)

PROJECT(uhttpd C)

INCLUDE (CheckFunctionExists)

SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
ADD_DEFINITIONS(-D_FILE_OFFSET_BITS=64 -Os -Wall -Werror -Wmissing-declarations --std=gnu99 -g3)

OPTION(TLS_SUPPORT "TLS support" ON)
OPTION(LUA_SUPPORT "Lua support" ON)
OPTION(UBUS_SUPPORT "ubus support" ON)

IF(APPLE)
  INCLUDE_DIRECTORIES(/opt/local/include)
  LINK_DIRECTORIES(/opt/local/lib)
ENDIF()

FIND_LIBRARY(LIBS crypt)
IF(LIBS STREQUAL "LIBS-NOTFOUND")
	SET(LIBS "")
ENDIF()

FIND_PATH(ubox_include_dir libubox/usock.h)
INCLUDE_DIRECTORIES(${ubox_include_dir})

SET(SOURCES main.c listen.c client.c utils.c file.c auth.c cgi.c relay.c proc.c plugin.c handler.c)
IF(TLS_SUPPORT)
	SET(SOURCES ${SOURCES} tls.c)
	ADD_DEFINITIONS(-DHAVE_TLS)
ENDIF()

CHECK_FUNCTION_EXISTS(getspnam HAVE_SHADOW)
IF(HAVE_SHADOW)
    ADD_DEFINITIONS(-DHAVE_SHADOW)
ENDIF()

ADD_EXECUTABLE(uhttpd ${SOURCES})
FIND_LIBRARY(libjson NAMES json-c json)
TARGET_LINK_LIBRARIES(uhttpd ubox dl json_script blobmsg_json ${libjson} ${LIBS})

SET(PLUGINS "")
IF(LUA_SUPPORT)
	FIND_PROGRAM(PKG_CONFIG pkg-config)

	IF(NOT LUA_CFLAGS AND PKG_CONFIG)
		EXECUTE_PROCESS(
			COMMAND pkg-config --silence-errors --cflags lua5.1
			OUTPUT_VARIABLE LUA_CFLAGS
			OUTPUT_STRIP_TRAILING_WHITESPACE
		)
	ENDIF()

	IF(NOT LUA_LIBS AND PKG_CONFIG)
		EXECUTE_PROCESS(
			COMMAND pkg-config --silence-errors --libs lua5.1
			OUTPUT_VARIABLE LUA_LIBS
			OUTPUT_STRIP_TRAILING_WHITESPACE
		)
	ENDIF()

	IF(NOT LUA_LIBS)
		SET(LUA_LIBS "lua")
	ENDIF()

	SET(PLUGINS ${PLUGINS} uhttpd_lua)
	ADD_DEFINITIONS(-DHAVE_LUA ${LUA_CFLAGS})
	ADD_LIBRARY(uhttpd_lua MODULE lua.c)
	TARGET_LINK_LIBRARIES(uhttpd_lua ${LUA_LIBS} m dl)
ENDIF()

IF(UBUS_SUPPORT)
	SET(PLUGINS ${PLUGINS} uhttpd_ubus)
	ADD_DEFINITIONS(-DHAVE_UBUS)
	ADD_LIBRARY(uhttpd_ubus MODULE ubus.c)
	TARGET_LINK_LIBRARIES(uhttpd_ubus ubus ubox blobmsg_json ${libjson})
ENDIF()

IF(PLUGINS)
	SET_TARGET_PROPERTIES(${PLUGINS} PROPERTIES
		PREFIX ""
	)
ENDIF()

INSTALL(TARGETS uhttpd ${PLUGINS}
	RUNTIME DESTINATION bin
	LIBRARY DESTINATION lib
)
