2009-09-28 10 views
29

Próbuję zbudować część naszego oprogramowania, które zostało zaprojektowane do pracy wyłącznie na Linuksie, na MacOS X. Używamy CMake i zainstalowałem MacPorts, dzięki czemu mogłem łatwo uzyskać CMake wraz z niektórymi bibliotekami stron trzecich, które zależeć od.Jak polecam CMake szukać bibliotek zainstalowanych przez MacPorts?

Problem polega na tym, że CMake domyślnie nie szuka bibliotek z MacPorts, więc kilka naszych obiektów docelowych jest wyłączonych, ponieważ nie są w stanie znaleźć zależności, które są wszystkie w /opt/local.

Jak mogę polecić programowi CMake, aby również wyszukiwał załączników i bibliotek z programu MacPorts?

+0

Czy bierzesz pod uwagę po prostu dodając swój projekt do repo DarwinPorts? W ten sposób wszystkie poprawne flagi są przekazywane z MacPorts. –

+2

To autorskie rozwiązanie. –

Odpowiedz

15

Dodałem plik toolchain dla "Darwin", który dodaje niezbędne ścieżki włączania i biblioteki. Miałem nadzieję na coś bardziej automatycznego, ale przynajmniej rozwiązuje problem.

darwin.cmake:

SET(CMAKE_SYSTEM_NAME Darwin) 

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

NIE kodować/optować/lokalnie.Może to być dowolny katalog, w którym użytkownik instaluje MacPorts. –

+0

zwykle nie jest to dobry pomysł. Znacznie lepiej pozwolić twojej PATH na znalezienie bibliotek, które musisz dołączyć i dodać nazwy bibliotek specjalnie. Każda platforma UNIX jest inna. – Dave

+1

Zgadzam się, ale to nie jest optymalne rozwiązanie, ale było to jedyne rozwiązanie, które mogłem wymyślić. –

6

CMake musi respektować zmienną środowiskową DYLD_LIBRARY_PATH, która jest odpowiednikiem zmiennej środowiskowej LD_LIBRARY_PATH w systemie Linux. Twój DYLD_LIBRARY_PATH musi mieć właściwą ścieżkę, aby znaleźć biblioteki zainstalowane przez MacPorts.

+1

LD_LIBRARY_PATH powinien być używany tylko do debugowania i testowania. Warto zauważyć, że jeśli twój plik wykonywalny jest ustawiony na setuid lub setgid, zostanie zignorowany. Informacje o kompilacji muszą być zgodne z innymi informacjami o kompilacji w plikach projektu. –

30

Dodaj/opt/local/lib, a także wszelkie inne prawdopodobne zainstalować ścieżki, do zestawu ścieżek poszukiwanego przez cmake w pliku CMakeLists.txt:

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

To dołącza/opt/local/lib do zestawu ścieżek, w których cmake szuka bibliotek. Ta technika CMAKE_LIBRARY_PATH wpłynie na wszystkie polecenia find_library po ustawieniu zmiennej.

Dla bardziej chirurgiczne, biblioteka po bibliotece podejścia, modyfikować poszczególne find_library polecenia:

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

Zauważ, że to robi nie hardcode/opt/local/lib jako jedyne miejsce do poszukiwania Biblioteka. Zamiast tego, po prostu dołącza/opt/local/lib do zbioru lokalizacji, w których należy szukać biblioteki. Często kończę dodając wiele takich ścieżek, obejmujących lokalizacje obserwowane na wszystkich maszynach, które znam. Zobacz find_library documentation, aby uzyskać więcej odmian tego tematu.

Możesz również chcieć zmienić CMAKE_INCLUDE_PATH, co wpływa na zachowanie poleceń find_file() i find_path().

+4

Dla nieco ładniejszej składni: lista (APPEND CMAKE_LIBRARY_PATH/opt/local/lib) –

+0

Możesz także udokumentować 'NO_DEFAULT_PATH', ponieważ można chcieć używać wyłącznie lib z położenia macports, ale nie wyszukiwać zwykłych. – malat

+1

Ta odpowiedź zmarnowała dla mnie dużo czasu - cmake wydaje się z radością zignorować tę zmienną (a może używa jej do zupełnie innych celów). Po prostu chciałem ostrzec ludzi, ponieważ właściwą (poprawną) odpowiedzią jest ta z (myląco) pomniejszoną liczbą upvotes: użyj 'link_directories'. – Marco

2

Per @ Nerdling's "Do NOT hardcode" komentarz do zaakceptowanego rozwiązania, oto propozycja, aby wykryć ścieżkę prefiksu 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 
Powiązane problemy