U-Boot中Makefile的学习

U-Boot中Makefile的学习给了我很大的启发。它让我深刻地体会到了make工具对大的工程和项目的完美控制。我觉得自己真的已经爱上了Makefile。
这里还是以一个简单的“hello,world”程序为例,来诠释一下我所体会到的Makefile的强大之初。
现在来看一下我对这个简单程序所创建的文件夹和总控Makefile文件:


lanpeng@lanpeng-laptop:~/hello$ ls -l

总用量 24
drwxr-xr-x 2 lanpeng lanpeng 4096 2010-04-17 20:06 bye
-rw-r--r-- 1 lanpeng lanpeng  199 2010-04-17 19:48 config.mk
drwxr-xr-x 2 lanpeng lanpeng 4096 2010-04-17 20:06 hello
drwxr-xr-x 2 lanpeng lanpeng 4096 2010-04-17 19:43 include
drwxr-xr-x 2 lanpeng lanpeng 4096 2010-04-17 20:06 main
-rw-r--r-- 1 lanpeng lanpeng  911 2010-04-17 20:05 Makefile



lanpeng@lanpeng-laptop:~/hello$ vim config.mk

#编译器的定义
COMPILE :=
CC     := $(COMPILE)gcc
CFLAGS     := -Wall -O2 -g
CFLAGS    += -I$(TOPDIR)/include

export COMPILE CC CFLAGS


#编译规则的定义
%.o : %.c
    $(CC) $(CFLAGS) -c -o $@ $<


lanpeng@lanpeng-laptop:~/hello$ vim Makefile

TOPDIR := $(shell pwd)
export TOPDIR
#####################################################################################################

include $(TOPDIR)/config.mk

########################################################################################################
OBJS := $(addprefix main/, main.o)
OBJS += $(addprefix hello/, hello.o world.o)
OBJS += $(addprefix bye/, bye.o)
#以上结果为 OBJS = main/main.o hello/hello.o hello/world.o bye/bye.o
##########################################################################################################

ALL := myhello

all: $(ALL)
myhello:$(OBJS)
    $(CC) $(CFLAGS) -o $@ $(OBJS)
$(OBJS):
    $(MAKE) -C $(dir $@)
#$(dir main/main.o) 结果是main/ 。 即抽取文件的路径部分。这里开始调用各个子目录下的Makefile。
clean:
    $(MAKE) -C main/ clean
    $(MAKE) -C hello/ clean
    $(MAKE) -C bye/ clean
    rm -rf myhello


下面来看看各个子目录下的文件:


(1)main目录
lanpeng@lanpeng-laptop:~/hello/main$ ls
main.c  Makefile

lanpeng@lanpeng-laptop:~/hello/main$ vim main.c

#include <hello.h>

int main(int argc, char *argv[])
{
    hello_init();
    world_init();
    bye_init();
    return 0;
}


lanpeng@lanpeng-laptop:~/hello/main$ vim Makefile


include $(TOPDIR)/config.mk
OBJ := main.o
all: $(OBJ)
clean:
    rm -rf *.o


(2)hello目录

lanpeng@lanpeng-laptop:~/hello/hello$ ls
hello.c  world.c   Makefile

lanpeng@lanpeng-laptop:~/hello/hello$ vim hello.c


#include <hello.h>

void hello_init()
{
    printf("hello,");
}


lanpeng@lanpeng-laptop:~/hello/hello$ vim world.c


#include <hello.h>

void world_init()
{
    printf("world!\n");
}


lanpeng@lanpeng-laptop:~/hello/hello$ vim Makefile

include $(TOPDIR)/config.mk
OBJ := hello.o
OBJ += world.o
all : $(OBJ)
clean:
    rm -fr *.o


(3)bye目录下

lanpeng@lanpeng-laptop:~/hello/bye$ ls
bye.c  Makefile

lanpeng@lanpeng-laptop:~/hello/bye$ vim bye.c


#include <hello.h>

void bye_init()
{
    printf("bye bye!\n");
}


lanpeng@lanpeng-laptop:~/hello/bye$ vim makefile


include $(TOPDIR)/config.mk
OBJ := bye.o
all: $(OBJ)
clean :
    rm -fr *.o


(4)include 目录下:
lanpeng@lanpeng-laptop:~/hello/include$ ls
hello.h

#ifndef HELLO_H
#define HELLO_H
#include <stdio.h>
void hello_init();
void world_init();
void bye_init();
#endif


这样就通过了总控Makefile去控制各个目录下的子Makefile来完成对程序的编译。
lanpeng@lanpeng-laptop:~/hello$ make
make -C main/  
make[1]: 正在进入目录 `/home/lanpeng/hello/main'
gcc -Wall -O2 -g -I/home/lanpeng/hello/include -c -o main.o main.c
make[1]:正在离开目录 `/home/lanpeng/hello/main'
make -C hello/  
make[1]: 正在进入目录 `/home/lanpeng/hello/hello'
gcc -Wall -O2 -g -I/home/lanpeng/hello/include -c -o hello.o hello.c
gcc -Wall -O2 -g -I/home/lanpeng/hello/include -c -o world.o world.c
make[1]:正在离开目录 `/home/lanpeng/hello/hello'
make -C bye/  
make[1]: 正在进入目录 `/home/lanpeng/hello/bye'
gcc -Wall -O2 -g -I/home/lanpeng/hello/include -c -o bye.o bye.c
make[1]:正在离开目录 `/home/lanpeng/hello/bye'
gcc -Wall -O2 -g -I/home/lanpeng/hello/include -o myhello  main/main.o    hello/hello.o hello/world.o bye/bye.o


lanpeng@lanpeng-laptop:~/hello$  ./myhello
hello,world!
bye bye!


lanpeng@lanpeng-laptop:~/hello$ make clean
make -C main/ clean
make[1]: 正在进入目录 `/home/lanpeng/hello/main'
rm -rf *.o
make[1]:正在离开目录 `/home/lanpeng/hello/main'
make -C hello/ clean
make[1]: 正在进入目录 `/home/lanpeng/hello/hello'
rm -fr *.o
make[1]:正在离开目录 `/home/lanpeng/hello/hello'
make -C bye/ clean
make[1]: 正在进入目录 `/home/lanpeng/hello/bye'
rm -fr *.o
make[1]:正在离开目录 `/home/lanpeng/hello/bye'
rm -rf myhello

Makefile is very good!!

<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(254) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值