2024/9/20(金)

libsoundioをちょっとCMakeでビルドしようとしたらえらい目にあった。

まず、Windows上で普通にCMakeビルドしようとしただけで死ぬ。公式ドキュメントを見ると、MXEなるツールを使えということらしい。なんだこりゃ?CMakeだけで済むのがCMakeの美点だろうに。

https://www.clear-code.com/blog/2019/6/6.html

どうやら、MXEというのはGCC方言で書かれたコードをMSVCなどでもビルドできるように変換してくれるようなものらしい。気持ち悪い上に導入が面倒くさい。CMakeの設定変更のみでどうにかならないか試行してみる。

まず、死ぬほど大量の構文エラーが出る。根本を辿ってみるとどうやらstdatomic.hをインクルードするのが諸悪の根源らしい。C++ではC++23で導入されたヘッダだが、CではC11で入っている。MSVCはこれをインクルードすると即死する。

この記事を見るに、C標準をC11にして/experimental:c11atomicsを付ければ通るらしい。そしたら確かに大部分のエラーは消えた。残ったのはunistd.hなどのUnix環境特有のヘッダなどだ。どうやら完全にLinux環境×gccビルドを前提に書いて他環境はMXEでなんとかするという腹積もりらしい。評判は良いのに中身はなかなか舐めた開発だ。

vcpkgのport定義を参考にしてみたところ、テストやサンプルプログラムのビルドを切れば良いことが分かった。さらに、動的ライブラリとしてビルドしたときのみいくつかのエラーが出ることも分かったため、それもオフにした。最終的に以下のコードに行きついた。

if(MSVC)
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /experimental:c11atomics")
  set(CMAKE_C_STANDARD 11)
  set(BUILD_EXAMPLE_PROGRAMS OFF)
  set(BUILD_TESTS OFF)
  set(BUILD_DYNAMIC_LIBS OFF)
endif()
FetchContent_Declare(
  libsoundio
  GIT_REPOSITORY https://github.com/andrewrk/libsoundio.git
  GIT_TAG 2.0.0)
FetchContent_MakeAvailable(libsoundio)

グローバルのプロパティを汚してしまうのは別で対処するとして、とりあえずこれでビルドが通った。

グローバルを汚してしまう問題については、プロパティの変更前を保存しておけば後で復帰できる。

https://stackoverflow.com/questions/73885608/how-to-add-compile-options-to-cmake-fetchcontent-dependency-using-target-interfa

Categories: