diff --git a/cmake/utils.cmake b/cmake/utils.cmake
index 197d83b1e923ec9c1687e8810b38b5cc0231f794..2402e4bd6456f1be502dd0332f0cee22d08527d7 100644
--- a/cmake/utils.cmake
+++ b/cmake/utils.cmake
@@ -84,10 +84,15 @@ endfunction()
 function(apigen)
     set (dstfile "${CMAKE_BINARY_DIR}/src/module.h")
     set (tmpfile "${dstfile}.new")
+    set (headers)
+    # Get absolute path for header files (required of out-of-source build)
+    foreach (header ${ARGN})
+        list(APPEND headers ${CMAKE_CURRENT_SOURCE_DIR}/${header})
+    endforeach()
 
     add_custom_command(OUTPUT ${dstfile}
         COMMAND cat ${CMAKE_SOURCE_DIR}/src/module_header.h > ${tmpfile}
-        COMMAND cat ${ARGN} | ${CMAKE_SOURCE_DIR}/extra/apigen >> ${tmpfile}
+        COMMAND cat ${headers} | ${CMAKE_SOURCE_DIR}/extra/apigen >> ${tmpfile}
         COMMAND cat ${CMAKE_SOURCE_DIR}/src/module_footer.h >> ${tmpfile}
         COMMAND ${CMAKE_COMMAND} -E copy_if_different ${tmpfile} ${dstfile}
         COMMAND ${CMAKE_COMMAND} -E remove ${tmpfile}
diff --git a/test/app/module_api.test.lua b/test/app/module_api.test.lua
index b8e50193b6d436ec0d3cad5faba77cbc62377106..0f28dca108c5018e7b77988cce5f45b20567742f 100755
--- a/test/app/module_api.test.lua
+++ b/test/app/module_api.test.lua
@@ -2,8 +2,7 @@
 
 box.cfg{logger = "tarantool.log"}
 
-local work_dir = require('fio').dirname(arg[0])
-package.cpath = work_dir..'/?.so;'
+package.cpath = '../app/?.so;'..package.cpath
 
 local test = require('tap').test("module_api", function(test)
     test:plan(7)