背景
V8 あるいは spidermonky や libpython を組み込みスクリプトとして使いたい場合、環境がちょっと特殊だったりするとリンクやライブラリーのビルドが難しかったり、容量的に嵩張ったり実行時リソースもそれなりに消費したりします。
そんな時には Lua が有力な組み込み選択肢となります。幸いな事に、 Lua はバイナリーでも配布されているのでこの記事のようにソースから扱わなくても簡単に使用できるのですが、 CMake と併せて扱ったり、標準のコンパイルオプションではないビルドを使いたい場合にはソースから扱ってもビルド時間も短く用途によってはクロスプラットフォームなメタビルドルールを記述する際にも便利が良くなります。
そこで、組み込みスクリプト言語として Lua をソースから CMake で扱う方法を整理します。
Lua のソースファイルのリストを生成
Lua のソースを展開する場所を ${lua_path}
として以下の具合でソースファイルのリストを生成する。
file( GLOB_RECURSE lua_sources ${lua_path}/src/*.c )
list( REMOVE_ITEM lua_sources
${lua_path}/src/lua.c
${lua_path}/src/luac.c
)
あとは ${lua_sources}
をお好みの add_executable
や add_library
で使うだけです。
アプリに直接リンクして使う
小規模なアプリで Lua を組み込むプロジェクトでは直接取り込む方法が最も単純です。
include_directories( ${lua_path}/src )
add_executable( my_app my_app_main.cxx ${lua_sources} )
バイナリーライブラリーを生成して使う
プロジェクトの規模やビルドの構成によってはバイナリーライブラリーを生成したい事も多いと思います。
include_directories( ${lua_path}/src )
# 動的リンク用のライブラリー ( .so なり .dll なり )
add_library( lua-shared SHARED ${lua_sources} )
# 静的リンク用のライブラリー ( .a なり .lib なり )
add_library( lua-static STATIC ${lua_sources} )
付録: ExternalProject でソース回収から行う方法
ソースを拾って展開して CMakeLists.txt を捏造し(この部分 PATCH などで行っても良いが今回はそれほど煩雑でも無いため echo で生成)、 lua.a をビルドし、 ExternalProject を定義した元のプロジェクトのビルドディレクトリーの lib と include へそれぞれ生成物と必要最小限のヘッダーファイルを複製します。
cmake_minimum_required( VERSION 3.2 )
project( lua_project )
include( ExternalProject )
set( lua_source_path ${CMAKE_CURRENT_BINARY_DIR}/external/lua/src/external_lua/ )
set( lua_cmake_file_path ${lua_source_path}/CMakeLists.txt )
ExternalProject_Add( external_lua
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/external/lua
INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}
URL http://www.lua.org/ftp/lua-5.3.2.tar.gz
URL_HASH SHA1=7a47adef554fdca7d0c5536148de34579134a973
PATCH_COMMAND
COMMAND echo cmake_minimum_required( VERSION 3.2 ) > ${lua_cmake_file_path}
COMMAND echo file( GLOB_RECURSE lua_sources src/*.c ) >> ${lua_cmake_file_path}
COMMAND echo list( REMOVE_ITEM lua_sources $\{CMAKE_CURRENT_SOURCE_DIR}/src/lua.c $\{CMAKE_CURRENT_SOURCE_DIR}/src/luac.c ) >> ${lua_cmake_file_path}
COMMAND echo project( lua_project ) >> ${lua_cmake_file_path}
COMMAND echo add_library( lua SHARED $\{lua_sources} ) >> ${lua_cmake_file_path}
COMMAND echo install( TARGETS lua DESTINATION lib ) >> ${lua_cmake_file_path}
COMMAND echo install( DIRECTORY src/ DESTINATION include FILES_MATCHING PATTERN "lua*.h*" ) >> ${lua_cmake_file_path}
COMMAND echo install( DIRECTORY src/ DESTINATION include FILES_MATCHING PATTERN "lauxlib.h" ) >> ${lua_cmake_file_path}
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}
-DCMAKE_COMPILER_IS_GNUCXX=${CMAKE_COMPILER_IS_GNUCXX}
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
)