2009-10-07 7 views
2

Existe-t-il un moyen d'utiliser des macros m4 lors du développement en Java pour Eclipse, c.-à-d. s'assurer que le préprocesseur est automatiquement appelé avant la compilation d'Eclipse?Utilisation de macros m4 avec Eclipse & Java

Ou est-ce que quelqu'un a utilisé avec succès un autre préprocesseur avec Eclipse?

Répondre

1

Vous pouvez spécifier un générateur arbitraire sur un projet Eclipse et ordonner le générateur de sorte qu'il soit exécuté avant l'exécution du générateur Java.

Pour définir le nouveau constructeur, ouvrez les propriétés du projet (à droite droit-> Propriétés ou alt - ) ENTRER, sélectionnez Builders puis New .... Sélectionnez Programme, puis dans la boîte de dialogue configurez le générateur (espérons que vous savez ce qui doit être fait ici) et sélectionnez OK. Retour à la page Builders vous pouvez sélectionner votre nouveau constructeur et sélectionnez Up jusqu'à ce qu'il soit avant le Java Builder

+0

S'il vous plaît je besoin de le faire, pouvez-vous s'il vous plaît éclairer la configuration du programme comment il peut être fait. –

1

je pense avoir un moyen.

Je viens de le faire fonctionner avec le préprocesseur c dans eclipse sur windows. Je suis sûr qu'il pourrait être adapté à M4, mais j'utilise la capacité de gnu CPP pour créer des fichiers make exprimant les dépendances d'un fichier. Faire cela pour m4 serait à vous. Il a quelques problèmes. S'il y a une erreur pendant le prétraitement, eclipse l'ignore et continue. De plus, si vous avez construit avec "run", la sortie de la console du préprocesseur disparaît dès le démarrage du programme.

Comme je ne comprends pas fourmi, et je n'ai pas le temps d'apprendre, ma version est basée sur l'utilisation de Ruby pour la colle. J'ai écrit un petit automake dans Ruby qui prend une liste de fichiers qui ont été touchés avant la dernière marque, filtre ceux qui sont des fichiers prétraités, et ceux qui sont préprocesseurs inclus, balaye les fichiers préprocesseurs intacts pour voir s'ils dépendent de quelque chose a été modifié, puis les traite tous. Tout dépend de l'utilisation des "constructeurs" d'Eclipse qui ne semblent fonctionner que dans Juno. Dans mon cas, les paramètres du projet sont: créer un générateur pour les paramètres du projet qui s'exécute avant le générateur Java définir l'emplacement à: C: \ Ruby192 \ bin \ ruby.exe définir le répertoire de travail à C: \ Ruby192 \ bin \ définir les arguments à: C: \ préprocesseurs \ mymake.rb $ {build_project} $ {build_files: acf} cela passe le répertoire du projet suivi par le fichier qui ont été touchés mis "refresh" à « projet contenant la ressource sélectionnée » et « inclure de manière récurrente sous-dossier » ensemble des options de construction pour: Allouer console Exécuter le constructeur: après le nettoyage, construit au cours de manuel, et pendant autobuilds

Aucun te que d'après ma marque simple les fichiers ".jpp" seront traités en fichiers ".java" et les fichiers ".jpp" peuvent #incluer les fichiers ".jph" (et seulement les fichiers .jph) les fichiers ".jph" peuvent aussi #include les fichiers ".jph" et seulement les fichiers ".jph"

Tous ces fichiers doivent être dans le répertoire/src/(récursivement dans les répertoires sous/src/qui est la façon dont eclipse organise le code java et les paquets) .

Voici le code Ruby:

require 'set' 
$path = (ARGV[0].gsub('\\','/')+'/src') 
$process=(ARGV[1..-1]||[]).map{ |a| a.gsub('\\','/') } 
def pending(ending) 
    ($process.select do |a| 
     a[0..$path.length-1]==$path && a[-4..-1].downcase == ending 
    end).to_set 
end 
def read_make_dependencies(filename) 
    ((File.open(filename).read. 
     split("\n")[1..-1]. 
     map do |a| 
      if a[-2..-1]==' \\' 
       a=a[0..-3] 
      end 
      a.lstrip.gsub('\\/','/').gsub('\\','/').rstrip 
     end)||[]).to_set 
end 
$pendingJph=pending('.jph') 
$pendingJpp=pending('.jpp') 

Dir.chdir($path) 

$untouchedJph=Dir['**/*.jph'].map{|a| $path+'/'+a}.to_set - $pendingJph 
$untouchedJpp=Dir['**/*.jpp'].map{|a| $path+'/'+a}.to_set - $pendingJpp 

Dir.chdir('C:/MinGW/bin') 

$pendingJph.each do|a| 
    o = a[0..-4]+'depend' 
    system "cpp -MM \"#{a}\" -o \"#{o}\"" 
    $pendingJph = $pendingJph + read_make_dependencies(o) 
end 

$untouchedJpp.each do|a| 
    o = a[0..-4]+'depend' 
    system "cpp -MM \"#{a}\" -o \"#{o}\"" 
    if not (read_make_dependencies(o) & $pendingJph).empty? 
     puts "touching #{a}" 
     $pendingJpp << a 
    end 
end 

$pendingJpp.each do|a| 
    o = a[0..-4]+'java' 
    puts "processing #{a}" 
    system "cpp -w -P -C -x c \"#{a}\" -o \"#{o}\"" 
end