web-dev-qa-db-ja.com

OS XでのCMake警告:MACOSX_RPATHが次のターゲットに指定されていません

Fedora 21で正常にビルドできるOS X(Yosemite)でCMakeベースのソフトウェアをビルドしようとしています。多くのライブラリを使用しています。両方、Boostのような大きく開いたものと、/ installation_folder/libにある自己記述のもの。 CMakeバージョン3.3.0を使用しています。

実行後

mkdir build
cd build
cmake .. -DCMAKE_C_COMPILER=/usr/local/Cellar/gcc/5.2.0/bin/gcc-5 -DCMAKE_CXX_COMPILER=/usr/local/Cellar/gcc/5.2.0/bin/g++-5  -DCMAKE_MODULE_PATH=${PWD}/../external/install/share/llvm/cmake 

次の警告が表示されます。

CMake Warning (dev):
Policy CMP0042 is not set: MACOSX_RPATH is enabled by default.  Run "cmake
--help-policy CMP0042" for policy details.  Use the cmake_policy command to
set the policy and suppress this warning.

MACOSX_RPATH is not specified for the following targets:

ClangWrapper
Structure
WCETXML

This warning is for project developers.  Use -Wno-dev to suppress it.

CMakeLists.txtには、RPATHに関する次の行が含まれています。

SET(CMAKE_SKIP_BUILD_RPATH FALSE)
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir)

IF("${isSystemDir}" STREQUAL "-1")
  SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
ENDIF("${isSystemDir}" STREQUAL "-1")

言えるのは、${CMAKE_INSTALL_PREFIX}/libは確かに正しいパスであり、Boostのような他のライブラリは正しく検出されます。

警告を無視し、ビルドディレクトリで「make」を続行すると、リンクエラーが発生します。

CMake Wiki RPATH handling article を読みましたが、これらのパス変数とOS Xでの正しい使用を区別することはできません。

19
fotinsky

上記の記述の前にCMakeLists.txtにset(CMAKE_MACOSX_RPATH 1)を追加すると、警告が消えます。 makeを実行した後のリンクの問題は残ります。これにより、RPATHのセットアップはリンクの問題とは無関係であるという仮定に至ります。

それにもかかわらず、このスレッドの問題は解決されています。 CMakeLists.txt内のRPATHオプションの正しい使用に関する説明は、まだ大歓迎です!

25
fotinsky

さて、@ fotinskyの答えから一歩先に進みます。 (これを自由に回答に組み込んでください。)

Cmake-policy --help-policy CMP0042を実行するという警告の提案の出力は次のとおりです。

CMake 2.8.12 and newer has support for using ``@rpath`` in a target's install
name.  This was enabled by setting the target property
``MACOSX_RPATH``.  The ``@rpath`` in an install name is a more
flexible and powerful mechanism than ``@executable_path`` or ``@loader_path``
for locating shared libraries.

CMake 3.0 and later prefer this property to be ON by default.  Projects
wanting ``@rpath`` in a target's install name may remove any setting of
the ``INSTALL_NAME_DIR`` and ``CMAKE_INSTALL_NAME_DIR``
variables.

This policy was introduced in CMake version 3.0.  CMake version
3.1.3 warns when the policy is not set and uses OLD behavior.  Use
the cmake_policy command to set it to OLD or NEW explicitly.

これは単に、新しいcmakeバージョンでは、ユーザーが明示的に有効または無効にする必要があることを意味しますCMAKE_MACOSX_RPATH

この CMakeブログエントリ には、この変数の導入に関する背景情報もあります。

3
hopia