Я работаю над make-файлом, который создает несколько файлов в выходных каталогах. Для того чтобы эти файлы были созданы, выходной каталог должен существовать, иначе создание файла не удастся.
Вот минимальный пример, который демонстрирует проблему, с которой я сталкиваюсь:
.PHONY: default
default: dir/file.dat dir/other.dat
# In order to create these files, their parent directory must exist
dir/%.dat: | dir/
touch "$@"
# To create a directory, use mkdir -p
%/:
mkdir -p "$@"
Когда я запускаю make-файл, я получаю сообщение об ошибке, что не существует правила для создания dir
. Отладочный прогон показывает, что make отбрасывает завершающий "/" из "dir /":
root@69654136a2ae:~# make -rdf dirs.mk
GNU Make 3.81
[snipped]
Considering target file `default'.
File `default' does not exist.
Considering target file `dir/file.dat'.
File `dir/file.dat' does not exist.
Considering target file `dir'.
File `dir' does not exist.
Looking for an implicit rule for `dir'.
No implicit rule found for `dir'.
Finished prerequisites of target file `dir'.
Must remake target `dir'.
make: *** No rule to make target `dir', needed by `dir/file.dat'. Stop.
Кстати, запрос целевого каталога в командной строке работает просто отлично:
root@69654136a2ae:~# make -rdf dirs.mk /some/dir/
GNU Make 3.81
[snipped]
Updating goal targets....
Considering target file `/some/dir/'.
File `/some/dir/' does not exist.
Looking for an implicit rule for `/some/dir/'.
Trying pattern rule with stem `/some/dir'.
Found an implicit rule for `/some/dir/'.
Finished prerequisites of target file `/some/dir/'.
Must remake target `/some/dir/'.
mkdir -p "/some/dir/"
Как я могу заставить make делать то, что я хочу?
В идеале я ищу общее решение. В приведенном выше примере есть только один подкаталог, но в реальном проекте будет много подкаталогов, поэтому я бы хотел избежать повсеместного копирования решений.