cmake: check toolchain and libraries at configure stage

Модератор: Модераторы разделов

IMB
Сообщения: 2455
ОС: Debian

cmake: check toolchain and libraries at configure stage

Сообщение IMB » 12.07.2019 17:01

Добрый день!
autotools позволяет собирать простые тестовые приложения описанные в configure.ac
Пример из libpcap/configure.ac, приложил файл полностью

Shell

AC_CHECK_HEADERS(net/pfvar.h, , , [#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>])
if test "$ac_cv_header_net_pfvar_h" = yes; then
#
# Check for various PF actions.
#
AC_MSG_CHECKING(whether net/pfvar.h defines PF_NAT through PF_NORDR)
AC_TRY_COMPILE(
[#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#include <net/pfvar.h>],
[return PF_NAT+PF_NONAT+PF_BINAT+PF_NOBINAT+PF_RDR+PF_NORDR;],
[
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_PF_NAT_THROUGH_PF_NORDR, 1,
[define if net/pfvar.h defines PF_NAT through PF_NORDR])
],
AC_MSG_RESULT(no))
fi
Как можно осуществить подобное в cmake?
Зачем это надо? При кросс-компиляции cmake своим стандартным модулем может найти и попытаться использовать, например, хостовый zlib и такая проверка это выявит на раннем этапе.
Спасибо.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16145
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: cmake: check toolchain and libraries at configure stage

Сообщение Bizdelnick » 12.07.2019 17:43

IMB писал(а):
12.07.2019 17:01
При кросс-компиляции cmake своим стандартным модулем может найти и попытаться использовать, например, хостовый zlib
Если у Вас правильно прописан toolchain, то не может. Вы указываете свой sysroot в переменной CMAKE_FIND_ROOT_PATH, определяете

Код: Выделить всё

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
и всё, ничего с хоста не подцепится. Ну, конечно, если CMakeLists не безобразно кривые, и в них не захардкожен поиск по общесистемным путям, но за такое руки отрывать надо.

Но если хотите сделать cmake таким же тормозным, как autocrap, то это, конечно, тоже возможно. try_compile в помощь. Готового модуля, который бы проверял, определены ли те или иные макросы, не знаю, но можете написать свой на основе CheckIncludeFile, если это не разовая задача.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

IMB
Сообщения: 2455
ОС: Debian

Re: cmake: check toolchain and libraries at configure stage

Сообщение IMB » 15.07.2019 12:35

Bizdelnick писал:
12.07.2019 17:43
Если у Вас правильно прописан toolchain, то не может.
В toolchain всё-же не принято включать все возможные либы ;) А если он и включает либы общие назначения, такие как zlib, libjpeg, libpng, openssl и т.п., то, как правило, версии назвать актульными нельзя.
Bizdelnick писал:
12.07.2019 17:43
и в них не захардкожен поиск по общесистемным путям, но за такое руки отрывать надо.

CMakeLists.txt

find_package(ZLIB REQUIRED)
.........
target_link_libraries(..........
ZLIB::ZLIB
...........)
Пока вижу нечто такое.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16145
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: cmake: check toolchain and libraries at configure stage

Сообщение Bizdelnick » 15.07.2019 14:25

IMB писал(а):
15.07.2019 12:35
В toolchain всё-же не принято включать все возможные либы
Не понял, о чём Вы. Я имел в виду файл toolchain от cmake, там ничего про либы нет. Пройдите по ссылке, что ли.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

IMB
Сообщения: 2455
ОС: Debian

Re: cmake: check toolchain and libraries at configure stage

Сообщение IMB » 15.07.2019 15:38

Так и я изначально о линковке с внешними либами :)
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16145
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: cmake: check toolchain and libraries at configure stage

Сообщение Bizdelnick » 15.07.2019 15:43

Я прекрасно понял, о чём Вы. Если Вы всё правильно пропишете в toolchain, то find_package и т. п. ни при какой погоде не найдёт никаких хостовых библиотек, будет искать их только в ${CMAKE_FIND_ROOT_PATH}.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

IMB
Сообщения: 2455
ОС: Debian

Re: cmake: check toolchain and libraries at configure stage

Сообщение IMB » 15.07.2019 16:06

Спасибо, возможно ли решить проблему без toolchain-файла?
Насколько я увидел там указываются абсолютные пути, что сравнительно удобно при автоматической сборке на сервере, но обязывать каждого разработчика придерживаться аналогичной структуры не очень хорошо.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16145
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: cmake: check toolchain and libraries at configure stage

Сообщение Bizdelnick » 15.07.2019 16:23

