2011-07-29 8 views
5

Estoy tratando de crear una jerarquía CMake para una aplicación que usa libpng. Libpng requiere zlib.jerarquía cmake zlib, libpng y mi propia aplicación

Desde un CMakeLists.txt se distribuye tanto con zlib y libpng mi primera idea era hacer la siguiente estructura:

/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?- 

... y luego, en el nivel superior CMakeLists.txt, coloque algo así como :

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

Pero no hubo suerte. El CMakeLists.txt de libpng realiza un find_package (ZLIB ...) pero no sabe dónde buscar. Esto podría resolverse en Mac OS "instalando" zlib a/usr. Pero esto no funcionaría en Windows.

Entonces pensé que no volvería a aparecer en los subdirectorios. Simplemente compile y compile zlib y libpng de forma independiente y realice un paquete de búsqueda (PNG ...) antes de pasar a mi propia aplicación (compilando y compilando zlib y libpng de forma individual (a través del CMakeLists.txt) funciona, al menos en Mac OS pero de nuevo, solo porque zlib está instalado en/usr).

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

No hubo suerte, find_package (PNG ...) failed. No tengo idea de cómo dejar que find_package (PNG ...) sepa dónde buscar la librería libpng que acabo de construir. Por ejemplo, para impulsar, puede establecer la variable "BOOST_ROOT". ¿Hay algo simular para libpng?

Saludos cordiales,

Daniel Dekkers

+0

Por lo general, si el paquete de búsqueda falla, puede editar el archivo de CMakeCache e ingresar las rutas de inclusión y de biblioteca allí. Es más fácil si usa una GUI para CMake. – LiMuBei

Respuesta

0

No parece como el PNG tiene encontrar variables PNG_ROOT, como es el caso de BOOST_ROOT. Sospecho que este es el caso con la biblioteca zlib. Puede verificar el directorio de sus módulos buscando el módulo find_png y el módulo find_zlib.

Reescribo estos módulos y los agrego al directorio de configuración de cmake. La versión reescrita debe verse así:

# 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) 

Tenga en cuenta que estoy agregando los comandos find_ dos veces. La primera vez se salta los directorios predeterminados. El segundo no omite los directorios predeterminados. Si la primera búsqueda tiene éxito, la segunda no está completa. La segunda búsqueda sabrá que la primera se superó si se define PNG_INCLUDE_DIR o PNG_LIBRARY.

Cuestiones relacionadas