From fe185e6e3efe80f048c5830860025b3ac5d359bb Mon Sep 17 00:00:00 2001
From: Roman Tsisyk <roman@tsisyk.com>
Date: Thu, 20 Jun 2013 14:39:48 +0400
Subject: [PATCH] Refactor CMakeLists.txt to support src/lua/*.lua files

---
 .gitignore             |  1 +
 cmake/utils.cmake      | 19 +++++++++++++++++++
 src/CMakeLists.txt     | 10 ++++++++++
 src/box/CMakeLists.txt | 28 +++++++---------------------
 src/box/box_lua.cc     |  2 +-
 src/lua/init.cc        | 10 ++++++++++
 6 files changed, 48 insertions(+), 22 deletions(-)

diff --git a/.gitignore b/.gitignore
index b67ffacdc4..5876f1430d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -45,6 +45,7 @@ extra/rpm.spec
 include/config.h
 install_manifest.txt
 lcov
+src/lua/*.lua.c
 src/box/lua/*.lua.c
 src/box/tarantool_box
 src/box/tarantool.cfg
diff --git a/cmake/utils.cmake b/cmake/utils.cmake
index 1400bf1169..e78e4bf7d9 100644
--- a/cmake/utils.cmake
+++ b/cmake/utils.cmake
@@ -36,3 +36,22 @@ macro(set_source_files_compile_flags)
     unset(_file_ext)
     unset(_lang)
 endmacro(set_source_files_compile_flags)
+
+# A helper function to compile *.lua source into *.lua.c sources
+function(lua_source varname filename)
+    set (srcfile "${CMAKE_CURRENT_SOURCE_DIR}/${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)
+
+    ADD_CUSTOM_COMMAND(OUTPUT ${dstfile}
+        COMMAND ${ECHO} 'const char ${module}_lua[] =' > ${tmpfile}
+        COMMAND ${CMAKE_BINARY_DIR}/extra/txt2c ${srcfile} >> ${tmpfile}
+        COMMAND ${ECHO} '\;' >> ${tmpfile}
+        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${tmpfile} ${dstfile}
+        COMMAND ${CMAKE_COMMAND} -E remove ${tmpfile}
+        DEPENDS ${srcfile} txt2c)
+
+    set(var ${${varname}})
+    set(${varname} ${var} ${dstfile} PARENT_SCOPE)
+endfunction()
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 5e089930a2..0d0232055e 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -60,6 +60,15 @@ set_source_files_properties(memcached.cc
 #
 set_property(DIRECTORY PROPERTY CLEAN_NO_CUSTOM true)
 
+# Compile src/lua/*.lua files into src/lua/*.lua.c sources
+file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/src/lua)
+set(lua_sources)
+
+add_custom_target(generate_lua_sources
+    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src/box
+    DEPENDS ${lua_sources})
+set_property(DIRECTORY PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${lua_sources})
+
 #
 # Used by modules.
 #
@@ -110,6 +119,7 @@ set (common_sources
      lua/lua_socket.cc
      lua/session.cc
      lua/cjson.cc
+     ${lua_sources}
 )
 
 if (ENABLE_TRACE)
diff --git a/src/box/CMakeLists.txt b/src/box/CMakeLists.txt
index a86df910fd..4e251781ae 100644
--- a/src/box/CMakeLists.txt
+++ b/src/box/CMakeLists.txt
@@ -2,29 +2,15 @@ if (TARGET_OS_DARWIN)
     set(module_link_flags "-pagezero_size 10000 -image_base 100000000")
 endif()
 
-function(lua_source filename)
-    get_filename_component(module ${filename} NAME_WE)
-    ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_BINARY_DIR}/src/box/${filename}.c
-        COMMAND ${ECHO} 'const char ${module}_lua[] =' > ${filename}.new.c
-        COMMAND ${CMAKE_BINARY_DIR}/extra/txt2c
-            ${CMAKE_SOURCE_DIR}/src/box/${filename} >> ${filename}.new.c
-        COMMAND ${ECHO} '\;' >> ${filename}.new.c
-        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${filename}.new.c
-            ${CMAKE_BINARY_DIR}/src/box/${filename}.c
-        COMMAND ${CMAKE_COMMAND} -E remove ${filename}.new.c
-        DEPENDS ${CMAKE_SOURCE_DIR}/src/box/${filename} txt2c)
-
-    set(lua_sources ${lua_sources} ${CMAKE_BINARY_DIR}/src/box/${filename}.c
-        PARENT_SCOPE)
-endfunction()
-
 file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/src/box/lua)
-lua_source(lua/box.lua)
-lua_source(lua/box_net.lua)
-lua_source(lua/misc.lua)
-lua_source(lua/sql.lua)
 
-add_custom_target(generate_lua_sources}
+set(lua_sources)
+lua_source(lua_sources lua/box.lua)
+lua_source(lua_sources lua/box_net.lua)
+lua_source(lua_sources lua/misc.lua)
+lua_source(lua_sources lua/sql.lua)
+
+add_custom_target(box_generate_lua_sources
     WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src/box
     DEPENDS ${lua_sources})
 set_property(DIRECTORY PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${lua_sources})
diff --git a/src/box/box_lua.cc b/src/box/box_lua.cc
index 808b1d015c..bbd0e0868e 100644
--- a/src/box/box_lua.cc
+++ b/src/box/box_lua.cc
@@ -52,7 +52,7 @@ extern "C" {
 
 /* contents of box.lua, misc.lua, box.net.lua respectively */
 extern char box_lua[], box_net_lua[], misc_lua[], sql_lua[];
-const char *lua_sources[] = { box_lua, box_net_lua, misc_lua, sql_lua, NULL };
+static const char *lua_sources[] = { box_lua, box_net_lua, misc_lua, sql_lua, NULL };
 
 /**
  * All box connections share the same Lua state. We use
diff --git a/src/lua/init.cc b/src/lua/init.cc
index a6204378e2..b0dc71c46e 100644
--- a/src/lua/init.cc
+++ b/src/lua/init.cc
@@ -76,6 +76,9 @@ extern "C" {
 
 struct lua_State *tarantool_L;
 
+/* contents of src/lua/ files */
+static const char *lua_sources[] = { NULL };
+
 /**
  * Remember the output of the administrative console in the
  * registry, to use with 'print'.
@@ -1318,6 +1321,13 @@ tarantool_lua_init()
 	tarantool_lua_session_init(L);
 	tarantool_lua_error_init(L);
 
+	/* Load Lua extension */
+	for (const char **s = lua_sources; *s; s++) {
+		if (luaL_dostring(L, *s))
+			panic("Error loading Lua source %.160s...: %s",
+			      *s, lua_tostring(L, -1));
+	}
+
 	mod_lua_init(L);
 
 	/* init after internal luas are processed */
-- 
GitLab