diff --git a/src/sbbs3/CMakeLists.txt b/src/sbbs3/CMakeLists.txt
index fa12646fc28a6af156f251d295baa0678ba09703..ba6d3babb9968bf7820c05941052cbdb6bcd6402 100644
--- a/src/sbbs3/CMakeLists.txt
+++ b/src/sbbs3/CMakeLists.txt
@@ -2,6 +2,9 @@ project (SBBS3 C CXX)
 
 cmake_minimum_required(VERSION 2.8.11)
 
+INCLUDE (FindPkgConfig)
+INCLUDE (CheckFunctionExists)
+
 macro(require_lib_dir TARGET LIB LIBDIR)
 	if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_LIST_DIR}")
 		if(NOT DEFINED ${LIBDIR}_DONE)
@@ -22,6 +25,232 @@ endmacro()
 
 set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS RINGBUF_SEM RINGBUF_EVENT RINGBUF_MUTEX)
 
+if(EXISTS /dev/urandom)
+	set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS HAS_DEV_URANDOM URANDOM_DEV="/dev/urandom")
+endif()
+if(EXISTS /dev/random)
+	set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS HAS_DEV_RANDOM RANDOM_DEV="/dev/random")
+endif()
+
+add_library(ftpsrvr SHARED ftpsrvr.c nopen.c)
+require_lib(ftpsrvr xpdev)
+target_include_directories(ftpsrvr PRIVATE ../smblib)
+target_include_directories(ftpsrvr PRIVATE ../comio)
+target_compile_definitions(ftpsrvr PRIVATE SBBS SBBS_EXPORTS JAVASCRIPT)
+
+add_library(mailsrvr SHARED mailsrvr.c mxlookup.c mime.c ars.c base64.c)
+require_lib(mailsrvr xpdev)
+target_include_directories(mailsrvr PRIVATE ../smblib)
+target_include_directories(mailsrvr PRIVATE ../comio)
+target_compile_definitions(mailsrvr PRIVATE SBBS SBBS_EXPORTS JAVASCRIPT)
+
+add_library(services SHARED services.c sbbs_ini.c)
+require_lib(services xpdev)
+target_include_directories(services PRIVATE ../smblib)
+target_include_directories(services PRIVATE ../comio)
+target_compile_definitions(services PRIVATE SBBS SBBS_EXPORTS JAVASCRIPT)
+
+add_library(websrvr SHARED websrvr.c base64.c ars.c ringbuf.c)
+require_lib(websrvr xpdev)
+target_include_directories(websrvr PRIVATE ../smblib)
+target_include_directories(websrvr PRIVATE ../comio)
+target_compile_definitions(websrvr PRIVATE SBBS SBBS_EXPORTS JAVASCRIPT)
+
+set(SBBS_OBJS
+	ansiterm
+	answer
+	ars
+	atcodes
+	bat_xfer
+	base64
+	bulkmail
+	chat.cpp
+	chk_ar
+	../comio/comio
+	con_hi
+	con_out
+	dat_rec
+	data
+	data_ovl
+	date_str
+	download
+	email
+	exec
+	execfile
+	execfunc
+	execmisc
+	execmsg
+	execnet
+	fido
+	file
+	filedat
+	getkey
+	getmail
+	getmsg
+	getnode
+	getstats
+	getstr
+	inkey
+	ident
+	jsdebug
+	js_bbs
+	js_client
+	js_com
+	js_console
+	js_file
+	js_file_area
+	js_global
+	js_internal
+	js_msg_area
+	js_msgbase
+	js_queue
+	js_request
+	js_rtpool
+	js_server
+	js_socket
+	js_sprintf
+	js_system
+	js_user
+	js_xtrn_area
+	listfile
+	load_cfg
+	logfile
+	login
+	logon
+	logout
+	mail
+	main
+	msg_id
+	msgdate
+	msgtoqwk
+	netmail
+	newuser
+	nopen
+	pack_qwk
+	pack_rep
+	postmsg
+	prntfile
+	putmsg
+	putnode
+	qwk
+	qwktomsg
+	readmail
+	readmsgs
+	readtext
+	ringbuf
+	scandirs
+	scansubs
+	scfglib1
+	scfglib2
+	scfgsave
+	sockopts
+	sortdir
+	str
+	str_util
+	telgate
+	telnet
+	text_defaults
+	text_sec
+	tmp_xfer
+	un_qwk
+	un_rep
+	upload
+	userdat
+	useredit.cpp
+	uucode
+	viewfile
+	wordwrap
+	writemsg
+	xtrn
+	xtrn_sec
+	yenc
+	ver
+)
+if(WIN32)
+	list(APPEND SBBS_OBJS ../comio/comio_win32)
+else()
+	list(APPEND SBBS_OBJS ../comio/comio_nix)
+endif()
+add_library(sbbs SHARED ${SBBS_OBJS})
+require_lib(sbbs xpdev)
+target_include_directories(sbbs PRIVATE ../smblib)
+target_include_directories(sbbs PRIVATE ../comio)
+target_compile_definitions(sbbs PRIVATE SBBS SBBS_EXPORTS JAVASCRIPT)
+
+if(WIN32)
+	target_include_directories(sbbs PRIVATE ../../3rdp/win32.release/mozjs/include)
+	target_include_directories(ftpsrvr PRIVATE ../../3rdp/win32.release/mozjs/include)
+	target_include_directories(mailsrvr PRIVATE ../../3rdp/win32.release/mozjs/include)
+	target_include_directories(websrvr PRIVATE ../../3rdp/win32.release/mozjs/include)
+	target_include_directories(services PRIVATE ../../3rdp/win32.release/mozjs/include)
+	target_include_directories(sbbs PRIVATE ../../3rdp/win32.release/cryptlib/include)
+	link_directories(../../3rdp/win32.release/mozjs/bin ../../3rdp/win32.release/cryptlib/bin)
+else()
+	# TODO HACK HACK HACK!
+	target_include_directories(ftpsrvr PRIVATE ../../3rdp/cc.freebsd.amd64.release/mozjs/include/js)
+	target_include_directories(mailsrvr PRIVATE ../../3rdp/cc.freebsd.amd64.release/mozjs/include/js)
+	target_include_directories(services PRIVATE ../../3rdp/cc.freebsd.amd64.release/mozjs/include/js)
+	target_include_directories(websrvr PRIVATE ../../3rdp/cc.freebsd.amd64.release/mozjs/include/js)
+	target_include_directories(sbbs PRIVATE ../../3rdp/cc.freebsd.amd64.release/mozjs/include/js)
+	link_directories(../../3rdp/cc.freebsd.amd64.release/mozjs/lib)
+	link_directories(../../3rdp/cc.freebsd.amd64.release/cl)
+	# END OF HACK
+endif()
+
+require_lib(ftpsrvr sbbs)
+require_lib(mailsrvr sbbs)
+require_lib(websrvr sbbs)
+require_lib(services sbbs)
+
+add_executable(sbbscon sbbscon.c sbbs_ini.c)
+set_target_properties(sbbscon PROPERTIES OUTPUT_NAME sbbs)
+require_lib(sbbscon xpdev)
+require_lib(sbbscon smblib)
+target_include_directories(sbbscon PRIVATE ../smblib)
+target_link_libraries(sbbscon ftpsrvr)
+target_link_libraries(sbbscon mailsrvr)
+target_link_libraries(sbbscon websrvr)
+target_link_libraries(sbbscon services)
+target_link_libraries(sbbscon sbbs)
+
+if(WIN32)
+	target_include_directories(sbbscon PRIVATE ../../3rdp/win32.release/mozjs/include)
+else()
+	# TODO HACK HACK HACK!
+	target_include_directories(sbbscon PRIVATE ../../3rdp/cc.freebsd.amd64.release/mozjs/include/js)
+	# END OF HACK
+endif()
+
+target_link_libraries(sbbscon mozjs185-1.0)
+target_link_libraries(sbbscon cl)
+
+if(WIN32)
+	link_directories(../../3rdp/win32.release/nspr/bin)
+else()
+	execute_process(COMMAND nspr-config --cflags OUTPUT_VARIABLE NSPR_CFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE)
+	execute_process(COMMAND nspr-config --includedir OUTPUT_VARIABLE NSPR_INCLUDE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE)
+	execute_process(COMMAND nspr-config --libs OUTPUT_VARIABLE NSPR_LIBS OUTPUT_STRIP_TRAILING_WHITESPACE)
+	target_compile_options(sbbscon PRIVATE ${NSPR_CFLAGS})
+	target_include_directories(sbbscon PRIVATE ${NSPR_INCLUDE_DIR})
+	set_property(TARGET sbbscon APPEND PROPERTY LINK_FLAGS "${NSPR_LIBS}")
+endif()
+
+if(CMAKE_SYSTEM_NAME STREQUAL "NetBSD")
+        target_link_libraries(sbbscon util)
+elseif(CMAKE_SYSTEM_NAME STREQUAL "OpenBSD")
+        target_link_libraries(sbbscon util)
+elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
+        target_link_libraries(sbbscon util)
+elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+        target_link_libraries(sbbscon util)
+endif()
+list(APPEND CMAKE_REQUIRED_LIBRARIES util)
+CHECK_FUNCTION_EXISTS(forkpty HAS_FORKPTY)
+if(HAS_FORKPTY)
+else()
+	target_compile_definitions(sbbs PRIVATE NEEDS_FORKPTY)
+endif()
+
 add_executable(baja baja.c ars.c)
 require_lib(baja xpdev)
 require_lib(baja smblib)