В общем случае это невозможно в Makefiles, потому что для определения того, какие цели нужно сделать и в каком порядке, make
необходимо заранее знать их зависимости, прежде чем будут выполнены правила.
В вашем примере, как make
узнает, когда оценивать $(MAP_FILES)
в правиле work_with_map_files
? Порядок не определен явно, но выводится из зависимостей. В вашем примере вы хотите, чтобы оно оценивалось после выполнения правила generate_map_files
, но у make
нет способа узнать это, поскольку ему необходимо знать значение этой переменной для зависимостей, которые необходимы для определения порядок, в котором будет оцениваться это значение - это самоссылочный цикл.
Конечно, один простой трюк состоит в том, чтобы запустить make дважды - это можно сделать автоматически, добавив команду make work_with_map_files
после команды ./mapbuilder
в шаблоне generate_map_files
, но будьте осторожны с этим в целом, потому что если work_with_map_files
фактически будет объявлено зависимым от generate_map_files
(что и должно быть), что приведет к бесконечному рекурсивному циклу make
. И, конечно, это опровергает идею автоматического определения порядка make
. В противном случае вам понадобится замена make
, на которую могут быть намеки на такие заказы и сделать несколько проходов.
Это причина того, что в больших кодовых базах с несколькими включаемыми файлами, где не требуется повторять включаемые зависимости в Makefile
, makedepend
часто используется для генерации отдельного Makefile с этими зависимостями, который включены в основной Makefile
. Для его создания сначала запускается make depend
, который вызывает makedepend
для генерации зависимостей включаемого файла, а затем make
.