Makefile

来源:互联网 发布:淘宝 关键词 大尺度 编辑:程序博客网 时间:2024/04/20 03:40
Makefile Components:
Comments
# $Id: slides,v 1.2 1992/02/14 21:00:58 reggers Exp $
Macros
Example:
MACROS= -me PSROFF= groff -Tps DITROFF= groff -Tdvi CFLAGS= -O -systype bsd43
There are lots of default macros -- you should honor the existing naming conventions.
To find out what rules/macros make is using
type:
% make -p
Environment variables are exported into the make as macros. They will override the defaults.
Set macros on the make command line:
% make "CFLAGS= -O" "LDFLAGS=-s" printenv
            cc -O printenv.c -s -o printenv
Targets
You make a particular target (eg. make all), in none specified then the first target found:
paper.dvi: $(SRCS)
  $(DITROFF) $(MACROS) $(SRCS) >paper.dvi
The line beginning with $(DITROFF) begins with TAB not spaces.
The target is made if any of the dependent files have changed. The dependent files in this case are represented by the $(SRCS) statement.
Continuation of Lines
Use a back slash (/). This is important for long macros and/or rules.
Conventional Macros
AR = ar GFLAGS = GET = get ASFLAGS = MAS = mas AS = as FC = f77 CFLAGS = CC = cc LDFLAGS = LD = ld LFLAGS = LEX = lex YFLAGS = YACC = yacc LOADLIBS = MAKE = make MAKEARGS = 'SHELL=/bin/sh' SHELL = /bin/sh MAKEFLAGS = b
Special Macros
Before issuing any command in a target rule set there are certain special macros predefined.
$@ is the name of the file to be made.
$? is the names of the changed dependents.
Example
printenv: printenv.c
  $(CC) $(CFLAGS) $? $(LDFLAGS) -o $@
alternatively:
printenv: printenv.c
            $(CC) $(CFLAGS) $@.c $(LDFLAGS) -o $@
There are two more special macros used in implicit rules. They are:
$< the name of the related file that caused the action.
$* the prefix shared by target and dependent files.
Makefile Target Rules
Format
target [target...] : [dependent ....]
  [ command ...]
Items in brackets are optional, ellipsis means one or more. Note the tab to preface each command is required.
When you say "make target" make finds the target rule that applies and, if any of the dependents are newer than the target, make executes the com- mands one at a time (after macro substitution). If any dependents have to be made, that happens first (so you have a recursion).
A make will terminate if any command returns a failure status. That's why you see rules like:
clean:
         -rm *.o *~ core paper
Make ignores the returned status on command lines that begin with a dash. eg. who cares if there is no core file?
Make will echo the commands, after macro substition to show you what's happening as it happens. Sometimes you might want to turn that off. For example:
install:
        @echo You must be root to install
