📜  Makefile-其他功能

📅  最后修改于: 2020-11-01 04:38:41             🧑  作者: Mango


在本章中,我们将研究Makefile的各种其他功能。

递归使用Make

递归使用make意味着在makefile中使用make作为命令。当您要为组成较大系统的各个子系统使用单独的makefile时,此技术很有用。例如,假设您有一个名为`subdir’的子目录,它有自己的makefile,并且您希望包含目录的makefile在该子目录上运行make 。您可以通过编写以下代码来做到这一点-

subsystem:
   cd subdir && $(MAKE)

or, equivalently:
     
subsystem:
   $(MAKE) -C subdir

您只需复制此示例即可编写递归的make命令。但是,您需要了解它们的工作原理和原因,以及子品牌与顶级品牌的关系。

将变量传递给子制造

可以通过显式请求通过环境将顶级make的变量值传递给子make。这些变量在子make中定义为默认值。除非使用`-e’开关,否则不能覆盖由子make makefile使用的makefile中指定的内容。

要传递或导出变量, make会将变量及其值添加到运行每个命令的环境中。然后,子make使用环境初始化其变量值表。

特殊变量SHELL和MAKEFLAGS始终被导出(除非您取消导出它们)。如果将MAKEFILES设置为任何值,则将其导出。

如果要将特定变量导出到子make,请使用export指令,如下所示:

export variable ...

如果要防止导出变量,请使用unexport指令,如下所示:

unexport variable ...

可变的MAKEFILES

如果定义了环境变量MAKEFILES, make将其值视为要在其他makefile之前读取的其他makefile的名称列表(以空格分隔)。它的工作原理与include指令非常相似:在各种目录中搜索这些文件。

MAKEFILES的主要用途是在make的递归调用之间进行通信。

包括来自不同目录的头文件

如果已将头文件放在不同的目录中,并且正在其他目录中运行make ,则需要提供头文件的路径。可以使用makefile中的-I选项来完成。假设functions.h文件在/ home / tutorialspoint / header文件夹中可用,而其余文件在/ home / tutorialspoint / src /文件夹中,则makefile的编写方式如下-

INCLUDES = -I "/home/tutorialspoint/header"
CC = gcc
LIBS =  -lm
CFLAGS = -g -Wall
OBJ =  main.o factorial.o hello.o

hello: ${OBJ}
   ${CC} ${CFLAGS} ${INCLUDES} -o $@ ${OBJS} ${LIBS}
.cpp.o:
   ${CC} ${CFLAGS} ${INCLUDES} -c $<

将更多文本附加到变量

通常,将更多的文本添加到已定义的变量的值中很有用。您可以使用包含“ + =”的行来执行此操作,如下所示:

objects += another.o

它采用变量对象的值,并在其前面添加文本“ another.o”,如下所示。

objects = main.o hello.o factorial.o
objects += another.o

上面的代码将对象设置为“ main.o hello.o factorial.o another.o”。

使用“ + =”类似于:

objects = main.o hello.o factorial.o
objects := $(objects) another.o

Makefile中的续行

如果您不喜欢Makefile中的大行,则可以使用反斜杠“ \”来中断行,如下所示-

OBJ =  main.o factorial.o \
   hello.o

is equivalent to

OBJ =  main.o factorial.o hello.o

从命令提示符运行Makefile

如果已经准备了名称为“ Makefile”的Makefile,则只需在命令提示符下编写make,它将运行Makefile文件。但是,如果您给Makefile赋予了其他任何名称,请使用以下命令-

make -f your-makefile-name