Wie kann ich erkennen, dass der Kompilierungsmodus auf Eingabe wartet?

8

Dies stört mich oft beim Erstellen von Linux-Kerneln. Ich werde eine Kompilierung starten und nach einer Weile merke ich, dass sie noch nicht fertig ist. Was normalerweise passiert ist, ist, dass die Standardkonfiguration geändert wurde und auf Benutzereingaben im Kompilierungsfenster wartet. Zum Beispiel finde ich das Kompilierungsfenster wie folgt blockiert:

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

Es wäre nützlich, wenn ich dies programmgesteuert erkennen könnte, um eine Benachrichtigung in meiner Moduszeile zu kennzeichnen. Irgendeine Idee, wie ich das erkennen könnte?

stsquad
quelle

Antworten:

6

Emacs kann nicht erkennen, warum ein untergeordneter Prozess wartet. Es könnte warten , weil es ruft read()auf stdin, aber es könnte genauso gut nur eine teure Berechnung durchführt , während C - Code zu optimieren.

Sie können jedoch feststellen, ob der Kompilierungsprozess eine Eingabeaufforderung geschrieben hat. Der Kompilierungsmodus wird compilation-filter-hookimmer dann ausgeführt, wenn die Ausgabe des Kompilierungsprozesses in den Kompilierungspuffer eingefügt wurde. Sie können Ihre eigenen Funktionen hinzufügen.

Sie können beispielsweise eine Funktion schreiben, die in der Ausgabe nach einer bestimmten Eingabeaufforderung sucht und eine Warnung ausgibt:

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

Dadurch wird ein Warnpuffer angezeigt, wenn der Kompilierungsprozess am Ende des Puffers eine Eingabeaufforderung druckt. Die Eingabeaufforderung wird erkannt, indem nach Variationen des [Y/n/?]Teils gesucht wird . Ich rxschreibe einen lesbaren regulären Ausdruck.

Dies sollte den Fall behandeln, in dem der Kompilierungsprozess eine Eingabeaufforderung druckt und dann auf die Eingabe wartet. In diesem Fall ist die Eingabeaufforderung der letzte in den Puffer eingefügte Text.

Es könnte einige Fehlalarme verursachen (ich habe es nicht versucht), aber da es nur eine Warnung ist, sollten diese tolerierbar sein.

Mondhorn
quelle
Ich habe meiner Frage eine Beispielausgabe hinzugefügt.
stsquad
@stsquad Ich habe meine Antwort entsprechend aktualisiert. Ich hoffe, es hilft.
Mondhorn
Ich denke, Sie haben dort möglicherweise eine unausgeglichene Zahnspange.
stsquad
@stsquad Oh, sorry, scheint es nicht durch den Copy-Pasta-Kanal geschafft zu haben. Fest.
Mondhorn