2010-07-23 57 views
4

对于Ada编程世界,我还是个新手,所以如果这个问题很明显,请原谅我。在编译时在Ada(GNAT)中指定不同的特定于平台的包

我正在研究开发一个应用程序(在Ada中,使用2005版本中的功能)从串行端口读取,并基本上执行从外部设备接收的字符串和数字的操作。

现在我的意图是可能使用Florist和POSIX终端接口首先在Linux上完成所有的串行工作....我会到Windows/MacOS /等...其他时间,但我想请打开该选项。

我想跟随Ada的最佳实践,无论我用这个做什么。因此,我想知道你是如何在命令行中指定对包文件的更改的(例如gnatmake),而不是像C这样的黑客入侵(我知道Ada没有)。

我现在唯一能想到的是我可以命名所有平台包完全相同(即包名称Serial.Connector具有相同的文件名),并将它们放置在项目存档中的不同文件夹中,然后在编译时指定目录/库用-I参数查找文件并更改不同平台的目录名称。

这就是我使用C/C++显示GCC的方式......这仍然是使用GNAT的Ada的最佳方式。

感谢, -Josh

回答

5

这是处理这种情况是完全可以接受的方式。如果可能的话,您应该有一个通用的包装规格(或多个规格适用的规格),所有平台特定的东西都严格限制在相应的包装体变化范围内。 (如果您确实想要使用预处理器路径,那么可以使用名为gnatprep的GNAT预处理程序,但我不喜欢有条件编译,所以我建议留在单独的子目录中)。

2

是的,在Ada中处理这个问题的普遍接受的方法是使用由您的构建系统选择的不同文件进行处理。 GNU make就像它的多平台一样,可以让你在不同的配置下创建不同的文件(具有不同的名称和/或目录以及所有内容)。事实上,我发现这是一个比C更好的方式(通过#ifdef)。

3

您可以使用GNAT项目文件package Naming:从一个真实的例子,在这里我想在同一目录软件包的两个版本,一个与调试添加之间进行选择的提取物,是

... 
type Debug_Code is ("no", "yes"); 
Debug : Debug_Code := External ("DEBUG", "no"); 
... 
package Naming is 
    case Debug is 
     when "yes" => 
     for Spec ("BC.Support.Managed_Storage") 
      use "bc-support-managed_storage.ads-debug"; 
     for Body ("BC.Support.Managed_Storage") 
      use "bc-support-managed_storage.adb-debug"; 
     when "no" => 
     null; 
    end case; 
end Naming; 

要选择特殊命名,将环境变量DEBUG设置为yes或使用gnatmake -XDEBUG=yes构建。

相关问题