Domanda

Sto cercando di costruire alcuni dei nostri software, che è stato progettato per funzionare esclusivamente su Linux, su MacOS X. Stiamo usando CMake e ho installato MacPorts così ho potuto facilmente ottenere CMake insieme ad alcune delle librerie di terze parti che noi dipendiamo.

Ora il problema è che CMake non sembra ricercare le librerie da MacPorts per default in modo molti dei nostri obiettivi sono disabilitati in quanto non riesce a trovare le dipendenze che sono tutti in / opt / local .

Come posso istruire CMake cercare anche per include e le librerie da MacPorts?

È stato utile?

Soluzione 2

Ho aggiunto un file toolchain per " Darwin ", che aggiunge la necessaria includere e percorsi di libreria. Speravo in qualcosa di un po 'più automatico, ma almeno si risolve il problema.

darwin.cmake :

SET(CMAKE_SYSTEM_NAME Darwin)

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

Altri suggerimenti

Aggiungi / opt / local / lib, e qualsiasi altro probabile installazione percorsi, per l'insieme dei percorsi cercato da CMake nel file CMakeLists.txt:

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

Questo aggiunge / opt / local / lib alla serie di percorsi in cui le ricerche cmake per le biblioteche. Questo CMAKE_LIBRARY_PATH tecnica interesserà tutti i comandi find_library dopo aver impostare la variabile.

Per una più chirurgica, una biblioteca-by-libreria di approccio, modificare i singoli comandi find_library:

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

Si noti che questo non hardcode / opt / local / lib come l'unico luogo per cercare la libreria. Piuttosto, semplicemente aggiunge / opt / local / lib al set di sedi in cui effettuare la ricerca per la libreria. Mi capita spesso di finire l'aggiunta di molti di questi percorsi, degli impianti di produzione osservati su tutte le macchine che so di. Vedere la find_library documentazione per ulteriori variazioni sul tema .

Si potrebbe anche desiderare di cambiare CMAKE_INCLUDE_PATH , che influisce sul comportamento dei comandi find_file() e find_path().

CMake deve rispettare la variabile d'ambiente DYLD_LIBRARY_PATH, che è l'equivalente della variabile di ambiente LD_LIBRARY_PATH su Linux. Il tuo DYLD_LIBRARY_PATH ha bisogno di avere il percorso corretto per trovare le librerie installate da MacPorts.

Per @ di Nerdling "NON hardcode" commento alla soluzione accettata, ecco una proposta per rilevare il percorso del prefisso 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top