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

В настоящее время я конвертирую небольшой проект C из autotools в CMake .

В old 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?

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


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

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

Легче для не-программиста понять, что если «проверить для gtk + заголовок – не удалось», они должны установить gtk, вместо того, чтобы иметь buch строк компиляции, которые говорят то же самое, но не читаются для большинства из них 🙂