CMakeで自動生成ファイルを出力させる

Pocket

あるソースコードにテーブルが配列として含まれているという状況で、メンテナンス性を高めるためにその内容を別のファイルに分離して、機械処理で配列として出力し、それをincludeするという手段を考えました。

これをautomakeで実現するのはそれほど難しくないのですが、autotools依存を避けるためにCMakeで実現する方法を調べてみました。

最終的に、以下のようなCMakeLists.txtで実現できました。

cmake_minimum_required(VERSION 2.8)

project(kakasi3)

include_directories( ${CMAKE_BINARY_DIR} )

add_library(libkakasi SHARED ${PROJECT_SOURCE_DIR}/src/kk2.c)

add_custom_command (
  OUTPUT k2rom_hepburn.c
  COMMAND perl "${PROJECT_SOURCE_DIR}/scripts/octtable.pl"
   "${PROJECT_SOURCE_DIR}/table/k2rom_hepburn.txt"
    > "${PROJECT_BINARY_DIR}/k2rom_hepburn.c"
)

add_custom_target( generate_headers DEPENDS k2rom_hepburn.c)

add_dependencies( libkakasi  generate_headers )

src/kk2.cがk2rom_hepburn.cをincludeすることを前提としています。k2rom_hepburn.cはperl scriptを通してtable/k2rom_hepburn.txtから生成します。

生成するスクリプトはadd_custom_commandを使います。OUTPUTに出力するファイル名、COMMANDに実行するコマンドを記述します。行が長くなる場合には、改行を任意の箇所で入れられるようです。

出力するファイルk2rom_hepburn.cを直接ターゲットとして扱えないようなので、add_custom_targetでgenerate_headersというターゲットを明示して作成し、その依存関係としてk2rom_hepburn.cを記述します。

最後に、作成したターゲットを依存関係へ組み込むためadd_dependencyを使います。これで、libkakasiの生成にgenerate_headersが依存することを明記しました。

以上のステップを踏むことによって、k2rom_hepburn.txtからk2rom_hepburn.cが生成された上でkk2.cがコンパイルされ、それをもとにlibkakasi.soが出力されます。

By knok

I am a Debian Developer and a board member of Free Software Initiative (FSIJ).