Вопрос

У меня есть проект C++, управляемый autoconf, который я адаптирую для компиляции на хостах FreeBSD.Исходной системой была Linux, поэтому я создал один AM_CONDITIONAL, чтобы различать хост, который я создаю, и разделить код на файлы, специфичные для системы.

configure.ac

AC_CANONICAL_HOST
AM_CONDITIONAL([IS_FREEBSD],false)
case $host in
        *free*)    
            AC_DEFINE([IS_FREEBSD],[1],[FreeBSD Host])
            AM_CONDITIONAL([IS_FREEBSD],true)
            BP_ADD_LDFLAG([-L/usr/local/lib])
                ;;
esac

Makefile.am

lib_LTLIBRARIES=mylib.la
mylib_la_SOURCES=a.cpp \
                 b.cpp

if IS_FREEBSD
    mylib_la_SOURCES+=freebsd/c.cpp
else
    mylib_la_SOURCES+=linux/c.cpp
endif

Когда я запускаю automake, происходит сбой с таким сообщением:

Makefile.am: object `c.lo' created by `linux/c.cpp' and `freebsd/c.cpp'

Есть идеи, как настроить automake для соблюдения этого условия даже в процессе сборки Makefile.in?

Это работает, если файлы имеют разные имена, но это код C++, и я пытаюсь сохранить имена файлов такими же, как имя класса.

Заранее спасибо!

Это было полезно?

Решение

Вы можете запросить создание объектов в соответствующих подкаталогах с помощью

AUTOMAKE_OPTIONS = subdir-objects

Другие советы

Еще один вариант, кроме подкаталоги-объекты, заключается в том, чтобы предоставить каждому подпроекту несколько пользовательских флагов сборки для каждого проекта.Когда вы это сделаете, automake изменит свои правила именования *.o, чтобы добавить целевое имя к имени модуля.Например, это:

mylib_la_CXXFLAGS=$(AM_CXXFLAGS)
mylib_la_SOURCES=a.cpp b.cpp

результатом будут выходные файлы mylib_la-a.o и mylib_la-b.o, а не a.o и b.o.Таким образом, вы можете иметь два разных проекта с одним и тем же выходным каталогом, каждый из которых имеет, скажем, файл b.cpp, и не иметь конфликта их выходных данных.

Обратите внимание, что я сделал это, установив для конкретного проекта CXXFLAGS значения, которые automake уже собирался использовать, AM_CXXFLAGS.Automake недостаточно умен, чтобы обнаружить этот трюк и использовать более короткие имена *.o.Если случится так, что вам понадобятся параметры сборки для каждого проекта, вы, конечно, можете сделать это вместо этого хака.

Есть весь список переменных automake, которые при установке для каждого исполняемого файла дают тот же эффект.Например, возможно, одному подпроекту уже нужны специальные флаги ссылок, поэтому вы даете ему что-то вроде:

mylib_la_LDFLAGS=-lfoo

Это даст вам файлы с префиксом *.o, как это сделал трюк AM_CXXFLAGS, только теперь вы «законно» используете эту функцию, вместо того, чтобы обманом заставить automake сделать это.

Кстати, это плохой стиль autoconf — менять способ сборки вашей программы исключительно на основе ОС, для которой она создается.Хороший стиль autoconf — проверять только определенные функции платформы, а не целые платформы, поскольку платформы меняются.Сегодня FreeBSD может вести себя определенным образом, но, возможно, в следующем выпуске она скопирует функцию Linux, которая избавит вас от необходимости собирать программу двумя разными способами.Или, возможно, функция, которую вы используете сегодня, устарела и будет удалена в следующей версии.

Кузнечик, в автоинструментах сорок лет опыта портативного программирования Unix.«Может быть», которое я дал выше иметь произошло в прошлом и, несомненно, произойдет снова.Тестирование отдельных функций — самый простой способ справиться с постоянно меняющимися платформами.

При таком подходе вы также можете получить неожиданные бонусы.Например, возможно, вашей программе нужны две непереносимые функции для выполнения своей работы.Скажем, во FreeBSD это функции A и B, а в Linux — это функции X и Y;A и X — похожие механизмы, но с разными интерфейсами, одинаковые для B и Y.Возможно, функция A взята из исходных BSD и присутствует в Solaris, потому что она имеет корни BSD из SunOS 80-х, а Solaris также имеет функцию Y из редизайна на основе System V в начале 90-х.Протестировав эти функции, ваша программа может работать и в Solaris, поскольку она имеет функции, необходимые вашей программе, но не в той же комбинации, что в FreeBSD и Linux.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top