2013-12-23 4 views
0

Для моего проекта (библиотеки) я использую configure с libtool и automake для сборки под Linux-хостами. Библиотека состоит из C API, а также дополнительного расширения C++. Таким образом, поскольку AC_PROG_CXX должен называться глобально, я использую AutoMake условными:Отключение поддержки cxx для libtool после вызова AC_PROG_CXX

*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 

Все дело, однако, не работает, если настроить не в состоянии определить местонахождение 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

Может кто-нибудь мне помочь?

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

ответ

1

Это ограничение Automake, он не заботятся о состоянии при выборе линкера.

Один Обходной условно переписать команду _link, как это было предложено в this mailing list post:

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 

Некоторые несвязанные примечания

  1. Не помещайте сгенерированные файлы (Makefile.in, configure и т. Д.) В исходное состояние.

  2. Добавить сценарий bootstrap, который вызывает autotools для генерации вещей.

  3. Предпочитает pkg-config (то есть PKG_CHECK_MODULES(SDL2, sdl2)) над макросами autoconf с ручной обработкой (то есть AM_PATH_SDL2);

  4. Не устанавливайте автодоузлы (то есть SDLU_config.h.in).Это делает вашу библиотеку несовместимой с каждым программным обеспечением на основе autoconf, поскольку вы переопределяете PACKAGE, VERSION и все макросы обнаружения библиотеки. См. my answer in this question для примеров того, как это сделать.

  5. Я бы установил и установил API C++ как независимую, дополнительную библиотеку; полностью удалите сценарий sdlu-config, затем напишите sdluxx.pc, для которого требуется sdlu. Не беспокойтесь, проверяйте, работает ли компилятор C++, если пользователь прошел --enable-cxx, он знает, что он делает; Я предпочитаю, чтобы сборка была неудачной, чем незаполненная библиотека.

+0

Спасибо за ваш ответ, первая работа вокруг (изменение команды LINK) работал отлично для меня. Что касается примечаний: – neoaggelos

+0

** 1-2 **: я решил добавить сгенерированные файлы, чтобы избежать общей проблемы с разными несовместимыми версиями autotools ** 3 **: эти макросы внутренне используют pkg-config и fallback к соответствующим сценариям (sdl2-config) ** 4 **: Это исправлено в последней версии, спасибо за примечание ** 5 **: Я бы хотел этого избежать и использовать его только в крайнем случае, главным образом потому, что я также поддерживать системы сборки на основе CMake и premake. Еще раз спасибо! – neoaggelos

+0

Тем не менее, сгенерированные файлы не принадлежат репозиторию. Когда вы делаете «make dist-gzip» для создания tarball, все будет упаковано, так что пользователю не нужен autoconf/automake. Я один из поддерживающих ODE, если вы хотите посмотреть наше репо: http://sourceforge.net/p/opende/code/HEAD/tree/trunk/ – DanielKO

0

Я не думаю, что это хорошая идея, чтобы вмешиваться в обработке переменной CXX.

Используйте свою собственную переменную BUILD_CXX

AC_CONDITIONAL([BUILD_CXX], [ test x$build_cxx = xyes ])here 

и

if BUILD_CXX 
    # .... 
endif 
+0

Нет, это не проблема ... Использование CXX прекрасно работает как условное название – neoaggelos