GNU make: как дождаться завершения команды "cp" - PullRequest
0 голосов
/ 13 февраля 2019

мой make-файл:

make:
# Mount Loader.bin
    sudo mount -t vfat -o loop Boot.img mnt
    sudo cp Loader.bin mnt
    sudo umount mnt

Тем не менее, результаты представляют ошибку с "target busy"

$ make make
sudo mount -t vfat -o loop Boot.img mnt
[sudo] password for shore: 
sudo cp Loader.bin mnt
sudo umount mnt
umount: /home/shore/MineOS/mnt: target is busy.
makefile:7: recipe for target 'make' failed
make: *** [make] Error 32

Это происходит случайно, и я предполагаю, что основная идея состоит в том, что unmouont выполняютсяпока копирование находится в процессе.

Таким образом, я хотел бы спросить, есть ли способ дождаться завершения предыдущей команды и затем выполнить следующую команду

Кстати, моя платформа - Ubuntu18.4

Большое спасибо !!

1 Ответ

0 голосов
/ 13 февраля 2019

make когда-либо запускает только одну строку в рецепте за раз, и всегда ожидает завершения предыдущей строки перед запуском следующей.Это должно подождать, потому что, если текущая строка терпит неудачу, рецепт должен потерпеть неудачу без начала следующей строки.

Вероятно, происходит то, что cp завершается, но данные не были полностью сброшены всмонтированная файловая система: ядро ​​все еще записывает буферизованные данные.Таким образом, даже если команда копирования завершена, раздел все еще занят.

Возможно, вы можете принудительно синхронизировать его, используя что-то вроде (здесь я предполагаю, что вы используете GNU / Linux или что-то совместимое):

make:
# Mount Loader.bin
        sudo mount -t vfat -o loop Boot.img mnt
        sudo cp Loader.bin mnt
        sudo sync -f mnt/Loader.bin
        sudo umount mnt

Я не знаю, будет ли этого достаточно, чтобы заставить его или нет.

Кстати, обычно неплохо использовать sudo -n, когда вы используете sudoв make-файле или любой другой неинтерактивной среде.

...