首页 > *nix技术, Shell命令 > 显示make编译信息

显示make编译信息

2012年4月18日 发表评论 阅读评论 7,323 次浏览

有时候我们想看每一个文件的编译选项,但是make时显示的却是这样的超简洁情况:

[root@localhost x86_64-softmmu]# make
  CC    arch_init.o
  CC    cpus.o
  GEN   hmp-commands.h
  GEN   qmp-commands-old.h
  CC    monitor.o
  CC    machine.o
  CC    gdbstub.o
  CC    balloon.o
  CC    ioport.o
  CC    pci.o
...

以上是编译qemu-kvm-1.0的显示,而另外最常见的就是在编译内核的时候也是如此:

[root@localhost linux-2.6.38.8]# make
  CHK     include/linux/version.h
  CHK     include/generated/utsrelease.h
  CC      kernel/bounds.s
  GEN     include/generated/bounds.h
  CC      arch/x86/kernel/asm-offsets.s
  GEN     include/generated/asm-offsets.h
  CALL    scripts/checksyscalls.sh
  CC      scripts/mod/empty.o
  MKELF   scripts/mod/elfconfig.h
  HOSTCC  scripts/mod/file2alias.o
...

这并没有什么不好,只是偶尔会不太方便,比如想查看当前确实是否已使用的某个编译选项(例如:加上-g了么?),要看到更细节的编译选项并不难,只要知道怎样显示如此简洁的信息,那么反其道而行之即可。根据官方手册:http://www.gnu.org/software/make/manual/make.html#Echoing可以看到通过抑制符@或-s、–silent旗标或.SILENT伪目标可阻止信息输出,所以一般检查makefile文件里是否有类似的设定即可。比如内核的Makefile文件:/usr/src/linux-2.6.38.8/Makefile,把其中的quiet等相关全部注释掉,再make时,世界就没那么清净了。

...
ifeq ($(KBUILD_VERBOSE),1)
#  quiet =
#  Q =
else
#  quiet=quiet_
#  Q = @
endif

# If the user is running make -s (silent mode), suppress echoing of
# commands

ifneq ($(findstring s,$(MAKEFLAGS)),)
#  quiet=silent_
endif

#export quiet Q KBUILD_VERBOSE
...
[root@localhost linux-2.6.38.8]# make
rm -f include/config/kernel.release
echo "2.6.38.8$(/bin/sh /usr/src/linux-2.6.38.8/scripts/setlocalversion /usr/src/linux-2.6.38.8)" > include/config/kernel.release
set -e; : '  CHK     include/linux/version.h'; mkdir -p include/linux/; 	(echo \#define LINUX_VERSION_CODE 132646; echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))';) < /usr/src/linux-2.6.38.8/Makefile > include/linux/version.h.tmp; if [ -r include/linux/version.h ] && cmp -s include/linux/version.h include/linux/version.h.tmp; then rm -f include/linux/version.h.tmp; else : '  UPD     include/linux/version.h'; mv -f include/linux/version.h.tmp include/linux/version.h; fi
set -e; : '  CHK     include/generated/utsrelease.h'; mkdir -p include/generated/; 	if [ `echo -n "2.6.38.8" | wc -c ` -gt 64 ]; then echo '"2.6.38.8" exceeds 64 characters' >&2; exit 1; fi; (echo \#define UTS_RELEASE \"2.6.38.8\";) < include/config/kernel.release > include/generated/utsrelease.h.tmp; if [ -r include/generated/utsrelease.h ] && cmp -s include/generated/utsrelease.h include/generated/utsrelease.h.tmp; then rm -f include/generated/utsrelease.h.tmp; else : '  UPD     include/generated/utsrelease.h'; mv -f include/generated/utsrelease.h.tmp include/generated/utsrelease.h; fi
mkdir -p .tmp_versions ; rm -f .tmp_versions/*
...

对于qemu-kvm-1.0的makefile文件,其更直接弄了一个名为quiet-command的自定义变量,然后进行执行与显示替换,见文件rules.mak:

...
%.o: %.c
	$(call quiet-command,$(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) -c -o $@ $<,"  CC    $(TARGET_DIR)$@")
...
quiet-command = $(if $(V),$1,$(if $(2),@echo $2 && $1, @$1))
...

总之,遇到这种情况,仔细搜索一下makefile文件吧。

转载请保留地址:http://www.lenky.info/archives/2012/04/1546http://lenky.info/?p=1546


备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。

法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以Email或书面等方式告知,本站将及时删除相关内容或链接。

分类: *nix技术, Shell命令 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.