2011-04-27 2 views
3

Почти каждый проект с открытым исходным кодом c/C++ Я вижу корабли с ним файл configure.Когда проекту c/C++ нужен файл конфигурации?

Но в проекте я не видел этот файл до сих пор наш собственный C/C++,

, когда он нужен?

+0

Возможно, он содержит CMakeLists.txt? – Begemoth

+0

Я думаю, нет. CMakeLists.txt используется для системы сборки cmake. Файл 'configure' обычно используется' autotools'. – beduin

+0

@Begemoth, нет, есть только 'Makefile' .. – wireshark

ответ

5

Я думаю, что вы говорите о скрипте configure, который используется, когда autotools используются для создания проекта.

Основной целью файла configure является генерация Makefiles, соответствующая вашей конфигурации системы, и проверка различных предварительных условий (например, установленных libs).

+0

Когда нам нужно проверить предварительные условия, можем ли мы обнаружить его во время выполнения, когда это необходимо? – wireshark

+0

Предположим, что один компилятор доступен на одной ОС, а другой - на другой ОС. Команда для создания вашей программы (и, следовательно, make-файла) должна быть разной для каждой ОС. Задача файла конфигурации заключается в обнаружении таких различий и создании соответствующих make-файлов для вашей системы. – Jaywalker

+0

@wireshark: также можно проверить, установлены ли в вашей системе соответствующие библиотеки (чтобы предотвратить получение компиляции или ошибки связи позже), при необходимости получите некоторую системную информацию (имя хоста, версию и т. Д.), Найдите путь к определенным исполняемым файлам (например, lex), проверьте, поддерживают ли некоторые используемые инструменты определенные параметры. – beduin

3

Когда вам становится слишком сложно создать Makefile вручную.

+0

Это задача Automake и CMake, а не autoconf. – Begemoth

7

A configure сценарий - предпоследний шаг в построении проекта, который использует GNU autotools. Autotools - это набор инструментов, предназначенных для максимизации переносимости приложения между различными операционными средами POSIX и POSIX, которые могут иметь несколько иные функции вне базового набора, который требуется приложению.

TL; configure имеет значение, когда вы хотите переносимость между различными операционными системами.

+0

Можете ли вы дать крошечный пример, показывающий, как «configure» может сделать портативный? – wireshark

+0

'configure' сам по себе не может. Инструменты, которые его генерируют, а также файлы шаблонов, используемые этими инструментами, делают приложение переносимым. –

0

Конфигурация создается autoconf из GNU Autotools. Вы можете использовать autoconf и automake для управления системой сборки для вашего проекта; если вы не хотите или не можете полагаться на существующую среду IDE, autotools - это еще один способ управления созданием и установкой вашего кода. Переносимость ОС - еще одна важная вещь, с которой они помогают, хотя в основном это разные системы на базе UNIX, и это уже не так много проблем.

Более подробно, если вы устали вручную редактировать Makefile или должны выйти из своей среды разработки, рассмотрите возможность использования Autotools или одного из его альтернатив, например CMake или SCons.

0

configure сценария служит в основном три цели:

  1. Определения наличия (или предпочтений пользователя) дополнительных библиотек, или проверку на наличие и правильные параметры, необходимые для использования обязательных библиотек программы зависит.
  2. Работа с поврежденными операционными системами, где отсутствуют стандартные функции библиотеки или не ведут себя в соответствии с требованиями стандартов.
  3. Работа со сломанными непереносимыми предположениями в вашей программе путем обнаружения системных параметров, которые вам не нужно заботиться и сообщать о них в вашу программу.

Цель 3 всегда была бесполезной для правильно написанного кода. Нет причин, по которым вам нужно знать, например, sizeof(int) на уровне препроцессора. Если вы хотите получить конкретный размер, используйте целочисленный тип фиксированного размера, например int32_t (и как часть 2-го пункта, конфигурация может паттать по сломанным системам, которые его не хватает). Аналогичным образом, вам не следует писать программы, поведение которых зависит от того, возвращает ли malloc(0)NULL или «уникальный указатель, который может быть успешно передан до free». (Да, есть много сломанного программного обеспечения, которое действительно заботится!)

Цель 2 была исторически очень важна для того, чтобы версии базового системного программного обеспечения GNU стали настолько вездесущими, поддерживая огромный спектр фирменных Unices со сломанными компиляторами и библиотеками и обеспечивая лучшее качество, чем обычные инструменты могли бы предложить , В настоящее время каждая Unix-подобная система имеет встроенные и средние среды исполнения, которые полностью или почти совместимы с POSIX, и вы можете получить их с помощью -D_POSIX_C_SOURCE=(version goes here) и, возможно, с некоторыми дополнениями к $PATH для материала оболочки. Таким образом, цель 2 в целом устарела и вредна сейчас, если вы не пытаетесь поддерживать не-POSIX-системы, такие как Windows (без cygwin).

Назначение 1 по-прежнему очень актуально и не уходит в ближайшее время.

Некоторые проекты, возможно, по очень веской причине, не любят GNU autotools и отказываются использовать любой из них, либо опуская configure, либо сворачивая свои собственные. Если вам нужна только configure для первой цели, такой подход может иметь смысл, если вы понимаете все потенциальные проблемы и умеете писать переносные сценарии оболочки. Однако если вы это сделаете, обязательно изучите и соблюдайте все соглашения configure о том, как параметры (например, --enable-*, --prefix и т. Д.) И переменные (, CPPFLAGS и т. Д.) Работают так, что вы не создаете кошмар для пользователей. И имейте в виду, что использование autoconf может быть проще и выгоднее - но, пожалуйста, не тратьте время на то, чтобы все время проверяли глупые вещи, такие как sizeof(int), или же для компилятора Fortran.

Смежные вопросы