You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 23:50:31