在Eclipse&中使用m4宏Java的

时间:2009-10-07 18:25:18

标签: java android eclipse m4

有没有办法在Java for Eclipse中开发时使用m4宏,即。确保在Eclipse编译之前自动调用预处理器?

或者有没有人使用Eclipse成功使用过其他预处理器?

2 个答案:

答案 0 :(得分:1)

您可以在Eclipse项目上指定任意构建器,并对构建器进行排序,以便在运行Java构建器之前执行该构建器。

要定义新构建器,请打开项目属性(右键单击>属性或 alt - 输入),然后选择构建器,然后新... 。选择程序,然后在对话框中配置构建器(希望您知道此处需要完成的操作)并选择确定。返回构建器页面,然后您可以选择新构建器并选择向上,直到它位于 Java Builder

之前

答案 1 :(得分:1)

我想我有办法。

我刚刚在windows上的eclipse中使用了c预处理器。我确信它可以适应M4,但我使用gnu CPP的能力来创建表达文件依赖关系的make文件。为m4做这件事取决于你。它有一些问题。如果在预处理期间出现错误,eclipse会忽略它并继续运行。此外,如果使用“run”构建,则一旦程序启动,预处理器的控制台输出就会消失。

由于我不懂ant,而且我没有时间学习,我的版本是基于使用Ruby来粘合。我在Ruby中编写了一个小的automake,它获取了在最后一个make之前触及的文件列表,过滤掉了那些预处理文件,以及那些预处理器包含的文件,扫描未经处理的预处理器文件以查看它们是否依赖于任何已被更改,然后处理所有。

这些都依赖于使用Eclipse的“构建器”,它们似乎只在Juno中运行。 在我的例子中,项目的设置是: 为在java构建器之前运行的项目设置创建构建器 将位置设置为:C:\ Ruby192 \ bin \ ruby​​.exe 将工作目录设置为C:\ Ruby192 \ bin \ 将参数设置为:C:\ preprocessors \ mymake.rb $ {build_project} $ {build_files:acf} 这会传递项目的目录,然后是已触摸的文件 将“刷新”设置为“包含所选资源的项目”和“递归包含子文件夹” 将构建选项设置为:分配控制台 运行构建器:在清理之后,在手动构建期间以及在autobuild期间

请注意,根据我的简单make“.jpp”文件将被处理成“.java”文件 和“.jpp”文件可以#include“.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