Bagaimana saya bisa mendeteksi mode kompilasi sedang menunggu input

8

Ini sering membuat saya tersandung ketika membangun kernel Linux. Saya akan menendang kompilasi dan setelah beberapa saat saya menyadari itu belum selesai. Apa yang biasanya terjadi adalah karena konfigurasi default telah berubah itu menunggu input pengguna di jendela kompilasi. Sebagai contoh saya menemukan jendela kompilasi terhenti pada hal berikut:

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

Akan bermanfaat jika saya dapat mendeteksi ini secara terprogram sehingga saya dapat menandai pemberitahuan di mode-line saya. Adakah yang tahu bagaimana saya bisa mendeteksi ini?

stsquad
sumber

Jawaban:

6

Emacs tidak dapat mendeteksi mengapa proses anak menunggu. Mungkin menunggu karena menyerukan read()pada stdin, tapi itu hanya mungkin juga hanya melakukan perhitungan mahal sementara mengoptimalkan kode C.

Namun, yang dapat Anda deteksi adalah apakah proses kompilasi telah menulis prompt. Mode Kompilasi berjalan compilation-filter-hooksetiap kali ia memasukkan output dari proses kompilasi ke dalam buffer kompilasi. Anda bebas menambahkan fungsi sendiri ke dalamnya.

Misalnya, Anda bisa menulis fungsi yang mencari prompt tertentu di output, dan memancarkan peringatan:

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

Ini akan memunculkan buffer peringatan setiap kali proses kompilasi mencetak prompt di akhir buffer. Prompt dikenali dengan mencari variasi [Y/n/?]bagian. Saya biasa rxmenulis ekspresi reguler yang bisa dibaca.

Ini harus menangani case di mana proses kompilasi mencetak prompt dan kemudian menunggu input. Dalam hal ini, prompt akan menjadi teks terakhir yang dimasukkan ke buffer.

Mungkin menyebabkan beberapa kesalahan positif (saya tidak mencoba), tetapi karena ini hanya peringatan, ini harus ditoleransi.

lunaryorn
sumber
Saya telah menambahkan contoh output ke pertanyaan saya.
stsquad
@stsquad saya memperbarui jawaban saya sesuai dengan itu. Saya harap ini membantu.
lunaryorn
Saya pikir Anda mungkin memiliki penyangga yang tidak seimbang di sana.
stsquad
@stsquad Oh, maaf, sepertinya tidak berhasil melalui saluran salin-pasta. Tetap.
lunaryorn