2010-12-10 2 views
3

Исходя из фона Rails, я привык к тому, чтобы указать зависимости моего приложения в Gemfile, который был проверен на моем git-репо. Когда мое приложение вытягивается, пользователю просто нужно запустить bundle install, и у них есть все необходимые зависимости.Как хранить зависимости библиотеки C в управлении версиями?

В сообществе this answer сообщество, похоже, соглашается с тем, что библиотеки C не должны проверяться в контроле источника. Это имеет смысл (ведь сами самолеты не проверяются под Rails), но это все еще создает проблему. Если я напишу код и включу новую зависимость от созданной пользователем библиотеки, как я могу выразить эту зависимость в исходном элементе управления?

+1

Какая платформа? Поскольку фактическое стандартное место для этого в Linux находится в файле `configure` (или какая-либо часть автоконфигурации извергает его). – detly 2010-12-10 06:46:07

+5

Если вы используете autotools, зависимости проверяются в `configure.ac`, обычно через` pkg-config`, вызывая макрос `PKG_CHECK_MODULES`. Это живет в вашем ВК. Файл `configure`, созданный с помощью` configure.ac`, запускается пользователем и не работает. – 2010-12-10 06:50:39

ответ

3

Очевидно, что вещи в мире C немного отличаются друг от друга, потому что вам не нужен источник во время выполнения. Общий способ работы с GNU/Linux (и многими другими * ix) состоит в том, что некоторые шаги настройки выполняются с использованием сценария конфигурации или программы. Наиболее распространенным из них является знаменитый сценарий configure, созданный GNU autoconf. Autotools генерируют много файлов кеша и копируют множество вспомогательных скриптов в исходное дерево, поэтому не забудьте установить .gitignore, или вы сойдете с ума.

Очень много библиотек устанавливают файлы управления для pkg-config в $prefix/lib/pkgconfig или $prefix/share/pkgconfig. Они считываются с помощью инструмента pkg-config для проверки наличия библиотек и получения правильных флагов компилятора и компоновщика для этой библиотеки. Это простой текст, так что посмотрите в /usr/lib/pkgconfig, чтобы понять, как они выглядят.

В autoconf, файл configure.ac компилируется в configure, вызывая макропроцессор m4 (через обертку под названием autoconf). Чтобы проверить библиотеку, которая работает с pkg-config, все очень просто. Вы добавить что-то вроде следующего, чтобы configure.ac

# Checks for libraries. 
PKG_CHECK_MODULES([GLib], [glib-2.0]) 

Это будет проверять, что pkg-config установлен, а затем использовать его для проверки пакета glib-2.0, напечатав сообщение Checking for GLib... по пути. Он также установит переменные оболочки GLib_CFLAGS и GLib_LIBS и организует их замену в любые файлы, созданные AC_CONFIG_FILES (например, ваш Makefile, от Makefile.in).Если он не находит glib, ошибка configure. Посмотрите на /usr/share/aclocal/pkg.m4, чтобы найти определение PKG_CHECK_MODULES, которое поддерживает несколько других опций. Документация находится на странице руководства пользователя pkg-config(1).

Если ваша зависимая библиотека не поддерживает pkg-config, иногда поставщик библиотеки предоставляет макрос autoconf. Например, старые версии SDL предоставили AM_PATH_SDL, но в новых версиях только pkg-config.

Если у поставщика нет поддержки, иногда есть сторонняя поддержка на autoconf archive. Архив autoconf доступен в виде пакета в Debian GNU/Linux и MacPorts (и, возможно, во многих других системах), что означает, что любые необходимые определения могут использоваться без копирования файлов .m4 вручную.

Если ни одно из указанных выше не является истинным, тогда проверьте заголовок, используя что-то вроде AC_CHECK_HEADER, и проверьте библиотеку, используя что-то вроде AC_CHECK_LIB.

2

Сообщество, похоже, соглашается с тем, что библиотеки C не должны проверяться в исходном контроле.

В зависимости от используемой библиотеки. Например, когда я использую Sqlite, я проверяю файлы sqlite на своем контроле версий и строю его с исходными файлами. Это легко, так как sqlite поставляется с одним исходным файлом и заголовком. Это не будет практично, если в библиотеке больше файлов.

, но это все еще создает проблему. Если я напишу код и включу новую зависимость от созданной пользователем библиотеки, как я могу выразить эту зависимость в исходном элементе управления?

В Linux это обрабатывается с помощью autotools. Используя это, вы можете указать пакеты для использования, и configure попытается найти его при создании. Если вы ищете кросс-платформенное решение, CMake - лучший инструмент. Эти инструменты могут найти пакеты, установленные в стандартных местах (/usr/lib & /usr/include), а также предоставляет способ настройки патча поиска.

Смежные вопросы