Используйте mkdir -p
.Это идемпотент (без проблем, если выполняется дважды с одним и тем же аргументом или даже параллельно). И создает все каталоги, если вы даете имя пути с несколькими компонентами.
Посмотрите на мой Makefile здесь: http://www.kylheku.com/cgit/txr/tree/Makefile
Несколько экземпляров mkdir -p
,Конечно, я вижу несколько mkdir -p
заданий, запускаемых при запуске make -j, но это не проблема.
Другая идея заключается в добавлении -
в команду mkdir.(Так же, как то, что используется с rm
в clean
целевых правилах).Но это игнорирует истинную ошибку, не только логика EEXIST
.
PS, такая как if directory does not exist, then mkdir ...
, не будет работать, потому что она имеет состояние гонки.Каталог может не существовать во время оценки if
, но затем, когда оценивается mkdir
, он внезапно существует.При параллельном make вам нужно беспокоиться о гонках, потому что написание правил для параллельного make является формой параллельного программирования.