如何让GNU Make执行include mk/*.mk时,空mk目录不报错?
解决GNU Make空目录
include mk/*.mk报错问题 环境信息
- OS:Mac
- Make:4.3
问题背景
我有一个基于GNU Make的环境配置项目,可借助终端自动补全和清晰命令名完成、修复或程序化执行重复CLI任务。项目根目录的Makefile中定义了适用于开发环境的元命令,同时引入mk目录下所有*.mk文件。该架构支持将Makefile复制到用户主目录使用,但即使创建了mk目录,也必须先创建一个dummy.mk文件,否则执行include mk/*.mk会报错。希望找到简洁干净的方案,无需初始化mk/dummy.mk文件即可解决该问题。
项目结构
├── makefile ├── mk │ ├── get.mk │ ├── notes.mk │ └── setup.mk └── readme.md
当前~/dev-env/mk/setup.mk内容
setup-make: mkdir -p ~/mk touch ~/mk/add-tgts-here.mk # <= 能否移除这一步 cat makefile >> ~/makefile # 采用追加模式更安全
当前~/dev-env/makefile内容
include mk/*.mk # <= 不复杂实现该需求 foo: echo $@ bar: echo $@
解决方案
方案1:使用wildcard函数简化处理
GNU Make的wildcard函数会返回匹配指定模式的文件列表,若没有匹配项则返回空字符串。将原include语句修改为:
include $(wildcard mk/*.mk)
当mk目录为空时,wildcard mk/*.mk返回空,include指令处理空内容不会触发报错,无需创建任何dummy文件即可解决问题。
方案2:条件判断明确控制include(兼容旧版Make)
如果需要兼容更早版本的Make(你的4.3版本已支持wildcard,此方案可选),可以通过条件判断仅在存在.mk文件时执行include:
ifneq ($(wildcard mk/*.mk),) include mk/*.mk endif
这种方式逻辑更清晰,空目录时会跳过include操作,同样避免报错。
优化setup-make目标
修改后的setup.mk可以移除创建dummy文件的步骤:
setup-make: mkdir -p ~/mk cat makefile >> ~/makefile # 采用追加模式更安全
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

