2009-09-28 11 views
29

Estoy tratando de construir parte de nuestro software, que fue diseñado para ejecutarse únicamente en Linux, en MacOS X. Estamos usando CMake e instalé MacPorts para que pueda obtener fácilmente CMake junto con algunas de las bibliotecas de terceros que depender de.¿Cómo le indico a CMake que busque las bibliotecas instaladas por MacPorts?

Ahora el problema es que no aparece CMake para buscar bibliotecas de MacPorts por defecto para varios de nuestros objetivos son discapacitados, ya que no encuentra las dependencias que están todos en /opt/local.

¿Cómo puedo instruir a CMake para que también busque inclusiones y bibliotecas de MacPorts?

+0

¿Usted ha considerado simplemente añadiendo su proyecto al repositorio DarwinPorts? De esta forma, todos los indicadores correctos se transfieren desde MacPorts. –

+2

Es una solución patentada. –

Respuesta

15

Agregué un archivo de cadena de herramientas para "Darwin" que agrega las rutas de acceso e inclusión necesarias. Esperaba algo un poco más automático, pero al menos resuelve el problema.

darwin.cmake:

SET(CMAKE_SYSTEM_NAME Darwin) 

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

NO codificar/opt/local.Puede ser cualquier directorio en el que el usuario instale MacPorts. –

+0

normalmente no es una buena idea. Es mucho mejor dejar que tu RUTA haga los hallazgos de las bibliotecas que necesitas incluir y agrega los nombres de la biblioteca específicamente. Entonces, cada plataforma UNIX es diferente. – Dave

+1

Estoy de acuerdo, pero esta no es la solución óptima de todos modos, pero fue la única solución de trabajo que pude encontrar. –

6

CMake necesita respetar la variable de entorno DYLD_LIBRARY_PATH, que es el equivalente de la variable de entorno LD_LIBRARY_PATH en Linux. Su DYLD_LIBRARY_PATH necesita tener la ruta adecuada para encontrar las bibliotecas instaladas por MacPorts.

+1

LD_LIBRARY_PATH solo debe utilizarse para la depuración y la prueba. En particular, si su ejecutable es setuid o setgid, se ignorará. La información de compilación debe estar con la otra información de compilación en los archivos del proyecto. –

30

Agregar/opt/local/lib, y cualquier otra probable rutas de instalación, para el conjunto de caminos buscado por cmake en su archivo CMakeLists.txt:

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

Esto agrega/opt/local/lib al conjunto de rutas en las que cmake busca las bibliotecas. Esta técnica CMAKE_LIBRARY_PATH afectará a todos los comandos find_library después de establecer la variable.

Para una mayor quirúrgica, biblioteca-por-biblioteca de enfoque, modificar los comandos find_library individuales:

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

en cuenta que esto no hardcode/opt/local/lib como el único lugar para buscar la biblioteca. Por el contrario, simplemente agrega/opt/local/lib al conjunto de ubicaciones en las que buscar la biblioteca. A menudo termino agregando muchas de estas rutas, cubriendo las ubicaciones observadas en todas las máquinas que conozco. Consulte el find_library documentation para obtener más variaciones sobre este tema. Es posible que también desee cambiar CMAKE_INCLUDE_PATH, que afecta el comportamiento de los comandos find_file() y find_path().

+4

Para una sintaxis ligeramente más agradable: list (APPEND CMAKE_LIBRARY_PATH/opt/local/lib) –

+0

También puede documentar 'NO_DEFAULT_PATH' ya que es posible que desee utilizar lib solo desde la ubicación de macports pero no buscar los regulares. – malat

+1

Esta respuesta ha desperdiciado mucho de mi tiempo para mí, parece que felizmente ignorar esta variable (o tal vez se usa para fines completamente diferentes). Solo quería advertir a las personas, ya que la respuesta real (correcta) es la que contiene (confusamente) menos votos ascendentes: use 'link_directories'. – Marco

2

Per @ Nerdling's "NO codificar" comentar sobre la solución aceptada, aquí hay una propuesta para detectar la ruta del prefijo 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 
Cuestiones relacionadas