2009-10-07 62 views
2

在使用Java for Eclipse進行開發時,有沒有辦法使用m4宏?確保在Eclipse編譯之前自動調用預處理器?在Eclipse和Java中使用m4宏

還是有人在Eclipse上成功地使用了另一個預處理器?

回答

1

您可以在Eclipse項目中指定一個任意構建器,然後對構建器進行排序,以便在運行Java構建器之前執行該構建器。

定義新的建設者,打開項目屬性(右鍵點擊 - >屬性或ALT - 進入),選擇建設者然後新建...。選擇程序,然後在對話框中配置生成器(希望你知道這裏需要做什麼)並選擇OK。早在建設者頁面,您可以再選擇新的建設者和選擇最多直到前的Java構建

+0

請我需要做到這一點,你可以請指教程序配置如何可以做到。 –

1

我想我有辦法。

我剛剛在Windows上使用eclipse中的c預處理器。我相信它可以適應M4,但我確實使用GNU CPP創建表示文件依賴關係的make文件。爲m4做這個將取決於你。它有一些問題。如果在預處理過程中出現錯誤,eclipse忽略它並繼續前進。另外,如果您使用「運行」構建,預處理器的控制檯輸出一旦程序啓動就會消失。

因爲我不明白螞蟻,我沒有時間學習,我的版本是基於使用Ruby的膠水。我在Ruby中編寫了一個automake,它獲取最後一次make之前已經觸及的文件列表,篩選出預處理文件以及預處理器包含的文件,掃描未觸及的預處理器文件,以查看它們是否依賴於任何已被更改,然後處理它們。

這些都取決於使用Eclipse的「建設者」,這似乎只能在Juno中工作。 在我的情況下,該項目的設置是: 創建一個項目設置的構建器,該構建器在java構建器 設置位置爲:C:\ Ruby192 \ bin \ ruby​​.exe之前運行 將工作目錄設置爲C:\ Ruby192 \ bin \ 將參數設置爲:C:\ preprocessors \ mymake.rb $ {build_project} $ {build_files:acf} 這會傳遞項目的目錄後面跟着已被觸及的文件 將「refresh」設置爲和「遞歸包括子文件夾」 設置編譯選項爲「包含所選資源項目」:分配控制檯 運行建設者:清洗乾淨後,在手動版本,並在autobuilds

無te根據我的簡單make將「.jpp」文件處理成「.java」文件 和「.jpp」文件可以包含「.jph」文件(只有.jph文件) 「.jph」文件可以還有#include「.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