Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

cmake hierarchy zlib, libpng and my own app

I'm trying to create a CMake hierarchy for an application that uses libpng. Libpng requires zlib.

Since a CMakeLists.txt is distributed with both zlib and libpng my first idea was to make the following structure:

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

... and then, in the top level CMakeLists.txt, place something like:

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

But no luck. The CMakeLists.txt of libpng performs a find_package(ZLIB...) but it doesn't know where to look. This might be solved on Mac OS by "installing" zlib to /usr. But this wouldn't work in Windows.

So then i thought i would not recurse into the subdirectories. Just compile and build zlib and libpng independently and do a find_package(PNG...) prior to traversing down into my own app (compiling and building zlib and libpng individually (via the provided CMakeLists.txt) works, at least on Mac OS but again, only because zlib is installed to /usr).

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

No luck, find_package(PNG...) fails. I have no idea how to let find_package(PNG...) know where to look for the libpng library i have just built. For instance for boost, you can set the "BOOST_ROOT" variable. Is there anything simular for libpng?

Kind Regards,

Daniel Dekkers

like image 758
Daniel Dekkers Avatar asked Jul 29 '11 14:07

Daniel Dekkers


1 Answers

It doesn't seem like the find png has PNG_ROOT variable, as is the case with BOOST_ROOT. I suspect that this is the case with the zlib library. You can check in your modules directory by looking for the find_png module and find_zlib module.

I would rewrite these modules and add them to your cmake configure directory. The re-written version should look like:

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

Note that I'm adding the find_ commands twice. The first time skips the default directories. The second one does not skip the default directories. If the first search succeeds the second one is not done. The second search will know that the first one suceeded if the PNG_INCLUDE_DIR or PNG_LIBRARY is defined.

like image 122
KlingonJoe Avatar answered Sep 22 '22 00:09

KlingonJoe