LINUX.ORG.RU

autotools: смысл config.h?


0

0

Скрипт configure в результате своей работы (при наличии 
соответствующих макросов в configure.in) создает файл config.h, 
который имеет примерно следующую структуру:

/* Define if you have the ANSI C header files.  */
#define STDC_HEADERS 1

/* Define if you have the atoi function.  */
#define HAVE_ATOI 1

/* Define if you have the atol function.  */
#define HAVE_ATOL 1


Вопрос: в чем смысл данного файла? Очевидны следующие моменты:
1. Определение "констант" (PACKAGE_NAME etc)
2. В зависимости от установленных дефайнов включать свою 
реализацию какой-либо функции (e.g.: #ifndef HAVE_ATOI 
<atoi_own_implementation> #endif)


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

Спасибо.
anonymous

Абсолютно корректным. Можно вообще не юзать autotools, никто ругать за это не будет :)

Virun
()

обычно в config.h по мимо указанного кросплатформенного стафа присутвуют различные константы, используемые в вашей системе a-la DEFAULT_LOG_PATH, DEFAULT_BLABLA_BUFFER_SIZE, DEFAULT_ETC, DEFAULT_WO.

помимо этого, туда можно добавить debug макрос, если configure был передан флаг --with-debug или набор макросов определяющих какие фичи юзеру нужны, а какие нет. i.e. флаги --with-x-feature, --with-y-feature, --without-z-feature могут объявлять соответвующие макросы в config.h.

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

asgard
()

использование config.h вовсе не обязательно. если не озабачиваться портабельностью, то он нужен только в случаях, когда используются --with-feature для включения дополнительных возможностей

ananas ★★★★★
()

autoconf собственно для того и предназначен, чтобы можно было проверить, есть какая-то функция или нет. Если ты этим не пользуешься, то лучше выкинь automake и autoconf и напиши Makefile руками - только не забудь про DESTDIR и используй FORCE вместо .PHONY(bsdmake .PHONY не поддерживает - это расширение GNU). Ну и еще пользуйся bindir, libdir и т. п. Все это прекрасно заменяет функции configure и не требует GNU make(бОльшая переносимость).

За подробностями по написанию Makefileов сюда: http://www.gnu.org/prep/standards/html_node/Makefile-Conventions.html#Makefil...

anonymous
()

Спасибо за разъяснения. autotools, все-таки, мне нужны, из-за --with-feature функционала и определения C99-conforming компилятора на стадии configure.

anonymous
()
Ответ на: комментарий от anonymous

С99 компилятор вроде бы определяется наличием соответствующих макросов, определенных в стандарте.

--with-feature можно заменить вручную набираемым(или как в Linux с помощью меню) файлом .config

Вот Linux же обходится без autoconf: make menuconfig make bzImage ...

Вообще autotools -- неудобно и держит кучу файлов в каталоге программы. Просто это стандарт для пакетов GNU, но не все же стандарты GNU хорошие. Например, GNU поддерживает ужасный формат tar, который не поддерживает длинные имена файлов(в отличие от cpio и pax(насчет pax не уверен)). Утилита echo(да и множество других) из coreutils не соответствует POSIX(echo -e выводит пустую строку, вместо "-e"). getopt без POSIXLY_CORRECT работает вообще неверно.

Вообщем свой Makefile все-же лучше, чем зависеть от autotools. Linux вообще в ядре использует cpio и собирается с помощью своего Makefile.

anonymous
()
Ответ на: комментарий от anonymous

Наивный...У ядра нету зависимостей, все что ему нужно это компилятор и линковщик, оно самодостаточно, потому и обходится без систем сборки. Без autotools или другой системы сборки ты без изобретения велосипедов портабельную программу никогда не сделаешь. Так то не мели чепуху.

Virun
()
Ответ на: комментарий от anonymous

> Вот Linux же обходится без autoconf: make menuconfig make bzImage ...

man kbuid.

asgard
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.