Make递归调用之参数传递

本文介绍了Makefile中变量如何在父级与子级make进程中传递的机制,包括使用export和unexport指令的作用及区别,环境变量对变量传递的影响,以及特殊变量SHELL、MAKEFLAGS和MAKEFILES的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 默认情况下,只有环境变量和通过命令行方式定义的变量才会被传递给子make进程。需要将一个在上层定义的变量传递给子 make,应该在上层 Makefile 中使用指示符“export”指示符来对它声明,格式为export VARIABLE ...;当不希望将一个变量传递给子 make 时,可以使用指示符“unexport”来声明这个变量,格式如下:unexport VARIABLE ...。最后一个出现的指示符“export”或者“unexport”决定整个 make 运行过程中变量是否进行传递。

  • 三个特殊变量:
    “SHELL”和“MAKEFLAGS”在整个 make 的执行过程中始终被自动的传递给所有的子 make。
    “MAKEFILES”如果不为空也会被自动的传递给子 make。

  • 使用环境变量传递上层所定义的变量时,上层所传递给子 make 过程的变量定义不会覆盖子 make 过程所执行makefile 文件中的同名变量定义,除非使用make的“-e”选项(该选项代表使用环境变量的值)。

  • 指示符“export”或者“unexport”的参数(变量部分),如果它是对一个变量或者函数的引用,这些变量或者函数将会被立即展开,并赋值给export或者unexport的变量。export 时对变量进行展开,是为了保证传递给子 make 的变量使用当前 Makefile 中定义的变量值。

  • 一个不带任何参数的指示符“export”指示符的含义是将此 Makefile 中定义的所有变量传递给子 make 过程。那些名字中包含其它字符(除字母、数字和下划线以外的字符)的变量可能不会被传递给子 make,对这类特殊命名的变量传递需要明确的使用“export”指示符对它进行声明。虽然不带任何参数的“export”指示符具有特殊的含义,但是一个不带任何参数的“unexport”指示符却是没有任何意义的,它不会对 make 的执行过程(变量的传递)产生任何影响。

  • 通过MAKELEVEL的值可以了解当前 make 递归调用的深度。最上一级时“MAKELEVEL”的值为“0”、下一级时为“1”、再下一级为“2”…….这个变量主要用在条件测试指令,如不允许直接在此目录下执行 make可使用如下限制条件

ifeq ($(MAKELEVEL),0)
all : msg
else
all : other
endif
……
msg:
@echo ”Can not make in this directory!”
  • 最上层主控make 的命令行选项“-k”、“-s”等会被自动的通过环境变量“MAKEFLAGS”传递给子 make 进程;执行 make 时命令行中给定的一个变量定义,如make CFLAGS+=-g,此变量和它的值(CFLAGS+=-g)也会借助环境变量“MAKEFLAGS”传递给子 make进程。如果在执行 make 时通过命令行指定了“-k”和“-s”选项,那么“MAKEFLAGS”的值会被自动设置为“ks”。“-C”、“-f”、“-o”和“-W”这些命令行选项是不会被赋值给变量“MAKEFLAGS”。执行多级的 make 调用时,当不希望传递“MAKEFLAGS”的给子 make 时,需要在调用子 make 时对这个变量进行赋空。

  • 子 make在执行时,首先将会对变量“MAKEFLAGS”的值进行分析。当变量的值不是以连字符开始时,将变量的值按字用空格分开并将这些字作为命令行的选项对待(除了选项“-C”、“-f”、“-h”、“-o”和“-W”以及他们的长格式),如果其中包含无效的选项不会提示错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值