読者です 読者をやめる 読者になる 読者になる

ヤルキデナイズド

Unclassified Articles on Software and IT

Io を Native Client で動かそうとした

プログラミング

動かそうとしたがうまくいかなかったので途中経過を記録しておく。

まず Io の所定のビルド手順を踏み、 make io2c して、できた io2c をパスの通った場所にコピーする。これは、 NaCl のツールチェインを使うと io2c のビルドでコケるため。対処が面倒なのであらかじめ普通に作って置いておく。

次に、 NaCl のツールチェインを使ってスタティックライブラリをビルドできるように、 Io の CMake ルールにパッチを当てる。

diff --git a/libs/CMakeLists.txt b/libs/CMakeLists.txt
index 5ead7dc..6717fbd 100644
--- a/libs/CMakeLists.txt
+++ b/libs/CMakeLists.txt
@@ -90,7 +90,7 @@ list(APPEND IOVMALL_STATIC_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/iovm/source/IoVMInit
 # ...And the static library. Refer to IOVMALL_STATIC_SRCS definition
 # up top.
 add_library(iovmall_static STATIC ${IOVMALL_STATIC_SRCS})
-add_dependencies(iovmall_static io2c basekit coroutine garabagecollector iovmall)
+add_dependencies(iovmall_static basekit_static coroutine_static garabagecollector_static)
 
 # Define the subdirectories we can reach from here that we want
 # to go into and build stuff.
diff --git a/libs/basekit/CMakeLists.txt b/libs/basekit/CMakeLists.txt
index 65d3827..d2d350f 100644
--- a/libs/basekit/CMakeLists.txt
+++ b/libs/basekit/CMakeLists.txt
@@ -27,8 +27,9 @@ add_library(basekit SHARED ${SRCS})
 target_link_libraries(basekit ${BASEKIT_LIBS})
 
 # ...And the static library
-#add_library(basekit_static STATIC ${SRCS})
+add_library(basekit_static STATIC ${SRCS})
 
 # The following add the install target, so we put libbasekit.* in our
 # install prefix.
 install(TARGETS basekit DESTINATION lib)
+install(TARGETS basekit_static DESTINATION lib)
diff --git a/libs/coroutine/CMakeLists.txt b/libs/coroutine/CMakeLists.txt
index d521ed6..3b3b2bf 100644
--- a/libs/coroutine/CMakeLists.txt
+++ b/libs/coroutine/CMakeLists.txt
@@ -30,6 +30,10 @@ endif(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Windows")
 # Now build the shared library
 add_library(coroutine SHARED ${SRCS})
 
+# ... And the static library
+add_library(coroutine_static STATIC ${SRCS})
+
 # The following add the install target, so we put libcoroutine.* in
 # our install prefix.
 install(TARGETS coroutine DESTINATION lib)
+install(TARGETS coroutine_static DESTINATION lib)
diff --git a/libs/garbagecollector/CMakeLists.txt b/libs/garbagecollector/CMakeLists.txt
index fd88bda..087513f 100644
--- a/libs/garbagecollector/CMakeLists.txt
+++ b/libs/garbagecollector/CMakeLists.txt
@@ -21,8 +21,10 @@ add_dependencies(garbagecollector basekit)
 target_link_libraries(garbagecollector basekit)
 
 # ...And the static library
-#add_library(garbagecollector_static STATIC ${SRCS})
+add_library(garbagecollector_static STATIC ${SRCS})
+add_dependencies(garbagecollector_static basekit_static)
 
 # The following add the install target, so we put libgarbagecollector.*
 # in our install prefix.
 install(TARGETS garbagecollector DESTINATION lib)
+install(TARGETS garbagecollector_static DESTINATION lib)

続いてスタティックライブラリをビルドする。

# 作業環境は Mac、 Pepper API のバージョンは16。適宜変更可
export NACL_SDK_ROOT=/path/to/nacl_sdk
PATH=$NACL_SDK_ROOT/pepper_16/toolchain/mac_x86/x86_64-nacl/bin:$PATH

cd /path/to/io-src-dir
mkdir build-nacl
cd build-nacl
cmake ..
make copy_iovm_headers iovmall_static

これで _build/lib/libiovmall_static.a ができる。

あとは NaCl のプロジェクトの build.scons を編集して

...

nacl_env = make_nacl_env.NaClEnvironment(
    nacl_platform=os.getenv('NACL_TARGET_PLATFORM'),
    toolchain_variant='glibc' # ←これを追加
)

# ↓これも追加
nacl_env.Append(

    EXTRA_CFLAGS=[
        '-I/path/to/io-src-dir/build-nacl/_build/headers'
    ],
    LINKFLAGS=[
        '-L/path/to/io-src-dir/build-nacl/_build/lib',
        '-liovmall_static'
    ])
# ↑

...

toolchain_variant='glibc' を追加しないと toolchain/mac_x86_newlib が使われる。追加すると toolchain/mac_x86 が使われる。後者を使うのは Io をビルドしたツールチェインと一致させるため。ちなみに前者はヘッダが足りず Io がビルドできない。

こうしてやると Io とリンクした NaCl バイナリが……できない。 libiovmall_static が incompatible だと言われる。どうして〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