makefile

规则                                

目标targets: 依赖prerequisites

【TAB】 命令command                 #  注释行   命令行必需以[Tab]键开始 , 反斜线之后不能有空格 

         目标
               all: getPageInfo                             // 在Makefile中第一个目标是终极目标。
              .PHONY: all clean                          //  没有依赖的目标称为“伪目标”。避免当有一个“clean”文件时,目标“clean”所在规则的命令无法执行。
         命令

              cd xxx; command                         //  每行的命令在同一个shell环境中执行,命令用分号分隔 or  \

             -rm edit $(objects)                        //  在命令行之前使用“-”,意思是忽略命令“rm”的执行错误。

            @echo 'Building target: $@'       //  命令前面有 @ 的作用: 不回显此命令

         依赖
              如果出现“-lNAME”格式的依赖时,表示需要搜索的依赖文件名为“libNAME.so”和“libNAME.a”,这是由变量“.LIBPATTERNS”指定的。
自动环境变量
       “$@”  目标  ;   $<   依赖集 
       “$^”    代表所有通过目录搜索得到的依赖文件的完整路径名(目录 + 一般文件名)列表。 
       “$?”   在这里表示依赖文件列表中被改变过的所有文件。
                      gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"       

赋值符号
       “=”                    // 定义的变量称之为“递归展开”式变量,其值可以在后面定义 
         RM := rm -rf        // 直接展开式变量, 不能引用后面的定义
         FOO ?= bar       // 前面没有赋值,才赋值
         C_SRCS += ./src/main.c    // += 追加赋值

              AA = $(EE)      // 后面定义

              EE = ee

              BB := $(DD)    //  前面定义

              DD ?= ok             // AA is ee,  EE is ee, BB is null, DD is ok

在makefile外部传入参数

        make -f make_simple explain DD=outside    //    等号左后不能空格。BB is outside, DD is outside
模式字符%   : “%.h”表示所有以“.h”结尾的文件
转义字符
         $  转义 $$
         #  转义 \# 

可使用的通配符: *  ?  []
        1. 可在规则中直接使用
        2. 其他地方,通过wildcard使用:如变量定义, objects = $(wildcard *.o)

使用shell

       home      = $(shell pwd)    // 获得当前路径

特殊函数
         objects := $(patsubst %.c,%.o,$(wildcard *.c))
         foreach <var>, <list>, <do>
                files := $(foreach n,$(names),$(n).o)   // names := a b c d   ,    $(files)的值是“a.o b.o c.o d.o”
         call <express>, <param1>, <param2>
               foo = $(call reverse,a,b)   // reverse = $(1) $(2) ,   foo的值就是“a b”
         eval <express> 
              $(eval exe:b.c a.c)      // 按照make展开:   cc   b.c a.c -o exe

        $(notdir src/foo.c hacks)返回值是“foo.c hacks”
        $(basename src/foo.c src-1.0/bar.c hacks)返回值是“src/foo src-1.0/bar hacks”。
        $(addprefix src/,foo bar)返回值是“src/foo src/bar”。
        objects := $(wildcard *.o)  // 通配符,将展开;而 objects = *.o ,类似宏,不会展开
        patsubst <patten>, <replace>, <text>
               $(patsubst %.c,%.o, x.c.c bar.c)  // x.c.o bar.o
        subst <from>, <to>, <text>
              $(subst ee,EE,feet on the street)  // 返回结果是“fEEt on the strEEt”
        filter <patten>, <text>
              $(filter %.c %.s,$(sources))返回的值是“foo.c bar.c baz.s”。 // filter-out 反过滤,去掉符合patten的    

        OBJ=a.o b.o c.o d.o main.o
        define MA
        main:$(OBJ)
        gcc  -g -o main $$(OBJ)
        endef
        $(eval $(call MA) )

make CROSS_COMPILE=arm-none-linux-gnueabi-    ARCH=arm omap3_evm_config
         CROSS_COMPILE : 编译器所使用的交叉工具链的名称
         ARCH          : 目标处理器的架构

make -f   Makefile_simple

make -C ./test     // 进入test,执行子目录中的makefile

make -w    // 打印出进入的工作目录  

  make加上“-i”或是“--ignore-errors”参数,那么,Makefile中所有命令都会忽略错误
 make的参数的是“-k”或是“--keep-going”,这个参数的意思是,如果某规则中的命令出错了,那么就终目该规则的执行,但继续执行其它规则。
带入make参数“-n”或“--just-print”,那么其只是显示命令,但不会执行命令     

-include // sinclude

include foo.make *.mk $(bar)  // include foo.make a.mk b.mk c.mk e.mk f.mk

cd /home/hchen; pwd  // 分号 前后命令有依赖关系

  

gcc part......................

 cc -M main.c  // main.o : main.c defs.h 如果你使用GNU的C/C++编译器,你得用“-MM”参数,不然,“-M”参数会把一些标准库的头文件也包含进来
 gcc -MM main.c  // main.o: main.c defs.h

 

dump----------------

 root char *p = "welcome"; p[0] = 'W'; ok ? why // not ok, just not print "core dumped", but generate core file
  ding : can execute, printf "core dumped" ,but can't generate core file
  root: not printf, but have core file
   why sudo can't printf"core dumped"?
   in command line , why can't change much times?
 echo 1 > core_uses_pid

 

backtrace_symbols // gcc -g -rdynamic

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值