diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index fab228dbbab8305d596cd4e5ae706dd322a78162..80acc6068bb68a379cc5633440fff220cb06529e 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -2,101 +2,54 @@ project (Synchronet C CXX)
 
 cmake_minimum_required(VERSION 2.8.11)
 
-if(NOT PROJECTS)
-	SET(PROJECTS SyncTERM;SyncDraw;SExPOTS;Tone;SMBLib;SBBS3 CACHE STRING "Choose the projects to build, options are: SyncTERM" FORCE)
-	if(WIN32)
-		list(APPEND PROJECTS CIOXtrn)
-	endif()
-endif()
-
-if(MSVC)
-	set_property(DIRECTORY APPEND PROPERTY COMPILE_OPTIONS /wd4996)
-endif()
-
-list(FIND PROJECTS SBBS3 BUILD_SBBS3)
-if(BUILD_SBBS3 GREATER -1)
-	if(NOT XPDEV_ADDED)
-		add_subdirectory(xpdev)
-		set(XPDEV_ADDED TRUE)
-	endif()
-	if(NOT CONIO_ADDED)
-		add_subdirectory(conio)
-		set(CONIO_ADDED TRUE)
-	endif()
-	if(NOT UIFC_ADDED)
-		add_subdirectory(uifc)
-		set(UIFC_ADDED TRUE)
-	endif()
-	list(APPEND PROJECTS SMBLib)
-	add_subdirectory(sbbs3)
-endif()
-
-list(FIND PROJECTS SyncTERM BUILD_SYNCTERM)
-if(BUILD_SYNCTERM GREATER -1)
-	if(NOT XPDEV_ADDED)
-		add_subdirectory(xpdev)
-		set(XPDEV_ADDED TRUE)
-	endif()
-	if(NOT CONIO_ADDED)
-		add_subdirectory(conio)
-		set(CONIO_ADDED TRUE)
-	endif()
-	if(NOT UIFC_ADDED)
-		add_subdirectory(uifc)
-		set(UIFC_ADDED TRUE)
-	endif()
-	add_subdirectory(syncterm)
-endif()
-
-list(FIND PROJECTS SyncDraw BUILD_SYNCDRAW)
-if(BUILD_SYNCDRAW GREATER -1)
-	if(NOT XPDEV_ADDED)
-		add_subdirectory(xpdev)
-		set(XPDEV_ADDED TRUE)
-	endif()
-	if(NOT CONIO_ADDED)
-		add_subdirectory(conio)
-		set(CONIO_ADDED TRUE)
-	endif()
-	add_subdirectory(syncdraw)
-endif()
-
-list(FIND PROJECTS SExPOTS BUILD_SEXPOTS)
-if(BUILD_SEXPOTS GREATER -1)
-	if(NOT XPDEV_ADDED)
-		add_subdirectory(xpdev)
-		set(XPDEV_ADDED TRUE)
-	endif()
-	add_subdirectory(sexpots)
-endif()
-
-list(FIND PROJECTS Tone BUILD_TONE)
-if(BUILD_TONE GREATER -1)
-	if(NOT XPDEV_ADDED)
-		add_subdirectory(xpdev)
-		set(XPDEV_ADDED TRUE)
-	endif()
-	add_subdirectory(tone)
-endif()
-
-list(FIND PROJECTS SMBLib BUILD_SMBLIB)
-if(BUILD_SMBLIB GREATER -1)
-	if(NOT XPDEV_ADDED)
-		add_subdirectory(xpdev)
-		set(XPDEV_ADDED TRUE)
-	endif()
-	add_subdirectory(smblib)
-endif()
+INCLUDE(build/SynchronetMacros.cmake)
 
-list(FIND PROJECTS CIOXtrn BUILD_CIOXTRN)
-if(BUILD_CIOXTRN GREATER -1)
-	if(NOT XPDEV_ADDED)
-		add_subdirectory(xpdev)
-		set(XPDEV_ADDED TRUE)
-	endif()
-	if(NOT CONIO_ADDED)
-		add_subdirectory(conio)
-		set(CONIO_ADDED TRUE)
-	endif()
-	add_subdirectory(cioxtrn)
-endif()
+if(NOT PROJECTS)
+	SET(PROJECTS SyncTERM;SyncDraw;SExPOTS;Tone;SMBLib;SBBS3;CIOXtrn CACHE STRING "Choose the projects to build, options are: SyncTERM" FORCE)
+endif()
+
+macro(add_subdirs)
+	foreach(ARG IN ITEMS ${ARGV})
+		string(TOUPPER ${ARG} UC_ARG)
+		list(FIND ADDED ${UC_ARG} FOUND)
+		if(${FOUND} EQUAL -1)
+			add_subdirectory(${ARG})
+			list(APPEND ADDED ${UC_ARG})
+		endif()
+	endforeach()
+endmacro()
+
+foreach(PROJECT IN ITEMS ${PROJECTS})
+	if(${PROJECT} STREQUAL SBBS3)
+		add_subdirs(xpdev conio uifc)
+		list(FIND PROJECTS SMBLib FOUND)
+		if(${FOUND} EQUAL -1)
+			list(APPEND PROJECTS SMBLib)
+		endif()
+		add_subdirectory(sbbs3)
+	endif()
+	if(${PROJECT} STREQUAL SyncTERM)
+		add_subdirs(xpdev conio uifc)
+		add_subdirectory(syncterm)
+	endif()
+	if(${PROJECT} STREQUAL SyncDraw)
+		add_subdirs(xpdev conio)
+		add_subdirectory(syncdraw)
+	endif()
+	if(${PROJECT} STREQUAL SExPOTS)
+		add_subdirs(xpdev)
+		add_subdirectory(sexpots)
+	endif()
+	if(${PROJECT} STREQUAL Tone)
+		add_subdirs(xpdev)
+		add_subdirectory(tone)
+	endif()
+	if(${PROJECT} STREQUAL SMBLib)
+		add_subdirs(xpdev)
+		add_subdirectory(smblib)
+	endif()
+	if(${PROJECT} STREQUAL CIOXtrn)
+		add_subdirs(xpdev conio)
+		add_subdirectory(cioxtrn)
+	endif()
+endforeach()