Cygwin+CMakeでEmscripten用のMakeを吐く
EmscriptenとVisualStudioでクロスコンパイル環境を用意したくて、プロジェクトをCMakeで定義しようと思ったら思いっきりハマった。
前提
- cygwinをインストールされている
- cygwinにでgcc/make等のコマンドがセットアップ済みである
- CMakeがインストールされている
- 2013/10/22時点でのsdk-incoming-32bitがインストールされている(cmakeのinvokeに関わる)
- .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が出来上がる。