变量和递归

变量和递归
在 make 的递归执行过程中,上层 make 可以明确指定将一些变量的定义通过环境变量的方式传递给子 make 过程。没有明确指定需要传递的变量,上层 make 不会将其
所执行的 Makefile 中定义的变量传递给子 make 过程。使用环境变量传递上层所定义的变量时,上层所传递给子 make 过程的变量定义不会覆盖子 make 过程所执行makefile 文件中的同名变量定义。

如果子make过程所执行Makefile中存在同名变量定义,则上层传递的变量定义不会覆盖子Makefile中定义的值。就是说如果上层make传递的变量和子make所执行的Makefile中存在重复的变量定义,则以子Makefile中的变量定义为准。除非使用make的“-e”选项


上层 make 过程要将所执行的 Makefile 中的变量传递给子 make 过程,需要明确地指出。在 GNU make 中,实现此功能的指示符是“export”。当一个变量使用“export”进行声明后,变量和它的值将被加入到当前工作的环境变量中,以后在 make 执行的所有规则的命令都可以使用这个变量。而当没有使用指示符“export”对任何变量进行声明的情况下,上层 make 只将那些已经初始化的环境变量(在执行 make 之前已经存在的环境变量)和使用命令行指定的变量(如命令“make CFLAGS +=-g”或者“make –e CFLAGS +=-g”)传递给子 make 程序,通常这些变量由字符、数字和下划线组成。需要注意的是:有些 shell 不能处理那些名字中包含除字母、数字、下划线以外的其他字符的变量。


存在两个特殊的变量“SHELL”和“MAKEFLAGS”,对于这两个变量除非使用指示符“unexport”对它们进行声明,它们在整个 make 的执行过程中始终被自动的传递给所有的子 make。另外一个变量“MAKEFILES”,如果此变量有值(不为空)那么同样它会被自动的传递给子 make。在没有使用关键字“export”声明的变量,make 执行时它们不会被自动传递给子 make,因此下层 Makefile 中可以定义和上层同名的变量,不会引起变量定义冲突。需要将一个在上层定义的变量传递给子 make,应该在上层 Makefile 中使用指示符“export”对此变量进行声明。格式如下:
    export VARIABLE ...
当不希望将一个变量传递给子 make 时,可以使用指示符“unexport”来声明这个变量。
格式如下:
    unexport VARIABLE ...

以上两种格式,指示符“export”或者“unexport”的参数(变量部分),如果它是对一个变量或者函数的引用,这些变量或者函数将会被立即展开。并赋值给export或者unexport的变量,例如:
    Y=Z
    export X=$(Y)
其实就是“export X=Z”。export 时对变量进行展开,是为了保证传递给子 make 的变量值有效(使用当前 Makefile 中定义的变量值)。
“export”更方便的用法是在定义变量的同时对它进行声明。看下边的几个例子:
1.
    export VARIABLE = value
等效于:
    VARIABLE = value
    export VARIABLE

2.
    export VARIABLE := value
等效于:
    VARIABLE := value
    export VARIABLE
3.
    export VARIABLE += value
等效于:
    VARIABLE += value
    export VARIABLE
我们可以看到,其实在 Makefile 中指示符“export”和“unexport”的功能和在 shell下功能基本相同。
一个不带任何参数的指示符“export”指示符:
    export
含义是将此 Makefile 中定义的所有变量传递给子 make 过程。如果不需要传递其中的某一个变量,可以单独使用指示符“unexport”来声明这个变量。使用“export”将所
有定义的变量传递给子 Makefile 时,那些名字中包含其它字符(除字母、数字和下划线以外的字符)的变量可能不会被传递给子 make,对这类特殊命名的变量传递需要明
确的使用“export”指示符对它进行声明。虽然不带任何参数的“export”指示符具有特殊的含义,但是一个不带任何参数的“unexport”指示符却是没有任何意义的,它不会对 make 的执行过程(变量的传递)产生任何影响。

需要说明的是:单独使用“export”来导出所有变量的行为是老版本 GNU make所默认的。但是在新版本的 GNU make 中取消了这一默认的行为。因此在编写和老版本 GNU make 兼容的 Makefile 时,需要使用特殊目标“.EXPORT_ALL_VARIABLES”来代替“export”,此特殊目标的功和不带参数的“export”相同。它会被老版本的 make 忽略,只有新版本的 make 能够识别这个特殊目标。这是因为,老版本的 GNU make不能识别和解析指示符“export”。为了和老版本兼容我们可以这样声明一些变量:
    .EXPORT_ALL_VARIABLES:
    VARIABLE1=var1
    VARIABLE2=var2

