Re: makefiles vs project files
От: jazzer Россия Skype: enerjazzer
Дата: 24.02.15 14:48
Оценка: 2 (1) +1
Здравствуйте, x-code, Вы писали:

XC>или "императивное vs деклатативное описание проектов".


XC>Исторически make-файлы появились раньше.


Но это не делает их недекларативными.

XC>По сути make-файл это скрипт на каком-то языке


Похоже, ты make-файлов не видел живьем.

make-файлы — это не императивный скрипт типа сначала собери то, потом се, потом вот эту команду исполни, и т.п.

make-файлы — это декларативное описание зависимостей между файлами с пристегнутым к зависимости скриптом сборки одного файла из другого.
А как и в каком порядке все это исполнять — решает сама утилита make.

Т.е. make-файл — это текстовое описание графа зависимостей (DAG), где узлы — это файлы, а к стрелочкам-зависимостям прицеплены скрипты-сборщики.

Так что, в принципие, никто тебе не мешает взять любую тулзовину для рисования графов (DOT, Rose, UML, XML) и наваять генератор мейкфайла из него (например, xslt). Это если нужно позарез именно что-то гуёвое.

Но его не составляет никаких проблем и руками писать, потому что синтаксис элементарный:
файл: зависимости через пробел
    команда, чтоб собрать файл из зависимостей

Всё. Все остальное, чем наполнены мейк-файлы — это просто автоматизация при помощи переменных и т.п.

Соответственно, мейкфайл может служить абсолютно для чего угодно, когда у тебя есть пересборка файлов, которые как-то друг от друга зависят. Например, сборка файла книжки, где главы лежат отдельными файлами. Или перегенерация содержания, если что-то изменилось. Причем книжка может собираться автоматически в 18 форматах и заодно автоматом выкладываться на сайт. Или у тебя есть данные, и есть несколько прог, которые эти данные обрабатывают как-то, и есть еще куча прог, которые используют и исходные файлы, и сгенеренные. И тебе приходит апдейт одного из исходных файлов. Мейк автоматом перегенерит только то, что нужно. Причем то, что можно генерить параллельно (независимые ветки графа), он будет генерить параллельно. И т.д. и т.п.

Это не значит, что нельзя то же самое наворотить в проектных файлах (зависит от навороченности среды, которая исполняет проектный файл, но в нормальныхз средах есть возможность задать свою команду для custom build, а не только пользоваться встроенными).
Просто не недо думать, что мейкфайл ничего не способен делать и на помоечку.

ЗЫ У меня один монструозный исходник генерится ходов в 10 из кучи разных файлов, половина из которых добывается разными странными путями — xslt, grep/perl и прочая (удивительно, что еще с веба ничего не тянем). На мейкфайле все записывается очень хорошо и понятно и декларативно, за хз сколько лет ни одной проблемы не было. Если меняется один файл — перегенерится только то, что надо, не более.
Аналогично я устроил систему сборки всех сторонних библиотек. Точно так же мейкфайл отслеживает все зависимости и пересобирает только то, что надо (типа если обновился буст (или собирающий его скрипт) — не надо пересобирать питон и R, а только буст и то, что от него зависит). До того, как я сделал мейкфайл, это был ад и израиль и куча часов на пересборку всего и вся, потому что всем лень было разбираться с зависимостями вручную, проще было пересобрать все с нуля. Сейчас всем этим заведует мейкфайл, причем он сам генерится большей частью из очень маленького и компактного мейкфайла, в котором просто прописаны зависимости между библиотеками.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.