У меня есть следующий GNU make Makefile


PWD := $(shell pwd)

obj-m += liason.o

default:
        bash -c '[ "$(lsmod|grep liason)" == "" ] || rmmod liason'
        make -C /src M=$(PWD) modules

Я вызываю make-файл; это показывает это среди вывода:

bash -c '[ "" == "" ] ||  rmmod liason'

Таким образом, rmmod не выполняется.

Однако:

Модуль "liason" установлен.
Он даже появляется, когда я выполняю следующее из cmdline.

$ lsmod|grep liason
liason                 16384  0

Следовательно, пустые кавычки для одного и того же lsmod|grep в выходных данных makefile не имеют смысла.

0
clearlight 6 Окт 2021 в 23:32

1 ответ

Лучший ответ

$ обрабатывается Make; $(lsmod|grep liason) выдает пустую строку, команды фактически не выполняются. Чтобы вместо этого передать выражение в оболочку, вам нужно удвоить $:

bash -c '[ "$$(lsmod|grep liason)" == "" ] || rmmod liason'

Вы можете упростить это следующим образом:

if lsmod | grep -q liason; then rmmod liason; fi

Это гарантирует, что любая ошибка при удалении модуля остановит сборку.

3
Stephen Kitt 7 Окт 2021 в 07:26
Упрощенная версия выдает довольно непонятную ошибку "make: *** [Makefile:3: all] Error 1"
 – 
clearlight
7 Окт 2021 в 06:59
Добавление «; true» к каждой строке, чтобы сбросить статус выхода 1 из lsmod | grep -q работает.
 – 
clearlight
7 Окт 2021 в 07:13
1
Ах да, извините! Добавление ; true означает, что любая ошибка rmmod будет проигнорирована, см. обновленный ответ для альтернативы.
 – 
Stephen Kitt
7 Окт 2021 в 09:47
1
Я хочу сказать, что когда предполагается выполнение rmmod, если удаление не удается, оно завершится с ненулевым кодом выхода. Добавление ; true игнорирует это, а также код выхода из grep, когда rmmod не должен запускаться. Игнорировать grep можно, потому что это ожидаемо; игнорирование rmmod — нет. Обертывание grep в if обрабатывает ошибку grep, не игнорируя потенциальные ошибки rmmod.
 – 
Stephen Kitt
7 Окт 2021 в 19:12
1
Да, я понимаю, я только подумал, что стоит пояснить свои рассуждения.
 – 
Stephen Kitt
7 Окт 2021 в 20:11