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

Kin*_*ley 2 gcc ada

我正在尝试更新我们已有 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
Run Code Online (Sandbox Code Playgroud)

所以有问题的行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
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:似乎试图“修复” s-excmac.adb/s-excmac.ads是一个傻瓜的差事。阻力较小的路径是下载一个预先构建的编译器,然后从中开始构建后来的 GCC。

Bri*_*ond 6

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

继续前进,您可以删除单词“ not null”,该行将编译并运行,但如果您传入空访问类型,则不会获得所需的行为(异常中止)。一个更好的修复方法是一个包装程序,它明确检查,并在适当的时候引发异常或调用底层的 C pro空函数。

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


Sim*_*ght 5

布莱恩是对的not null。但是代码中可能有更多的 2005-isms ......

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

  • 按照这条路线,如果没有 C++ 编译器(除了 Ada 和 C),gcc 4.7 及更高版本将无法编译 (3认同)