Я думаю, у меня есть способ.
Я только сейчас начал работать с препроцессором c в eclipse на windows. Я уверен, что он может быть адаптирован к M4, но я действительно использую способность gnu CPP создавать файлы make, выражающие зависимости файла. Делать это для m4 было бы до вас. У него есть несколько проблем. Если во время предварительной обработки произошла ошибка, затмение игнорирует ее и продолжает движение. Также, если вы создали команду «run», консольный вывод препроцессора исчезнет, как только программа запустится.
Так как я не понимаю муравья и у меня нет времени учиться, моя версия основана на использовании Ruby для клея. Я написал небольшую автоматику в Ruby, которая берет список файлов, которые были затронуты до последней сборки, отфильтровывает те, которые являются предварительно обработанными файлами, и те, которые входят в препроцессор, сканирует нетронутые файлы препроцессора, чтобы увидеть, зависят ли они от чего-либо был изменен, затем обрабатывает их все.
Все это зависит от использования "строителей" Eclipse, которые работают только в Juno.
В моем случае настройки для проекта:
создать компоновщик для параметров проекта, который запускается до компоновщика Java
установить расположение: C: \ Ruby192 \ bin \ ruby.exe
установите рабочий каталог в C: \ Ruby192 \ bin \
установите аргументы в: C: \ preprocessors \ mymake.rb $ {build_project} $ {build_files: acf}
это передает каталог проекта, сопровождаемый файлом, который был затронут
установите «обновить» в «проект, содержащий выбранный ресурс» и «рекурсивно включить подпапку»
установить параметры сборки: выделить консоль
Запустите компоновщик: после очистки, при ручной сборке и при автоматической сборке
Обратите внимание, что в соответствии с моей простой сборкой файлы ".jpp" будут обрабатываться в файлы ".java".
и файлы ".jpp" могут включать в себя файлы ".jph" (и только файлы .jph)
Файлы «.jph» также могут включать в себя файлы «.jph» и только файлы «.jph»
Все эти файлы должны находиться в каталоге / src / (рекурсивно в каталогах в / src /, как eclipse организует Java-код и пакеты).
Вот код 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