иерархия cmake zlib, libpng и мое собственное приложение - PullRequest
6 голосов
/ 29 июля 2011

Я пытаюсь создать иерархию CMake для приложения, которое использует libpng. Libpng требует zlib.

Поскольку CMakeLists.txt распространяется вместе с zlib и libpng, моей первой идеей было создать следующую структуру:

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

... а затем в верхнем уровне CMakeLists.txt поместите что-то вроде:

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

Но не повезло. CMakeLists.txt из libpng выполняет find_package (ZLIB ...), но не знает, где искать. Это может быть решено в Mac OS путем «установки» zlib в / usr. Но это не сработает в Windows.

Итак, я подумал, что не вернусь в подкаталоги. Просто скомпилируйте и соберите zlib и libpng независимо и выполните find_package (PNG ...), прежде чем переходить в мое собственное приложение (Компиляция и сборка zlib и libpng по отдельности (через предоставленный CMakeLists.txt) работает, по крайней мере, в Mac OS, но опять же, только потому, что zlib установлен в /usr).

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

Не повезло, find_package (PNG ...) не работает. Я понятия не имею, как сообщить find_package (PNG ...), где искать библиотеку libpng, которую я только что создал. Например, для повышения вы можете установить переменную "BOOST_ROOT". Есть ли что-то похожее на libpng?

С уважением,

Даниэль Деккерс

1 Ответ

1 голос
/ 25 ноября 2011

Не похоже, что find png имеет переменную PNG_ROOT, как в случае с BOOST_ROOT. Я подозреваю, что это имеет место с библиотекой zlib. Вы можете проверить в своем каталоге модулей, ища модуль find_png и модуль find_zlib.

Я бы переписал эти модули и добавил их в ваш каталог конфигурации cmake. Переписанная версия должна выглядеть так:

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

Обратите внимание, что я добавляю команды find_ дважды. Первый раз пропускает каталоги по умолчанию. Второй не пропускает каталоги по умолчанию. Если первый поиск успешен, второй не завершен. Второй поиск будет знать, что первый был успешным, если определено PNG_INCLUDE_DIR или PNG_LIBRARY.

...