Как проверить файлы заголовков и библиотечные функции в CMake, как это делается в Autotools?
В настоящее время я конвертирую небольшой проект C из autotools в CMake.
В старом configure.in
я проверил каждую функцию заголовка и библиотеки на существование, используя следующие строки:
# Checks for header files
AC_HEADER_STDC
AC_CHECK_HEADERS([stdlib.h time.h math.h sys/stat.h errno.h unistd.h fcntl.h signal.h])
# Checks for library functions
AC_FUNC_FORK
AC_CHECK_FUNCS([time localtime mktime gmtime exit fork chdir atol signal])
AC_FUNC_STRFTIME
Это то, что многие проекты autotools делают AFAIK.
Несмотря на то, что компилятор уже проверяет необходимые файлы заголовков и проверяет компоновщик на функции библиотеки, мой код по-прежнему нуждается в этих проверках, выполненных на этапе настройки, чтобы правильно настроить его для флагов #ifdef HAVE_FOOBAR
и так же.
В этом случае, что лучше всего проверять на заголовки/функции с помощью CMake?
Ответы
Ответ 1
Вы можете легко перенести это с помощью CHECK_FUNCTION_EXISTS
, CHECK_INCLUDE_FILE
, CHECK_TYPE_SIZE
и т.д. Также см. CMake_HowToDoPlatformChecks для некоторых советов.
Конфигурирование в этом стиле добавляет переносимость (т.е. вы можете проверить ucontext.h
и setjmp.h
и использовать тот, который присутствует, изменяя ваш код с помощью #ifdef HAVE_UCONTEXT
или #ifdef HAVE_SETJMP
).
Кроме того, при распространении своего приложения вы хотите избежать компиляции ошибок (для пользователей) и, следовательно, с хорошей системой сборки, вы можете справиться с большинством различий в архитектуре перед распространением своего приложения.
Легче для не-программиста понять, что если "проверить для gtk + заголовок - не удалось", они должны установить gtk, вместо того, чтобы иметь buch строк компиляции, которые говорят то же самое, но не читаются для большинства их:)