Example Target Rules
For example, to manage sources stored within RCS (sometimes you'll need to "check out" a source file):
SRCS=x.c y.c z.c
$(SRCS):
        co $@
To manage sources stored within SCCS (sometimes you'll need to "get" a source file):
$(SRCS):
        sccs get $@
Alternativley, to manage sources stored within SCCS or RCS let's generalize with a macro that we can set as required.
SRCS=x.c y.c z.c
# GET= sccs get
GET= co
$(SRCS):
        $(GET) $@
For example, to construct a library of object files
lib.a: x.o y.o z.o
        ar rvu lib.a x.o y.o z.o
        ranlib lib.a
Alternatively, to be a bit more fancy you could use:
OBJ=x.o y.o z.o
AR=ar
lib.a: $(OBJ)
        $(AR) rvu $@ $(OBJ)
        ranlib $@
Since AR is a default macro already assigned to "ar" you can get away without defining it (but shouldn't).
If you get used to using macros you'll be able to make a few rules that you can use over and over again.
For example, to construct a library in some other directory
INC=../misc
OTHERS=../misc/lib.a
$(OTHERS):
        cd $(INC); make lib.a
Beware:, the following will not work (but you'd think it should)
INC=../misc
OTHERS=../misc/lib.a
$(OTHERS):
        cd $(INC)
        make lib.a
Each command in the target rule is executed in a separate shell. This makes for some interesting constructs and long continuation lines.
To generate a tags file
SRCS=x.c y.c z.c
CTAGS=ctags -x >tags
tags: $(SRCS)
  ${CTAGS} $(SRCS)
On large projects a tags file, that lists all functions and their invocations is a handy tool.
To generate a listing of likely bugs in your problems
lint:
  lint $(CFLAGS) $(SRCS)
Lint is a really good tool for finding those obvious bugs that slip into programs -- eg. type classes, bad argu- ment list, etc.
Some Basic Make Rule
People have come to expect certain targets in Makefiles. You should always browse first, but it's reasonable to expect that the targets all (or just make), install, and clean will be found.
make all -- should compile everything so that you can do local testing before installing things.
make install -- should install things in the right places. But watch out that things are installed in the right place for your system.
make clean -- should clean things up. Get rid of the executables, any temporary files, object files, etc.
You may encounter other common targets, some have been already mentioned (tags and lint).
An Example Makefile for printenv

# make the printenv command
#
OWNER=bin
GROUP=bin
CTAGS= ctags -x >tags
CFLAGS= -O
LDFLAGS= -s
CC=cc
GET=co
SRCS=printenv.c
OBJS=printenv.o
SHAR=shar
MANDIR=/usr/man/manl/printenv.l
BINDIR=/usr/local/bin
DEPEND= makedepend $(CFLAGS)
all:    printenv

# To get things out of the revision control system
$(SRCS):
        $(GET) $@
# To make an object from source
       $(CC) $(CFLAGS) -c $*.c

# To make an executable

printenv: $(OBJS)
        $(CC) $(LDFLAGS) -o $@ $(OBJS)

# To install things in the right place
install: printenv printenv.man
        $(INSTALL) -c -o $(OWNER) -g $(GROUP) -m 755 printenv $(BINDIR)
        $(INSTALL) -c -o $(OWNER) -g $(GROUP) -m 644 printenv.man $(MANDIR)

# where are functions/procedures?
tags: $(SRCS)
        $(CTAGS) $(SRCS)

# what have I done wrong?
lint: $(SRCS)
        lint $(CFLAGS) $(SRCS)

# what are the source dependencies
depend: $(SRCS)
        $(DEPEND) $(SRCS)

# to make a shar distribution
shar:   clean
        $(SHAR) README Makefile printenv.man $(SRCS) >shar

# clean out the dross
clean:
        -rm printenv *~ *.o *.bak core tags shar

# DO NOT DELETE THIS LINE -- make depend depends on it.
printenv.o: /usr/include/stdio.h

Makefile Implicit Rules
Consider the rule we used for printenv
printenv: printenv.c
        $(CC) $(CFLAGS) printenv.c $(LDFLAGS) -o printenv
We generalized a bit to get  
printenv: printenv.c  
        $(CC) $(CFLAGS) $@.c $(LDFLAGS) -o $@  | The command is one that ought to work in all cases where we build an executable x out of the source code x.c This can be stated as an implicit rule: 
.c: 
        $(CC) $(CFLAGS) $@.c $(LDFLAGS) -o $@ 
This Implicit rule says how to make x out of x.c -- run cc on x.c and call the output x. The rule is implicit because no particular target is mentioned. It can be used in all cases. 
Another common implicit rule is for the construction of .o (object) files out of .c (source files). 
.o.c: 
       $(CC) $(CFLAGS) -c $< 
alternatively 
.o.c: 
       $(CC) $(CFLAGS) -c $*.c

Make Dependencies
It's pretty common to have source code that uses include files. For example: 
% cat program.c #include #include "defs.h" #include "glob.h" etc.... main(argc,argv) etc...
The implicit rule only covers part of the source code depen- dency (it only knows that program.o depends on program.c). The usual method for handling this is to list the dependen- cies separately; 
etc... $(CC) $(CFLAGS) -c $*.c etc... program.o: program.c defs.h glob.h 
Usually an implicit rule and a separate list of dependencies is all you need. And it ought to be easy enough to figure out what the dependencies are.  However, there are a number of nice tools around that will automatically generate dependency lists for you.
For example (trivial): 
DEPEND= makedepend $(CFLAGS) etc... # what are the source dependencies depend: $(SRCS) $(DEPEND) $(SRCS) etc.... # DO NOT DELETE THIS LINE -- .... printenv.o: /usr/include/stdio.h 
These tools (mkdepend, mkmkf, etc.) are very common these days and aren't too difficult to use or understand. They're just shell scripts that run cpp (or cc -M, or etc.) to find out what all the include dependencies are. They then just tack the dependency list onto the end of the Makefile
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 案子结了网上追逃的怎么办 贷款买的手机不还了会怎么办 支付宝手机号没用了登陆不了怎么办 支付宝绑定的手机号注销了怎么办 考勤机进水了不能识别指纹怎么办? 网商银行人脸识别失败怎么办 电脑网页上的字变小了怎么办 把光驱换成固态硬盘后不识别怎么办 相机内存卡电脑读不出来怎么办 sd卡在电脑上无法格式化怎么办 内存卡突然读不出来了怎么办 怀孕两个月胎儿死在腹中怎么办 香港公司在大陆卖地皮资金怎么办 结婚证上的身份证号码错了怎么办 身份证快过期了人在外地怎么办 邮政电话银行登录密码忘记了怎么办 如果欠了3w不敢和家里说怎么办 大四学生欠了3w该怎么办 房子付了首付贷款贷不下来怎么办 浙江嵊泗人在金华丢了身份证怎么办 一证5号够了怎么办新卡 微信号被盗实名认证是自己的怎么办 苹果微信登录显示被盗风险怎么办 在诈骗公司上班被公安抓了怎么办 在国外护照不小心撕坏了怎么办 在俄罗斯护照超期拉黑应该怎么办 俄罗斯五年定居护照丢了怎么办 百家号文章质量分一直在下降怎么办 如果在韩国把护照弄丢了怎么办 坐亲戚的车出了车祸受伤怎么办 出了车祸受伤对方不拿医药费怎么办 如果找你买保险的不在了保单怎么办 赴美生子父母一方是绿卡怎么办 农保报销需要居住证过期了怎么办 有上海户口但没有户口本怎么办护照 签证用的旧护照丢失了英签怎么办 买的动迁房房东不肯过户怎么办 身份信息在qq邮箱泄露了怎么办 别人用我的身份证贷款不还怎么办 做兼职被骗了身份证泄露了怎么办 qq绑定的手机号被别人换了怎么办