Como posso detectar que o modo de compilação está aguardando entrada

8

Isso geralmente me atrapalha na criação de kernels do Linux. Vou chutar uma compilação e depois de um tempo percebo que ela não está concluída. O que geralmente acontece é que a configuração padrão foi alterada, aguardando a entrada do usuário na janela de compilação. Por exemplo, acho que a janela de compilação parou no seguinte:

-*- mode: compilation; default-directory: "~/lsrc/kvm/kernel-v8.build/" -*-
Compilation started at Tue Nov 25 10:34:20

cd /home/alex/lsrc/kvm/kernel-v8.build && ARCH=arm64 make -j9
  GEN     ./Makefile
scripts/kconfig/conf --silentoldconfig Kconfig
*
* Restart config...
*
*
* File systems
*
Second extended fs support (EXT2_FS) [Y/n/m/?] y
  Ext2 extended attributes (EXT2_FS_XATTR) [N/y/?] n
  Ext2 execute in place support (EXT2_FS_XIP) [N/y/?] n
Ext3 journalling file system support (EXT3_FS) [Y/n/m/?] y
  Default to 'data=ordered' in ext3 (EXT3_DEFAULTS_TO_ORDERED) [N/y/?] n
  Ext3 extended attributes (EXT3_FS_XATTR) [N/y/?] n
The Extended 4 (ext4) filesystem (EXT4_FS) [Y/n/m/?] y
  Ext4 POSIX Access Control Lists (EXT4_FS_POSIX_ACL) [N/y/?] n
  Ext4 Security Labels (EXT4_FS_SECURITY) [N/y/?] n
  EXT4 debugging support (EXT4_DEBUG) [N/y/?] n
JBD (ext3) debugging support (JBD_DEBUG) [N/y/?] n
JBD2 (ext4) debugging support (JBD2_DEBUG) [N/y/?] n
Reiserfs support (REISERFS_FS) [N/m/y/?] n
JFS filesystem support (JFS_FS) [N/m/y/?] n
XFS filesystem support (XFS_FS) [N/m/y/?] n
GFS2 file system support (GFS2_FS) [N/m/y/?] n
Btrfs filesystem support (BTRFS_FS) [N/m/y/?] n
NILFS2 file system support (NILFS2_FS) [N/m/y/?] n
Dnotify support (DNOTIFY) [Y/n/?] y
Inotify support for userspace (INOTIFY_USER) [Y/n/?] y
Filesystem wide access notification (FANOTIFY) [Y/n/?] y
  fanotify permissions checking (FANOTIFY_ACCESS_PERMISSIONS) [Y/n/?] y
Quota support (QUOTA) [N/y/?] n
Kernel automounter version 4 support (also supports v3) (AUTOFS4_FS) [N/m/y/?] n
FUSE (Filesystem in Userspace) support (FUSE_FS) [Y/n/m/?] y
  Character device in Userspace support (CUSE) [Y/n/m/?] y
Overlay filesystem support (OVERLAY_FS) [N/m/y/?] (NEW) 

Seria útil se eu pudesse detectar isso programaticamente para sinalizar uma notificação na minha linha de modo. Alguma idéia de como eu poderia detectar isso?

stsquad
fonte

Respostas:

6

O Emacs não pode detectar por que um processo filho está aguardando. Pode esperar, porque ele está chamando read()on stdin, mas poderia muito bem apenas realizar um cálculo caro, enquanto otimização de código C.

No entanto, o que você pode detectar é se o processo de compilação gravou um prompt. O Modo de Compilação é executado compilation-filter-hooksempre que ele inseriu a saída do processo de compilação no buffer de compilação. Você é livre para adicionar suas próprias funções a ele.

Por exemplo, você pode escrever uma função que procure um prompt específico na saída e emita um aviso:

(defun my-compilation-mode-warn-about-prompt ()
  (save-excursion
    (let ((re '(rx "[" (one-or-more (any "n" "N" "m" "M" "Y" "y") "/") "?]"
                   (optional " (NEW)") (zero-or-more whitespace) buffer-end)))
      (when (re-search-backward re nil 'no-error)
        (lwarn 'emacs :warning "Compilation process in %s seems stalled!"
               (buffer-name))))))

(add-hook 'compilation-filter-hook
          #'my-compilation-mode-warn-about-prompt)

Isso exibirá um buffer de aviso sempre que o processo de compilação imprimir um prompt no final do buffer. O prompt é reconhecido procurando variações da [Y/n/?]peça. Eu uso rxpara escrever uma expressão regular legível.

Isso deve lidar com o caso em que o processo de compilação imprime um prompt e aguarda a entrada. Nesse caso, o prompt será o último texto inserido no buffer.

Pode causar alguns falsos positivos (não tentei), mas como é apenas um aviso, eles devem ser toleráveis.

lunaryorn
fonte
Adicionei um exemplo de saída à minha pergunta.
Stsquad
@stsquad Atualizei minha resposta de acordo. Espero que ajude.
lunaryorn
Eu acho que você pode ter uma cinta desequilibrada lá.
Stsquad
@stsquad Oh, desculpe, parece que não conseguiu passar pelo canal de cópia em massa. Fixo.
lunaryorn