2

Makefile の 235 行目にエラーがあるというエラーが発生しました。

make[4]: Leaving directory `/opt/home/root/native-upstream/native_client/tools/SRC/glibc/wctype'
make  subdir=manual -C manual ..=../ subdir_lib
make[4]: Entering directory `/opt/home/root/native-upstream/native_client/tools/SRC/glibc/manual'
Makefile:235: *** mixed implicit and normal rules.  Stop.
make[4]: Leaving directory `/opt/home/root/native-upstream/native_client/tools/SRC/glibc/manual'
make[3]: *** [manual/subdir_lib] Error 2
make[3]: Leaving directory `/opt/home/root/native-upstream/native_client/tools/SRC/glibc'
make[2]: *** [all] Error 2
make[2]: Leaving directory `/opt/home/root/native-upstream/native_client/tools/BUILD/build-glibc32'
make[1]: *** [BUILD/stamp-glibc32] Error 2
make[1]: Leaving directory `/opt/home/root/native-upstream/native_client/tools'
make: *** [build-with-glibc] Error 2

しかし、どの Makefile にこのエラーがあるのか​​わかりません。私のプロジェクトにはたくさんの Makefile があります。

#  find . -name Makefile
./tools/Makefile
./tools/BUILD/.gcc-extra-build-cloog-ppl/doc/Makefile
./tools/BUILD/.gcc-extra-build-cloog-ppl/Makefile
./tools/BUILD/.gcc-extra-build-cloog-ppl/test/Makefile
./tools/BUILD/.gcc-extra-build-gmp/printf/Makefile
./tools/BUILD/.gcc-extra-build-gmp/doc/Makefile
./tools/BUILD/.gcc-extra-build-gmp/tests/Makefile
./tools/BUILD/.gcc-extra-build-gmp/tests/devel/Makefile
...

したがって、各 Makefile の 235 行目を出力して、誰が犯人かを調べたいと思います。たとえば、次のようになります。

./tools/Makefile: 235: $(objpfx)c++-types-check.out: $(check-data) scripts/check-c++-types.sh
./tools/BUILD/.gcc-extra-build-cloog-ppl/doc/Makefile: 235: ifneq (,$(check-data))
./tools/BUILD/.gcc-extra-build-cloog-ppl/Makefile: 235: $(objpfx)c++-types-check.out:
./tools/BUILD/.gcc-extra-build-cloog-ppl/test/Makefile: 235: endif
./tools/BUILD/.gcc-extra-build-gmp/printf/Makefile: 235:
./tools/BUILD/.gcc-extra-build-gmp/doc/Makefile: 235:
./tools/BUILD/.gcc-extra-build-gmp/tests/Makefile: 235: #   Master Makefile for the GNU C library
./tools/BUILD/.gcc-extra-build-gmp/tests/devel/Makefile: 235:

これを行う方法はありますか?

4

3 に答える 3

3

/opt/home/root/native-upstream/native_client/tools/SRC/glibc/manual/Makefileエラーの直前の行がそのディレクトリに入っていることを示していることを考えると、問題は にあるようです:

make[4]: Entering directory `/opt/home/root/native-upstream/native_client/tools/SRC/glibc/manual'
Makefile:235: *** mixed implicit and normal rules.  Stop.

とはいえ、各 Makefile の 235 行目を見つける方法はいくつかあります。人々はすでに awk および sed ソリューションを指摘しています。ファイル名も必要な場合は、すばやく簡単な解決策として次を使用しますgrep

find . -name Makefile -print0 | xargs -0 grep -nH $ | grep :235:

find コマンドは、Makefile という名前のすべてのファイルを検索し、ヌル区切りで出力します (名前にスペースが含まれるファイルがある場合に問題が発生しないようにするため)。xargsこれらのファイル名を に渡しますgrepgrep -nH一致するすべての行のファイル名と行番号を出力します。これ$は、パターンがすべての行に一致することを保証するためです (各行の終わりに一致します)。次に、探している行番号をその中でgrepします。

完璧ではありません。たまたま「:235:」を含む行が数行見つかるかもしれませんが、簡単な 1 回限りの場合には問題ないはずです (本当に気にするなら、`grep '^[^:]*:235: を使用できます)。 ' 行番号のみが一致することを確認します)。

于 2012-12-20T04:25:52.603 に答える
1

findとを使用したソリューションを次に示します。awk

find -type f -name "Makefile" -exec awk 'FNR==235 {print FILENAME; print}' {} +

これは以下を出力します:

  • メイクファイル名
  • その Makefile の 235 行目

説明:

  • find -type f -name "Makefile"- 現在の作業ディレクトリから名前が付けられたすべてのファイルを再帰的に検索しますMakefile
  • -exec awk 'FNR==235 {print FILENAME; print}' {} +- 見つかったそのようなファイルごとに、 を使用awkしてその名前を出力し、次にその内容を 235 行目に出力します。
于 2012-12-20T04:21:57.417 に答える
1

最も簡単な方法は次のようになると思います

sed -n '235p' *

これにより、現在のディレクトリ内のすべてのファイルの 235 行目が出力されます。ディレクトリを再帰するか、特定のファイルを除外する場合は、より明示的なグロブを使用するかfind-exec.

したがって、最終的には、おそらく次のようになります。

find . -type f -name Makefile -print -exec sed -n '235p' {} \;
于 2012-12-20T03:54:00.457 に答える