2009-09-28 3 views
29

Ich versuche, einige unserer Software, die entworfen wurde, um ausschließlich unter Linux zu laufen, auf MacOS X zu bauen. Wir verwenden CMake und ich installierte MacPorts, so dass ich CMake zusammen mit einigen der Bibliotheken von Drittanbietern leicht bekommen konnte darauf ankommen.Wie weise ich CMake an, nach von MacPorts installierten Bibliotheken zu suchen?

Das Problem ist jetzt, dass CMake nicht für Bibliotheken von MacPorts standardmäßig zu aussehen scheint so einige unserer Ziele sind deaktiviert, da es die Abhängigkeiten zu finden, fehlschlägt, die alle in /sind opt/local.

Wie kann ich CMake anweisen, auch nach Includes und Bibliotheken von MacPorts zu suchen?

+0

Haben Sie darüber nachgedacht, einfach Ihr Projekt in die Repo MacPorts hinzufügen? Auf diese Weise werden alle korrekten Flags von MacPorts übergeben. –

+2

Es ist eine proprietäre Lösung. –

Antwort

15

Ich habe eine Toolchain-Datei für "Darwin" hinzugefügt, die die erforderlichen Include- und Bibliothekspfade hinzufügt. Ich habe auf etwas mehr automatisches gehofft, aber es löst wenigstens das Problem.

darwin.cmake:

SET(CMAKE_SYSTEM_NAME Darwin) 

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

Nicht hart codieren/opt/local.Dies kann ein beliebiges Verzeichnis sein, in dem der Benutzer MacPorts installiert. –

+0

normalerweise keine gute Idee. Viel besser, Ihren PATH die Funde der Bibliotheken machen zu lassen, die Sie benötigen, um die Bibliotheksnamen spezifisch hinzuzufügen und hinzuzufügen. Dann ist jede UNIX-Plattform anders. – Dave

+1

Ich stimme zu, aber das ist sowieso nicht die optimale Lösung, aber es war die einzige funktionierende Lösung, die ich mir vorstellen konnte. –

6

CMake muss die Umgebungsvariable DYLD_LIBRARY_PATH einhalten, die der Umgebungsvariablen LD_LIBRARY_PATH unter Linux entspricht. Ihr DYLD_LIBRARY_PATH muss den richtigen Pfad haben, um nach Bibliotheken zu suchen, die von MacPorts installiert werden.

+1

LD_LIBRARY_PATH sollte nur zum Debuggen und Testen verwendet werden. Insbesondere, wenn Ihre ausführbare Datei Setuid oder Setgid ist, wird es ignoriert. Build-Informationen müssen mit den anderen Build-Informationen in den Projektdateien übereinstimmen. –

30

Add/opt/local/lib, und andere Wege wahrscheinlich installieren, auf den Satz von Pfaden durch cmake in Ihrer CMakeLists.txt Datei gesucht:

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

Damit wird/opt/local/lib an die Pfade angehängt, in denen CMake nach Bibliotheken sucht. Diese CMAKE_LIBRARY_PATH Technik betrifft alle find_library Befehle, nachdem Sie die Variable festgelegt haben.

für eine chirurgische, Bibliothek-by-Bibliothek Ansatz, ändern Sie die einzelnen find_library Befehle:

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

Beachten Sie, dass dies tut nicht hard/opt/local/lib als der einzige Ort zu suchen die Bibliothek. Vielmehr hängt es/opt/local/lib nur an die Stellen an, an denen nach der Bibliothek gesucht werden soll. Oft füge ich viele solcher Pfade hinzu und beziehe die Orte ein, die auf allen Maschinen, die ich kenne, beobachtet wurden. Weitere Variationen zu diesem Thema finden Sie unter find_library documentation.

Möglicherweise möchten Sie auch CMAKE_INCLUDE_PATH ändern, was sich auf das Verhalten der Befehle find_file() und find_path() auswirkt.

+4

Für eine etwas nettere Syntax: list (APPEND CMAKE_LIBRARY_PATH/opt/local/lib) –

+0

Vielleicht möchten Sie auch 'NO_DEFAULT_PATH' dokumentieren, da Sie vielleicht nur lib aus dem Macports-Ort verwenden wollen, aber nicht nach den regulären suchen. – malat

+1

Diese Antwort hat viel Zeit für mich verschwendet - CMake scheint diese Variable glücklich zu ignorieren (oder vielleicht wird sie für ganz andere Zwecke verwendet). Ich wollte nur Leute warnen, da die eigentliche (richtige) Antwort diejenige ist, die (verwirrenderweise) weniger Upvotes enthält: benutze 'link_directories'. – Marco

2

Per @ Nerdling's "Do not hardcode" Kommentar zur akzeptierten Lösung, hier ist ein Vorschlag, den MacPorts Präfix Pfad zu erkennen.

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 
Verwandte Themen