这 对 不 同 版 本 的 make 来 说 都 是 兼 容 的 , 其 含 义 是 将 特 殊 目 标“.EXPORT_ALL_VARIABLES”依赖中的所有变量全部传递给子 make。和指示符“export”相似,也可以使用单独的“unexport”指示符来禁止一个变量的向下传递。这一动作是现行版本 make 所默认的,因此我们就没有必要在上层的Makefile 中使用它。在多级的 make 递归调用中,可以在中间的 Makefile 中使用它来限制上层传递来的变量再向下传递。需要明确的是,不能使用“export”或者“unexport”来实现对命令中使用变量的控制功能。就是说,不能做到用这两个指示符来限制某个(些)变量在执行特定命令时有效,而对于其它的命令则无效。在 Makefile 中,最后一个出现的指示符“export”或者“unexport”决定整个 make 运行过程中变量是否进行传递。

在多级递归调用的 make 执行过程中。变量“MAKELEVEL”代表了调用的深度。在 make 一级级的执行过程中变量“MAKELEVEL”的值不断的发生变化,通过它的值我们可以了解当前 make 递归调用的深度。最上一级时“MAKELEVEL”的值为“0”、下一级时为“1”、再下一级为“2”.......例如:Main 目录下的 Makefile 清单如下:
    #maindir Makefile
    .........
    .........
    .PHONY :test
    test:
    @echo “main makelevel = $(MAKELEVEL)”
    @$(MAKE) –C subdir dislevel
    #subdir Makefile
    ...........
    ...........
    .PHONY : test
    test :
    @echo “subdir makelevel = $(MAKELEVEL)”
在 maindir 目录下执行“make test”。将显式如下信息:
    main makelevel = 0
    make[1]: Entering directory `/...../ subdir '
    subdir makelevel = 1
    make[1]: Leaving directory `/...../ subdir '
在主控的 Makefile 中 MAKELEVEL 为“0”,而在 subdir 的 Makefile 中,MAKELEVEL 为“1”。
这个变量主要用在条件测试指令中。
例如:
我们可以通过测试此变量的值来决定是否执行递归方式的 make 调用或者其他方式的 make 调用。我们希望一个子目录必须被上层 make 调用才可以执行此目录下的 Makefile,而不允许直接在此目录下执行 make。我们可以这样实现:
    .......
    ifeq ($(MAKELEVEL),0)
    all : msg
    else
    all : other
    endif
    ......
    ......
    msg:
    @echo ”Can not make in this directory!”
    ......
    ......
当在包含次条件判断的 Makefile 所在的目录下执行 make 时,将会得到提示“Can not make in this directory!”

命令行选项和递归
在 make 的递归执行过程中。最上层(可以称之为主控)make 的命令行选项“-k”、“-s”等会被自动的通过环境变量“MAKEFLAGS”传递给子 make 进程。传递过程中变量
“MAKEFLAGS”的值会被主控 make 自动的设置为包含执行 make 时的命令行选项的字符串。如果在执行 make 时通过命令行指定了“-k”和“-s”选项,那么“MAKEFLAGS”的值会被自动设置为“ks”。子 make 进程在处理时,会把此环境变量的值作为执行的命令行参数,因此子 make 过程同样也会有“-k”和“-s”这两个命令行选项。同样,执行 make 时命令行中给定的一个变量定义(如“make CFLAGS+=-g”),此变量和它的值(CFLAGS+=-g)也会借助环境变量“MAKEFLAGS”传递给子 make进程。可以借助 make 的环境变量“MAKEFLAGS” 传递我们在主控 make 所使用的命令行选项给子 make 进程。需要注意的是有几个特殊的命令行选项例外,他们是:-C”、“-f”、“-o”和“-W”。这些命令行选项是不会被赋值给变量“MAKEFLAGS”的。Make 命令行选项中一个比较特殊的是“-j”选项。在支持这个选项的操作系统上,如果给它指定了一个数值“N”(多任务的系统 unix、Linux 支持,MS-DOS 不支持),那么主控 make 和子 make 进程会在执行过程中使用通信机制来限制系统在同一时刻(包括所有的递归调用的 make 进程,否则,将会导致 make 任务的数目数目无法控制而使别的任务无法到的执行)所执行任务的数目不大于“N”。另外,当使用的操作系统不能支持 make 执行过程中的父子间通信,那么无论在执行主控 make 时指定的任务数目“N”是多少,变量“MAKEFLAGS”中选项“-j”的数目会都被设置为“1”,通过这样来确保系统的正常运转。执行多级的 make 调用时,当不希望传递“MAKEFLAGS”的给子 make 时,需要在调用子 make 是对这个变量进行赋空。例如:
    subsystem:
    cd subdir && $(MAKE) MAKEFLAGS=
