我试图构建 Sather 编译器,一切进展顺利,但在执行 make 时出现此错误:
Creating C for installation compiler...
Boot/sacomp -verbose -O_fast -O_no_move_while -O_no_hoist_const -O_no_cse -only_reachable Compiler/sacomp.module -o Bin/sacomp -only_C
/usr/local/src/sather-1.2.3/System/Common/CONFIG:1:error, expected an UID followed by a ':'
make: *** [Makefile:130 : compiler] Erreur 255
这似乎不是一个依赖性问题(我认为我已经安装了它们)。以下是整个输出,希望对您有所帮助(抱歉我的电脑是法语的):
make[1] : on entre dans le répertoire « /usr/local/src/sather-1.2.3/System/Common »
make[1]: rien à faire pour « all ».
make[1] : on quitte le répertoire « /usr/local/src/sather-1.2.3/System/Common »
Making serial library: System Socket
Containers
Making platform BOOT...
make[1] : on entre dans le répertoire « /usr/local/src/sather-1.2.3/System/Platforms/BOOT »
make[1]: rien à faire pour « all ».
make[1] : on quitte le répertoire « /usr/local/src/sather-1.2.3/System/Platforms/BOOT »
Making platform linux...
make[1] : on entre dans le répertoire « /usr/local/src/sather-1.2.3/System/Platforms/linux »
make[1]: rien à faire pour « all ».
make[1] : on quitte le répertoire « /usr/local/src/sather-1.2.3/System/Platforms/linux »
Making boot compiler...
make -C System/Platforms/linux boot CC='gcc'
make[1] : on entre dans le répertoire « /usr/local/src/sather-1.2.3/System/Platforms/linux »
ln -sf `pwd`/header.h ../BOOT
make -C /usr/local/src/sather-1.2.3/Boot/sacomp.code CC=gcc
make[2] : on entre dans le répertoire « /usr/local/src/sather-1.2.3/Boot/sacomp.code »
make[2]: « ../sacomp » est à jour.
make[2] : on quitte le répertoire « /usr/local/src/sather-1.2.3/Boot/sacomp.code »
rm -f ../BOOT/header.h
make[1] : on quitte le répertoire « /usr/local/src/sather-1.2.3/System/Platforms/linux »
Creating C for installation compiler...
Boot/sacomp -verbose -O_fast -O_no_move_while -O_no_hoist_const -O_no_cse -only_reachable Compiler/sacomp.module -o Bin/sacomp -only_C
/usr/local/src/sather-1.2.3/System/Common/CONFIG:1:error, expected an UID followed by a ':'
make: *** [Makefile:130 : compiler] Erreur 255
任何帮助,或者在 Ubuntu 上安装 Sather 的更简单的方法
答案1
问题似乎是,另一个 System/Common/Makefile 使用 C 预处理器将cpp
CONFIG.proto 预处理为 CONFIG。由于cpp
不知道预期的输出是sather
而不是C
,它会处理并在 CONFIG 文件的开头插入标准头文件 /usr/include/stdc-predef.h,您可以通过以下方式验证
cpp -dI System/Common/CONFIG.proto | head
因为 make 变量CPP
在顶层 Makefile 中定义为CPP=/lib/cpp -C -P
,所以输入文件中的注释不会被隐藏。因此 CONFIG 文件的/* C-style */
顶部最终会出现一个很大的注释块,这显然会阻塞sather
解析器(它显然希望注释以 开头-
)。
stdc-predef.h 的包含似乎是在 GCC 4.8 中引入的,强制向后兼容的推荐方法是使用此选项-ffreestanding
(尽管此选项似乎没有在 cpp 手册页中记录):
make clean
make CPP='cpp -ffreestanding -C -P'
然后你应该能够执行./Bin/sacomp
如下操作
SATHER_HOME=. ./Bin/sacomp
There is no class named MAIN.
(大概它希望给出一个或多个源文件的名称)。