GNU make manual 翻译( 一百四十六)
继续翻译
5.7.3 Communicating Options to a Sub-`make' ------------------------------------------- Flags such as `-s' and `-k' are passed automatically to the sub-`make' through the variable `MAKEFLAGS'. This variable is set up automatically by `make' to contain the flag letters that `make' received. Thus, if you do `make -ks' then `MAKEFLAGS' gets the value `ks'. As a consequence, every sub-`make' gets a value for `MAKEFLAGS' in its environment. In response, it takes the flags from that value and processes them as if they had been given as arguments. *Note Summary of Options: Options Summary. Likewise variables defined on the command line are passed to the sub-`make' through `MAKEFLAGS'. Words in the value of `MAKEFLAGS' that contain `=', `make' treats as variable definitions just as if they appeared on the command line. *Note Overriding Variables: Overriding. The options `-C', `-f', `-o', and `-W' are not put into `MAKEFLAGS'; these options are not passed down. The `-j' option is a special case (*note Parallel Execution: Parallel.). If you set it to some numeric value `N' and your operating system supports it (most any UNIX system will; others typically won't), the parent `make' and all the sub-`make's will communicate to ensure that there are only `N' jobs running at the same time between them all. Note that any job that is marked recursive (*note Instead of Executing Recipes: Instead of Execution.) doesn't count against the total jobs (otherwise we could get `N' sub-`make's running and have no slots left over for any real work!) If your operating system doesn't support the above communication, then `-j 1' is always put into `MAKEFLAGS' instead of the value you specified. This is because if the `-j' option were passed down to sub-`make's, you would get many more jobs running in parallel than you asked for. If you give `-j' with no numeric argument, meaning to run as many jobs as possible in parallel, this is passed down, since multiple infinities are no more than one.
5.7.3 向子make通信的选项
-------------------------------------------
诸如 -s 或者 -k 这样的标志会通过变量 MAKEFLAGS自动地传递到子make中。这个变量是由make自动设置的,用来包含make所接受到的标志。因此如果你使用的 make -ks ,那么MKAKEFLAGS中就包含了值ks。
作为一个序列,每一个子make在其环境中获得一个MAKEFLAGS的值。作为回应,它拿到这些标志,然后处理它们,就好像它们作为参数一般。*Note Summary of Options: Options Summary
类似的,在命令行中的定义的变量会通过 MAKEFLAGS 传递到子make中。对于在MAKEFLAGS中包含 = 的单词,make 把它当作变量定义对待,就如同从命令行中出现一样。 *Note Overriding Varaables:Overriding
选项 -C ,-f ,-o 和 -W 不会放到 MAKEFLAGS里,这些选项不会向下传递。
-j选项是一个特殊的情况(*note Parallel Execution: Parallel.) 如果你把它设置为某些数值N并且你的操作系统支持这么做(很多UNIX系统支持,但是其他系统不会),父make和所有的子make将会通信以确保只有N个任务在所有make之间同时运行。
请注意任何被标记为 递归(*note Instead of Executing Recipes: Instead of Execution.)的任务不会记入到总的任务数(否则我们没有办法获得'N'个 子make 运行并且会没有槽留给剩下的真正的工作)中。
如果你的操作系统不支持这种通信,那么 -j1 而不是你指定的值将会总是传递给 MAKEFLAGS里。这是因为 如果-j 选项向下传递到 子make里, 你会获得比你请求的还要夺得任务并行执行。如果你给出没有参数的 -j,意味着尽可能地并行运行任务,这会被传递下去,因为多个无穷大也未必大过一个无穷大。
后文待续