此规则取消了子 make 执行时对父 make 命令行选项的继承(将变量“MAKEFLAGS”的值赋为空)
执行make时可以通过命令行来定义一个变量,像上例中的那样;前边已经提到过,这种变量是借助环境“MAKEFLAGS”来传递给多级调用的子make进程的。其实真正的命令行中的 变量定义 是通过另外一个变量“MAKEOVRRIDES”记录的,在变量“MAKEFLAGS”的定义中引用了此变量,所以命令行中的变量定义被记录在环境变量“MAKEFLAGS”中被传递下去。当不希望上层make在命令行中定义的变量传递给子 make 时 , 可 以 在 上 层 Makefile 中 把 “ MAKEOVERRIDES ” 赋 空(MAKEOVERRIDES=)。但是这种方式通常很少使用,建议非万不得已您还是最好不使用这种方式(为了和POSIX2.0 兼容,当Makefile中出现“.POSIX”这个特殊的目标。时,在上层Makefile中修改量“MAKEOVERRIDES”对子make不会产生任何影响)另外,在一些系统中环境变量值的长度存在一个上限,一次当“MAKEFLAGS”的值超过一定长度时,执行过程可能会出现类似“Arg list too long”的错误提示。历 史 原 因 , 在 make 中 也 存 在 另 外 一 个 和 “ MAKEFLAGS ” 相 类 似 的 变 量“MFLAGS”。现行版本中保留此变量的原因是为了和老版本兼容。和
“MAKEFLAGS”同点是:1. 此变量在 make 的递归调用时不包含命令行选项中的变量定义部分(就是说此变量的定义没有包含对“MAKEOVERRIDES”的引用);2. 此变量的值(除为
空的情况)是以“-”开始的,而“MAKEFLAGS”的值只有在长命令选项格式(如:“--warn-undefined-variables”)时才以“-”开头。传统的此变量一般被明确的使用在
make 递归调用时的命令中。像下边那样:
    subsystem:
    cd subdir && $(MAKE) $(MFLAGS)
在现行的 make 版本中,变量“MFLAGS”已经成为一个多余部分。在书写和老版本make 兼容的 Makefile 时可能需要这个变量。当然它在目前的版本上也能够正常的工作。
在某些特殊的场合,可能需要为所有的make进程指定一个统一的命令行选项。比如说需要给所有的运行的make指定“-k”选项.
实现这个目的,我们可以在执行make之前设置一个系统环境变量(存在于当前系统的环境中)“MAKEFLAGS=k”,或者在主控Makefile中将它的值赋为“k”。注意:不能通过变量“MFLAGS”来实现。make 在执行时,首先将会对变量“MAKEFLAGS”的值(系统环境中或者在 Makefile中设置的)进行分析。当变量的值不是以连字符(“-”)开始时,将变量的值按字分开,字之间使用空格分开。将这些字作为命令行的选项对待(除了选项“-C”、“-f”、“-h”、“-o”和“-W”以及他们的长格式,如果其中包含无效的选项不会提示错误)。
最后需要说明的是:将“MAKEFLAGS”设置为系统环境变量的做法是不可取的!
因为这样一旦将一些调试选项或者特殊选项作为此变量值的一部分,在执行 make 时,会对 make 的正常执行产生潜在的影响。
例如如果变量“MAKEFLAGS”中包含选项“t”、“n”、“q”这三个的任何一个,当执行 make 的结果可能就不是你所要的。建议大家最好不要随便更改“MAKEFLAGS”的值,更不要把它设置为系统的环境变量来使用。否则可能会产生一些奇怪甚至让你感到不解的现象。 变量和递归
在 make 的递归执行过程中,上层 make 可以明确指定将一些变量的定义通过环境变量的方式传递给子 make 过程。没有明确指定需要传递的变量,上层 make 不会将其
所执行的 Makefile 中定义的变量传递给子 make 过程。使用环境变量传递上层所定义的变量时,上层所传递给子 make 过程的变量定义不会覆盖子 make 过程所执行makefile 文件中的同名变量定义。

