warp: 開発環境の使い方を思い出す会

ちょっと開発から離れてると全然忘れててビックリ。まぁ他のプロジェクトが全部CMakeなのにwarpだけConanにしたからね...

開発環境パッケージのビルド
基本的には packaging
ディレクトリの各ディレクトリを、 conan build .
してから conan export-pkg .
することでローカルのパッケージリポジトリに入れていく。
-
llvm-temp
→conan export-pkg .
-
crt
→conan build .
conan export-pkg .
-
build0
(ditto) -
build1
(ditto) -
sysroot
(ditto)
最後に、toolchainを conan install .
conan export-pkg .
。これだけソースコードのコピーを伴うので install
が必要になっている。もうちょっとクールな書き方を考えたい。。

開発環境パッケージの利用
こっちが本題。
下準備
- Settings.ymlを編集して
os
にWarp
を足し、conan config install settings.yml
- warp.profileを用意する
[settings]
arch=wasm
build_type=Release
os=Warp
[tool_requires]
warp-toolchain/[>=0]
warp-sysroot/[>=0]
llvmtoolchain-warp/[>=0]
利用
CMakeプロジェクトに conanfile.txt
を追加する。
[generators]
CMakeDeps
CMakeToolchain
これで conan install
すると、 build
ディレクトリ以下にバッチファイル類が生成される。
conan install . -pr ./warp.profile --output-folder=build --build=missing -c tools.cmake.cmaketoolchain:generator=Ninja
その後、presetを使う。
cmake --preset conan-release -S . -B build
build
は conan install
と cmake
で一致している必要がある(Conanは何故かtoolchain fileをフルパスで記述しないため)。

問題
CMake presetを使った場合、環境変数がconfigure時にしか効かないので伝播してやる必要があるっぽい。 ...これ悩みどころだな。。
EDIT: cmake --build build
でOKだった。つまり、CMakeにビルドをさせるとpresetを読んでくれる。
[1/6] Building C object CMakeFiles/hello.dir/hello.c.obj
FAILED: CMakeFiles/hello.dir/hello.c.obj
E:\conan_home\p\b\warp-d8f54e773dffb\p\bin\warp-cc.bat -MD -MT CMakeFiles/hello.dir/hello.c.obj -MF CMakeFiles\hell
o.dir\hello.c.obj.d -o CMakeFiles/hello.dir/hello.c.obj -c E:/repos/warpsdk/check2/hello.c
CMake Error at E:/conan_home/p/b/warp-d8f54e773dffb/p/cmake/_sdkpaths.cmake:9 (message):
WARP_TOOLCHAIN_PREFIX unknown.
Call Stack (most recent call first):
E:/conan_home/p/b/warp-d8f54e773dffb/p/cmake/warp-cc.cmake:9 (include)
VSCodeとかを考えるとConfigure時にbakeしてしまった方が良い気はする。起動時の環境変数優先で "fallback〜" みたいなオプション付けるのが良いかな。
あと、 Windowsではツールチェインwrapperの拡張子に .bat
が付くので、それもパッケージングのときに処理する必要がある。
リンク時の問題
syscall類は未実装なので後でやるとして、3引数のmainだと main
自体がリネームされてしまうようで見つからない問題になる。 weak で2引数 main
を持っている必要があるのかな。。
[5/6] Linking C executable hello
FAILED: hello
cmd.exe /C "cd . && E:\conan_home\p\b\warp-d8f54e773dffb\p\bin\warp-cc.bat CMakeFiles/hello.dir/hello.c.obj -o hello
&& cd ."
wasm-ld: error: e:/conan_home/p/b/warp-0bef81d336890/p/lib\libc.a(picosbrk.c.o): undefined symbol: __heap_start
wasm-ld: error: e:/conan_home/p/b/warp-0bef81d336890/p/lib\libc.a(picosbrk.c.o): undefined symbol: __heap_start
wasm-ld: error: e:/conan_home/p/b/warp-0bef81d336890/p/lib\libc.a(posixiob_stdout.c.o): undefined symbol: read
wasm-ld: error: e:/conan_home/p/b/warp-0bef81d336890/p/lib\libc.a(posixiob_stdout.c.o): undefined symbol: write
wasm-ld: error: e:/conan_home/p/b/warp-0bef81d336890/p/lib\libc.a(posixiob_stdout.c.o): undefined symbol: lseek
wasm-ld: error: e:/conan_home/p/b/warp-0bef81d336890/p/lib\libc.a(posixiob_stdout.c.o): undefined symbol: close
clang: error: linker command failed with exit code 1 (use -v to see invocation)
CMake Error at E:/conan_home/p/b/warp-d8f54e773dffb/p/cmake/warp-cc.cmake:90 (message):
Err: 1 (e:/conan_home/p/b/llvmt2c5a3eddf20b4/p/bin/clang)
[6/6] Linking C executable hello3
FAILED: hello3
cmd.exe /C "cd . && E:\conan_home\p\b\warp-d8f54e773dffb\p\bin\warp-cc.bat CMakeFiles/hello3.dir/hello3.c.obj -o hel
lo3 && cd ."
wasm-ld: error: e:/conan_home/p/b/warp-0bef81d336890/p/lib/warpcrt_exec.o: undefined symbol: main
clang: error: linker command failed with exit code 1 (use -v to see invocation)
CMake Error at E:/conan_home/p/b/warp-d8f54e773dffb/p/cmake/warp-cc.cmake:90 (message):
Err: 1 (e:/conan_home/p/b/llvmt2c5a3eddf20b4/p/bin/clang)

main
への対応
3引数 WasmLinuxと同じ方針で良い。