web-dev-qa-db-fra.com

Avertissements CMake sous OS X: MACOSX_RPATH n'est pas spécifié pour les cibles suivantes

J'essaie de construire un logiciel basé sur CMake sous OS X (Yosemite) qui peut être construit avec succès sous Fedora 21. Il utilise un tas de bibliothèques. Les deux grands ouverts comme Boost et certains auto-écrits se trouvant dans/installation_folder/lib. J'utilise la version 3.3.0 de CMake.

Après l'exécution

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 

Je reçois les avertissements suivants:

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.

Le CMakeLists.txt contient les lignes suivantes concernant 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")

Tout ce que je peux dire, c'est que ${CMAKE_INSTALL_PREFIX}/lib est en effet le chemin correct, et que d'autres bibliothèques comme Boost se trouvent correctement.

Ignorer les avertissements et continuer avec "make" dans le répertoire de génération entraîne une erreur de liaison.

J'ai lu le article de gestion de CMake Wiki RPATH , mais je ne suis toujours pas en mesure de faire la distinction entre ces variables de chemin et leur utilisation correcte sur OS X.

19
fotinsky

L'ajout de set(CMAKE_MACOSX_RPATH 1) dans CMakeLists.txt, avant les instructions écrites ci-dessus, laisse les avertissements disparaître. Le problème de liaison après l'exécution de make reste. Cela m'amène à l'hypothèse que ma configuration RPATH n'a rien à voir avec mon problème de liaison.

Néanmoins, le problème de ce fil est résolu. Une explication sur l'utilisation correcte des options RPATH dans CMakeLists.txt est toujours la bienvenue!

25
fotinsky

Eh bien, je vais juste faire un pas en avant par rapport à la réponse de @ fotinsky. (N'hésitez pas à l'intégrer dans votre réponse.)

Le résultat de la suggestion de l'avertissement d'exécuter cmake-policy --help-policy CMP0042 est:

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.

Cela signifie simplement que dans les versions ultérieures de cmake, l'utilisateur doit activer ou désactiver explicitement CMAKE_MACOSX_RPATH .

Il y a aussi plus d'informations de fond sur l'introduction de cette variable dans cette entrée de blog CMake .

3
hopia