コンパイルモードが入力を待っていることをどのように検出できますか


8

これは、Linuxカーネルを構築するときに、しばしばつまずきます。コンパイルを開始しますが、しばらくすると、完了していないことに気付きます。通常、デフォルトの設定が変更されたため、コンパイルウィンドウでのユーザー入力を待機しています。たとえば、コンパイルウィンドウが次のように停止しているのがわかります。

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

これをプログラムで検出して、モードラインで通知にフラグを付けることができると便利です。これをどのように検出できるか考えていますか?

回答:


6

Emacsは子プロセスが待機している理由を検出できません。を呼び出しread()ているため待機stdinする可能性がありますが、Cコードを最適化しながら、高価な計算を実行するだけの場合もあります。

ただし、検出できるのは、コンパイルプロセスがプロンプトを書き込んだかどうかです。コンパイルモードはcompilation-filter-hook、コンパイルプロセスからの出力をコンパイルバッファに挿入すると実行されます。独自の関数を自由に追加できます。

たとえば、出力で特定のプロンプトを検索して警告を発する関数を作成できます。

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

これにより、コンパイルプロセスがバッファーの最後にプロンプ​​トを出力するたびに警告バッファーがポップアップします。プロンプトは、[Y/n/?]パーツのバリエーションを探すことで認識されます。私rxは読みやすい正規表現を書くのに使っています。

これは、コンパイルプロセスがプロンプトを出力し、入力を待機するケースを処理する必要があります。この場合、プロンプトはバッファに挿入された最後のテキストになります。

それはいくつかの誤検知を引き起こす可能性があります(私は試しませんでした)が、それは単なる警告であるため、許容できるはずです。


質問に出力例を追加しました。
stsquad 2014年

@stsquad私はそれに応じて私の答えを更新しました。お役に立てば幸いです。
lunaryorn 2014年

そこにはアンバランスなブレースがあるかもしれません。
stsquad 2014年

@stsquadああ、申し訳ありませんが、コピーパスタチャネルを通過できなかったようです。修繕。
lunaryorn 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.