Как проверить заголовочные файлы и библиотечные функции в CMake, как это делается в Autotools? - PullRequest
15 голосов
/ 15 марта 2009

В настоящее время я конвертирую небольшой проект 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

Это то, что многие автоинструментальные проекты делают AFAIK.

Несмотря на то, что компилятор уже проверяет необходимые заголовочные файлы, а компоновщик проверяет библиотечные функции, мой код все еще нуждается в этих проверках, выполненных на этапе настройки, чтобы правильно настроить флаги компиляции для #ifdef HAVE_FOOBAR и тому подобное.

В этом случае, каков наилучший метод проверки заголовков / функций с помощью CMake?

1 Ответ

13 голосов
/ 17 марта 2009

Вы можете легко перенести это напрямую с помощью CHECK_FUNCTION_EXISTS, CHECK_INCLUDE_FILE, CHECK_TYPE_SIZE и т. Д. Также см. CMake_HowToDoPlatformChecks за совет.


Настройка в этом стиле добавляет переносимость (т. Е. Вы можете проверить наличие ucontext.h и setjmp.h и использовать один из них, изменив код с помощью #ifdef HAVE_UCONTEXT или #ifdef HAVE_SETJMP).

Более того, когда вы распространяете свое приложение, вы хотите избежать ошибок компиляции (для пользователей) и, следовательно, с хорошей системой сборки, вы можете справиться с большинством архитектурных различий перед распространением вашего приложения.

Для непрограммистов легче понять, что если «проверить наличие gtk + header - не удалось», они должны установить gtk, а не иметь набор строк ошибок компиляции, которые говорят то же самое, но не читаются для большинства их:)

...