Chinaunix首页 | 论坛 | 博客
  • 博客访问: 437690
  • 博文数量: 71
  • 博客积分: 26
  • 博客等级: 民兵
  • 技术积分: 1246
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-23 14:46
个人简介

linux --- 一切皆文件

文章分类

全部博文(71)

文章存档

2021年(1)

2019年(2)

2018年(4)

2017年(7)

2016年(11)

2015年(1)

2014年(2)

2013年(33)

2012年(10)

分类: LINUX

2016-02-26 00:09:23

1: shell命令行必须以[TAB]开头,默认使用shell版本为/bin/sh,即环境变量中SHELL变量指定的程序。使用#进行注释。

2: 通过@来关闭命令回显,只显示执行的结果。
Example:
foo.o:foo.c
    echo "$@"

Output:
    echo foo.o
    foo.o

Example1:
foo.o:foo.c
    @echo "$@"

Output:
    foo.o

3: make -n 或者 --just-print参数,只会打印执行的命令,不去执行,包括被@修饰的命令。有助于makefile排错。

4: make -s 或者 --slient, 禁止所有执行命令显示,就相当于在所有命令前加上@。但是-s没有@灵活,建议使用@来控制命令回显。

5: makefile中的每行的命令是起用单独的shell进程执行的,所以上一行的结果不会影响到下一行,比如

foo.o:foo.c
    cd /tmp
    touch test.txt

以上makefile,cd和touch这两个命令是在不同的shell中执行的,所以test.txt并没有创建在/tmp中。

如果要让多条shell命令产生关联,则需要写在同一行,即使要写在多行,最后需要用\来多行命令进行连接,\后面不可有空格,tab等字符。

foo.o:foo.c
    cd /tmp;    \
    touch test.txt

foo.o:foo.c
    cd /tmp; touch test.txt

6: make -j 或者--job 同一时刻允许多条命令执行,也就是起多个子进程进行执行make命令。
    make -j 3     #同时起三个进程进行make

    当有个命令执行失败时,其他的所有进程都会失败。选用-k 或者 --keep-going,其他进程都会继续执行。
    可通过-l 或者 --max-load来设置超过预定的负载时,不起用多进程。
    make -j 3 -l 2.5   # 当系统负载超过2.5时,不启用多进程make

7: '-',可以忽略shell执行的失败,而不退出make执行。
clean:
    -rm -rf *.o        #当shell命令执行错误时,忽略错误

8: make -k 或 --keep-going,在工程中,如果命令执行错误,还会继续执行,直到最后连接失败。
    这样可以在多个文件同时修改时,可以一次直到那些文件编译成功,那些编译失败。

9: make递归执行,在存在多级子目录的项目中很有用。通过-C参数,执行子目录下的makefile。
    make -C xx/            #执行xx目录下的makefile

10: make通过CURDIR来获取当前的工作目录。当make在子目录下执行时,CURDIR将会被重新赋值。

11: 使用MAKE变量替换make命令,通过$(MAKE)引用变量的值,当make版本发生改变时,不需要大面积需改,只需修改MAKE变量即可。

12: make -t 只更新目标的时间戳,不执行命令
     make -n 只打印命令,不执行命令
     make -q 只检查目标是否过期,过期则返回1,没过期则返回0.
     make的参数可以放在MAKEFLAGS,这个参数会传递给下一个子目录的程序中

13:
        1)需要将变量在所有makefile中被引用,则需要使用export修饰。没有export修饰的,只在本makefile中生效。
            export AAA = 100            #那么这个AAA在所有makefile中都可以被使用,其值为100
            也可使用 make -e AAA = 100
       
        2)可以使用unexport参数来使得export参数失效。
                unexport AAA
    
        3)MAKEFILES这个变量默认传递到所有makefile中,除非特意unexport

Example: 
        export CFLAGS += -g
        等价于
        CFLAGS += -g
        export CFLAGS

14: MAKELEVEL    表示当前makefile的深度。主控的MAKELEVEL为0
    ifeq($(MAKELEVEL), 0)
        all : msg
    else
        all : other
    endif

15: make -w 或者 --print-drectory,来打印进入和离开目录的信息(执行cd或者-C,目录切换的信息)
      make --no-print-directory ,禁止打印目录相关信息
    
16: 定义命令包,通过引用命令包,执行多个命令。

    define mycmd
        @echo "xxxx $<"
        @echo "yyyy $@"
        @-rm -rf a.txt
    endef

    foo.o:foo.c
        @$(mycmd)


阅读(1893) | 评论(0) | 转发(0) |
0

上一篇:Makefile 规则(四)

下一篇:Makefile 变量(六)

给主人留下些什么吧!~~