2010-07-23 9 views
4

Je suis encore jeune dans le monde de la programmation Ada alors pardonnez-moi si cette question est évidente. Je cherche à développer une application (dans Ada, en utilisant les fonctionnalités de la révision de 2005) qui lit à partir du port série et effectue essentiellement la manipulation des chaînes et des chiffres qu'elle reçoit d'un périphérique externe.Spécification d'un package spécifique à la plate-forme au moment de la compilation dans Ada (GNAT)

Maintenant mon intention était d'utiliser probablement Florist et les interfaces de terminal POSIX pour faire tout le travail en série sur Linux d'abord .... J'arriverai à Windows/MacOS/etc ... une autre fois, mais je veux laissez cette option ouverte.

Je voudrais suivre les meilleures pratiques Ada dans tout ce que je fais avec cela. Donc, au lieu d'un bidouillage comme la compilation conditionnelle sous C (que je sais qu'Ada n'a pas de toute façon), j'aimerais savoir comment vous êtes supposé spécifier un changement dans les fichiers de paquet depuis la ligne de commande (gnatmake par exemple)? La seule chose que je peux penser en ce moment est que je pourrais nommer tous les paquets de plate-forme exactement le même (nom de paquet Serial.Connector avec les mêmes noms de fichiers) et les placer dans différents dossiers dans l'archive du projet les répertoires/bibliothèques pour rechercher les fichiers avec l'argument -I et changer les noms de répertoires pour les différentes plates-formes.

C'est ainsi que j'ai été montré pour GCC en utilisant C/C++ ... est-ce toujours le meilleur moyen avec Ada en utilisant GNAT ?.

Merci, -Josh

Répondre

5

C'est une façon tout à fait acceptable de traiter ce genre de situation. Si possible, vous devriez avoir une spécification de paquetage commune (ou des spécifications si plus d'une spécification est appropriée), avec tous les éléments spécifiques à la plate-forme strictement confinés aux variations de corps de paquet correspondantes.

(Si vous voulez descendre le chemin du préprocesseur, il existe un préprocesseur GNAT appelé gnatprep qui peut être utilisé, mais je n'aime pas non plus la compilation conditionnelle, donc je recommande de rester avec l'approche séparée des sous-répertoires.)

2

Oui, la manière généralement acceptée de gérer cela dans Ada est de le faire avec des fichiers différents, sélectionnés par votre système de construction. Gnu make est à peu près aussi multiplateforme que possible, et peut vous permettre de construire différents fichiers (avec des noms différents et/ou des répertoires et tout) sous différentes configurations.

En fait, je trouve cela d'une manière supérieure (sur #ifdef s) pour le faire aussi en C.

3

Vous pouvez utiliser le fichier de projet GNAT package Naming: un extrait d'un exemple concret, où je voulais choisir entre deux versions d'un paquet dans le même répertoire, l'un avec des additions de débogage, est

... 
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; 

Pour sélectionnez la désignation spéciale, définissez la variable d'environnement DEBUG sur yes ou créez avec gnatmake -XDEBUG=yes.

Questions connexes