Cygwin+CMakeでEmscripten用のMakeを吐く

EmscriptenとVisualStudioでクロスコンパイル環境を用意したくて、プロジェクトをCMakeで定義しようと思ったら思いっきりハマった。

前提

  1. cygwinをインストールされている
  2. cygwinにでgcc/make等のコマンドがセットアップ済みである
  3. CMakeがインストールされている
  4. 2013/10/22時点でのsdk-incoming-32bitがインストールされている(cmakeのinvokeに関わる)
  5. .emscriptenがちゃんと設定出来ている。


EmscriptenのToolChainはclang/llvmをベースとした環境で、clangはgccのコマンドオプションに互換性があると言う事で、基本的にはUnixベースのMakefileが利用しやすい。

Makefileを作る方法は色々あるけど、VisulalStudioと同時に使って行く道を模索した結果、CMakeでプロジェクト定義をして、環境に合わせたプロジェクトを出力出来るようにした。

CMakeは、その環境に適したプロジェクトファイルを出力するには、実際にその環境を持っている必要がある。(sconsにはその制限が無いらしい?)

僕はWindowsユーザーなのだけど、UnixライクなMakefileをCMakeから出力したい。
Windows上のUnixと言えばCygwin!!てな具合で、cygwin環境を使ってCMakeにUnix環境を認識させてMakefileを作る事にした。
(実際にはMinGWとか試して上手く行かなかったので、最終的にCygwinに落ち着きました)


まず、Emscriptenをインストールしたフォルダにあるemcmdprompt.batからコンソールを起動。

cygwin\binへのパスを環境変数のpathへ追加する。

CMakeLists.txtが存在するフォルダにて以下を実行。

>emconfigure "c:\Program Files (x86)\CMake 2.8\bin\cmake.exe" -G "Unix Makefiles"

内部で-DCMAKE_TOOLCHAIN_FILEが定義され、Emscriptenのcmake/platform/Emscripten.cmakeを読みに行くようになっている。
このファイルの中ではUnix Makefiles/MinGW Makefiles等の-Gオプションに対して、invokeが掛かるようになっており、そこでemccやらが設定される。
僕の場合はcygwinを利用するのでUnix Makefilesを選択した。

CMakeを実行すると、Makefileが出来るのであとはmakeを呼び出すだけ。
出力されるファイルは、add_executableの拡張子次第

ちなみにemconfigureは、./configureやcmakeの動作に必要な環境変数を定義してくれるスクリプト。

cmakeは絶対パスで指定するのがポイント。何故かPathを通したcmakeでは上手く行かなかった。
(pythonのsubprocessのpopenに依るもの??んー。詳しくないので判らず。)

CMakeLists.txtは以下のような感じでテストしてみた。

cmake_minimum_required (VERSION 2.6)

# 絶対PathだとWarningが出るので、相対パスを使うようにする
set(CMAKE_USE_RELATIVE_PATHS ON)

project (CMakeTest)

# バージョン番号
set (CM_VERSION_MAJOR 1)
set (CM_VERSION_MINOR 0)

# CMake の設定をソースコードに渡すための
# ヘッダファイルの構成
configure_file (
  "${PROJECT_SOURCE_DIR}/Project/CMakeConfig.h.in"
  "${PROJECT_BINARY_DIR}/Project/CMakeConfig.h"
  )

# TutorialConfig.h を検出できるように,
# インクルードファイルの探索パスにバイナリツリーを追加
include_directories("${PROJECT_BINARY_DIR}/Project")

# 実行ファイルを追加
add_executable(CMakeTest.html Project/main.cpp)

先程の方法を使ってemconfigureを呼び出して、makeするとCMakeTest.htmlが出来上がる。