如果子make过程所执行Makefile中存在同名变量定义,则上层传递的变量定义不会覆盖子Makefile中定义的值。就是说如果上层make传递的变量和子make所执行的Makefile中存在重复的变量定义,则以子Makefile中的变量定义为准。除非使用make的“-e”选项


上层 make 过程要将所执行的 Makefile 中的变量传递给子 make 过程,需要明确地指出。在 GNU make 中,实现此功能的指示符是“export”。当一个变量使用“export”进行声明后,变量和它的值将被加入到当前工作的环境变量中,以后在 make 执行的所有规则的命令都可以使用这个变量。而当没有使用指示符“export”对任何变量进行声明的情况下,上层 make 只将那些已经初始化的环境变量(在执行 make 之前已经存在的环境变量)和使用命令行指定的变量(如命令“make CFLAGS +=-g”或者“make –e CFLAGS +=-g”)传递给子 make 程序,通常这些变量由字符、数字和下划线组成。需要注意的是:有些 shell 不能处理那些名字中包含除字母、数字、下划线以外的其他字符的变量。


存在两个特殊的变量“SHELL”和“MAKEFLAGS”,对于这两个变量除非使用指示符“unexport”对它们进行声明,它们在整个 make 的执行过程中始终被自动的传递给所有的子 make。另外一个变量“MAKEFILES”,如果此变量有值(不为空)那么同样它会被自动的传递给子 make。在没有使用关键字“export”声明的变量,make 执行时它们不会被自动传递给子 make,因此下层 Makefile 中可以定义和上层同名的变量,不会引起变量定义冲突。需要将一个在上层定义的变量传递给子 make,应该在上层 Makefile 中使用指示符“export”对此变量进行声明。格式如下:
    export VARIABLE ...
当不希望将一个变量传递给子 make 时,可以使用指示符“unexport”来声明这个变量。
格式如下:
    unexport VARIABLE ...

以上两种格式,指示符“export”或者“unexport”的参数(变量部分),如果它是对一个变量或者函数的引用,这些变量或者函数将会被立即展开。并赋值给export或者unexport的变量,例如:
    Y=Z
    export X=$(Y)
其实就是“export X=Z”。export 时对变量进行展开,是为了保证传递给子 make 的变量值有效(使用当前 Makefile 中定义的变量值)。
“export”更方便的用法是在定义变量的同时对它进行声明。看下边的几个例子:
1.
    export VARIABLE = value
等效于:
    VARIABLE = value
    export VARIABLE

2.
    export VARIABLE := value
等效于:
    VARIABLE := value
    export VARIABLE
3.
    export VARIABLE += value
等效于:
    VARIABLE += value
    export VARIABLE
我们可以看到,其实在 Makefile 中指示符“export”和“unexport”的功能和在 shell下功能基本相同。
一个不带任何参数的指示符“export”指示符:
    export
含义是将此 Makefile 中定义的所有变量传递给子 make 过程。如果不需要传递其中的某一个变量,可以单独使用指示符“unexport”来声明这个变量。使用“export”将所
有定义的变量传递给子 Makefile 时,那些名字中包含其它字符(除字母、数字和下划线以外的字符)的变量可能不会被传递给子 make,对这类特殊命名的变量传递需要明
确的使用“export”指示符对它进行声明。虽然不带任何参数的“export”指示符具有特殊的含义,但是一个不带任何参数的“unexport”指示符却是没有任何意义的,它不会对 make 的执行过程(变量的传递)产生任何影响。

需要说明的是:单独使用“export”来导出所有变量的行为是老版本 GNU make所默认的。但是在新版本的 GNU make 中取消了这一默认的行为。因此在编写和老版本 GNU make 兼容的 Makefile 时,需要使用特殊目标“.EXPORT_ALL_VARIABLES”来代替“export”,此特殊目标的功和不带参数的“export”相同。它会被老版本的 make 忽略,只有新版本的 make 能够识别这个特殊目标。这是因为,老版本的 GNU make不能识别和解析指示符“export”。为了和老版本兼容我们可以这样声明一些变量:
    .EXPORT_ALL_VARIABLES:
    VARIABLE1=var1
    VARIABLE2=var2

