makefile 基础

原创 2013年12月02日 11:27:12
========================================
makefile 的 变量赋值
========================================
1、“=” 最后计算展开后赋值
      make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:
            x = foo
            y = $(x) bar
            x = xyz
      在上例中,y的值将会是 xyz bar ,而不是 foo bar 。

2、“:=” 立即赋值
      “:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。
            x := foo
            y := $(x) bar
            x := xyz
      在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。

?= 是如果没有被赋值过就赋予等号后面的值
    TEMP ?= var
    ifeq($(TEMP),undefined)
        TEMP = var
        endif


+= 是添加等号后面的值

第一阶段:读取所有的makefile文件(包括 include 项,命令行 -f 项)
   内建所有的变量、明确规则和隐含规则,
   并建立所有目标和依赖之间的依赖关系结构链表。

第二阶段:根据第一阶段已经建立的依赖关系结构链表决定哪些目标需要更新,并使用对应的规则来重建这些目标

========================================
makefile  条件语句
========================================

<conditional-directive>
<text-if-true>
else
<text-if-false>
endif

条件语句有ifeq, ifneq, ifdef, ifndef
句法书写举例:
ifeq(argv1,argv2)          # 字符串不用加单引号或双引号
ifdef(variable-name)        # 不能加$, 是变量名字
举例:
如果 strip 函数返回值为空
ifeq($(strip $(foo)),)
xxx
endif


给个例子:
[~/test]$ cat Makefile
foo=abc
ifdef foo
$(warning foo defined)
endif


========================================
makefile 调试
========================================
$(warning)函数
它可以放在makefile 中的任何地方:
开始的位置、工作目标或必要条件列表中以及命令脚本中。
这让你能够在最方便的地方查看变量的输出值

-n 或“--just-print”,那么其只是显示命令,但不会执行命令,
这个功能很有利于我们调试我们的Makefile,

-p 或(--print-data-base) 是另一个你常会用到的选项。显示make 所运行的命令, 然后输出它的内部数据库。
数据库里的数据将会依种类划分

    成以下几个组:
    variables、
    directories、
    implicit rules、
    pattern-specific variables、
    files(explicit rules)以及vpath search path。

-d 是另一个有用的选项。 大量的信息可能让人眼花。

========================================
makefile 控制命令回显。
========================================
“-s”或“--slient”则是全面禁止命令的显示。  
makefile 以tab开头表示命令,

当我们用“@”字符在命令行前,那么,这个命令将不被make显示出来. 为了向屏幕少输出信息。


========================================
makefile 依赖关系
========================================
----------------------------------------
有问题的最简单的Makefile
----------------------------------------
all:
    gcc  -o main main.o
main.o: main.c
    gcc -c -o main.o main.c
clean:
    rm *.o main

运行make, 提示如下错误:
gcc  -o main main.o
gcc: main.o: No such file or directory
gcc: no input files
make: *** [all] Error 1

我很奇怪,不是告诉它main.o 依赖main.c 吗,按定义的规则去生成。
而且我查看了make -d 的输出,发现其并没有继续检查main.o 的依赖关系。
后来我对比了正确的makefile 写法, 发现要把main.o 写在all 的右边才能作为依赖
才能使makefile继续检查它的生成关系。
如果你使用隐含规则,甚至不用写.c 生成.o 的规则。
----------------------------------------
下面是正确的写法:all 右边有依赖
----------------------------------------
all:main.o
    gcc  -o main main.o
clean:
    rm *.o main
运行make 的结果:
[root@hjj /home/samba/testapp]# make
cc    -c -o main.o main.c
gcc  -o main main.o

********************************************************************************

makefile 的 V=1 起了什么作用?
makefile 可以在命令行为宏变量赋值
ifeq ("$(origin V)", "command line")
KBUILD_VERBOSE = $(V)
endif

ifndef KBUILD_VERBOSE
KBUILD_VERBOSE = 0
endif
********************************************************************************




版权声明:本文为博主原创文章,未经博主允许不得转载。

Makefile 入门与基本语法

在我看来,学会写简单的Makefile,阅读较复杂的makefile,是每一个Linux程序员都必须拥有的基本素质。Makefile可以自动识别哪些源文件被更改过,需要重新编译,那些不需要。从而节省大...
  • Paul_C_V
  • Paul_C_V
  • 2015年05月18日 11:16
  • 6131

makefile书写入门

首先声明,本篇文章是根据陈皓博客中的相关文章改写的。原因是那篇文章太全面了,而本文抽取了其中比较实用的几点,以一个使用者的角度来说明一下,makefile改怎么写,而且只限定是linux下的C语言的m...
  • cyfcsd
  • cyfcsd
  • 2016年07月29日 16:54
  • 1731

Makefile经典教程(掌握这些足够)

ruglcc's blog 研发7年,专注于 iOS Android Linux Github->https://github.com/ruglcc 目...
  • special00
  • special00
  • 2016年04月07日 11:44
  • 2249

Linux下C语言编译基础及makefile的编写

这篇文章介绍在LINUX下进行C语言编程所需要的基础知识。在这篇文章当中,我们将会学到以下内容: 源程序编译 Makefile的编写 程序库的链接 程序的调试 头文件和系统求助   1....
  • coloriy
  • coloriy
  • 2015年10月30日 13:15
  • 370

makefile 详细用法之二

最近在学习Linux下的C编程,买了一本叫《Linux环境下的C编程指南》读到makefile就越看越迷糊,可能是我的理解能不行。             于是google到了以下这篇文章。通俗易懂...
  • dapengbusi
  • dapengbusi
  • 2016年09月18日 16:37
  • 1140

Linux下C++的通用Makefile与解析

本文给出万能Makefile的具体实现,以及对其中的关键点进行解析。所谓C++万能Makefile,即可编译链接所有的C++程序,而只需作很少的修改。 号称万能Makefile,一统江湖。我对原版的...
  • zhoujiaxq
  • zhoujiaxq
  • 2014年05月16日 13:54
  • 10392

多层级的makefile编写——递归调用makefile

文件层级结构: │  Makefile │  tmp │ ├─include │      public.h │ └─src     ├─moda     │      Makefile     │ ...
  • wangyuling1234567890
  • wangyuling1234567890
  • 2014年03月25日 23:52
  • 2415

makefile常用写法和简易写法

先说长用到的-l: 小写的l就是依赖的lib库,lib首字母,很好记。 -L: 引用的三方lib库所在目录,lib首字母大写就是目录,也好记。 -I: 少不了头文件目录,还是老路子,include...
  • persitail
  • persitail
  • 2016年09月20日 12:36
  • 677

Linux下Makefile的编写及四个特殊符号的意义@、$@、$^、$<

我们先看三段C++程序: 一、line1的源码 line1.h #ifndef _LINE_1_H #define _LINE_1_H void line1_print(const char...
  • runfarther
  • runfarther
  • 2015年11月25日 14:47
  • 4704

Makefile 实际用例分析(一) ------- 比较通用的一种架构

这里不再说Makefile的基本知识,如果需要学习,那么请参考: 下载:makefile 中文手册 或者 点击打开链接 或者 跟我一起写Makefile( 陈皓 ) 这里说的是一般的实际的一个工...
  • shanshanpt
  • shanshanpt
  • 2013年12月08日 12:20
  • 5457
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:makefile 基础
举报原因:
原因补充:

(最多只允许输入30个字)