Это не проблема make
, а одна из external_program
, которую вы запускаете через make
.Предположительно, он ловит и игнорирует SIGINT
.
. Вы можете убедиться в этом, заменив external_tool <options>
в make-файле, представленном, скажем, sleep 30
.Если затем вы запустите make
из терминала, вы обнаружите, что Ctrl-C (в этом терминале) прерывает выполнение sleep
очень хорошо:
$ make
bash -c "trap 'trap - SIGINT SIGTERM ERR; exit 1' SIGINT SIGTERM ERR; make run_int"
make[1]: Entering directory `/home/jb/tmp'
make simulate
make[2]: Entering directory `/home/jb/tmp'
sleep 10
^Cmake[2]: *** [simulate] Interrupt
make[1]: *** [run_int] Interrupt
make: *** [run] Error 1
Обратите внимание такжечто ваше run
правило бессмысленно.Треппинг SIGINT будет уместен, только если этот сигнал доставляется в оболочку, в которой вы определяете ловушку, а это не так.Он доставляется на передний план, который будет запускаться по правилу simulate
, если вы не обладаете сверхчеловеческой быстротой при нажатии клавиши Ctrl-C.Вы можете полностью удалить это правило и все же прервать процесс, выполняемый правилом simulate
.Как уже обсуждалось, как этот процесс реагирует на сигнал, это отдельный вопрос.