Open2

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

okuokuokuoku

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を外部指定したりもできたんだけど。。

okuokuokuoku

代わりにはなる

https://github.com/okuoku/cmakepkgtest/commit/8abf0dd9585121325b6f2a902ebb658e792234aa

試してみたところ、普通の 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することを期待しているのでこれで良いらしいが。。