构建 GCC-Ada,使用非常旧的 gnatmake 编译 s-excmac.adb 时出现语法错误

Building GCC-Ada, Syntax error compiling s-excmac.adb with very old gnatmake

我正在尝试更新我们已有 20 年历史的 Ada 编译器,但是您需要一个 Ada 编译器来构建 GCC+Ada (9.2.0) 的某些部分。

gnatmake 大约是 2000 年,它可能在调用 GCC 2.8.1。 感叹

我已经成功构建了 GCC 的几个 Ada 部分,但是这个 libgnat/ 文件让我望而却步:

正在编译libgnat/s-excmac.adb:

$ gnatmake s-excmac.adb
gcc -c -gnatpg s-excmac.adb
s-excmac.ads:134:44: identifier expected
gnatmake: "s-excmac.adb" compilation error

所以 s-excmac.ads 中有问题的行是:

   type GCC_Exception_Access is access all Unwind_Exception;
   --  Pointer to a GCC exception

   procedure Unwind_DeleteException (Excp : not null GCC_Exception_Access );  -- <-- THIS ONE!

   pragma Import (C, Unwind_DeleteException, "_Unwind_DeleteException");

   --  Procedure to free any GCC exception

我不明白这段代码有什么问题。是否有一些世纪之交的 Ada 语法替换我可以用来编译 GCC-Ada 的这一部分?

我有点Ada NOOB,所以请温柔点。

编辑:似乎尝试 "repair" s-excmac.adb / s-excmac.ads 是徒劳的。阻力较小的途径是下载预构建的编译器,然后从中开始构建后来的 GCC。

如果编译器早于 2005,编译 Ada-2005 not null access 声明将是一个问题。

要继续前进,您可以删除单词“not null”,该行将编译并运行,但如果您传入空访问类型。更好的修复方法是包装程序显式检查,并引发异常或适当调用底层 C procoughvoid 函数。

此外,可能还有其他 Ada-2005 功能也无法编译,因此更好的选择是升级编译器。

Brian 对 not null 的看法是正确的。但是代码中可能有更多的 2005 年主义......

我相信维护者只会保证能够使用以前的版本构建编译器,这意味着构建 GCC 3,使用它构建 GCC 4,等等;您也许可以跳过一两个版本。未来漫长的日子!

我猜,建造 libgnat 是最新的一步。我的意思是您需要使用旧版本构建 "new-gcc",然后使用 "new-gcc" 构建 libgnat。在这种情况下,您不会收到此错误。