makefile笔记
来源:互联网 发布:中国每年生活垃圾数据 编辑:程序博客网 时间:2024/05/21 09:57
make
-k:即使make程序出错也继续向下运行
-n:将原来执行的命令输出,而不执行
-f:指定makefile的文件名称
-p:打印出系统缺省定义的内部规则
依赖关系
目标名,加冒号,后面跟空格或Tab,例如
main: main.o f1.of2.o
main.o: main.c def1.h
f1.o: f1.c def1.h def2.h
f2.o: f2.c def2.h def3.h
默认时,make程序只更新makefile中的第一个目标
使用一个特殊的目标all,更新多个目标文件
all: main hello ...
规则
目标: [依赖模块][;命令]
或者
目标: [依赖模块]
命令
命令
......
如果命令写在一行的话,"命令"之前用分号";"隔开
如果分成多行书写的话,后继的行务必以Tab字符为先导
(对应makefile而言,空格字符和Tab字符是不同的)
!!!makefile文件中的行尾加上空格键的话,也会导致make命令失败
Sample——myMakefile
+--------------------------------------+
|main: main.o f1.o f2.o
| gcc -o main main.o f1.o f2.o
|main.o: main.c def1.h
| gcc -c main.c
|f1.o: f1.c def1.h def2.h
| gcc -c f1.c
|f2.o: f2.c def2.h def3.h
| gcc -c f2.c
+--------------------------------------+
$make -f myMakefile
宏——makefile
宏标识符=值列表
1.宏标识符通常全部大写
2.通过$(宏标识符)或者${宏标识符}来访问这个标识符所代表的值
3.也可以通过make命令来传递宏的值,例如:$make CC=gcc --host=i386
4.分为用户自定义宏,和系统内部定义的宏
常用系统宏变量
$@ 目标文件名
$< 规则中的第一个文件名
$^ 规则中所有相关文件的名称
$? 规则中日期比目标新的文件列表,用空格分开
$@(D) 目标文件的目录部分
$@(F) 目标文件的文件名部分
$* 去掉后缀的目标文件名,例如,pro.o则$*表示pro
all: 表示编译所有的内容
clean: 表示清楚目标
distclean: 表示清楚所有的内容
install: 表示进行安装的内容
-k:即使make程序出错也继续向下运行
-n:将原来执行的命令输出,而不执行
-f:指定makefile的文件名称
-p:打印出系统缺省定义的内部规则
下面放我项目中的一个比较详细的Makefile文件:
#**************************************************************************# *# PROJECT : MIPS port for UCOS-II *# *# MODULE : MakeFile *# *# AUTHOR : *# *# PROCESSOR : MIPS 4KEc (32 bit RISC) *# *# Tool-chain : Cygnus *# *# DESCRIPTION : *# Makefile used for building application. *# *# The default target (all) builds application in two formats : *# *.elf : Image in ELF format. *# *.rec : Image in S-record format. *# *# The linker also generates a MAP file "*.map". *# *# Other targets are : *# clean : Deletes all files generated by makefile. *# depend : Builds dependency file. *# *#*************************************************************************/CC = mips-elf-gccLD = mips-elf-ldOBJCOPY = mips-elf-objcopyOBJDUMP = mips-elf-objdump# **********************************************# Endianness# **********************************************ENDIAN = ELifeq ($(ENDIAN),EL)OFORMAT = -ELelseOFORMAT = -EBendif# **********************************************# Name of application# **********************************************IMAGENAME = syscfgLSTNAME = syscfg# **********************************************# Type of Processor & Board# **********************************************Processor = mips# **********************************************# Directories# **********************************************ROOT = ./../../..CASEROOT = $(ROOT)/caseSDKROOT = $(ROOT)/sdkLIBROOT = $(SDKROOT)/libARCHROOT = $(SDKROOT)/kernel/$(Processor)SRCDIR = $(SDKROOT)/kernel $(ARCHROOT) $(SDKROOT)/kernel/zlibINCDIR = $(SDKROOT)/includeifeq ($(WIFI),1)BINDIR = $(SDKROOT)/bin/wifiLSTNAME = syscfg_wifielseBINDIR = $(SDKROOT)/binendifLINKDIR = .VPATH = $(SRCDIR)# **********************************************# Image file names and map file# **********************************************IMAGE_ELF = $(IMAGENAME).elfIMAGE_LST = $(LSTNAME).lstIMAGE_REC = $(IMAGENAME).recIMAGE_BIN = $(IMAGENAME).sysMAP = $(LSTNAME).map# **********************************************# Compiler and linker options# **********************************************ifeq ($(AMGUI),1)GUI_CFG = -DUSE_AMGUIelseGUI_CFG = endififeq ($(WIFI),1)WIFI_CFG = -DUSE_WIFIelseWIFI_CFG = endifINCLUDE = -I$(SDKROOT)/kernel -I$(SDKROOT)/include -I$(SDKROOT)/inc -I$(SDKROOT)/kernel/zlib#CC_OPTS = -g -c -G0 -fPIC -O0 $(OFORMAT) $(INCLUDE) -mips32CC_OPTS = -g -c -G0 -Os $(OFORMAT) $(INCLUDE) -mips32 -fno-builtin -mno-abicalls -fno-PIC -DHAVE_R4K_FLUSH_CACHE_ALL=1 $(GUI_CFG) $(WIFI_CFG)CC_OPTS_A = $(CC_OPTS) -D_ASSEMBLER_LD_SCRIPT = $(LINKDIR)/link.xnLD_OPTS = -g -G0 -T $(LD_SCRIPT) -o $(IMAGE_ELF) -L$(LIBROOT)/libc --whole-archive -lmyc --no-whole-archive -Map $(MAP) $(OFORMAT)# **********************************************# Files to be compiled# **********************************************SRC_C = $(foreach dir, $(SRCDIR), $(wildcard $(dir)/*.c))SRC_S = $(foreach dir, $(SRCDIR), $(wildcard $(dir)/*.S))SRC = $(SRC_C) $(SRC_S)OBJ_C = $(notdir $(patsubst %.c, %.o, $(SRC_C)))OBJ_S = $(notdir $(patsubst %.S, %.o, $(SRC_S)))OBJ = $(OBJ_C) $(OBJ_S)# **********************************************# Rules# **********************************************.PHONY : allall : $(IMAGE_BIN)$(IMAGE_BIN) : $(IMAGE_ELF)$(OBJCOPY) -O binary $(IMAGE_ELF) $(BINDIR)/$(IMAGE_BIN)$(OBJDUMP) -D $(IMAGE_ELF) > $(IMAGE_LST)#cp *_api.a $(LIBROOT)rm $(LINKDIR)/*.o @echo 恭喜你编译成功$(IMAGE_ELF) : $(OBJ)$(LD) $(OBJ) $(LIBROOT)/flash_api.a $(LIBROOT)/carddet_api.a $(LIBROOT)/drm_api.a $(LIBROOT)/charge_api.a $(LD_OPTS) $(OBJ_C) : %.o : %.c $(CC) $(CC_OPTS) -o $@ $<$(OBJ_S) : %.o : %.S$(CC) $(CC_OPTS_A) -o $@ $<.PHONY : clean dependclean :rm -f $(LINKDIR)/$(IMAGENAME).* $(BINDIR)/$(IMAGENAME).* $(BINDIR)/depend.mkrm $(LINKDIR)/*.odepend :$(CC) $(INCLUDE) -M $(SRC) > $(BINDIR)/depend.mk-include depend.mk
依赖关系
目标名,加冒号,后面跟空格或Tab,例如
main: main.o f1.of2.o
main.o: main.c def1.h
f1.o: f1.c def1.h def2.h
f2.o: f2.c def2.h def3.h
默认时,make程序只更新makefile中的第一个目标
使用一个特殊的目标all,更新多个目标文件
all: main hello ...
规则
目标: [依赖模块][;命令]
或者
目标: [依赖模块]
命令
命令
......
如果命令写在一行的话,"命令"之前用分号";"隔开
如果分成多行书写的话,后继的行务必以Tab字符为先导
(对应makefile而言,空格字符和Tab字符是不同的)
!!!makefile文件中的行尾加上空格键的话,也会导致make命令失败
Sample——myMakefile
+--------------------------------------+
|main: main.o f1.o f2.o
| gcc -o main main.o f1.o f2.o
|main.o: main.c def1.h
| gcc -c main.c
|f1.o: f1.c def1.h def2.h
| gcc -c f1.c
|f2.o: f2.c def2.h def3.h
| gcc -c f2.c
+--------------------------------------+
$make -f myMakefile
宏——makefile
宏标识符=值列表
1.宏标识符通常全部大写
2.通过$(宏标识符)或者${宏标识符}来访问这个标识符所代表的值
3.也可以通过make命令来传递宏的值,例如:$make CC=gcc --host=i386
4.分为用户自定义宏,和系统内部定义的宏
常用系统宏变量
$@ 目标文件名
$< 规则中的第一个文件名
$^ 规则中所有相关文件的名称
$? 规则中日期比目标新的文件列表,用空格分开
$@(D) 目标文件的目录部分
$@(F) 目标文件的文件名部分
$* 去掉后缀的目标文件名,例如,pro.o则$*表示pro
all: 表示编译所有的内容
clean: 表示清楚目标
distclean: 表示清楚所有的内容
install: 表示进行安装的内容
- Makefile笔记
- makefile 笔记
- makefile 笔记
- Makefile笔记
- 笔记:makefile
- Makefile 笔记
- makefile笔记
- makefile笔记
- makefile笔记
- makefile笔记
- Makefile 笔记
- Makefile 笔记
- makefile 笔记
- Makefile笔记
- Makefile笔记
- makefile笔记
- Makefile笔记
- Makefile笔记
- Android系统基础积累
- linux下route命令
- Google Map Web服务API
- C语言中volatile关键字的作用
- 设置SQL*PLUS的启动环境变量
- makefile笔记
- Extjs的grid和树以及几种常用的插件使用详解
- log4j指定类单独输出到一个日志文件
- 原型模式
- Bootstrap 组件 - 按钮组与下拉按钮(Button Groups & Button Dropdowns)
- android 布局如何支持多种不同屏幕尺寸
- OpenGL ES 2.0基本概念
- Hebernate QBC 语言
- 函数返回类型为指针类型时的一些问题