diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2ce45baaf229be6fe18efcb6b1cf7a730664a409..594053da5d28906b829787f3f10f0376242c8333 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,6 +16,7 @@ include(CheckCSourceCompiles)
 include(CheckCXXSourceCompiles)
 include(TestBigEndian)
 include(CheckFunctionExists)
+include(FindOptionalPackage)
 
 find_program(ECHO echo)
 find_program(XSLTPROC xsltproc)
@@ -402,6 +403,7 @@ message (STATUS "ENABLE_BUNDLED_LIBEV: ${ENABLE_BUNDLED_LIBEV}")
 message (STATUS "ENABLE_BUNDLED_LIBEIO: ${ENABLE_BUNDLED_LIBEIO}")
 message (STATUS "ENABLE_BUNDLED_LIBCORO: ${ENABLE_BUNDLED_LIBCORO}")
 message (STATUS "ENABLE_DOC: ${ENABLE_DOC}")
+list_optional_packages()
 message (STATUS "")
 message (STATUS "To view or modify configuration results, check out CMakeCache.txt.")
 message (STATUS "")
diff --git a/cmake/FindOptionalPackage.cmake b/cmake/FindOptionalPackage.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..b19bad5fc45ad5be3ba259b21dc0c5d1243f9acf
--- /dev/null
+++ b/cmake/FindOptionalPackage.cmake
@@ -0,0 +1,29 @@
+if (NOT _OptionalPackagesFile)
+    set(_OptionalPackagesFile
+        ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/OptionalPackages.txt)
+    if (EXISTS ${_OptionalPackagesFile})
+        file(REMOVE ${_OptionalPackagesFile})
+    endif()
+endif()
+
+macro (find_optional_package _package)
+    string(TOUPPER ${_package} _packageUpper)
+    if (WITH_${_packageUpper})
+        # WITH_${_packageUpper} option requested by the user
+        set(${_packageUpper}_FIND_REQUIRED ON)
+    endif()
+    option(WITH_${_packageUpper} "Search for ${_package} package" ON)
+    if (WITH_${_packageUpper})
+        find_package(${_package} ${ARGN})
+    else (WITH_${_packageUpper})
+        set(${_package}_FOUND OFF)
+        set(${_packageUpper}_FOUND OFF)
+    endif ()
+    file(APPEND "${_OptionalPackagesFile}"
+         "-- WITH_${_packageUpper}=${WITH_${_packageUpper}}\n")
+endmacro (find_optional_package)
+
+macro(list_optional_packages)
+    file(READ ${_OptionalPackagesFile} _message)
+    message(STATUS "\n${_message}")
+endmacro()
diff --git a/src/plugin/mysql/CMakeLists.txt b/src/plugin/mysql/CMakeLists.txt
index 31965eeefc56fd24581dfb013a609a68ec34096e..e01188e92df5af667c479a1b1f892558484c1029 100644
--- a/src/plugin/mysql/CMakeLists.txt
+++ b/src/plugin/mysql/CMakeLists.txt
@@ -1,4 +1,5 @@
-include(FindMySQL)
+find_optional_package(MySQL)
+
 if (MYSQL_FOUND)
 	message(STATUS "box.net.sql(mysql) INC=${MYSQL_INCLUDE_DIRS}")
 	message(STATUS "box.net.sql(mysql) LIBS=${MYSQL_LIBRARIES}")
@@ -7,6 +8,4 @@ if (MYSQL_FOUND)
 	add_library(mysql SHARED mysql.cc)
 	target_link_libraries(mysql ${MYSQL_LIBRARIES})
 	install(TARGETS mysql LIBRARY DESTINATION ${PLUGIN_DIR})
-else()
-	message(STATUS "MySQL client not found")
 endif()
diff --git a/src/plugin/pg/CMakeLists.txt b/src/plugin/pg/CMakeLists.txt
index 8a6662b0d4e0c02036542a97966b23b18f506482..7a6fa44afd5d22ffc0d171aedcc47c43be568feb 100644
--- a/src/plugin/pg/CMakeLists.txt
+++ b/src/plugin/pg/CMakeLists.txt
@@ -1,6 +1,6 @@
 # A special hack for buggy FindPostgreSQL.cmake in Debian/Ubuntu
 set(PostgreSQL_ROOT /usr/include/postgresql;/usr/include/postgres)
-find_package(PostgreSQL)
+find_optional_package(PostgreSQL)
 if (PostgreSQL_FOUND)
 	message(STATUS "box.net.sql(pg): INC=${PostgreSQL_INCLUDE_DIRS}")
 	message(STATUS "box.net.sql(pg): LIBS=${PostgreSQL_LIBRARIES}")