`

make

 
阅读更多

1. .PHONY 声明的目标总是被调用

.PHONY:zzg
	echo "hello zzg"
        @echo "good morning" # @符号表示不显示被执行的命令,但是会执行。

 

2. $(info start working) info  是make内置的函数,后面跟的是参数,打印消息,类似的函数还有warning,error,不同的是error在打印完消息后会终止执行并退出。

 

3. 调用make

$make -f Makefile target_in_makefile

 

 4. 赋值符号

    :=   在makefile被解析时就立即展开并赋值  (立即展开)

    =   只有当所定义的变量在使用时才展开     (延迟展开)

    ?=  条件赋值,只有该变量还没有值时才赋值 (延迟展开)

    += 附加赋值   (出现在target后面会延迟,而普通情况下会立即展开)

 

5.  条件控制语句

   

if-condition
    text if the condition is true
endif


if-condition
   text if the condition is true
else 
   text if the condition is true
endif


其中condition只能进行两种判断,一种是判断表达式是否相等,另一种是判断表达式是否被定义:
ifdef var
ifndef var
ifeq (a, b)
ifneq (a, b)

 

6. 宏(函数)定义

按调用方式可以分为三类

a). make内置函数调用
    $(func_name, param...)
b) 用户定义函数
   $(call func_name, param...)
c) 用户定义的无参函数,也成为宏
   $(func_name)

函数的定义方法:
define func_name
command   # 命令前没有tab键,宏被展开时make解释器会自动添加
endef

函数参数的获取:
$(0)  函数名
$(1) 第一个参数

 

7.常用函数

a)字符串操作函数
    $(filter pattern..., text)
    $(filter-out pattern..., text)
    $(findstring string, text)
    $(subst from, to, text)
    $(patsubst from, to, text)
    $(strip text)
    $(words text)
    $(word n, text)
    $(firstword, text)
    $(wordlist start, end, text)
    $(sort list)

b) 文件名操作
    $(wildcard *.c)
    $(dir f1.c src/f2.c)
    $(notdir f1.c src/f2.c)
    $(suffix f1.c f1.h)
    $(basename f1.c src/f1.h)
    $(addsuffix .c, f1 src/f2)
    $(addprefix src/, f1.c f2.c)
    $(join f1 f2, .c .h)

c) 过程控制函数:前面的ifeq、ifneq是脚本解析的时候起作用,有点像c语言的宏,即预处理。过程控制则需要函数来完成
    $(if condition, then-part, else-part) #condition为true的条件是其不为空
    $(error text)
    $(foreach variable, list, body)
    eg:  $(foreach name, zhao wang zhao qian, $(shell echo hello $(name)\,))


 

8. 内置符号

$@  target名称
$*   和$@类似,只是不包含target的后缀
$^   所有先决条件名称,以space分隔,自动去重
$?    有更新的先决条件列表, 例如有4个先决条件,其中有3个甘冈被修改过,则$?就代表刚刚被修改过的先决条件,以空格分隔
$+  所有先决条件,和$^类似,只是$+包含了重复的先决条件,而$^会去重
$<  第一个先决条件

 

9. 目标特定的变量赋值

tar2:CFLAGS=   #只对此编译起作用

tar:

     gcc $(CFLAGS) main.c

======

tar2: override CFLAGS=   # override 完胜

tar:

     gcc $(CFLAGS) main.c

========

make tar2 -e CFLAGS="-c -g"

 

10. 常用选项

-e   --environment-overrides: 强制使用make命令参数中的变量赋值

-t    --touch  仅更新文件的时间戳,却不执行target对应的命令

-c   --directory  指定要执行那个的makefile的路径

-f   --file  指定make用的文件

-n --just-print 仅打印要执行的命令,不真正执行,方便分析

-l   指定 编译时所需要的lib文件例如lName 寻找  libName.so ,如果没有再找  libName.a

 

 11. 隐含规则:

   a) 后缀规则  

      .c.o:     #  后缀成对出现,将.c转换为.o

      gcc -c -o $@ $<;

   b) 模式规则

      %.c:%.o

      gcc -c -o $@ $<;

 

12.  内置符号:

       $^  所有依赖集合,去重后的

       $+ 所有依赖集合,没有去重

       $? 所有依赖集合中比目标新的文件的集合

       $< 依赖集合中的第一个文件

       $*   不包含扩展名的目标文件名称。

       $@ 目标的完整名称

       $%  如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称

          mytarget.so(image.o),则 $@  mytarget.so,而 $%  image.o

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    windows 安装make (gnu make)

    在Windows操作系统上安装GNU Make是开发过程中的常见需求,尤其是对于那些经常进行C或C++编程,或是使用基于Makefile的构建系统的人来说。GNU Make是一个自动化构建工具,它能够读取名为“Makefile”的文件,根据...

    window make工具 版本为:GNU Make 4.2.1

    **GNU Make 4.2.1 知识详解** GNU Make是开源软件开发中的一个关键工具,用于自动化构建过程,特别是在C/C++等编译型语言的项目中。它的核心功能是读取名为Makefile的文件,根据其中的规则来执行一系列命令,以构建...

    windows下的make工具 make-4.2.tar

    《Windows环境下Make工具详解——以make-4.2.tar为例》 在计算机编程领域,构建系统是项目开发不可或缺的一部分,而Make工具就是其中的一种经典构建工具。尤其在Linux和Unix系统中,Make广泛用于自动化编译和链接...

    windows下的make 3.81

    "Windows下的make 3.81"指的是在Windows环境下使用GNU Make 3.81版本进行项目构建。GNU Make是一个强大的自动化构建工具,它根据一系列规则(即makefile)来编译、链接源代码,生成可执行文件。这个场景中,配合GCC/...

    centos7离线源码安装make

    在Linux系统中,`make`是一个非常重要的工具,它帮助开发者构建、编译源代码,大大简化了软件的编译过程。在CentOS 7环境下,由于网络限制或安全策略,有时我们需要离线方式进行源码安装`make`。本文将详细介绍如何...

    make环境包.zip

    标题中的"make环境包.zip"表明这是一个包含了用于在没有预装`make`环境的Linux服务器上编译软件的资源包。`make`是Unix/Linux系统中一个非常重要的工具,它帮助开发者自动化编译过程,使得构建复杂项目变得更为便捷...

    windows 64位的 make 工具

    "Windows 64位的make工具"是指在64位Windows操作系统上使用的构建系统工具,它使得开发者能够在该平台上执行类似Unix/Linux系统的make命令来管理项目构建流程。在Windows环境下,make工具通常被用来协调C++或者其他...

    make-3.81.rar

    《make-3.81在Windows环境下的应用与安装》 `make-3.81.rar`是一个包含`make-3.81.exe`可执行文件的压缩包,主要用于在Windows 10操作系统中安装`make`命令工具。`make`是软件构建工具,它在编程领域中扮演着至关...

    make-3.82.tar.gz

    This directory contains the 3.82 release of GNU Make. See the file NEWS for the user-visible changes from previous releases. In addition, there have been bugs fixed. Please check the system-specific...

    GNU Make For Windows

    GNU Make for Windows是一个专为在Windows操作系统环境下使用的版本管理工具,它是GNU项目的一部分,由GNU组织开发和维护。Make工具是构建自动化系统的核心,它能够根据预定义的规则自动编译和链接源代码,极大地...

    gnumake-v3.80-cn

    GNU make(通常简称为make)是一款广泛使用的构建工具,它读取Makefile文件中的指令,然后控制编译过程,自动化处理编译规则。本文将介绍GNU make的版本3.80,中文手册中提到的核心知识点涵盖了make的基本用法、语法...

    GNU make中文手册_v_3.8.pdf

    GNU make是一款在Linux环境下广泛使用的自动构建工具,它通过读取Makefile文件中定义的依赖关系来自动化编译、链接和安装程序。Makefile是一种脚本文件,其中包含了如何编译和链接程序的规则和指令。学习makefile...

    GNU make-3.79.1.tar.gz

    GNU make 是一个强大的自动化构建工具,它在软件开发过程中扮演着至关重要的角色。这个压缩包“GNU make-3.79.1.tar.gz”包含了GNU make的3.79.1版本源代码,允许用户在自己的系统上编译和安装这款软件。 1. **GNU ...

    GnuWin32-Make3.81

    标题 "GnuWin32-Make3.81" 指的是一个针对Windows平台的开源软件项目,它使得用户可以在Windows系统上使用GNU的Make工具。Make是构建自动化工具,主要用于编译和链接源代码,是软件开发过程中的重要组成部分。在...

    GNU Make项目管理(第三版)

    GNU Make是一款在Unix和其他操作系统上广泛使用的软件构建工具。自从1970年诞生以来,Make一直都是程序开发项目的必备工具,甚至在编译Linux内核时也扮演着核心角色。这本书《GNU Make项目管理(第三版)》由OREILLY...

    make_ext4fs

    安卓9.0 make_ext4fs文件,make_ext4fs用于Android平台上制作ext4文件系统的镜像。 make_ext4fs [ -l &lt;len&gt; ] [ -j &lt;journal size&gt; ] [ -b &lt;block_size&gt; ] [ -g &lt;blocks per group&gt; ] [ -i &lt;inodes&gt; ] [ -I ...

    make 学习 make 学习

    vmake 学习 make 学习 make 学习 make 学习

    debian7.7安装make需要的依赖包

    在Linux系统中,`make`是一个非常重要的工具,它用于自动化编译过程,根据Makefile文件来构建软件项目。在 Debian 7.7(代号为"Wheezy")这样的旧版系统中,`make`可能没有预装,因此用户需要手动安装。`make build`...

    make.exe希望对你有用

    【标题】"make.exe希望对你有用"所涉及的知识点主要集中在`make.exe`这个程序上,它是构建自动化工具的一部分,通常在开发C/C++程序时使用。`make.exe`是GNU Make的Windows版本,用于协调编译过程,使得开发者可以...

    mingw32-make-3.81-2.tar.gz

    MingW32-make是Windows平台上一个非常重要的工具,它是GNU Make的移植版本,用于构建和管理软件项目。这个"mingw32-make-3.81-2.tar.gz"文件是一个压缩包,其中包含了MingW32-make的源代码、文档以及可执行文件。 ...

Global site tag (gtag.js) - Google Analytics