Windows下递归nmake的错误码传递问题
解决Windows下递归nmake子目录构建失败时外层返回0的问题
你当前的递归Makefile中,子目录的nmake执行失败时外层始终返回0,核心原因有两个:
- 命令开头的
-是nmake的错误忽略标记,会让nmake无视整个for命令的退出状态 - 循环内的
&&连接逻辑导致子make失败时后续命令不执行,但错误无法传递到外层nmake
简化修改方案
直接调整命令逻辑,去掉错误忽略标记,用pushd/popd保证目录切换安全,并在子make失败时立即返回错误码:
MODULES = admin char mailnews merintr intro dm chess all: @for %i in ($(MODULES)) do @( if EXIST %i ( pushd %i $(MAKE) /$(MAKEFLAGS) || (popd && exit /b %ERRORLEVEL%) popd ) )
更健壮的版本(支持捕获具体错误码)
如果需要保留子make的具体错误码并传递到外层,可以启用延迟环境变量扩展:
MODULES = admin char mailnews merintr intro dm chess all: @setlocal enabledelayedexpansion @set ERR_CODE=0 @for %i in ($(MODULES)) do @( if EXIST %i ( pushd %i $(MAKE) /$(MAKEFLAGS) if !ERRORLEVEL! neq 0 ( set ERR_CODE=!ERRORLEVEL! popd exit /b !ERR_CODE! ) popd ) ) @exit /b %ERR_CODE%
关键修改点说明
- 移除了命令前的
-:让nmake不再忽略整个for命令的错误状态,外层会感知到子命令的退出码 - 使用
pushd/popd替代cd:避免因目录切换失败导致后续命令在错误目录执行,同时确保执行后回到原目录 - 错误捕获逻辑:通过
||或检查ERRORLEVEL,在子make失败时立即终止循环并返回错误码,保证外层nmake能拿到正确的非零退出码
内容的提问来源于stack exchange,提问作者Andrew Kirmse
相关产品推荐
相关产品推荐

