Makefile: Makefile中的-I

本文详细解释了Makefile中IDIR和includemakefile选项的作用,通过实例展示了如何使用这些选项从指定目录包含其他Makefile文件,以及在实际操作中的应用步骤。

书上是这样解释的:

-I DIR 当包含其他 makefile 文件时,可利用该选项指定搜索目录

读了好多遍都没有懂,结果使我浮想联翩,最后在老师我指导下明白了:

指定目录下(如tmp)的makefile(或者其他名字)在当前Makefile中要有这样一句:include makefile,然后makefile -I tmp时就会在在tmp下找Makefile并把里边的内容添加到当前目录下的Makefile中。

当前目录下的Makefile:

OBJ=main.o fun1.o fun2.o
CC=gcc
CFLAGS=-DDBG

hello: $(OBJ)
	gcc $^ -o hello

include Makefile

tmp目录下的Makefile:

clean:
	rm *.o hello
install:
	cp hello /usr/bin
uninstall:
	rm /usr/bin/hello

在当前目录下执行:

[root@localhost makefile]# make clean
makefile:8: Makefile: 没有那个文件或目录
make: *** 没有规则可以创建目标“Makefile”。 停止。
但是加上这个-I tmp后:

[root@localhost makefile]# make clean -I tmp
rm *.o hello
rm: 无法删除"*.o": 没有那个文件或目录
rm: 无法删除"hello": 没有那个文件或目录
make: *** [clean] 错误 1
[root@localhost makefile]# 

就可以了,是因为它把这个/tmp/Makefile中的内容拷贝到当前目录下的Makefile中了。



你执行了 `make clean`,但输出提示: ``` Makefile:8: "Usage - make PRODUCT_NAME=xxx target(s)" Makefile:9: "PRODUCT_NAME - c9v1_un " Makefile:10: "Targets - toolchain iplatform_prep sdk iplatform firmware platform " Makefile:11: *** "PRODUCT_NAME is must required for any target building in Makefile!"。 停止。 ``` --- ## 🔍 问题分析 这个错误说明:**你的 Makefile 要求必须通过命令行指定 `PRODUCT_NAME` 变量才能运行任何目标(包括 `clean`)**。 虽然 `clean` 通常是清理操作、不需要配置,但这个项目的 Makefile 写得比较严格 —— **所有目标都依赖于 `PRODUCT_NAME` 是否设置**。 从提示看: - 支持的产品名是:`c9v1_un` - 可用目标有:`toolchain`, `iplatform_prep`, `sdk`, `iplatform`, `firmware`, `platform` - 必须格式:`make PRODUCT_NAME=xxx 目标` 但它连 `make clean` 都不允许跳过 `PRODUCT_NAME`! --- ## ✅ 解决方案:在 `make clean` 时也指定 `PRODUCT_NAME` ### ✔️ 正确命令如下: ```bash make PRODUCT_NAME=c9v1_un clean ``` ✅ 这样就能绕过 Makefile 的检查,成功执行清理。 --- ## 📌 补充说明 你可以查看 Makefile 第 8~11 行的内容(用 `head -15 Makefile | cat -n` 查看),大概逻辑是这样的: ```makefile ifndef PRODUCT_NAME $(warning Usage - make PRODUCT_NAME=xxx target(s)) $(warning PRODUCT_NAME - c9v1_un ) $(warning Targets - toolchain iplatform_prep sdk iplatform firmware platform ) $(error "PRODUCT_NAME is must required for any target building in Makefile!") endif ``` 所以无论你执行什么目标(哪怕是 `clean`),只要没传 `PRODUCT_NAME`,就会报错退出。 --- ## ✅ 后续编译示例 清理完成后,如果你想继续构建其他目标,也要带上 `PRODUCT_NAME`: ```bash # 编译 iplatform 模块 make PRODUCT_NAME=c9v1_un iplatform # 编译整个固件 make PRODUCT_NAME=c9v1_un firmware # 并行加速编译 make PRODUCT_NAME=c9v1_un firmware -j$(nproc) ``` --- ## 💡 提示建议 如果你经常使用同一个产品型号,可以写一个简单的 shell 脚本或别名来简化命令。 ### 方法 1:设置别名(临时) ```bash alias m='make PRODUCT_NAME=c9v1_un' ``` 然后就可以这样用了: ```bash m clean m iplatform m firmware ``` ### 方法 2:创建 `Makefile.local` 或 `build.sh` ```bash #!/bin/bash export PRODUCT_NAME=c9v1_un exec make "$@" ``` 保存为 `build.sh`,然后: ```bash chmod +x build.sh ./build.sh clean ./build.sh firmware ``` --- ## ✅ 总结 | 问题 | 原因 | |------|------| | `make clean` 报错 | Makefile 强制要求定义 `PRODUCT_NAME` | | 提示“must required” | 是 Makefile 中的 `$(error ...)` 导致中断 | | 正确做法 | 使用:`make PRODUCT_NAME=c9v1_un clean` | |----------|----------------------------------------| --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

袁保康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值