首页 > 其他 > 详细

makefile 编写要点

时间:2016-05-08 01:14:18      阅读:211      评论:0      收藏:0      [点我收藏+]

#PS:请尊重原创,不喜勿喷


#PS:要转载请注明出处,本人版权所有


#PS:这个只是  《  我自己    》理解,如果和你的原则相冲突,请


谅解,勿喷 


最近整理自己的文件时,发现由于太懒的原因,很多资料都来不及整理就忘掉了,很可惜,所以,在整理Makefile时,就把自己作为新手,编写makefile的一些疑问立即写下来.


1 变量赋值

varname= 是最基本的赋值
varname:= 是覆盖之前的值
varname?= 是如果没有被赋值过就赋予等号后面的值
varname+= 是添加等号后面的值



2 几个特殊符号的意义

$@--目标文件,

$^--所有的依赖文件,

$<--第一个依赖文件。


3 多目录makefile编写要点

用命令: ${MAKE} -C ${子目录} ${TARGETNAME}

注释:以上命令会切换到子目录,并执行make命令

在子目录建立makefile,做好依赖工作


4 makefile部分函数使用

patsubst(<pattern>,<replacement>,<text>)
功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否 
符合模式<pattern>,如果匹配的话,则以<replacement>替换。这里,<pattern>可以包括 
通配符“%”,表示任意长度的字串。如果<replacement>中也包含“%”,那么, 
<replacement>中的这个“%”将是<pattern>中的那个“%”所代表的字串。(可以用“\” 
来转义,以“\%”来表示真实含义的“%”字符) 
返回:函数返回被替换过后的字符串。

示例:
$(patsubst %.c,%.o,tmp.c.c tmp1.c)
把字串“tmp.c.c tmp1.c”符合模式[%.c]的单词替换成[%.o],返回结果是“tmp.c.o tmp1.o


$(strip <string> ) 

功能:去掉<string>字串中开头和结尾的空字符。 
返回:返回被去掉空格的字符串值。 
示例:
$(strip abc )
把字串“ abc ”去到开头和结尾的空格,结果是“abc”。

${wildcard <partner>)

功能:src = $(wildcard *.c ) 

返回:搜索当前目录下所有以.c结尾的文件,生成一个以空格间隔的文件名列表,并赋值给SRC.当前目录文件只有文件名,子目录下的文件名包含路径信息

 

${notdir textlist)

使用:src = $(notdir textlist)

返回:去除所有的目录信息,SRC里的文件名列表将只有文件名。




我的makefile实例:

topdir-makefile:

##############################
# file:   Makefile
# author:  sky
# modified-date:  2016-05-07
###############################
export ROOT_DIR := $(shell pwd)  
#get out of start and end char‘ ‘ of the string
ROOT_DIR :=$(strip ${ROOT_DIR})
export LIB_DIR:=$(ROOT_DIR)/lib
export SRC_DIR:=$(ROOT_DIR)/src
export INCLUDE_DIR:=$(ROOT_DIR)/include
export TARGET:=test
export CC:=gcc
export
LD_FLAGS:=-l config -pthread
export SRC:=$(wildcard ${SRC_DIR}/*.c)
export OBJ:=$(patsubst %.c,%.o,${SRC})
export OBJ_S:=Y_Start.o Y_ChildProcess.o 
#if you want to build release-program , use command: make BUILD_RELEASE=TRUE
ifeq ($(BUILD_RELEASE), TRUE)
export
C_FLAGS:= -I ${INCLUDE_DIR} -std=c99 
export BUILD_DIR := $(ROOT_DIR)/release  
else
export
C_FLAGS:= -g -D Y_DEBUG -I ${INCLUDE_DIR} -std=c99  
export BUILD_DIR := $(ROOT_DIR)/debug
endif
export OLD_OBJ:=$(wildcard ${BUILD_DIR}/*.o)
.PHONY :default all clean 
default:all 
all :
@${MAKE} -C src all
clean: 
@${MAKE} -C src clean
sub
-dir-makefile:


.PHONY:all clean  
all:${TARGET}
@${CC}  ${OBJ} -o ${TARGET} ${LD_FLAGS}
@mv ${TARGET} ${BUILD_DIR}
@mv ${OBJ} ${BUILD_DIR}
#this is to make test from a static-lib
test_static:${OBJ}
@${CC} ${C_FLAGS} ${OBJ_S} -o test_static -static -L ${LIB_DIR} -l Y_Stdio
#this is to make test from a shared-lib
test_share:${OBJ}
@${CC} ${C_FLAGS} ${OBJ_S} -o test_share -L ${LIB_DIR} -l Y_Stdio
#this is to make a static-lib
libY_Stdio_Static:
@${CC} ${C_FLAGS} -c Y_Stdio.c
@ar -rcs libY_Stdio.a Y_Stdio.o
@mv libY_Stdio.a ${LIB_DIR}
#this is to make a shared-lib
libY_Stdio_Shared:
@${CC} ${C_FLAGS} -fPIC -c Y_Stdio.c
@${CC} -shared -fPIC -o libY_Stdio.so Y_Stdio.o
@mv libY_Stdio.so ${LIB_DIR}
${TARGET}:
@${CC} ${C_FLAGS} -c ${SRC}
#clean target
clean:
@rm  ${OLD_OBJ} ${BUILD_DIR}/${TARGET}


纯手打,难免有出错之处,欢迎指正。

#PS:请尊重原创,不喜勿喷


#PS:要转载请注明出处,本人版权所有


有问题请留言,看到后我会第一时间回复


makefile 编写要点

原文:http://blog.csdn.net/u011728480/article/details/51340818

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!