web-dev-qa-db-fra.com

Comment demander à CMake de rechercher les bibliothèques installées par MacPorts?

J'essaie de construire certains de nos logiciels, qui ont été conçus pour fonctionner uniquement sur Linux, sur MacOS X. Nous utilisons CMake et j'ai installé MacPorts afin que je puisse facilement obtenir CMake avec certaines des bibliothèques tierces dont nous dépendons. .

Maintenant, le problème est que CMake ne semble pas rechercher les bibliothèques de MacPorts par défaut, donc plusieurs de nos cibles sont désactivées car il ne trouve pas les dépendances qui sont toutes dans / opt/local.

Comment puis-je demander à CMake de rechercher également les inclusions et les bibliothèques de MacPorts?

32
David Holm

J'ai ajouté un fichier de chaîne d'outils pour "Darwin" qui ajoute les chemins d'inclusion et de bibliothèque nécessaires. J'espérais quelque chose d'un peu plus automatique mais au moins ça résout le problème.

darwin.cmake:

SET(CMAKE_SYSTEM_NAME Darwin)

# Add MacPorts
INCLUDE_DIRECTORIES(/opt/local/include)
LINK_DIRECTORIES(/opt/local/lib)
15
David Holm

Ajoutez/opt/local/lib et tout autre chemin d'installation probable à l'ensemble des chemins recherchés par cmake dans votre fichier CMakeLists.txt:

set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} /opt/local/lib)

Cela ajoute/opt/local/lib à l'ensemble des chemins dans lesquels cmake recherche les bibliothèques. Cette technique CMAKE_LIBRARY_PATH affectera toutes les commandes find_library Après avoir défini la variable.

Pour une approche plus chirurgicale, bibliothèque par bibliothèque, modifiez les commandes individuelles find_library:

find_library(Foo foo
    PATHS /opt/local/lib)

Notez que cela n'est pas hardcode/opt/local/lib comme le seul endroit où chercher la bibliothèque. Au contraire, il ajoute simplement/opt/local/lib à l'ensemble des emplacements dans lesquels rechercher la bibliothèque. Je finis souvent par ajouter de nombreux chemins de ce type, couvrant les emplacements observés sur toutes les machines que je connais. Voir la documentation find_library pour plus de variations sur ce thème.

Vous pouvez également souhaiter modifier CMAKE_INCLUDE_PATH , ce qui affecte le comportement des commandes find_file() et find_path().

32
Christopher Bruns

CMake doit respecter le DYLD_LIBRARY_PATH variable d'environnement, qui est l'équivalent de LD_LIBRARY_PATH variable d'environnement sous Linux. Votre DYLD_LIBRARY_PATH doit avoir le chemin d'accès approprié pour trouver les bibliothèques installées par MacPorts.

6
Hank Gay

Par @ Nerdling's "Do NOT hardcode" commentez la solution acceptée, voici une proposition pour détecter le chemin du préfixe MacPorts.

MyModule.cmake

# Detect if the "port" command is valid on this system; if so, return full path
EXECUTE_PROCESS(COMMAND which port RESULT_VARIABLE DETECT_MACPORTS OUTPUT_VARIABLE MACPORTS_PREFIX ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)

IF (${DETECT_MACPORTS} EQUAL 0)
    # "/opt/local/bin/port" doesn't have libs, so we get the parent directory
    GET_FILENAME_COMPONENT(MACPORTS_PREFIX ${MACPORTS_PREFIX} DIRECTORY)

    # "/opt/local/bin" doesn't have libs, so we get the parent directory
    GET_FILENAME_COMPONENT(MACPORTS_PREFIX ${MACPORTS_PREFIX} DIRECTORY)

    # "/opt/local" is where MacPorts lives, add `/lib` suffix and link
    LINK_DIRECTORIES(${LINK DIRECTORIES} ${MACPORTS_PREFIX}/lib)

    MESSAGE("WINNING!: ${MACPORTS_PREFIX}/lib")
ENDIF()

# Recommendation, also add a "brew --prefix" custom command to detect a homebrew build environment
2
tresf