2013-05-10 9 views
5

Używam cmake do zarządzania kompilacją mojego projektu i to jest mój pierwszy raz używać cmake. To narzędzie jest bardzo wygodne, ponieważ istnieje mnóstwo skryptów i funkcji, które pozwalają sprawdzić, czy wszystkie potrzebne biblioteki są zainstalowane na danym komputerze. Czasami jednak te ogólne pisma nie obejmują konkretnego przypadku lub w ogóle nie są dostępne dla danej biblioteki. Moje pytanie jest następujące:Jak sprawdzić cmake czy dany plik nagłówka jest dostępny dla projektu C++

Jaki jest właściwy styl cmake polegający na sprawdzeniu, czy dany plik nagłówkowy (hpp lub h) jest dostępny w ścieżce dołączania?

Uzasadnienie:

Większość straigforward sposobem jest prawdopodobnie używać makr CHECK_INCLUDE_FILE. Na przykład, jeśli chciałbym użyć biblioteki unittest ++, mógłbym napisać

CHECK_INCLUDE_FILE_CXX("UnitTest++.h" HAVE_UNITTESTXX) 
IF(NOT HAVE_UNITTESTXX) 
    message(FATAL_ERROR "UnitTest++ is not found") 
ENDIF() 

Niestety Jeżeli to się robi w ten sposób, zmienna HAVE_UNITTESTXX są przechowywane w pamięci podręcznej. Jeśli zainstaluję bibliotekę UnitTest ++ w moim systemie, cmake będzie nadal skarży się na to, że UnitTest ++. H nie jest zainstalowany. Mogę ręcznie usunąć pamięć podręczną, ale standardowe funkcje pakietu nie wymagają tego. Mogę również zaktualizować kod tak, jak to

CHECK_INCLUDE_FILE_CXX("UnitTest++.h" HAVE_UNITTESTXX) 
IF(NOT HAVE_UNITTESTXX) 
    UNSET(HAVE_UNITTESTXX CACHE) 
    message(FATAL_ERROR "UnitTest++ is not found") 
ENDIF() 

To rozwiązanie działa, ale nie wygląda ładnie. Chciałbym poznać sposób cmake do wykonania tego zadania.

Pozdrawiam!

Odpowiedz

3

Odpowiedź, której szukasz, znajduje się już pod numerem the CMake Wiki. Wyraźnie mówią, aby usunąć plik CMakeCache.txt lub linię podręczną, która przeszkadza Ci ręcznie.

Niestety, nie ma prostszego sposobu na zrobienie tego. Twoja jest już tak dobra, jak mogła być. Myślę, że CMake stara się być wygodnym, gdy wszystko jest w porządku, stąd pamięć podręczna, i próbuje zmusić cię do usunięcia i zregenerowania, gdy ci się nie uda.

Z drugiej strony, można napisać CHECK_INCLUDE_FILE_CXX_ERROR makro (lub dowolną czystsze nazwę), aby owinąć śmiertelny komunikat o błędzie, dzięki czemu nie trzeba powtarzać ten sam kod za każdym razem:

macro(CHECK_INCLUDE_FILE_CXX_ERROR INCLUDE_FILE HAVE_FILE) 
    CHECK_INCLUDE_FILE_CXX(${INCLUDE_FILE} ${HAVE_FILE}) 
    IF(NOT ${HAVE_FILE}) 
     UNSET(HAVE_UNITTESTXX CACHE) 
     message(FATAL_ERROR "${INCLUDE_FILE} is not found") 
    ENDIF() 
endmacro() 

I następnie użyj go w następujący sposób:

CHECK_INCLUDE_FILE_CXX_ERROR("UnitTest++.h" HAVE_UNITTESTXX) 
+0

Dziękuję za życzliwą odpowiedź! To podejście makro jest z pewnością znacznie czystsze, ponieważ chciałbym włączyć wiele bibliotek. – wpfnoop

Powiązane problemy