Làm cách nào tôi có thể phát hiện chế độ biên dịch đang chờ đầu vào


8

Điều này thường làm tôi vấp ngã khi xây dựng các nhân Linux. Tôi sẽ đá một biên dịch và sau một thời gian tôi nhận ra nó chưa hoàn thành. Điều thường xảy ra là do cấu hình mặc định đã thay đổi, nó đang chờ người dùng nhập vào trong cửa sổ biên dịch. Ví dụ, tôi thấy cửa sổ biên dịch bị đình trệ như sau:

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

Sẽ rất hữu ích nếu tôi có thể phát hiện điều này theo chương trình để tôi có thể gắn cờ thông báo trong dòng chế độ của mình. Bất cứ ý tưởng làm thế nào tôi có thể phát hiện ra điều này?

Câu trả lời:


6

Emacs không thể phát hiện lý do tại sao một quá trình con đang chờ đợi. Nó có thể chờ đợi vì nó đang kêu gọi read()trên stdin, nhưng nó có thể cũng giống như cũng chỉ cần thực hiện một tính toán đắt tiền trong khi tối ưu hóa mã C.

Tuy nhiên, những gì bạn có thể phát hiện là liệu quá trình biên dịch có viết lời nhắc hay không. Chế độ biên dịch chạy compilation-filter-hookbất cứ khi nào nó đã chèn đầu ra từ quá trình biên dịch vào bộ đệm biên dịch. Bạn có thể tự do thêm các chức năng của riêng bạn vào nó.

Chẳng hạn, bạn có thể viết một hàm tìm kiếm một dấu nhắc cụ thể trong đầu ra và phát ra cảnh báo:

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

Điều này sẽ bật lên một bộ đệm cảnh báo bất cứ khi nào quá trình biên dịch in một dấu nhắc ở cuối bộ đệm. Lời nhắc được nhận ra bằng cách tìm kiếm các biến thể của [Y/n/?]phần. Tôi sử dụng rxđể viết một biểu thức chính quy có thể đọc được.

Điều này sẽ xử lý trường hợp trong đó quá trình biên dịch in một dấu nhắc và sau đó chờ nhập. Trong trường hợp này, lời nhắc sẽ là văn bản cuối cùng được chèn vào bộ đệm.

Nó có thể gây ra một số lỗi tích cực (tôi đã không thử), nhưng vì đó chỉ là một cảnh báo, nên những điều này có thể chấp nhận được.


Tôi đã thêm một ví dụ đầu ra cho câu hỏi của tôi.
stsquad

@stsquad Tôi cập nhật câu trả lời của tôi cho phù hợp. Tôi hy vọng nó sẽ giúp.
lunaryorn

Tôi nghĩ rằng bạn có thể có một cú đúp không cân bằng ở đó.
stsquad

@stsquad Ồ, xin lỗi, có vẻ như nó đã không được thực hiện thông qua kênh sao chép. Đã sửa.
lunaryorn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.