CMake packageはCMake moduleの替わりになるのか問題

find_package
コマンドも include
コマンドも CMAKE_MODULE_PATH
からモジュールを探すことになっている。が、 find_package
はパッケージレジストリも持っている。
specifying a search path for CMake modules to be loaded by the include() or find_package() commands before checking the default modules that come with CMake
A
<PackageName>
may appear under registry key:HKEY_CURRENT_USER\Software\Kitware\CMake\Packages\<PackageName>
as a
REG_SZ
value, with arbitrary name, that specifies the directory containing the package configuration file.
いや本当にレジストリ使うことないやろ。。(UNIXでは ~/.cmake/packages/
と割とまっとうなロケーションになっている)
(CMakeの一部のコマンドはpathの代わりにレジストリを受け入れる https://cmake.org/cmake/help/latest/manual/cmake-developer.7.html#find-using-windows-registry )
じゃぁ include
じゃなくて find_package
だけ有ればよくね。。?というわけで交換可能なのか確認してみる。
何故?
VSCode等は自前でCMakeを呼ぶことに依存しているため。いや昔はcacheのオープンとかできたしgeneration commandを外部指定したりもできたんだけど。。

代わりにはなる
試してみたところ、普通の include
と同じ効果はありそうだ。つまり、モジュール定義の中で関数を定義すると、その関数はそのまま使えるようになる。
インストールするためには reg
コマンドを叩いたが、手元では glm
のパッケージが既に登録されていたのでたぶん誰か勝手に登録してる奴が既に居る。
execute_process(COMMAND
reg add
"HKCU\\Software\\Kitware\\CMake\\Packages\\PackageTest"
/f
/t REG_SZ
/v default_name
/d "${CMAKE_CURRENT_LIST_DIR}/PackageTestConfig.cmake")
Overrideしたい場合は Find〜.cmake を作って CMAKE_MODULE_PATH
を設定すれば良い。 ...が、CMAKE_MODULE_PATH はプロジェクト内で上書きしても良いことになっているのでちょっとコレに頼るのは微妙な気がしないでもない。。
It is common for users to set the CMAKE_MODULE_PATH when running CMake, and it is common for CMake projects to append to CMAKE_MODULE_PATH to allow use of local Find module files.
CMake的には、プロジェクトはappendすることを期待しているのでこれで良いらしいが。。