Chinaunix首页 | 论坛 | 博客
  • 博客访问: 729463
  • 博文数量: 134
  • 博客积分: 3207
  • 博客等级: 中校
  • 技术积分: 1995
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-01 20:47
文章分类

全部博文(134)

文章存档

2022年(1)

2020年(7)

2018年(2)

2016年(5)

2015年(14)

2014年(21)

2013年(3)

2012年(1)

2011年(15)

2010年(30)

2009年(35)

分类: LINUX

2010-03-25 16:57:32

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!!

阅读(1041) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~