взял ваш пример
all:
@tar ex
@echo "exit code $$?"
@echo "Here!" $ make
tar: invalid option -- e
Try `tar --help' or `tar --usage' for more information.
make: *** [all] Error 64
$
то есть всё как и должно быть
>я делаю в мэйк-файле tar cf - -C /mydir/ . | tar
>xvf - -C /my/dist/
>если mydir не создан, надо останавливаться.
>а эта дура дальше маслает.
>вот @#$%.
эта конструкция действительно не показывает то что вы от неё ожидаете, но работает правильно, это ваши ожидания неверны :-)
первая часть (tar cf - -C mydir/ .) завершается с ошибкой в результате которой на вход следующей команде (tar xvf - -C my/dist/) подаётся пустой поток и команда завершается без ошибки,
раз нечего разарихировать, то и нечего директорию проверять,
и вот этот 0 от второй команды заставляет make продолжить работу.
кстати конструкция вида
all:
command
echo $$?
практически бесполезна так как make каждую строку запускает в отдельном shell, поэтому вторая строка всегда вернёт 0. Надо писать через ; и использовать \ если хотите перенести строки
присутствие директории можно проверит по другому, например вот так:
all:
[ -d mydir ] && tar cf - -C mydir/ . | tar xvf - -C my/dist/