diff --git a/CMakeLists.txt b/CMakeLists.txt
index c30ddfc50edf298a5f42e82a28db89ab576bf08d..b99cff95629eef0b82b19589c5661c4dcde78667 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,11 +1,15 @@
 cmake_minimum_required(VERSION 2.8.7)
 project(macaon)
 
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/Modules")
+
+find_package(dynet REQUIRED)
+find_package(eigen3 REQUIRED)
+find_package(Boost REQUIRED COMPONENTS program_options)
+
 set(CMAKE_VERBOSE_MAKEFILE 0)
 set(CMAKE_CXX_STANDARD 11)
 
-list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/Modules")
-
 if(NOT CMAKE_BUILD_TYPE)
   set(CMAKE_BUILD_TYPE Release)
 endif()
diff --git a/cmake/Modules/Findeigen3.cmake b/cmake/Modules/Findeigen3.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..0c323bc25c20693db595fb26dd8c86bcd5e02db8
--- /dev/null
+++ b/cmake/Modules/Findeigen3.cmake
@@ -0,0 +1,16 @@
+# - Try to find eigen3
+# Once done this will define
+#  EIGEN3_FOUND - System has eigen3
+#  EIGEN3_INCLUDE_DIRS - The eigen3 include directories
+#  EIGEN3_LIBRARIES - The libraries needed to use eigen3
+#  EIGEN3_DEFINITIONS - Compiler switches required for using eigen3
+
+find_package(PkgConfig)
+  pkg_check_modules(PC_EIGEN3 QUIET eigen3)
+
+  find_path(EIGEN3_INCLUDE_DIR eigen3/model.h
+                HINTS ${PC_EIGEN3_INCLUDEDIR} ${PC_DYNET_INCLUDE_DIRS}
+                          PATH_SUFFIXES eigen3 )
+
+set(EIGEN3_LIBRARIES ${DYNET_LIBRARY} )
+set(EIGEN3_INCLUDE_DIRS ${DYNET_INCLUDE_DIR}/eigen3 )
diff --git a/cmake/Modules/Findfasttext.cmake b/cmake/Modules/Findfasttext.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..ee000a04123679db44dcf0f2e0348b25fdb06b70
--- /dev/null
+++ b/cmake/Modules/Findfasttext.cmake
@@ -0,0 +1,27 @@
+# - Try to find fasttext
+# Once done this will define
+#  FASTTEXT_FOUND - System has fasttext
+#  FASTTEXT_INCLUDE_DIRS - The fasttext include directories
+#  FASTTEXT_LIBRARIES - The libraries needed to use fasttext
+#  FASTTEXT_DEFINITIONS - Compiler switches required for using fasttext
+
+find_package(PkgConfig)
+  pkg_check_modules(PC_FASTTEXT QUIET fasttext)
+
+  find_path(FASTTEXT_INCLUDE_DIR fasttext/fasttext.h
+                HINTS ${PC_FASTTEXT_INCLUDEDIR} ${PC_FASTTEXT_INCLUDE_DIRS}
+                          PATH_SUFFIXES fasttext )
+
+  find_library(FASTTEXT_LIBRARY NAMES fasttext
+                   HINTS ${PC_FASTTEXT_LIBDIR} ${PC_FASTTEXT_LIBRARY_DIRS} )
+
+  include(FindPackageHandleStandardArgs)
+# handle the QUIETLY and REQUIRED arguments and set FASTTEXT_FOUND to TRUE
+# if all listed variables are TRUE
+  find_package_handle_standard_args(fasttext  DEFAULT_MSG
+                                        FASTTEXT_LIBRARY FASTTEXT_INCLUDE_DIR)
+
+  mark_as_advanced(FASTTEXT_INCLUDE_DIR FASTTEXT_LIBRARY )
+
+  set(FASTTEXT_LIBRARIES ${FASTTEXT_LIBRARY} )
+  set(FASTTEXT_INCLUDE_DIRS ${FASTTEXT_INCLUDE_DIR}/fasttext )
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index c76bc3dd143b8ae25f851b7c85e5d507f3232985..043734e17a56c58d02b11e3399d3ac1007117502 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -3,7 +3,9 @@ FILE(GLOB SOURCES src/*.cpp)
 add_executable(test_train src/test_train.cpp)
 target_link_libraries(test_train tape_machine)
 target_link_libraries(test_train trainer)
+target_link_libraries(test_train ${Boost_PROGRAM_OPTIONS_LIBRARY})
 
 add_executable(test_decode src/test_decode.cpp)
 target_link_libraries(test_decode tape_machine)
 target_link_libraries(test_decode decoder)
+target_link_libraries(test_train ${Boost_PROGRAM_OPTIONS_LIBRARY})
diff --git a/tests/src/test_train.cpp b/tests/src/test_train.cpp
index d2d17665ccb76b21c48ab889910c570e0deb5096..764bda551088e4a37fc243fe5de232464aabae65 100644
--- a/tests/src/test_train.cpp
+++ b/tests/src/test_train.cpp
@@ -1,5 +1,6 @@
 #include <cstdio>
 #include <cstdlib>
+#include <boost/program_options.hpp>
 #include "MCD.hpp"
 #include "Config.hpp"
 #include "TapeMachine.hpp"