2011-07-29 13 views
5

Próbuję utworzyć hierarchię CMake dla aplikacji korzystającej z libpng. Libpng wymaga zlib.hierarchia cmle zlib, libpng i moja własna aplikacja

Ponieważ CMakeLists.txt jest rozprowadzany zarówno zlib i libpng mój pierwszy pomysł był aby następującą strukturę:

/development 
    CMakeLists.txt 
    /zlib-1.2.5 
     CMakeLists.txt <- provided by zlib 
     -sources- 
     -build of zlib?- 
    /libpng154 
     CMakeLists.txt <- provided by libpng 
     -sources- 
     -build of libpng?- 
    /myapp 
     CMakeLists.txt 
     -sources- 
    /build 
     -build of myapp- 
     -build of zlib?- 
     -build of libpng?- 

... a potem, na najwyższym poziomie CMakeLists.txt umieścić coś takiego :

project(everything) 
... 
add_subdirectory(zlib-1.2.5) 
add_subdirectory(libpng154) 
add_subdirectory(myapp) 
... 

Ale bez powodzenia. CMakeLists.txt z libpng wykonuje find_package (ZLIB ...), ale nie wie, gdzie szukać. Można to rozwiązać w systemie Mac OS przez "zainstalowanie" zlib na/usr. Ale to nie działa w systemie Windows.

Tak więc pomyślałem, że nie powróciłbym do podkatalogów. Po prostu kompiluj i kompiluj zlib i libpng niezależnie i zrób plik find_package (PNG ...) przed przejściem do mojej własnej aplikacji (kompilowanie i budowanie pojedynczych i libli przy pomocy dostarczonego CMakeLists.txt) działa, przynajmniej na Mac OS ale znowu, tylko dlatego, że zlib jest zainstalowany na/usr).

project(everything) 
... 
find_package(PNG...) 
add_subdirectory(myapp) 
... 

No szczęście, find_package (PNG ...) nie powiedzie się. Nie mam pojęcia, jak pozwolić find_package (PNG ...) wiedzieć, gdzie szukać biblioteki libpng, którą właśnie zbudowałem. Na przykład dla boost, możesz ustawić zmienną "BOOST_ROOT". Czy istnieje coś podobnego do libpng?

poważaniem

Daniel Dekkers

+0

Zwykle, jeśli pakiet find_package nie powiedzie się, można edytować plik CMakeCache i wprowadzić tam ścieżki włączenia i biblioteki. To najłatwiejsze, jeśli używasz GUI dla CMake. – LiMuBei

Odpowiedz

0

Nie wydaje się jak png wybrać ma zmienną PNG_ROOT, jak to ma miejsce w przypadku BOOST_ROOT. Podejrzewam, że tak jest w przypadku biblioteki zlib. Możesz sprawdzić w katalogu modułów, szukając modułu find_png i modułu find_zlib.

Chciałbym przerobić te moduły i dodać je do katalogu konfiguracyjnego cmake. Ponownie napisana wersja powinna wyglądać następująco:

# This module defines 
# PNG_INCLUDE_DIR, where to find png.h, etc. 
# PNG_FOUND, If false, do not try to use PNG. 
# also defined, but not for general use are 
# PNG_LIBRARY, where to find the PNG library. 

FIND_PATH(
    PNG_INCLUDE_DIR png.h 
    PATHS 
    ${PNG_ROOT} 
    PATH_SUFFIXES 
    include 
    include/libpng 
    NO_DEFAULT_PATH) 

FIND_PATH(
    PNG_INCLUDE_DIR png.h 
    PATHS 
    ${PNG_ROOT} 
    PATH_SUFFIXES 
    include 
    include/libpng) 

SET(PNG_NAMES ${PNG_NAMES} png libpng png12 libpng12) 

FIND_LIBRARY(
    PNG_LIBRARY 
    NAMES 
    ${PNG_NAMES} 
    PATHS 
    ${PNG_ROOT} 
    PATH_SUFFIXES 
    /lib 
    NO_DEFAULT_PATHS) 

FIND_LIBRARY(
    PNG_LIBRARY 
    NAMES 
    ${PNG_NAMES} 
    PATHS 
    ${PNG_ROOT} 
    PATH_SUFFIXES 
    /lib) 

# handle the QUIETLY and REQUIRED arguments and set PNG_FOUND to TRUE if 
# all listed variables are TRUE 
INCLUDE(FindPackageHandleStandardArgs) 
FIND_PACKAGE_HANDLE_STANDARD_ARGS(PNG DEFAULT_MSG PNG_LIBRARY PNG_INCLUDE_DIR) 

Zauważ, że dodaję dwa polecenia find_. Za pierwszym razem pomija domyślne katalogi. Drugi nie pomija domyślnych katalogów. Jeśli pierwsze wyszukiwanie powiedzie się, drugie nie zostanie wykonane. Drugie wyszukiwanie będzie wiedzieć, że pierwszy został przekroczony, jeśli zdefiniowano PNG_INCLUDE_DIR lub PNG_LIBRARY.