make参数简介

“-b”
“-m”
这两个参数的作用是忽略和其它版本make的兼容性。

“-B”
“--always-make”
认为所有的目标都需要更新(重编译)。

“-C <dir>”
“--directory=<dir>”
指定读取makefile的目录。如果有多个“-C”参数,make的解释是后面的路径以前面的作为相对路径,并以最后的目录作为被指定目录。如:“make –C ~hchen/test –C prog”等价于“make –C ~hchen/test/prog”。

“—debug[=<options>]”
输出make的调试信息。它有几种不同的级别可供选择,如果没有参数,那就是输出最简单的调试信息。下面是<options>的取值:
    a —— 也就是all,输出所有的调试信息。(会非常的多)
    b —— 也就是basic,只输出简单的调试信息。即输出不需要重编译的目标。
    v —— 也就是verbose,在b选项的级别之上。输出的信息包括哪个makefile被解析,不需要被重编译的依赖文件(或是依赖目标)等。
    i —— 也就是implicit,输出所以的隐含规则。
    j —— 也就是jobs,输出执行规则中命令的详细信息,如命令的PID、返回码等。
    m —— 也就是makefile,输出make读取makefile,更新makefile,执行makefile的信息。

“-d”
相当于“--debug=a”。

“-e”
“--environment-overrides”
指明环境变量的值覆盖 makefile中定义的变量的值。

“-f=<file>”
“--file=<file>”
“--makefile=<file>”
指定需要执行的makefile。

“-h”
“--help”
显示帮助信息。

“-i”
“--ignore-errors”
在执行时忽略所有的错误。

“-I <dir>”
“--include-dir=<dir>”
指定一个被包含makefile的搜索目标。可以使用多个“-I”参数来指定多个目录。

“-j [<jobsnum>]”
“--jobs[=<jobsnum>]”
指同时运行命令的个数。如果-j后没有这个jobsnum参数,make运行命令时能运行多少就运行多少。如果有一个以上的“-j”参数,那么仅最后一个“-j”才是有效的。(注意这个参数在MS-DOS中是无用的)

“-k”
“--keep-going”
出错也不停止运行。如果生成一个目标失败了,那么依赖于其上的目标就不会被执行了。

“-l <load>”
“--load-average[=<load]”
“—max-load[=<load>]”
指定make运行命令的负载。

“-n”
“--just-print”
“--dry-run”
“--recon”
仅输出执行过程中的命令序列,但并不执行。

“-o <file>”
“--old-file=<file>”
“--assume-old=<file>”
不重新生成的指定的<file>,即使这个目标的依赖文件新于它。

“-p”
“--print-data-base”
输出makefile中的所有数据,包括所有的规则和变量。这个参数会让一个简单的makefile都会输出一堆信息。如果你只是想输出信息而不想执行makefile,你可以使用“make -qp”命令。如果你想查看执行makefile前的预设变量和规则,你可以使用“make –p –f /dev/null”。这个参数输出的信息会包含着你的makefile文件的文件名和行号,所以,用这个参数来调试你的makefile会是很有用的,特别是当你的环境变量很复杂的时候。

“-q”
“--question”
不运行命令,也不输出。仅仅是检查所指定的目标是否需要更新。如果是0则说明要更新,如果是2则说明有错误发生。

“-r”
“--no-builtin-rules”
禁止make使用任何隐含规则。

“-R”
“--no-builtin-variabes”
禁止make使用任何作用于变量上的隐含规则。

“-s”
“--silent”
“--quiet”
在命令运行时不输出命令的输出。

“-S”
“--no-keep-going”
“--stop”
取消“-k”选项的作用。因为有些时候,make的选项是从环境变量“MAKEFLAGS”中继承下来的。所以你可以在命令行中使用这个参数来让环境变量中的“-k”选项失效。

“-t”
“--touch”
相当于UNIX的touch命令,只是把目标的修改日期变成最新的,也就是阻止生成目标的命令运行。

“-v”
“--version”
输出make程序的版本、版权等关于make的信息。

“-w”
“--print-directory”
输出运行makefile之前和之后的信息。这个参数对于跟踪嵌套式调用make时很有用。

“--no-print-directory”
禁止“-w”选项。

“-W <file>”
“--what-if=<file>”
“--new-file=<file>”
“--assume-file=<file>”
假定目标<file>需要更新,如果和“-n”选项使用,那么这个参数会输出该目标更新时的运行动作。如果没有“-n”那么就像运行UNIX的 “touch”命令一样,使得<file>的修改时间为当前时间。

“--warn-undefined-variables”
只要make发现有未定义的变量,那么就输出警告信息

 

原文地址:http://blog.163.com/pirates_fish/blog/static/1833331502011322104120446/

