Open3
warp: 共有ライブラリのワークフロー整理

そもそも、どういう機能性をSDKとしてサポートしないといけないのか考えたい。 ...いやまぁWebAssemblyのRPATHとかまだ誰も使ってないと思うけど。。

基本的な形を作る(1-pass integration)
とりあえずビルドを通す。
シンボルのexport/import属性はプラットフォーム毎に異なるので専用の移植性ヘッダが必要になる。CMakeは専用のモジュール GenerateExportHeader
を提供している(何故?) https://cmake.org/cmake/help/latest/module/GenerateExportHeader.html
このようにしてビルドすると、LinuxのようなELFプラットフォームではビルドディレクトリから直接実行できる。(RPATHが設定されるため)
{
"directory": "/home/okuoku/repos/shlibtest/buildinteg/_build",
"command": ": && /usr/bin/cc mainexec/CMakeFiles/mainexec.dir/main.c.o -o mainexec/mainexec -Wl,-rpath,/home/okuoku/repos/shlibtest/buildinteg/_build/testmod testmod/libaddtwo.so && :",
"file": "mainexec/CMakeFiles/mainexec.dir/main.c.o",
"output": "mainexec/mainexec"
},
逆に、 この性質があるため、install()しないと正常なexecutableを得られない という問題がある。

install()を書く
単純に1-passビルドをwrapするだけならやることはそこまで多くなく、
-
<ライブラリ名>Config.cmake
を用意する。内容は空で良いinclude("${CMAKE_CURRENT_LIST_DIR}/<ライブラリ名>Targets.cmake")
だけ -
ライブラリをALIASしておく<ライブラリ名>Targets.cmake
をexport
コマンドで生成する -
CMAKE_PREFIX_PATH
に上記の.cmake
ファイルの生成先を追加する -
find_package
を呼ぶ (こうすることで2-passビルド時も同じCMakeLists.txtを使える) - リンクするライブラリの名前をnamespaceされたものに替えておく
↑のコミットだと無からビルドするときにエラーになる:
okuoku@stripe:~/repos/shlibtest/buildinteg/_build$ cmake .
-- Prefix = /home/okuoku/repos/shlibtest/buildinteg/_build/pkgs
CMake Error at _build/pkgs/ShlibtestAddtwoConfig.cmake:1 (include):
include could not find requested file:
/home/okuoku/repos/shlibtest/buildinteg/_build/pkgs/ShlibtestAddtwoTargets.cmake
Call Stack (most recent call first):
/home/okuoku/repos/shlibtest/mainexec/CMakeLists.txt:4 (find_package)
CMP0024 https://cmake.org/cmake/help/latest/policy/CMP0024.html はALIASを使えといってるのでそうする。。