使用erlang.mk构建项目时,已存在文件无法被脚本检测到的问题
问题排查方案
针对你遇到的deps.log文件实际存在但Make脚本无法检测到的问题,以下是几个核心排查方向和验证步骤:
1. 检查Make并行执行导致的时序问题
如果构建时使用了make -j(并行构建),可能出现deps.log还未被创建完成,检测脚本就已执行的情况。作为子模块构建时,依赖顺序被强制串行,所以不会触发该问题。
- 验证方法:执行
make -j1 deps(强制串行构建),看是否还会报错。
2. 排查文件名是否包含隐藏字符
有可能deps.log的文件名存在不可见字符(如换行、空格、制表符),导致脚本里的文件名和实际不匹配:
- 在项目目录下执行:
ls -b .erlang.mk/,查看输出的deps.log是否有转义的特殊字符(比如deps.log$代表末尾有换行); - 或者用
cat -A .erlang.mk/deps.log查看文件名是否异常。
3. 检查安全模块的访问限制
SELinux或AppArmor这类安全模块可能会限制make进程访问特定文件:
- 临时关闭SELinux验证:执行
sudo setenforce 0,再重新运行make; - 如果问题消失,需要为该目录添加SELinux访问规则。
4. 确认文件是否在检测前被意外删除
检查erlang.mk中是否有其他Recipe步骤(比如清理、预构建步骤)在检测deps.log前删除了该文件:
- 在检测脚本前添加
stat $(ERLANG_MK_TMP)/deps.log;\,查看文件的状态变化; - 或者在Makefile中添加
--debug参数执行make --debug deps,追踪执行顺序和文件操作。
5. 验证文件系统的同步问题
如果项目目录位于NFS、tmpfs或其他网络/内存文件系统,可能存在文件系统同步延迟:
- 尝试将项目复制到本地磁盘(如
/home下的非挂载目录),重新构建测试; - 在检测前添加
sync命令强制文件系统同步:sync;\。
内容的提问来源于stack exchange,提问作者forrealthough
相关产品推荐
相关产品推荐

