LINUX.ORG.RU

алгоритм разрешения зависимостей


0

1

Допустим, есть куча исходников, которые могут зависеть друг от друга. Чтобы их собрать, нужно определить все их зависимости и скомпилировать в правильном порядке.

Как это делается в общем случае? Как это делают пакетные менеджеры, тот же Portage например?

В общем, интересуют ссылки на теоретические исследования на данную тему :)

★★★★★

Для правильной сборки исходников пишутся скрипт configure и Makefile. Из них берётся информация для Spec.

toney ★★★★★
()
Ответ на: комментарий от toney

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

Для правильной сборки исходников пишутся скрипт configure и Makefile. Из них берётся информация для Spec.

так и делается, но задача определить правильный порядок автоматически, чтобы потом возможно сформировать Makefile

Harald ★★★★★
() автор топика
Ответ на: комментарий от Harald

Тогда грепать инклуды... составлять таблицу...

toney ★★★★★
()

мой народ называет это теорией графов.

anonymous
()
Ответ на: комментарий от Harald

И да, externals.h содержит инфо для линковщика.

toney ★★★★★
()
Ответ на: комментарий от Harald

так и делается, но задача определить правильный порядок автоматически, чтобы потом возможно сформировать Makefile

Ты усложняешь себе жизнь, ведь все, что надо — это

1. Написать список нужных объектников для каждого бинарника:

SRC=obj1.c obj3.c
SRCX=obj2.cpp
OBJ=$(patsubst %.o,%.c,$(SRC)) $(patsubst %.o,%.cpp,$(SRCX))
binary: $(OBJ)
    $(CXX) -o $@ $(LDFLAGS) $^ $(LIBS)

2. Написать правило для преобразования исходника c(cpp) -> o:

%.o: %.c
    $(CC) -c -o $@ $(CFLAGS) $<

%.o: %.cpp
    $(CXX) -c -o $@ $(CXXFLAGS) $<

3. Получить список исходников и попросить gcc сгенерировать список зависимостей:

dep:
    $(CC) $(CFLAGS) -MM $(SRC) > dep
    $(CXX) $(CXXFLAGS) -MM $(SRCX) >> dep

4. Вежливо попоросить make использовать эту информацию:

-include dep

5. Не забывать периодически ее обновлять (make -B dep)

red_eyed_peguin
()
Ответ на: комментарий от red_eyed_peguin

уточню задачу. Есть некоторый набор программ, которые тащат с собой все свои зависимости. Зависимостей много, всякие libpng, libjpeg, OpenSSL, и т.д. У многих программ зависимости пересекаются, т.е допустим две программы зависят от одной и той же библиотеки. У каждой библиотеки или программы есть свой Makefile. Всё это дело лежит в большой куче исходников. И собирается велосипедной костыльно-подпорочной системой параллельной сборки.

Иногда возникает такая ситуация, что одновременно начинают собираться две программы, зависящие от одной библиотеки. Т.к. эта библиотека еще не собрана, параллельно запускается её сборка одновременно в двух экземплярах. Надо такую ситуацию исключить и заранее построить дерево зависимостей

Harald ★★★★★
() автор топика
Ответ на: комментарий от dmitry_vk

спасибо, кажется то что нужно

Harald ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.