Come posso rilevare la modalità compilation è in attesa di input


8

Questo mi fa spesso inciampare quando costruisco kernel Linux. Darò un calcio di compilazione e dopo un po 'mi rendo conto che non è completato. Ciò che accade di solito è perché la configurazione predefinita è cambiata in attesa di input dell'utente nella finestra della compilation. Ad esempio trovo la finestra della compilation bloccata su quanto segue:

-*- 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) 

Sarebbe utile se potessi rilevarlo a livello di codice in modo da poter contrassegnare una notifica nella mia linea di modalità. Hai idea di come potrei rilevarlo?

Risposte:


6

Emacs non è in grado di rilevare perché un processo figlio è in attesa. Potrebbe aspettare perché sta chiamando read()su stdin, ma potrebbe altrettanto bene solo eseguire un calcolo costoso, mentre l'ottimizzazione del codice C.

Tuttavia, ciò che è possibile rilevare è se il processo di compilazione ha scritto un prompt. La modalità compilazione viene eseguita compilation-filter-hookogni volta che ha inserito l'output del processo di compilazione nel buffer di compilazione. Sei libero di aggiungere le tue funzioni.

Ad esempio, è possibile scrivere una funzione che cerca un determinato prompt nell'output ed emette un avviso:

(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)

Questo farà apparire un buffer di avviso ogni volta che il processo di compilazione stampa un prompt alla fine del buffer. Il prompt viene riconosciuto cercando le variazioni della [Y/n/?]parte. Uso rxper scrivere un'espressione regolare leggibile.

Questo dovrebbe gestire il caso in cui il processo di compilazione stampa un prompt e quindi attende l'input. In questo caso, il prompt sarà l'ultimo testo inserito nel buffer.

Potrebbe causare alcuni falsi positivi (non ho provato), ma poiché è solo un avvertimento, questi dovrebbero essere tollerabili.


Ho aggiunto un output di esempio alla mia domanda.
stsquad,

@stsquad Ho aggiornato la mia risposta di conseguenza. Spero possa essere d'aiuto.

Penso che potresti avere un tutore sbilanciato lì.
stsquad,

@stsquad Oh, scusa, sembra che non sia riuscito a superare il canale di pasta-copia. Fisso.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.