Если ваш вопрос:
Могу ли я использовать Autotools на какой-то машины А, чтобы создать единый универсальный Makefile, который будет работать на всех других машинах?
тогда ответ «Нет». Автоутилисты даже не притворяются, что пытаются это сделать. Они предназначены для размещения переносного кода, который определит, как создать рабочий файл makefile на целевой машине.
Если ваш вопрос:
Могу ли я использовать Autotools настроить программное обеспечение, необходимое для работы на разных машинах, с разными версиями основного программного обеспечения, которое мой плагин работает с, плюс различные библиотеки 3-й партии, не говоря уже о 32-битных и 64-битных проблемах?
тогда ответ «Да». Автоустановки предназначены для этого. Кроме того, они работают над Unix, Linux, MacOS X, BSD.
У меня есть программа, SQLCMD (которая предшествует программе Microsoft с тем же именем на десятилетие и более), которая работает с базами данных IBM Informix. Он определяет версию клиентского программного обеспечения (например, IBM Informix ESQL/C, часть IBM Informix ClientSDK или CSDK) и является ли она 32-разрядной или 64-разрядной. Он также определяет, какая версия программного обеспечения установлена, и адаптирует ее функциональность к тому, что доступно в поддерживающем продукте. Он поддерживает версии, выпущенные в течение примерно 17 лет. Он автоконфигурирован - мне пришлось написать несколько макросов autoconf для функциональности Informix и для нескольких других вещей (с высоким разрешением, наличием/dev/stdin и т. Д.). Но это выполнимо.
С другой стороны, я не пытаюсь выпускать один файл makefile, который подходит всем машинам и средам клиентов; есть слишком много возможностей для того, чтобы быть разумным. Но autotools заботится о деталях для меня (и моих пользователей). Все, что они делают:
./configure
Это проще, чем разработать, как отредактировать make-файл. (О, в течение первых 10 лет программа была настроена вручную, людям было трудно, хотя у меня были довольно хорошие настройки по умолчанию. Именно поэтому я перешел к автоматической настройке: это упрощает люди установки)
г-н Fooz прокомментировал:.
Я хочу что-то между ними. В моем случае клиенты будут использовать несколько версий и битов одного и того же базового приложения на одной машине. Меня не беспокоит кросс-компиляция, например, создание двоичных файлов Windows в Linux.
Вам нужна отдельная сборка вашего плагина для 32-разрядной и 64-разрядной версий? (Я бы предположить, - да, но вы могли бы удивить меня.) Так что вам нужно, чтобы обеспечить механизм для пользователя, чтобы сказать
./configure --use-tppkg=/opt/tp/pkg32-1.0.3
(где tppkg является кодом для пакета третьей стороной, и расположение специфичный для пользователя.) Однако имейте в виду удобство использования: чем меньше таких опций, у пользователя есть, чтобы обеспечить, тем лучше; против этого, не делайте жесткий код вещей, которые должны быть дополнительными, например, места установки. Во что бы то ни стало посмотреть по умолчанию - это хорошо. И дефолт к бойню вещей, которые вы найдете. Возможно, если вы найдете как 32-битные, так и 64-битные версии, тогда вы должны построить и то, и другое, что потребует тщательной сборки. Вы всегда можете повторить «Проверка для TP-пакета ...» и указать, что вы нашли и где вы его нашли. Затем установщик может изменить параметры. Убедитесь, что вы документа в './configure --help
', что варианты; это стандартная практика аутсорсинга.
Не делайте ничего интерактивного; скрипт configure должен запускаться, сообщая, что он делает.Скрипт Perl Configure
(обратите внимание на заглавную букву - это полностью отдельная автоматическая система настройки) - одна из немногих интерактивно настроенных систем конфигурации (и это, вероятно, главным образом из-за ее наследия; если начать заново, то, скорее всего, -interactive). Такие системы более сложны для настройки, чем неинтерактивные.
Кросс-компиляция жесткая. Мне никогда не приходилось это делать, слава богу.
Г-н Fooz также прокомментировал:
Спасибо за дополнительные комментарии. Я ищу что-то вроде:
./configure --use-tppkg=/opt/tp/pkg32-1.0.3 --use-tppkg=/opt/tp/pkg64-1.1.2
, где было бы создать как 32-разрядные, так и 64-разрядные объекты в одном Makefile для текущей платформы.
Ну, я уверен, что это можно сделать; Я не уверен, что это стоит сделать по сравнению с двумя отдельными сценариями конфигурации с полной перестройкой между ними. Вы, вероятно, захотите использовать:
./configure --use-tppkg32=/opt/tp/pkg32-1.0.3 --use-tppkg64=/opt/tp/pkg64-1.1.2
Это указывает на два отдельных каталога. Вам нужно будет решить, как вы собираетесь делать сборку, но предположительно у вас есть два подкаталога, например «obj-32
» и «obj-64
» для хранения отдельных наборов объектных файлов. Вы также разместите свой файл в формате:
FLAGS_32 = ...32-bit compiler options...
FLAGS_64 = ...64-bit compiler options...
TPPKG32DIR = @[email protected]
TPPKG64DIR = @[email protected]
OBJ32DIR = obj-32
OBJ64DIR = obj-64
BUILD_32 = @[email protected]
BUILD_64 = @[email protected]
TPPKGDIR =
OBJDIR =
FLAGS =
all: ${BUILD_32} ${BUILD_64}
build_32:
${MAKE} TPPKGDIR=${TPPKG32DIR} OBJDIR=${OBJ32DIR} FLAGS=${FLAGS_32} build
build_64:
${MAKE} TPPKGDIR=${TPPKG64DIR} OBJDIR=${OBJ64DIR} FLAGS=${FLAGS_64} build
build: ${OBJDIR}/plugin.so
Предполагается, что плагин будет общим объектом. Идея здесь заключается в том, что autotool будет обнаруживать 32-разрядные или 64-разрядные установки для стороннего пакета, а затем делать замены. Макрос BUILD_32 будет установлен в build_32, если потребуется 32-битный пакет и в противном случае останется пустым; макрос BUILD_64 будет обрабатываться аналогичным образом.
Когда пользователь запускает 'make all
', он будет сначала строить цель build_32 и цель build_64. Чтобы построить цель build_32, он будет повторно запускать make
и настроить флаги для 32-битной сборки. Аналогично, чтобы построить цель build_64, он перезапустит make
и настроит флаги для 64-битной сборки. Важно, чтобы все флаги, связанные с 32-разрядными и 64-битными строками, были установлены на рекурсивном вызове make
и что правила для создания объектов и библиотек написаны тщательно - например, правило для компиляции источника на объект должно быть осторожным, чтобы поместить объектный файл в нужный каталог объектов - с помощью GCC, например, необходимо указать (в .c.o
правила):
${CC} ${CFLAGS} -o ${OBJDIR}/$*.o -c $*.c
макрос CFLAGS будет включать $ {ФЛАГИ} значение, которое имеет дело с биты (например, FLAGS_32 = -m32
и FLAGS_64 = -m64 , and so when building the 32-bit version,
ФЛАГИ = -m32 would be included in the
CFLAGS` макро.
невязку l в autotools разрабатывает, как определить 32-битные и 64-битные флаги. Если худшее приходит к худшему, вам придется писать макросы для себя. Тем не менее, я бы ожидал (не исследовав его), что вы можете сделать это, используя стандартные средства из набора autotools.
Если вы не создадите себе тщательно (даже безжалостно) симметричный make-файл, он не будет надежно работать.
Спасибо. Я делаю некоторые чтения на обоих и видя, что с большей вероятностью будет иметь дело с некоторыми сложностями процесса сборки, такими как вызов специальных оболочек сборки приложений, а не прямой вызов gcc. – 2008-11-27 20:17:25