Makefile设置PATH后@前缀失效,shell命令执行报错求助
解决Makefile中连续命令块的@前缀错误
问题原因
你遇到的@cd: not found错误,核心原因是**@是Make的语法,不是shell的语法**。当你用\将多行命令连接成一个连续的shell命令块时,每一行的@都会被原封不动传递给shell,而shell无法识别@作为命令前缀,因此报错。
Make中的@作用是抑制Make本身打印该命令行,而非控制shell的输出。对于用&& \连接的连续命令块,只需在整个块的第一行开头加一个@即可,后续行无需重复添加。
解决方案
移除连续shell命令块中的多余@,仅保留第一行的@,让整个命令块作为一个整体被shell执行,同时通过单个@抑制Make打印命令行。
修正后的代码示例
%-build-glibc: @echo "Building glibc" @mkdir -p $(DIR_BUILD)/glibc @export PATH=$(PATH):$(DIR_INSTALL)/bin && \ cd $(DIR_BUILD)/glibc && \ $(call cmd,$(DIR_BUILD)/glibc-$(VER_GLIBC)/configure \ --host=$(TARGET_MACH) \ --prefix=/usr \ --libdir=/usr/lib \ --with-headers=$(DIR_SYSROOT)/usr/include \ --enable-bind-now \ --enable-kernel=$(VER_LINUX) \ --enable-stack-protector=strong \ --disable-profile \ --disable-werror \ libc_cv_c_cleanup=yes \ libc_cv_ctors_header=yes \ libc_cv_forced_unwind=yes \ libc_cv_slibdir=/lib \ CFLAGS="-O2") && \ $(call cmd,make -k install-headers cross_compiling=yes install_root=$(DIR_SYSROOT)) && \ $(call cmd,make -j8) && \ $(call cmd,make install install_root=$(DIR_SYSROOT))
额外说明
如果你的cmd宏本身包含@或负责处理输出抑制,需确认宏定义是否会和外层@冲突,但当前错误的直接诱因就是连续命令块中重复的@被传递给shell,移除这些多余@即可解决问题。
内容的提问来源于stack exchange,提问作者Daniel Nunez
相关产品推荐
相关产品推荐

