博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

嵌入式linux

构建完善的嵌入式linux平台
   uClinux.cublog.cn
关于作者  
姓名:panhuachun@hotmail.com
职业:软件工程师
年龄:24
位置:China
个性介绍:构建优美的嵌入式平台

我的分类  




gcc编程环境基础3--Makfile
更多内容请看makefile手册
 
 
 
=======================常用标志=========================
$@
表示规则的目标文件名。如果目标是一个文档文件(Linux中,一般称.a文件为
文档文件,也称为静态库文件),那么它代表这个文档的文件名。在多目标模式
规则中,它代表的是哪个触发规则被执行的目标文件名。
$%
当规则的目标文件是一个静态库文件时,代表静态库的一个成员名。例如,规则
的目标是“foo.a(bar.o)”,那么,“$%”的值就为“bar.o”,“$@”的值为“foo.a”。
如果目标不是静态库文件,其值为空。
$<
规则的第一个依赖文件名。如果是一个目标文件使用隐含规则来重建,则它代表
由隐含规则加入的第一个依赖文件。
$?
所有比目标文件更新的依赖文件列表,空格分割。如果目标是静态库文件名,代
表的是库成员(.o文件)。
$^
规则的所有依赖文件列表,使用空格分隔。如果目标是静态库文件,它所代表的
只能是所有库成员(.o文件)名。一个文件可重复的出现在目标的依赖中,变量
“$^”只记录它的一次引用情况。就是说变量“$^”会去掉重复的依赖文件。
$+
类似“$^”,但是它保留了依赖文件中重复出现的文件。主要用在程序链接时库
的交叉引用场合。
$*
在模式规则和静态模式规则中,代表“茎”。“茎”是目标模式中“%”所代表的
部分(当文件名中存在目录时,“茎”也包含目录(斜杠之前)部分,可参考 10.5.4
模式的匹配 一小节)。例如:文件“dir/a.foo.b”,当目标的模式为“a.%.b”时,
“$*”的值为“dir/a.foo”。“茎”对于构造相关文件名非常有用。
自动化变量“$*”需要两点说明:
 
 
 
============实例===============
CC=g++
INCLUDE_PATH=-I../../
LIBS= -lpthread
WARNINGS = -Wall
OBJ=$(patsubst %.cpp,%.o,$(wildcard *.cpp))
//.PHONY : all debug test

all: $(OBJ)
$(OBJ) : $(wildcard *.cpp)
 $(CC) $(INCLUDE_PATH) -fpic -shared -o ../../lib/$@ $<

%.o :%.cpp
 $(CC) $(INCLUDE_PATH) -fpic -shared -o $@ $<
clean:
 @echo "Cleaning up directory."
 rm -f ../../lib/*.o
 
 

 
 

------------------环境变量--------------------------------
make 使用“-e”参数时,Makefile 和命
令行定义的变量不会覆盖同名的环境变量,make将使用系统环境变量中这些变
量的定义值。
1.  执行“make debug”将显示:
hostname is : server-http
shell is /bin/sh
2.  执行“make –e debug”;将显示:
hostname is : server-cc
shell is /bin/sh
3.  执行“make –e HOSTNAEM=server-ftp”;将显示:
hostname is : server-ftp
shell is /bin/sh
---------条件执行------------------
foo: $(objects)
 
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
……
--------make的内嵌函数----------------
 
 
---------默认规则------------------
%.o: %.c foo.h
 $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
--------------------------------------------------------
objects = $(wildcar *.o)
objects = main.o foo.o bar.o utils.o
objects += another.o
--------------------------------------------------------
$(patsubst %.c,%.o,$(wildcard *.c))
foo := a.o b.o c.o
bar := $(foo:.o=.c) 是函数“patsubst”的一个简化实现
foo := a.o b.o c.o
bar := $(foo:%.o=%.c)
--------------------------------------------------------
SUBDIRS = foo bar baz
.PHONY: subdirs $(SUBDIRS)
 subdirs: $(SUBDIRS)
$(SUBDIRS):
 $(MAKE) -C $@
 
“foo: baz”,此规则用来限制子目录的 make
顺序。它的作用是限制同步目录“foo”和“baz”的 make 过程(在处理“foo”目录
之前,需要等待“baz”目录处理完成)
--------------------------------------------------------
我们可以使用如下的模式规则来自动生成每一个.c文件对应的.d文件:
 
%.d: %.c
 $(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
 sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
 rm -f $@.$$$$
---------------------------------------------------------
当前目录下可以使用这样一个规则来实现对这个子目录的编译:
subsystem:
 cd subdir && $(MAKE)
 
其等价于规则:
 
subsystem:
 $(MAKE) -C subd
----------------------------------------------------------
ifeq ($(CC),gcc)
 $(CC) -o foo $(objects) $(libs_for_gcc)
else
 $(CC) -o foo $(objects) $(normal_libs)
endif
-------------------------------------------------------------
函数的调用语法
$(FUNCTION ARGUMENTS) :"FUNCTION"是需要调用的函数名,"ARGUMENTS"是函数的参数
字符串替换函数 $(subst FROM,TO,TEXT)
模式替换函数   $(patsubst PATTERN,REPLACEMENT,TEXT)
去空格函数     $(strip STRINT)
查找字符串函数 $(findstring FIND,IN)
过滤函数 $(filter PATTERN…,TEXT)
反过滤函数     $(filter-out PATTERN...,TEXT)
排序函数 $(sort LIST)
取单词函数 $(word N,TEXT)
取字串函数     $(wordlist S,E,TEXT)
dir
notdir 
suffix
basename
addsuffix
addprefix
join 
wildcard        参考 8.3 文件名处理函数 一节
error        参考 8.11 make的控制函数
warning        参考 8.11 make的控制函数
shell        参考 8.10 shell函数 一节
origin        参考 8.9 origin函数 一节
foreach        参考 8.4 foreach函数 一节
call         参考 8.6 call函数 一节
if         参考 8.5 if函数 一节
eval         参考 8.8 eval函数 一节
value        参考 8.7 value函数 一节
.
.
.
files := $(shell echo *.c) 将变量“files”赋值为当前目录下所有.c文件的列表(文件名之间使用空格分割
-------------------------------------------------------------
重建内嵌隐含规则
%.o : %.c
 $(CC) $(CFLAGS) –D__DEBUG__  $< -o $@
-------------------------------------------------------------
MAKEFILES        参考 3.4 变量 MAKEFILES 一节
MAKEFILES_LIST       参考 3.5 变量 MAKEFILE_LIST 一节
VPATH        参考 4.5.1 一般搜索 一小节
SHELL        参考 5.2 命令的执行 一节
MAKESHELL       参考 5.2 命令的执行 一节
MAKE        参考 5.6 make的递归执行 一节
MAKELEVEL        参考 5.6 make的递归执行 一节
MAKEFLAGS       参考 5.6 make的递归执行 一节
MAKECMDGOALS       参考 9.2 指定终极目标 一节
CURDIR        参考 5.6 make的递归执行 一节
SUFFIXES        参考 10.8 隐含规则的搜索算法 一节
.LIBPATTERNS       参考 4.5.6 库文件和搜索目录 一小节
 
 

 发表于: 2008-02-25,修改于: 2008-02-25 21:22 已浏览184次,有评论0条 推荐 投诉

  网友评论

  发表评论



Copyright © 2001-2006 ChinaUnix.net All Rights Reserved

感谢所有关心和支持过ChinaUnix的朋友们
页面生成时间:0.2426

京ICP证041476号