2

Linux カーネル ソース ツリーのファイルに書き込み中にエラー注釈を表示するように flycheck または flymake を設定する簡単で自動化された方法はありますか? fs/proc/cmdline.c で作業していると仮定すると、flycheck で 2 つのディレクトリに移動して「make fs/proc/cmdline.o」を実行し、結果に注釈を付けます。ARCH と CROSS_COMPILE が外部で設定されていると仮定します。

4

3 に答える 3

3

私はこれを自分でやろうと考えていました-これが私が持っているものです:

カーネル ソース ツリーのベースを見つける必要があるため、探すというデフォルトのflymake取引はMakefile非生産的です。ソースベースの場所を特定し、通常のカーネル makefile をラップするために倍増する独自のファイルを追加します。

カーネル ソース ツリーのベースにファイルを追加しますflymake.mk(独自のクロス コンパイルのニーズに合わせて構成します)。

ARCH=mips
CROSS_COMPILE=mips-linux-gnu-

export ARCH
export CROSS_COMPILE

.PHONY: check-syntax
check-syntax:
    make -f Makefile $(patsubst %_flymake.o,%.o,$(patsubst %.c,%.o,$(CHK_SOURCES)))

要点は、「_flymake.c」を取り除き、実際のファイルのみをコンパイルし、構文だけではなく、実際のファイルをビルドすることです。これにより、誤って作成することを回避できますfile_flymake.o

flymake がそれを探してflymake.mk実行するように説得する必要がありますcheck-syntax- これらを .emacs に追加してください:

;; Build a custom command-line using flymake.mk
(defun flymake-get-kernel-make-cmdline (source base-dir)
  (list "make"
    (list "-s"
              "-f"
              "flymake.mk"
          "-C"
          base-dir
          (concat "CHK_SOURCES=" source)
          "SYNTAX_CHECK_MODE=1"
          "check-syntax")))

;; Search for flymake.mk to locate kernel tree base
(defun flymake-kernel-make-init ()
  (flymake-simple-make-init-impl 'flymake-create-temp-inplace t t "flymake.mk" 'flymake-get-kernel-make-cmdline))

;; Register against .c files under /linux/ or /kernel/
;; Since the list is parsed in order use `push`
(push '(".+/\\(linux\\|kernel\\)/.+\\.c$" flymake-kernel-make-init) flymake-allowed-file-name-masks)

制限:

  • ヘッダー ファイルを解析できません
  • flymake 一時ファイルを解析できませんsource_flymake.c(保存されたファイルを超えるまで flymake マークアップを無視してください)。flymake を強制的に再実行するキーストロークがあります。
  • 外部モジュールでの flymake のサポートなし
  • path-matcher の事前登録が必要です (push上記の行を参照) - flymake について、1 つのバッファを 1 回限りで上書きできるようにするのに十分な知識がありません。

ヘッダー、一時、および外部モジュールの制限は、カーネルの Makefile 自体にパッチを適用することで克服できますが、現時点では回避したいと考えていました。

于 2015-04-20T12:51:38.443 に答える