我遇到一个错误,说我的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:
有没有办法做到这一点?
答案 0 :(得分: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的所有文件,将它们打印出以null分隔(如果名称中有空格的文件,则不会出现问题)。 xargs
将这些文件名传递给grep
。 grep -nH
打印每个匹配行的文件名和行号; $
作为模式确保每一行匹配(它匹配每行的结尾)。然后你在那里寻找你正在寻找的行号。
它并不完美;你可能会发现其中有几行恰好包含“:235:”,但它应该可以快速一次性使用(如果你真的在乎,可以使用`grep'^ [^:] *:235: '以确保您只匹配行号。)
答案 1 :(得分:1)
我认为最直接的方式是
sed -n '235p' *
这将打印当前目录中所有文件的第235行。如果您想通过目录递归或排除某些文件,则必须使用更明确的glob或find
-exec
。
所以最后,你可能想要的是:
find . -type f -name Makefile -print -exec sed -n '235p' {} \;
答案 2 :(得分:1)
以下是find
和awk
find -type f -name "Makefile" -exec awk 'FNR==235 {print FILENAME; print}' {} +
打印:
<强>解释强>
find -type f -name "Makefile"
- 递归查找当前工作目录中名为Makefile
的所有文件-exec awk 'FNR==235 {print FILENAME; print}' {} +
- 对于找到的每个此类文件,请使用awk
打印其名称,然后使用第235行的内容。