Для моего проекта (библиотеки) я использую configure с libtool и automake для сборки под хостами linux. Библиотека состоит из C API, а также дополнительного расширения C++. Итак, поскольку AC_PROG_CXX нужно назвать глобально, я использую условные обозначения automake:
*configure.ac*:
AC_PROG_CC
AC_PROG_CXX
AM_PROG_AR
LT_INIT
... some tests to figure out 'build_cxx' ...
AC_CONDITIONAL([CXX], [ test x$build_cxx = xyes ])
И внутри Makefile.am
sources = files.c
if CXX then
cxx_sources = files.cpp
else
cxx_sources =
endif
sources = $sources $cxx_sources
Все это, однако, не работает, когда configure не может найти g++ (который практически убивает дополнительную логику для расширения C++). После некоторых исследований я пришел к выводу, что AC_PROG_CXX каким-то образом сообщает libtool предположить, что поддержка C++. Я также был удивлен, осознав, что если AC_PROG_CXX терпит неудачу, он устанавливает CXX в "g++" !!!
В любом случае вызов AC_PROG_CXX условно создает ошибки, такие как "am_fastdepCXX никогда не определяется", что кажется мне логичным. Хуже всего то, что ошибка не отображается во время работы configure, но она появляется позже на этапе связывания в форме "неизвестной опции libtool -o
" (ouch).
Полный исходный код можно найти здесь → http://bitbucket.org/sdlu/sdlu/src
Может кто-нибудь мне помочь?
Заранее спасибо...
Это ограничение Automake, оно не заботится об этом при выборе компоновщика.
Одна работа заключается в том, чтобы условно переписать команду _LINK, как это предлагается в этом списке рассылки:
if USE_CXX
cxx_sources = ...
else
cxx_sources =
libSDLU_la_LINK = $(LINK) $(libSDLU_la_CFLAGS) $(libSDLU_la_LDFLAGS)
endif
Другой способ (предложенный в том же обсуждении) состоит в том, чтобы поместить источники C++ в библиотеку утилиты, которая была построена и добавлена условно, а затем добавлена в основную библиотеку:
if CXX
noinst_LTLIBRARIES = libSDLUxx.la
libSDLUxx_la_SOURCES = src/cxx/SDLU_CButton.cxx \
src/cxx/SDLU_CIniHandler.cxx \
src/cxx/SDLU_CRenderer.cxx \
src/cxx/SDLU_CSprite.cxx \
src/cxx/SDLU_CTexture.cxx \
src/cxx/SDLU_CWindow.cxx
libSDLU_la_LIBADD = libSDLUxx.la
endif
Не помещайте сгенерированные файлы (Makefile.in
, configure
и т.д.) В исходный элемент управления.
Добавьте скрипт bootstrap
который вызывает autotools для генерации вещей.
Предпочитаете pkg-config (т.е. PKG_CHECK_MODULES(SDL2, sdl2)
) по макросам с AM_PATH_SDL2
вручную (т.е. AM_PATH_SDL2
);
Не устанавливайте autoheaders (например, SDLU_config.h.in
). Это делает вашу библиотеку несовместимой с каждым программным обеспечением на основе autoconf, поскольку вы переопределяете PACKAGE
, VERSION
и все макросы обнаружения библиотек. См. Мой ответ в этом вопросе для примеров о том, как это сделать.
Я бы установил и установил C++ API как независимую, дополнительную библиотеку; полностью отключите скрипт sdlu-config, затем напишите sdluxx.pc
, для которого требуется sdlu
. Не утруждайте себя проверкой работы компилятора C++, если пользователь прошел через --enable-cxx
он знает, что он делает; Я предпочитаю, чтобы сборка была неудачной, чем незаполненная библиотека.
Я не думаю, что это хорошая идея вмешиваться в обработку переменной CXX.
Используйте свою собственную переменную BUILD_CXX
AC_CONDITIONAL([BUILD_CXX], [ test x$build_cxx = xyes ])here
а также
if BUILD_CXX
# ....
endif