zoukankan      html  css  js  c++  java
  • 海思的一个 Makefile 解析

    Makefile 原文

    include ../Makefile.param
    #ifeq ($(SAMPLE_PARAM_FILE), )
    # SAMPLE_PARAM_FILE:=../Makefile.param
    # include $(SAMPLE_PARAM_FILE)
    #endif
     
    # target source
    SRC := $(wildcard *.c)
    OBJ := $(SRC:%.c=%.o)
    MPI_LIBS := $(REL_LIB)/libmpi.a
    MPI_LIBS += $(REL_LIB)/libhdmi.a
    TARGET := $(OBJ:%.o=%)
    .PHONY : clean all
     
    all: $(TARGET)
     
    $(TARGET):%:%.o $(COMM_OBJ)
    $(CC) $(CFLAGS) -lpthread -lm -o $@ $^ $(MPI_LIBS) $(AUDIO_LIBA) $(JPEGD_LIBA)
     
    clean:
    @rm -f $(TARGET)
    @rm -f $(OBJ)
    @rm -f $(COMM_OBJ)
     
    cleanstream:
    @rm -f *.h264
    @rm -f *.jpg
    @rm -f *.mjp
    @rm -f *.mp4
    

    解析

    include

    include ../Makefile.param
    

    在Makefile也和C语言一样有include的用法,include后面跟一个Makefile文件名,其功能和C语言中的include类似,就是把被包含的Makefile文件的内容全部原本的复制到包含文件中来。
    这个用法多用于在一个项目中有多个Makefile,分别在不同的目录下,这样我 们可以写一个公共Makefile,这个Makefile中包含一些公共变量的定义,其他目录下的Makefile可以把这个公共Makefile文件包含进去。

    SRC := $(wildcard *.c)

    SRC := $(wildcard *.c)
    

    变量的定义

    #方式一:定义多行变量  
    define variable 
    value 
    value 
    endef 
    
    #方式二:  
    variable = value 
    
    #方式三:  
    variable := value 
    
    #方式四:  
    variable += value 
    
    #方式五:  
    variable ?= value
    

    这些定义方式中,按照展开方式不同分为:

    • 方式一、方式二、方式五,都是使用时展开,就是无论前面如何定义,变量真正的含义都是到使用的时候才展开,这样定义的变量可以递归引用当前还未定义的变量;
    • 方式三是直接展开,就是变量定义的时候就展开为真正的值,这样定义的变量不可以递归引用当前还未定义的变量;
    • 方式四是追加变量,他的展开方式要看原有的变量是如何定义的。

    变量的引用

    变量的引用可以采用两种方式:

    $(variable)
    
    ${variable}
    

    wildcard

    一般我们可以使用下面这一句来获取工作目录下的所有的.c文件列表:

    $(wildcard *.c)
    

    在Makefile规则中,通配符会被自动展开。但在变量的定义和函数引用时,通配符将失效。这种情况下如果需要通配符有效,就需要使用函数wildcard,它的用法是:

    $(wildcard PATTERN...) 
    

    在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空。

    OBJ := $(SRC:%.c=%.o)

    OBJ := $(SRC:%.c=%.o)
    

    这里用到makefile里的替换引用规则,即用您指定的变量替换另一个变量。它的标准格式是:

    $(var:a=b) 或 ${var:a=b}
    

    它的含义是把变量var中的每一个值结尾用b替换掉a。

    %

    %”的意思是匹配零或若干字符,例如:

    %.h
    

    表示所有以“.h”结尾的文件,它是在GUNmake的语法层次上的,例如

    vpath %.h ../headers
    

    该语句表示,要求make在“../headers”目录下搜索所有以“.h”结尾的文件.
    *是Shell所支持的通配符,是在shell的语法层次上,*.c,一般用在shell命令里面,如:

    clean:
    rm -f *.o
    

    .PHONY : clean all

    .PHONY : clean all
    

    关键字.PHONY告诉make该目标是“假的”(磁盘上其实没有clean),这时make为生成这个目标就会将其规则执行一次。.PHONY修饰的目标就是只有规则没有依赖。

    all: $(TARGET)

    表示所有的目标(一个或者多个目标)

    $@ $^

    • $@--目标文件
    • $^--所有的依赖文件
    • $<--第一个依赖文件

    @rm -f $(TARGET)

    @rm -f $(TARGET)
    

    其中 @ 表示:如果 makefile 文件中执行的命令前面加了@字符,则不显示命令本身而只显示它的结果。

  • 相关阅读:
    Mac环境下,终端命令行开启、关闭和重启mysql数据库
    Java连接Mysql数据库详细代码
    强制关闭MySQL数据库
    ssh登录服务器出现Permission denied (publickey,gssapi-keyex,gssapi-with-mic)警告
    JSP中“转发”和“重定向”的区别
    Mac环境下配置Tomcat服务器
    TCP和UDP的区别
    div宽高未知,设置小的div位于大的div的中心
    HTML:使用Jquery动态生成二级选项列表
    $(document).ready()和window.onload的区别
  • 原文地址:https://www.cnblogs.com/chay/p/10436773.html
Copyright © 2011-2022 走看看