1-1-3 Makefile工程管理初探

1.  makefile的用途:用来描述程序编译、链接的规则,使程序编译自动化

2.  makefile的构成:规则、变量

3.  makefile的执行:执行make 或者 make clean等命令。

4.  格式为:/* 注意空格,“|”表示行首,“<tab>”表示table键 */

        |targets : prerequisites
        |<tab>command

    例如:

        |all: led.o
        |    arm-linux-ld -Tled.lds -o led.elf led.o
        |    arm-linux-objcopy -O binary led.elf led.bin
        |led.o: led.S
        |    arm-linux-gcc -g -c led.o led.S
        |.PHONY: clean
        |clean:
        |    rm -f *.o *.elf *.bin

5.  变量

 5.1 各种定义

   variable = value

   variable := value

   variable += value


    直接可以使用的系统变量包括:

        $^:所依赖的文件    $@:目标    $<:第一个依赖的文件

    用法举例:

        /* 使用前 */
        |app1 : app1.o func1.o func2.o
        |    gcc app1.o func1.o func2.o -o app1
        |app2 : app2.o func1.o func2.o
        |    gcc app2.o func1.o func2.o -o app2
        /* 使用后 */
        |obj=func1.o func2.o
        |app1 : app1.o $(obj)
        |    gcc app1.o $(obj) -o app1
        |    gcc app2.o $(obj) -o app2

6.  通用规则

        /* 把目录中所有的.S文件汇编成.o文件 */

        |%.o : %.S
        |    gcc -g -c %^

7.  使用注意事项

    1.1  同时存在 makefile 和 Makefile 两个文件,执行make,系统会先执行makefile,如果makefile不存在时,才会去执行Makefile

    1.2  去回显功能:在command前加上“@”,如:

        |hello : hello.c
        |    @gcc hello.c -o helle

        当然,也可以在make的时候加入[-s]选项,禁止make的一切输出信息  

    1.3  如果makefile更名未file,要make的时候,可加上[-f]选项指定makefile的替代文件,如:

        make -f file
        make -f file clean
8.  某些makefile的实验
  8.1
object_file : test.c
	gcc -c test.c
输出test.o
object_file : test.c
	gcc -c test.c -o obj.o
指明目标名称,输出obj.o
object_file : test.c
	gcc -c $^ -o $@
用$@指明目标文件的名称是规则中的目标文件object_file
  8.2
object_file : test.c 
gcc $^ -o $@
上面的test.c如果include了头文件,而头文件发生了变化,再make是不会成功的,必须要把头文件添加到依赖中,例如:
object_file : test.c no.h
gcc $^ -o $@
这样一旦no.h变化了,no.h的更新时间比object_file要新,就能make了
  8.3
关于“\”换行符,不能插在单词的中间,只能在某单词其后,例如
object_file : test.c \
no.h
gcc $^ \
-o $@
  8.4
对于在不同文件夹里面的源文件,例如include里的.h,source里的.c,进行编译的时候,makefile可以这么写:
vpath %.h include
vpath %.c source
又或者
VPATH = include:source
当然,由于.h在include里,所以位于source里的.c应该是#include "../include/no.h"这样。
  8.5
对于命令:
        在命令前输入“-”,即使操作失败,make会继续往下执行,例如要删除的文件不存在,或者要创建的目录已经存在了,等等的问题,如果不加“-”,make就会自动终止执行过程。
clean :
-rm *.o
        执行多条命令的时候,如果下一条命令依赖于上一条命令,两条命令不能分两行写,而是应该写在同一行,并以“;”隔开。
exec :
        cd /etc;pwd



  8.6  关于进入下级目录进行make 和 make clean
上级的Makefile
<span style="font-size:18px;">.PHONY: all clean
all :
	$(MAKE) -C source_1
	$(MAKE) -C source_2
clean :
	$(MAKE) clean -C source_1
	$(MAKE) clean -C source_2</span>

下级目录的source_1中的Makefile
<span style="font-size:18px;">test : test.c
	gcc $^ -o $@
.PHONY: clean
clean :
	-rm test</span>

下级目录的source_2和上面的一样,在上级执行make 或者 make all,能在source_1和source_2中编译出各自的test可执行文件,而在上级目录中执行make clean,则进入两目录中删除目录中的test文件。

8.7  关于条件判定表达式的注意点
    1.ifeq、else以及endif必须顶格,若不顶格,例如前面插了个tab,就会出现以下报错:
        /bin/sh: 1: Syntax error: word unexpected (expecting ")")
    2.在ifeq和括号之间,必须加空格
    3.中间执行的命令必须以<tab>开头(当然,所有在makefile中的命令前都是tab开头的)
    4.最后以endif结束 
    如:
<span style="font-size:18px;">ifeq ($(var_1),$(var_2))
	@echo var_1 = var_2
endif</span>
















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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值