diff --git a/cmake/utils.cmake b/cmake/utils.cmake
index 3e07c7112709c40a65b77fd3c28e7b6264550ea4..7ca69f6a29f00beb05d77b633dd618b00338cb4c 100644
--- a/cmake/utils.cmake
+++ b/cmake/utils.cmake
@@ -43,6 +43,11 @@ function(lua_source varname filename)
     set (tmpfile "${CMAKE_CURRENT_BINARY_DIR}/${filename}.new.c")
     set (dstfile "${CMAKE_CURRENT_BINARY_DIR}/${filename}.c")
     get_filename_component(module ${filename} NAME_WE)
+    get_filename_component(dstdir ${dstfile} DIRECTORY)
+    if (IS_DIRECTORY ${dstdir})
+    else()
+        file(MAKE_DIRECTORY ${dstdir})
+    endif()
 
     ADD_CUSTOM_COMMAND(OUTPUT ${dstfile}
         COMMAND ${ECHO} 'const char ${module}_lua[] =' > ${tmpfile}
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 6feb067156d00a67ad2def3197a234fda8e966c5..1d41c3cbf4fa5c5bd3a107fb53be4336fce40aa8 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -14,7 +14,6 @@ include_directories(${LIBGOPT_INCLUDE_DIR})
 include_directories(${READLINE_INCLUDE_DIR})
 
 # Compile src/lua/*.lua files into src/lua/*.lua.c sources
-file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/src/lua)
 set(lua_sources)
 lua_source(lua_sources lua/init.lua)
 lua_source(lua_sources lua/uuid.lua)
@@ -30,7 +29,6 @@ lua_source(lua_sources lua/help.lua)
 lua_source(lua_sources lua/help_en_US.lua)
 lua_source(lua_sources lua/tap.lua)
 lua_source(lua_sources lua/fio.lua)
-file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/third_party/luafun)
 lua_source(lua_sources ../third_party/luafun/fun.lua)
 
 add_custom_target(generate_lua_sources