Open5

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

okuokuokuoku

開発環境パッケージのビルド

基本的には packaging ディレクトリの各ディレクトリを、 conan build . してから conan export-pkg . することでローカルのパッケージリポジトリに入れていく。

  1. llvm-tempconan export-pkg .
  2. crtconan build . conan export-pkg .
  3. build0 (ditto)
  4. build1 (ditto)
  5. sysroot (ditto)

最後に、toolchainを conan install . conan export-pkg . 。これだけソースコードのコピーを伴うので install が必要になっている。もうちょっとクールな書き方を考えたい。。

okuokuokuoku

開発環境パッケージの利用

こっちが本題。

下準備

  1. Settings.ymlを編集して osWarp を足し、 conan config install settings.yml
  2. warp.profileを用意する
warp.profile
[settings]
arch=wasm
build_type=Release
os=Warp

[tool_requires]
warp-toolchain/[>=0]
warp-sysroot/[>=0]
llvmtoolchain-warp/[>=0]

利用

CMakeプロジェクトに conanfile.txt を追加する。

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

buildconan installcmake で一致している必要がある(Conanは何故かtoolchain fileをフルパスで記述しないため)。

okuokuokuoku

問題

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 が付くので、それもパッケージングのときに処理する必要がある。

https://github.com/okuoku/warpsdk/commit/a2987054b1d3c85a08441968912fbf994e638483

リンク時の問題

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)