Windows で boost と cmake を使っています。以下のように boost のライブラリディレクトリを取得してリンクディレクトリに追加していました。
find_package(Boost 1.87 REQUIRED COMPONENTS program_options) link_directories(${Boost_LIBRARY_DIRS})
cmake を 3.31 にアップグレードしたところ、CMakeLists.txt で find_package(Boost ...) にて、 boost のライブラリディレクトリが、 cmake の変数 Boost_LIBRARY_DIRS に取得できないという問題が発生しました。
cmake のポリシー CMP0167 に関係するらしく、cmake_policy(SET CMP0167 OLD) で互換モードに設定すれば回避できるのですが、互換モードは cmake の将来のバージョンでは削除されるかもしれないということで他の回避方法を探しました。
cmake 変数 Boost_DIR が BoostConfig.cmake のあるディレクトリのパス(../lib/cmake/Boost-1.xx.0/) を持っているので、その親の親のディレクトリを使用すれば良いという結論になりました。
念のため、その親の親のディレクトリ内の libboost_*.lib にマッチするファイルの数をカウントして 0 でないときだけ採用します。
find_package(Boost ...) の後に以下を追加すれば OK です。
if (WIN32) if ("${Boost_LIBRARY_DIRS}" STREQUAL "") message(STATUS "Check grandparent of Boost_DIR (${Boost_DIR})...") get_filename_component(Boost_PARENT_DIR ${Boost_DIR} DIRECTORY) get_filename_component(Boost_GRANDPARENT_DIR ${Boost_PARENT_DIR} DIRECTORY) message(DEBUG "Boost_GRANDPARENT_DIR: ${Boost_GRANDPARENT_DIR}") file(GLOB FileList "${Boost_GRANDPARENT_DIR}/libboost_*.lib") message(TRACE "FileList: ${FileList}") # 長いよ list(LENGTH FileList FileCount) message(STATUS "libboost file count: ${FileCount}") if (FileCount) list(APPEND Boost_LIBRARY_DIRS ${Boost_GRANDPARENT_DIR}) message(STATUS "Boost_LIBRARY_DIRS: ${Boost_LIBRARY_DIRS}") endif() endif() if ("${Boost_LIBRARY_DIRS}" STREQUAL "") message(FATAL_ERROR "Boost_LIBRARY_DIRS is empty.") endif() endif (WIN32)