Использование Autotools для новой общей библиотеки - PullRequest
2 голосов
/ 03 июля 2010

Что я хочу сделать, это создать новую общую библиотеку под названием libxxx, которая связывается с другой общей библиотекой под названием libzzz, эта общая библиотека имеет независимый инструмент типа pkg-config, скажем, он называется " zzz-config ", который дает флаги, необходимые на этапе компиляции при использовании libzzz. Что я хочу сделать, это:

  • Создание configure / makefile и т. Д. С использованием автоинструментов, таких как automake, autoconf и т. Д .;
  • Он должен использовать скрипт zzz-config, указанный выше;
  • Он должен генерировать автоматические зависимости для источников;
  • В нем должен быть режим для построения отладочных (без оптимизации) и выпускных (с оптимизацией) сборок;
  • Источники в C ++;
  • Это должно быть целью для общей библиотеки;
  • Он должен прочитать источники для каталога src и поместить скомпилированные файлы в другой каталог

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

Спасибо!

Ответы [ 3 ]

7 голосов
/ 05 июля 2010

Это довольно легко сделать с помощью автоинструментов.Несколько вещей, на которые стоит обратить внимание: libzzz может предоставить макрос, который сделает большую часть работы за вас.Например, glib предоставляет макрос с именем AM_PATH_GLIB_2_0, который устанавливается вместе с библиотекой, так что вам просто нужно вызвать его в своем файле configure.ac.(Обратите внимание, что макрос назван неправильно, так как он растекается по пространству имен automake, но это совсем другая проблема.) Вот пример configure.ac и Makefile.am, который делает то, что вы хотите (см. Примечания по сборкам отладки и выпуска)

configure.ac:

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.66])
AC_INIT([libxxx], [0.0.0], [alice@bob.com])
AC_CONFIG_SRCDIR([libxxx.cc])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([foreign])
LT_INIT
AC_PROG_CXX

# Checks for libraries.
# If libzzz has an autoconf macro use it.  Otherwise:
AC_PATH_PROG([ZZZ_CONFIG],[zzz-config],[none])
AS_IF([test x"$ZZZ_CONFIG" = xnone],[
    AC_MSG_ERROR([zzz-config not found in PATH])
])
CPPFLAGS="$CPPFLAGS $(zzz-config -cflags)"
LIBS="$(zzz-config -libs) $LIBS"  # Totally unnecessary: we're not linking
# If zzz-config is found, we can probably assume that
# libzzz is installed, but check anyway:
AC_CHECK_LIB([zzz],[main],[],[AC_MSG_ERROR([libzzz required])])

# Checks for header files.
AC_CHECK_HEADERS([zzz.h])

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

Makefile.am


lib_LTLIBRARIES = libxxx.la
libxxx_la_SOURCES = libxxx.cc
include_HEADERS = xxx.h
libxxx_la_LDFLAGS = -version-info 0:0:0

С точки зрения построения отладки или выпуска, существует множество способов сделать это с помощьюавтоинструменты, которые вообще не требуют редактирования скриптов сборки.Канонический способ сделать это - установить CXXFLAGS при вызове configure (например, передать CXXFLAGS = -O2 CPPFLAGS = -DNDEBUG в качестве аргументов для настройки для получения сборки выпуска).Вы также можете настроить свою систему так, чтобы все, что вы устанавливаете в / usr / local, было сборкой релиза, записав эти назначения в /usr/local/share/config.site, в то время как все, что собирается для установки в $ HOME, будет отладочной сборкойзаписав 'CXXFLAGS = "- g -O0" в $ HOME / share / config.site.Вы можете вызвать AC_HEADER_ASSERT в configure.ac, если вы хотите дать пользователю опцию --disable-assert во время конфигурирования, чтобы отключить утверждения (но для пользователя на самом деле так же просто поместить -DNDEBUG в CPPFLAGS).Еще одна полезная вещь, которую вы можете сделать, - это использовать сборки VPATH от automake для настройки отдельных каталогов сборки, где каждый из них настроен соответствующим образом.

Однако, если вы действительно чувствуете необходимость добавить функциональность в ваши сценарии сборки, вы можете попробовать что-то добавитькак это в configure.ac:

AC_ARG_ENABLE([debug],AS_HELP_STRING([--enable-debug],
    [configure a debug build]),
    [CXXFLAGS="$CXXFLAGS -g -O0"])
AC_ARG_ENABLE([release],AS_HELP_STRING([--enable-release],
    [configure a release build]),
    [CPPFLAGS="$CPPFLAGS -DNDEBUG"]
    [CXXFLAGS="$CXXFLAGS -O2"])

Обратите внимание, что это не надежно и может вызвать путаницу у пользователя.Например, если пользователь использует config.site для установки CPPFLAGS на -DDEBUG, но вызывает --enable-release, тогда CPPFLAGS будет включать "-DDEBUG -DNDEBUG".Если вы попытаетесь полностью сбросить CPPFLAGS в ответ на --enable-release, то флаги -I, необходимые для libzzz, будут потеряны.Вы можете избежать этой последней проблемы, используя AC_SUBST'ing LIBZZZ_CFLAGS и внося изменения в Makefile.am, но на самом деле просто научить пользователя устанавливать CPPFLAGS и CXXFLAGS при вызове configure.

0 голосов
/ 04 июля 2010

Я бы тоже держался подальше от автоинструментов.

Кроме того, мой опыт общения с Cmake был менее чем звездным. Возможно, все изменилось, но документации, которой я только что пытался изучить, просто не было.

Я склонен использовать scons: http://www.scons.org/

Это говорит о том, что я не знаю, насколько хорошо он работает в больших проектах (то есть в тысячах или более файлах). Для небольших или средних проектов это хорошо, хотя.

Вы также можете попробовать qmake, но я бы порекомендовал, если бы вы использовали Qt.

0 голосов
/ 03 июля 2010

Я предлагаю использовать CMake вместо autotools. С ним намного проще работать, и он также создаст зависящие от платформы проекты для работы (например, проекты на основе Makefile, проекты Visual Studio, проекты Eclipse CDT и т.

Также будут созданы проекты debug или release, в зависимости от значения переменной CMAKE_BUILD_TYPE.

Создать библиотеку libxxx так же просто, как:

add_library(libxxx SHARED ${LIBXXX_SOURCES})

где LIBXXX_SOURCES - переменная, которая содержит источники.

Связать две библиотеки так же просто (см. target_link_libraries ):

target_link_libraries(libxxx libzzz)

Чтобы получить флаги компиляции из сценария zzz-config, вы должны использовать команду execute_process следующим образом:

execute_process(COMMAND ./zzz-config 
                WORKING_DIRECTORY "<your_working_directory>"
                OUTPUT_VARIABLE ZZZ_FLAGS)

Затем вы можете установить переменную CMAKE_C_FLAGS или CMAKE_CXX_FLAGS для установки необходимых флагов компиляции.

...