Как включить префикс пути в шаблонное правило GNU Make
Учтите следующее:
%.foo: %.bar
echo %.foo: %.bar
echo $< > $@
lt; > $@
Предполагая, что у нас есть один файл1.bar
, команда выполнена простоecho 1.bar > 1.foo
, Однако когда%
содержит путь, а не просто имя файла, он начинает становиться привередливым. Моя проблема в том, что я хочу проложить другой путь к%.bar
шаблон становится полностью искаженным. Т.е. когда%.bar
являетсяnice/path/1.bar
, это становится невозможным:
%.foo: /project/something/%.bar
echo %.foo: /project/something/%.bar
echo $< > $@
lt; > $@
Это будет работать, но выполняетсяecho nice/path//project/something/1.bar > 1.foo
вместоecho /project/something/nice/path1.bar > 1.foo
Причина этого в том, как make выполняет свои шаблонные правила. Из документов:
Когда целевой шаблон не содержит косую черту (и обычно ее нет), имена каталогов в именах файлов удаляются из имени файла перед его сравнением с целевым префиксом и суффиксом. [...] Каталоги игнорируются только с целью найти неявное правило для использования, а не в применении этого правила. Таким образом, "e% t" соответствует имени файла src / eat, с "src / a" в качестве основы. Когда предварительные условия превращаются в имена файлов, каталоги из основы добавляются спереди, а остальная часть основы заменяется на «%». Стебель "src / a" с обязательным шаблоном "c% r" дает имя файла src / car
Можно ли как-то отключить это для определенного правила?