这 对 不 同 版 本 的 make 来 说 都 是 兼 容 的 , 其 含 义 是 将 特 殊 目 标“.EXPORT_ALL_VARIABLES”依赖中的所有变量全部传递给子 make。和指示符“export”相似,也可以使用单独的“unexport”指示符来禁止一个变量的向下传递。这一动作是现行版本 make 所默认的,因此我们就没有必要在上层的Makefile 中使用它。在多级的 make 递归调用中,可以在中间的 Makefile 中使用它来限制上层传递来的变量再向下传递。需要明确的是,不能使用“export”或者“unexport”来实现对命令中使用变量的控制功能。就是说,不能做到用这两个指示符来限制某个(些)变量在执行特定命令时有效,而对于其它的命令则无效。在 Makefile 中,最后一个出现的指示符“export”或者“unexport”决定整个 make 运行过程中变量是否进行传递。

在多级递归调用的 make 执行过程中。变量“MAKELEVEL”代表了调用的深度。在 make 一级级的执行过程中变量“MAKELEVEL”的值不断的发生变化,通过它的值我们可以了解当前 make 递归调用的深度。最上一级时“MAKELEVEL”的值为“0”、下一级时为“1”、再下一级为“2”.......例如:Main 目录下的 Makefile 清单如下:
    #maindir Makefile
    .........
    .........
    .PHONY :test
    test:
    @echo “main makelevel = $(MAKELEVEL)”
    @$(MAKE) –C subdir dislevel
    #subdir Makefile
    ...........
    ...........
    .PHONY : test
    test :
    @echo “subdir makelevel = $(MAKELEVEL)”
在 maindir 目录下执行“make test”。将显式如下信息:
    main makelevel = 0
    make[1]: Entering directory `/...../ subdir '
    subdir makelevel = 1
    make[1]: Leaving directory `/...../ subdir '
在主控的 Makefile 中 MAKELEVEL 为“0”,而在 subdir 的 Makefile 中,MAKELEVEL 为“1”。
这个变量主要用在条件测试指令中。
例如:
我们可以通过测试此变量的值来决定是否执行递归方式的 make 调用或者其他方式的 make 调用。我们希望一个子目录必须被上层 make 调用才可以执行此目录下的 Makefile,而不允许直接在此目录下执行 make。我们可以这样实现:
    .......
    ifeq ($(MAKELEVEL),0)
    all : msg
    else
    all : other
    endif
    ......
    ......
    msg:
    @echo ”Can not make in this directory!”
    ......
    ......
当在包含次条件判断的 Makefile 所在的目录下执行 make 时,将会得到提示“Can not make in this directory!”

命令行选项和递归
在 make 的递归执行过程中。最上层(可以称之为主控)make 的命令行选项“-k”、“-s”等会被自动的通过环境变量“MAKEFLAGS”传递给子 make 进程。传递过程中变量
“MAKEFLAGS”的值会被主控 make 自动的设置为包含执行 make 时的命令行选项的字符串。如果在执行 make 时通过命令行指定了“-k”和“-s”选项,那么“MAKEFLAGS”的值会被自动设置为“ks”。子 make 进程在处理时,会把此环境变量的值作为执行的命令行参数,因此子 make 过程同样也会有“-k”和“-s”这两个命令行选项。同样,执行 make 时命令行中给定的一个变量定义(如“make CFLAGS+=-g”),此变量和它的值(CFLAGS+=-g)也会借助环境变量“MAKEFLAGS”传递给子 make进程。可以借助 make 的环境变量“MAKEFLAGS” 传递我们在主控 make 所使用的命令行选项给子 make 进程。需要注意的是有几个特殊的命令行选项例外,他们是:-C”、“-f”、“-o”和“-W”。这些命令行选项是不会被赋值给变量“MAKEFLAGS”的。Make 命令行选项中一个比较特殊的是“-j”选项。在支持这个选项的操作系统上,如果给它指定了一个数值“N”(多任务的系统 unix、Linux 支持,MS-DOS 不支持),那么主控 make 和子 make 进程会在执行过程中使用通信机制来限制系统在同一时刻(包括所有的递归调用的 make 进程,否则,将会导致 make 任务的数目数目无法控制而使别的任务无法到的执行)所执行任务的数目不大于“N”。另外,当使用的操作系统不能支持 make 执行过程中的父子间通信,那么无论在执行主控 make 时指定的任务数目“N”是多少,变量“MAKEFLAGS”中选项“-j”的数目会都被设置为“1”,通过这样来确保系统的正常运转。执行多级的 make 调用时,当不希望传递“MAKEFLAGS”的给子 make 时,需要在调用子 make 是对这个变量进行赋空。例如:
    subsystem:
    cd subdir && $(MAKE) MAKEFLAGS=
