Solaris 11.4下Makefile遇Unexpected EOL错误,拒绝使用gmake求解
Solaris 11.4原生make执行Makefile报错的解决办法(无需gmake)
问题场景
在Solaris 11.4系统中使用原生make执行给定Makefile时,触发错误:
make: Fatal error in reader: Makefile, line 18: Unexpected end of line seen
用户不愿改用gmake,且尝试make -x SUN_MAKE_COMPAT_MODE=GNU test后仍报错,需原生make兼容的解决方案。
错误原因
报错根源在test目标的变量传递行:Solaris原生make对引号的解析逻辑与GNU make完全不同,EXTRA_CFLAGS="-DDEBUG"这种带引号的赋值写法会被判定为语法错误,导致解析中断。
解决步骤
1. 修正test目标的变量传递语法
将原test目标中的带引号赋值改为原生make兼容的形式,直接去掉引号即可(因-DDEBUG无空格等特殊字符,无需引号):
test: $(MAKE) EXTRA_CFLAGS=-DDEBUG $(TEST_TARGET) ./$(TEST_TARGET) --verbose=3
若后续需传递含空格的CFLAGS参数,可改用环境变量导出的方式:
test: EXTRA_CFLAGS="-DDEBUG -O0" ; export EXTRA_CFLAGS; $(MAKE) $(TEST_TARGET) ./$(TEST_TARGET) --verbose=3
2. 确保命令行缩进为硬制表符
Solaris原生make要求所有命令行必须用**硬制表符(Tab)**缩进,不能用空格替代。检查Makefile中所有命令行(如$(AR) rcs $@ $(TARGET).o等行)的缩进是否为Tab,避免因空格缩进引发其他语法错误。
修改后的完整Makefile
CFLAGS += -std=c11 CFLAGS += -fPIC CFLAGS += -Wall CFLAGS += -Wextra CFLAGS += -Werror CFLAGS += -Wwrite-strings CFLAGS += -Wno-unused-variable CFLAGS += -Wno-parentheses CFLAGS += -Wpedantic CFLAGS += -Warray-bounds CFLAGS += -Wno-unused-function CFLAGS += -Wstrict-prototypes CFLAGS += -Wdeprecated CFLAGS += $(EXTRA_CFLAGS) TARGET := arena TEST_TARGET := tests SLIB_TARGET := libarena.a DLIB_TARGET := libarena.so RM := /bin/rm -f static: $(SLIB_TARGET) $(SLIB_TARGET): $(TARGET).o $(AR) rcs $@ $(TARGET).o shared: $(DLIB_TARGET) $(DLIB_TARGET): $(TARGET).o $(CC) $(CFLAGS) $(TARGET).o -o $@ $(LDFLAGS) -shared test: $(MAKE) EXTRA_CFLAGS=-DDEBUG $(TEST_TARGET) ./$(TEST_TARGET) --verbose=3 clean: $(RM) $(TEST_TARGET) $(TARGET).o $(SLIB_TARGET) $(DLIB_TARGET) .PHONY: release debug static shared test clean .DELETE_ON_ERROR:
内容的提问来源于stack exchange,提问作者Madagascar
相关产品推荐
相关产品推荐

