2013-10-11 2 views
2

Я пытаюсь создать пакет, который использует CMake для системы здания (то есть libebur128), которая полагается на pkg-config, чтобы найти необходимые пакеты в системе.Как CMake использует pkg-config для поиска пакетов?

После создания необходимых библиотек я обнаружил, что CMake может найти один из них, но не другие, хотя они были построены таким же образом.

Как я могу узнать, что не так? Есть ли способ вывести тесты, которые он делает, или что-то о том, как он использует pkg-config для поиска пакетов? Потому что вручную с помощью pkg-config работает каждый раз при поиске всех необходимых пакетов.

Вот один из сценариев CMake, чтобы найти что-то, libmpg123 в этом случае:

find_package(PkgConfig) 
pkg_check_modules(PC_MPG123 QUIET libmpg123) 

find_path(MPG123_INCLUDE_DIR mpg123.h 
      HINTS ${PC_MPG123_INCLUDEDIR} ${PC_MPG123_INCLUDE_DIRS}) 
find_library(MPG123_LIBRARY NAMES mpg123 mpg123-0 
      HINTS ${PC_MPG123_LIBDIR} ${PC_MPG123_LIBRARY_DIRS}) 

set(MPG123_LIBRARIES ${MPG123_LIBRARY}) 
set(MPG123_INCLUDE_DIRS ${MPG123_INCLUDE_DIR}) 

include(FindPackageHandleStandardArgs) 
find_package_handle_standard_args(MPG123 DEFAULT_MSG MPG123_LIBRARY MPG123_INCLUDE_DIR) 
mark_as_advanced(MPG123_INCLUDE_DIR MPG123_LIBRARY) 

Примечание: Я кросс компиляции для Windows, в случае, если имеет значение, я использую MinGW-w64 набор инструментов и я скорректировал пути pkg-config, чтобы посмотреть, где это должно быть.

+1

Вы пытались удалить QUIET из pkg_check_modules? Если я не ошибаюсь, это скроет строку «проверка для модулей». Также почему вы используете всю ручную библиотеку для поиска файлов при использовании pkg-config. Мои типичные вещи pkg-config выглядят как 'pkg_check_modules (GLIB REQUIRED glib-2.0> = 2.0.0)' и все. – grim

+0

Ваш код выглядит хорошо для меня. Можете ли вы опубликовать больше кода, включая один случай, когда он не работает? Возможно, у вас есть ошибка копирования и вставки. – usr1234567

ответ

2

Вы можете отобразить содержимое ваших переменных с помощью CMake message command и вызова с:

cmake --debug-output ... 

Или вы можете редактировать файл CMakeCache.txt.

Я также предлагаю вам включить следующую строку, чтобы вы видели, что происходит во время компиляции.

set (CMAKE_VERBOSE_MAKEFILE true) 
+2

Вы также можете сделать 'make VERBOSE = 1', чтобы увидеть полные команды компиляции, даже если вы не сгенерировали' Makefile' с 'CMAKE_VERBOSE_MAKEFILE' включен. – legalize

4

В случае, если кто-то еще спотыкается через это, как я сделал:

  • Hack в некоторых MESSAGE вызовы в модулях/FindPkgConfig.cmake. В частности, перед вызовом execute_process, если вы хотите сбрасывать вызов pkg-config.

  • Теперь, как и я, вы можете быть удивлены, что ваше СООБЩЕНИЕ никогда не произойдет! Я узнал, что если cmake вызывает pkg-config для определенного пакета при проверке зависимостей для какого-либо другого пакета ранее на временной шкале, то найденная версия кэширует в CMakeCache.txt, который имеет постоянство сеанса. Это означает, что если вы позже придете и обновите этот пакет (потому что некоторая другая проверка зависимостей терпит неудачу), то CMakeCache.txt все еще сохраняет старое значение, и поэтому, несмотря на то, что вы вытаскиваете свои волосы, ошибки cmake из-за того, что версия или что-то не так ,

  • Проще говоря, удалите CMakeCache.txt, если вы обновите какие-либо пакеты как часть попыток пройти через ошибки cmake.