此规则取消了子 make 执行时对父 make 命令行选项的继承(将变量“MAKEFLAGS”的值赋为空)
执行make时可以通过命令行来定义一个变量,像上例中的那样;前边已经提到过,这种变量是借助环境“MAKEFLAGS”来传递给多级调用的子make进程的。其实真正的命令行中的 变量定义 是通过另外一个变量“MAKEOVRRIDES”记录的,在变量“MAKEFLAGS”的定义中引用了此变量,所以命令行中的变量定义被记录在环境变量“MAKEFLAGS”中被传递下去。当不希望上层make在命令行中定义的变量传递给子 make 时 , 可 以 在 上 层 Makefile 中 把 “ MAKEOVERRIDES ” 赋 空(MAKEOVERRIDES=)。但是这种方式通常很少使用,建议非万不得已您还是最好不使用这种方式(为了和POSIX2.0 兼容,当Makefile中出现“.POSIX”这个特殊的目标。时,在上层Makefile中修改量“MAKEOVERRIDES”对子make不会产生任何影响)另外,在一些系统中环境变量值的长度存在一个上限,一次当“MAKEFLAGS”的值超过一定长度时,执行过程可能会出现类似“Arg list too long”的错误提示。历 史 原 因 , 在 make 中 也 存 在 另 外 一 个 和 “ MAKEFLAGS ” 相 类 似 的 变 量“MFLAGS”。现行版本中保留此变量的原因是为了和老版本兼容。和
“MAKEFLAGS”同点是:1. 此变量在 make 的递归调用时不包含命令行选项中的变量定义部分(就是说此变量的定义没有包含对“MAKEOVERRIDES”的引用);2. 此变量的值(除为
空的情况)是以“-”开始的,而“MAKEFLAGS”的值只有在长命令选项格式(如:“--warn-undefined-variables”)时才以“-”开头。传统的此变量一般被明确的使用在
make 递归调用时的命令中。像下边那样:
    subsystem:
    cd subdir && $(MAKE) $(MFLAGS)
在现行的 make 版本中,变量“MFLAGS”已经成为一个多余部分。在书写和老版本make 兼容的 Makefile 时可能需要这个变量。当然它在目前的版本上也能够正常的工作。
在某些特殊的场合,可能需要为所有的make进程指定一个统一的命令行选项。比如说需要给所有的运行的make指定“-k”选项.
实现这个目的,我们可以在执行make之前设置一个系统环境变量(存在于当前系统的环境中)“MAKEFLAGS=k”,或者在主控Makefile中将它的值赋为“k”。注意:不能通过变量“MFLAGS”来实现。make 在执行时,首先将会对变量“MAKEFLAGS”的值(系统环境中或者在 Makefile中设置的)进行分析。当变量的值不是以连字符(“-”)开始时,将变量的值按字分开,字之间使用空格分开。将这些字作为命令行的选项对待(除了选项“-C”、“-f”、“-h”、“-o”和“-W”以及他们的长格式,如果其中包含无效的选项不会提示错误)。
最后需要说明的是:将“MAKEFLAGS”设置为系统环境变量的做法是不可取的!
因为这样一旦将一些调试选项或者特殊选项作为此变量值的一部分,在执行 make 时,会对 make 的正常执行产生潜在的影响。
例如如果变量“MAKEFLAGS”中包含选项“t”、“n”、“q”这三个的任何一个,当执行 make 的结果可能就不是你所要的。建议大家最好不要随便更改“MAKEFLAGS”的值,更不要把它设置为系统的环境变量来使用。否则可能会产生一些奇怪甚至让你感到不解的现象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值