### 通过 `make` 命令传递参数的机制与执行流程 #### 1. **Make参数传递机制** 在 GNU Make 中,可以通过命令行直接为变量赋值。这种赋值方式会在构建过程中生效,并覆盖 Makefile 中可能存在的同名变量默认值[^1]。 例如,在构建特定板级支持包(Board Support Package, BSP)时,常见的做法是通过以下形式传递参数: ```bash make BOARD=j784s4_evm CORE=mcu1_0 BUILD_PROFILE=release COMPILE_MODE=LockStep TARGET=sbl_ospi_img ``` 上述命令中: - `BOARD=j784s4_evm`: 设置目标开发板型号。 - `CORE=mcu1_0`: 指定核心编号。 - `BUILD_PROFILE=release`: 定义构建配置为发布版。 - `COMPILE_MODE=LockStep`: 启用锁步模式编译。 - `TARGET=sbl_ospi_img`: 明确最终生成的目标文件。 这些参数会被解析并应用到 Makefile 的规则和条件语句中。 --- #### 2. **Make 执行流程详解** ##### (1)**读取 Makefile 和环境初始化** 当运行 `make` 命令时,工具会自动查找当前目录下的 `Makefile` 或 `makefile` 文件。如果没有找到,则终止执行并提示错误。如果找到了,则继续解析其中的内容[^2]。 在此阶段,Make 会将命令行上传递的参数(如 `BOARD`, `CORE` 等)注入到内部环境中。这使得开发者能够在 Makefile 中访问这些变量,用于控制不同的构建行为。 示例片段: ```makefile # 默认值定义 BOARD ?= default_board CORE ?= mcu_default BUILD_PROFILE ?= debug # 判断 BUILD_PROFILE 并设置相应标志 ifeq ($(BUILD_PROFILE), release) CFLAGS += -O3 -DNDEBUG else ifeq ($(BUILD_PROFILE), debug) CFLAGS += -g endif ``` 在这里,`?=` 运算符表示仅在变量未被定义的情况下赋予默认值。因此,命令行上的参数优先级高于 Makefile 内部的默认值。 --- ##### (2)**解析目标及其依赖关系** 一旦 Makefile 加载完毕,工具会根据指定的目标(如 `sbl_ospi_img`)解析其依赖树。这个过程包括: - 寻找目标对应的规则。 - 检查目标是否存在以及是否需要更新。 - 如果目标缺失或过期,则触发相关规则重新生成。 假设目标 `sbl_ospi_img` 的规则如下: ```makefile sbl_ospi_img: bootloader.o kernel.o drivers.o @echo "Linking final image..." @gcc -o $@ $^ -lpthread ``` 此时,Make 会依次验证 `bootloader.o`, `kernel.o`, `drivers.o` 是否已存在且是最新的。如果不满足条件,则递归调用对应规则进行编译。 --- ##### (3)**执行构建任务** 对于每个待处理的目标,Make 会按照规则中的指令逐步执行。例如,针对 `.c` 文件转 `.o` 文件的操作,可能会有类似的规则: ```makefile %.o: %.c @echo "Compiling $< into $@" @gcc $(CFLAGS) -c $< -o $@ ``` 此处 `$<` 表示第一个前置依赖项(即源文件),而 `$@` 是指代目标本身(即对象文件)。通过这种方式,Make 自动完成了从源代码到二进制文件的转换。 --- #### 3. **多线程加速 (`-j`)** 为了充分利用现代多核 CPU 的性能,可以使用 `-j` 参数启用并发构建。例如: ```bash make -j4 BOARD=j784s4_evm ... ``` 这里的数字 `4` 表示最多允许同时运行 4 个子进程。若省略具体数值,则默认使用所有可用的核心数[^3]。 注意:虽然增加线程数量通常能缩短总耗时,但也可能导致资源竞争问题(如 I/O 瓶颈)。因此建议根据实际硬件配置合理调整该值。 --- #### 4. **特殊场景下的扩展功能** 在某些复杂项目中,除了基本的参数外,还可能涉及其他高级特性,例如: - **条件编译**: 根据 `BOARD` 或 `CORE` 的不同值切换头文件路径、库链接选项等。 - **动态加载模块**: 当 `M` 被选作某功能的状态时,将其独立打包为 .ko 文件以便后期插入内核[^4]。 - **自定义脚本集成**: 在构建前后执行额外的 Python/Shell 脚本来完成清理、测试等工作。 --- ### 总结 综上所述,借助 `make` 命令的强大灵活性,用户不仅能够轻松定制各种构建参数,还能高效管理大型项目的依赖链条。无论是简单的小型应用程序还是复杂的嵌入式系统固件,都能从中受益匪浅。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值