zoukankan      html  css  js  c++  java
  • Makefile debug的经验

    1. 使用warning指令

    warning 是个不错的命令,可以打印出消息,来判断makefile执行的流程

     

     

    如 , 这是一个普通的编译kernel module的Makefile,但是我忘记这个文件的执行顺序了。

     

    # If KERNELRELEASE is defined, we've been invoked from the
    # kernel build system and can use its language.

    #CROSS_COMPILE = /opt/toolchains/uclibc-crosstools-gcc-4.2.3-3/usr/bin/mips-linux-uclibc-
    #export CROSS_COMPILE

    ifneq ($(KERNELRELEASE),)
    $(warning A top-level warning)
        obj-m := hello_world.o
    #   hello_world-objs := 
    # Otherwise we were called directly from the command
    # line; invoke the kernel build system.
    else
    $(warning A Bottom-level waring)
        KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    #KERNELDIR ?= /home/wyang2/WFG500N/bcm963xx/kernel/linux
        PWD := $(shell pwd)
    default:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
    endif

     

     

     

    执行的结果是,这样我就发现,实际上时先执行下面那一段,然后再执行上面一段的 。

     

    $make
    Makefile:14: A Bottom-level waring
    make -C /lib/modules/2.6.23.1-42.fc8/build M=/home/wyang2/test/kmodule modules
    make[1]: Entering directory `/usr/src/kernels/2.6.23.1-42.fc8-i686'
    /home/wyang2/test/kmodule/Makefile:8: A top-level warning
      Building modules, stage 2.
      MODPOST 1 modules
      LD [M]  /home/wyang2/test/kmodule/hello_world.ko
    make[1]: Leaving directory `/usr/src/kernels/2.6.23.1-42.fc8-i686'

     

     

    2.使用ifeq ifneq

    当makefile被多次调用到的时候,如果都输出warning,那么就显得输出内容太多,找不到到底是哪个了。

    使用ifeq/ifneq可以选择性输出,对大型的工程比较好用。

    ifeq ($(obj),arch/x86/boot)
        $(warning building the bzImage?)
    endif

     

    3. 输出隐藏的变量

    有时候我需要看看,这次make执行中到底定义了哪些变量,一个个打太麻烦,而且打出来的都是自己知道的。

    原帖在

    http://www.cmcrossroads.com/ask-mr-make/6521-dumping-every-makefile-variable

    .PHONY: printvars
    printvars:
        @$(foreach V,/
            $(sort $(.VARIABLES)), /
                $(if $(filter-out environment% default automatic, $(origin $V)),/
                    $(warning $V=$($V) ($(value $V)))/
                 ) /
          )/

    printvars1:
    #    echo $(.VARIABLES)
        @$(foreach V,/
            $(sort $(.VARIABLES)), $(warning $V=$($V) ($(value $V)) $(origin $V)) /
          )

     

    上面两个例子分别打印了,在文件中定义的,和所有的makefile变量。

     


    4。 使用-p选项

    使用-p选项可以输出规则和变量。

  • 相关阅读:
    泛型的运用
    LinkdList和ArrayList异同、实现自定义栈
    MD5文件去重
    mysql协议解析
    solrconfig.xml主要配置项
    自定义特性使用
    使用OWIN 为WebAPI 宿主 跨平台
    Web.config配置文件详解
    IIS 之 在IIS7、IIS7.5中应用程序池最优配置方案
    GitHub 创建工程
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318886.html
Copyright © 2011-2022 走看看