【问题标题】:Using m4 macros with Eclipse & Java在 Eclipse 和 Java 中使用 m4 宏
【发布时间】:2010-12-04 17:40:42
【问题描述】:

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

或者有没有人在 Eclipse 中成功使用过另一个预处理器?

【问题讨论】:

    标签: java android eclipse m4


    【解决方案1】:

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

    要定义新的构建器,打开项目属性(右键单击->属性或alt-输入),选择Builders然后新...。选择Program,然后在对话框中配置构建器(希望您知道这里需要做什么)并选择OK。返回 Builders 页面,然后您可以选择新的构建器并选择 Up 直到它位于 Java Builder

    之前

    【讨论】:

    • 请问我需要这样做,请您指导程序配置如何完成。
    【解决方案2】:

    我想我有办法。

    我刚刚在 windows 上的 eclipse 中使用 c 预处理器。我确信它可以适应 M4,但我确实使用 gnu CPP 的能力来创建表达文件依赖关系的 make 文件。为 m4 执行此操作将取决于您。它有几个问题。如果在预处理过程中出现错误,eclipse 会忽略它并继续运行。此外,如果您使用“运行”构建,则预处理器的控制台输出会在程序启动后立即消失。

    由于我不懂ant,也没有时间学习,所以我的版本是基于使用ruby做glue的。我在 Ruby 中编写了一个小 automake,它列出了在最后一次制作之前已被触及的文件,过滤掉那些是预处理文件的文件,以及那些是预处理器包含的文件,扫描未触及的预处理器文件以查看它们是否依赖于任何已更改,然后将它们全部处理。

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

    注意根据我的简单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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      相关资源
      最近更新 更多