IMB писал(а):
15.07.2019 16:06
возможно ли решить проблему без toolchain-файла?
Можно. Не используйте cmake или откажитесь от кросс-компиляции.
IMB писал(а):
15.07.2019 16:06
Насколько я увидел там указываются абсолютные пути, что сравнительно удобно при автоматической сборке на сервере, но обязывать каждого разработчика придерживаться аналогичной структуры не очень хорошо.
Ну пусть разработчик держит у себя свой toolchain, соответствующий его предпочтениям. Не вижу в этом проблемы.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2686
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: cmake: check toolchain and libraries at configure stage

Сообщение Hephaestus » 29.07.2019 12:38

IMB писал(а):
12.07.2019 17:01
autotools позволяет собирать простые тестовые приложения описанные в configure.ac
IMB писал(а):
12.07.2019 17:01
Как можно осуществить подобное в cmake?
IMB писал(а):
12.07.2019 17:01
Зачем это надо?
Действительно, зачем?
Насколько я помню, в autotools смысл таких тестовых программ только в том,
что нужна была обратная связь: библиотека нашлась, нужной версии, работоспособность проверена.
Это могло быть нужным для больших проектов, состоящих из кучи модулей.
Однако подхватить библиотеку "не оттуда" это вообще никак не мешало.

Ну, в Cmake можно что-нибудь замутить с помощью CTest.
Это нечто другое, но тоже тестовые программы, да.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

IMB
Сообщения: 2455
ОС: Debian

Re: cmake: check toolchain and libraries at configure stage

Сообщение IMB » 29.07.2019 12:51

Hephaestus писал:
29.07.2019 12:38
Ну, в Cmake можно что-нибудь замутить с помощью CTest.
Это нечто другое, но тоже тестовые программы, да.
Э нет, CTest, насколько я понял, запускается после сборки, что полезно, но никак не решает озвученную проблему.
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2686
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: cmake: check toolchain and libraries at configure stage

Сообщение Hephaestus » 29.07.2019 13:43

IMB писал(а):
29.07.2019 12:51
Э нет, CTest, насколько я понял, запускается после сборки
В целом, да. В общем случае, это юнит-тесты, которые тестируют целевую программу.
Но ведь никто не мешает создать тесты таким образом, чтобы они тестировали интересующие библиотеки.
На предмет версии, наличия нужных функций и пр.
По сути будет то же самое, что и тестовая программа в configure.ac,
с той разницей, что запускаться будет не автоматом, а командой make test.
IMB писал(а):
29.07.2019 12:51
но никак не решает озвученную проблему
В некотором смысле всё-таки решает. Если библиотека "не та, не там и не оттуда", в процессе запуска теста это обнаружится.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

IMB
Сообщения: 2455
ОС: Debian

Re: cmake: check toolchain and libraries at configure stage

Сообщение IMB » 29.07.2019 14:15

Hephaestus писал:
29.07.2019 13:43
В некотором смысле всё-таки решает. Если библиотека "не та, не там и не оттуда", в процессе запуска теста это обнаружится.
Раз этот тест запусткает после сборки то я это увижу раньше, потому что сборка остановится с ошибкой, так что к сожалению ни в каком смысле не решает.
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2686
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: cmake: check toolchain and libraries at configure stage

Сообщение Hephaestus » 29.07.2019 14:30

IMB писал(а):
29.07.2019 14:15
Раз этот тест запусткает после сборки то я это увижу раньше, потому что сборка остановится с ошибкой
Не обязательно. Оно может спокойно собраться (скажем, библиотека нашлась, но не совсем та),
а ошибка всплывёт только в рантайме - упадет в сегфолт или что-нибудь в этом роде.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

IMB
Сообщения: 2455
ОС: Debian

Re: cmake: check toolchain and libraries at configure stage

Сообщение IMB » 29.07.2019 14:44

У меня такого не было, что бы приложение собираемое под arm смогло слинковаться с библиотекой собранной под x86 ;)
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2686
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: cmake: check toolchain and libraries at configure stage

Сообщение Hephaestus » 29.07.2019 15:10

IMB писал(а):
29.07.2019 14:44
У меня такого не было, что бы приложение собираемое под arm смогло слинковаться с библиотекой собранной под x86
:laugh: Такого, конечно, не будет, а вот если версия слегка "другая" подцепилась, то вроде и библиотека нашлась,
и функции в ней все на месте, а вот работает немного по-другому. Поэтому а этапе сборки всё будет тихо-мирно, а упадёт оно уже потом, в рантайме.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

IMB
Сообщения: 2455
ОС: Debian

Re: cmake: check toolchain and libraries at configure stage

Сообщение IMB » 29.07.2019 16:45

описание проблемы
При кросс-компиляции cmake своим стандартным модулем может найти и попытаться использовать, например, хостовый zlib и такая проверка это выявит на раннем этапе
Спасибо сказали: