trema/trema-edge

View on GitHub
Rakefile

Summary

Maintainability
Test Coverage
#
# Copyright (C) 2008-2013 NEC Corporation
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2, as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#


$LOAD_PATH.unshift File.expand_path( File.join File.dirname( __FILE__ ), "ruby" )


require "paper_house"
require "rake/clean"
require "rspec/core"
require "rspec/core/rake_task"
require "trema/dsl/parser"
require "trema/executables"
require "trema/path"
require "trema/version"


CLOBBER.include Trema.objects


CFLAGS = [
  "-g",
  "-fPIC",
  "-std=gnu99",
  "-D_GNU_SOURCE",
  "-fno-strict-aliasing",
  "-Werror",
  "-Wall",
  "-Wextra",
  "-Wformat=2",
  "-Wcast-qual",
  "-Wcast-align",
  "-Wwrite-strings",
  "-Wconversion",
  "-Wfloat-equal",
  "-Wpointer-arith"
]


task :default => [
  :libruby,
  :switch_manager,
  :switch_daemon,
  :trema_switch,
  :packetin_filter,
  :tremashark,
  :examples,
  "vendor:phost",
]


desc "Build Trema C library."
PaperHouse::StaticLibraryTask.new :libtrema do | task |
  task.target_directory = Trema.lib
  task.sources = "#{ Trema.include }/*.c"
  task.cflags = CFLAGS
end


desc "Build Trema Ruby library."
task :libruby => :libtrema

PaperHouse::RubyExtensionTask.new :libruby do | task |
  task.library_name = "trema"
  task.target_directory = Trema.ruby
  task.sources = [
    "#{ Trema.ruby }/trema/*.c",
    "#{ Trema.ruby }/trema/messages/*.c"
  ]
  task.includes = Trema.include
  task.cflags = CFLAGS + [ "-Wno-error=sign-conversion" ] # FIXME
  task.ldflags = [ "-Wl,-Bsymbolic", "-L#{ Trema.lib }" ]
  task.library_dependencies = [
    "trema",
    "sqlite3",
    "pthread",
    "rt",
    "dl",
    "crypt",
    "m"
  ]
end


desc "Build switch datapath library."
PaperHouse::StaticLibraryTask.new :libofdp do | task |
  task.target_directory = Trema.obj_datapath
  task.sources = "#{ Trema.src_datapath }/*.c"
  task.includes = Trema.include
  task.cflags = CFLAGS
end


desc "Build google cmockery library"
task "vendor:cmockery" => Trema.libcmockery_a
file Trema.libcmockery_a do
  sh "tar xzf #{ Trema.vendor_cmockery }.tar.gz -C #{ Trema.vendor }"
  cd Trema.vendor_cmockery do
    sh "./configure --prefix=#{ Trema.cmockery }"
    sh "make install"
  end
end

CLEAN.include Trema.vendor_cmockery
CLOBBER.include Trema.cmockery


desc "Build switch manager."
task :switch_manager => :libtrema

PaperHouse::ExecutableTask.new :switch_manager do | task |
  task.target_directory = File.dirname( Trema::Executables.switch_manager )
  task.sources = [
    "src/switch_manager/dpid_table.c",
    "src/switch_manager/secure_channel_listener.c",
    "src/switch_manager/switch_manager.c",
  ]
  task.includes = Trema.include
  task.cflags = CFLAGS
  task.ldflags = "-L#{ Trema.lib }"
  task.library_dependencies = [
    "trema",
    "sqlite3",
    "pthread",
    "rt",
    "dl",
  ]
end


desc "Build switch daemon."
task :switch_daemon => :libtrema

PaperHouse::ExecutableTask.new :switch_daemon do | task |
  task.target_directory = File.dirname( Trema::Executables.switch_daemon )
  task.sources = [
    "src/switch_manager/cookie_table.c",
    "src/switch_manager/ofpmsg_recv.c",
    "src/switch_manager/ofpmsg_send.c",
    "src/switch_manager/secure_channel_receiver.c",
    "src/switch_manager/secure_channel_sender.c",
    "src/switch_manager/service_interface.c",
    "src/switch_manager/switch.c",
    "src/switch_manager/xid_table.c",
    "src/switch_manager/tls.c",
  ]
  task.includes = Trema.include
  task.cflags = CFLAGS
  task.ldflags = "-L#{ Trema.lib }"
  task.library_dependencies = [
    "trema",
    "sqlite3",
    "pthread",
    "rt",
    "dl",
    "ssl",
    "crypto",
  ]
end


desc "Build Trema switch."
task :trema_switch => [ :libofdp, :libtrema ]

PaperHouse::ExecutableTask.new :trema_switch do | task |
  task.executable_name = "switch"
  task.target_directory = File.dirname( Trema::Executables.switch )
  task.sources = "src/switch/switch/*.c"
  task.includes = [ Trema.include, Trema.src_datapath ]
  task.cflags = CFLAGS
  task.ldflags = [ "-L#{ Trema.lib }", "-L#{ Trema.obj_datapath }" ]
  task.library_dependencies = [
    "ofdp",
    "trema",
    "sqlite3",
    "pthread",
    "rt",
    "dl",
  ]
end


desc "Build PacketIn filter."
task :packetin_filter => :libtrema

PaperHouse::ExecutableTask.new :packetin_filter do | task |
  task.target_directory = File.dirname( Trema::Executables.packetin_filter )
  task.sources = "src/packetin_filter/*.c"
  task.includes = Trema.include
  task.cflags = CFLAGS
  task.ldflags = "-L#{ Trema.lib }"
  task.library_dependencies = [
    "trema",
    "sqlite3",
    "pthread",
    "rt",
    "dl",
  ]
end


desc "Build Tremashark."

task :tremashark => [
  'tremashark:tremashark',
  'tremashark:syslog_relay',
  'tremashark:stdin_relay',
  'tremashark:packet_capture',
]

tremashark_sources = {
  'tremashark:tremashark' => [
    'src/tremashark/queue.c',
    'src/tremashark/pcap_queue.c',
    'src/tremashark/tremashark.c',
  ],
  'tremashark:syslog_relay' => [
    'src/tremashark/syslog_relay.c',
  ],
  'tremashark:stdin_relay' => [
    'src/tremashark/stdin_relay.c',
  ],
  'tremashark:packet_capture' => [
    'src/tremashark/queue.c',
    'src/tremashark/pcap_queue.c',
    'src/tremashark/packet_capture.c',
  ],
}

Rake::Task[ :tremashark ].prerequisites.each do | utility |
  begin
    Rake::Task[ utility ]
  rescue
    desc "Build #{ utility }."
    task utility => :libtrema

    PaperHouse::ExecutableTask.new utility do | task |
      task.target_directory = File.dirname( Trema::Executables.tremashark )
      task.executable_name = utility.split(':')[1]
      task.sources = tremashark_sources[utility]
      task.includes = Trema.include
      task.cflags = CFLAGS
      task.ldflags = "-L#{ Trema.lib }"
      task.library_dependencies = [
        "trema",
        "sqlite3",
        "pthread",
        "rt",
        "dl",
        "pcap",
      ]
    end
  end
end


################################################################################
# Examples.
################################################################################

def target_directory_of example
  File.join Trema.objects, example
end

task :examples => [
  'examples:cbench_switch',
  'examples:dumper',
  'examples:hello_trema',
  'examples:learning_switch',
  'examples:list_switches',
  'examples:multi_learning_switch',
  'examples:openflow_message',
  #'examples:packetin_filter_config',
  'examples:packet_in',
  'examples:repeater_hub',
  'examples:switch_info',
  'examples:switch_monitor',
  'examples:traffic_monitor'
]


task 'examples:openflow_message' => [
  'examples:openflow_message:echo_reply',
  'examples:openflow_message:echo_request',
  'examples:openflow_message:features_request',
  'examples:openflow_message:hello',
  'examples:openflow_message:group_mod',
  'examples:openflow_message:port_desc_multipart_request',
  'examples:openflow_message:set_config'
]


Rake::Task[ :examples ].prerequisites.each do | example |
  begin
    Rake::Task[ example ]
  rescue
    desc "Build #{ example }."
    task example => :libtrema

    PaperHouse::ExecutableTask.new example do | task |
      example_name = example.gsub(/:/,'/')
      task.executable_name = File.basename example_name
      task.target_directory = target_directory_of "#{ example_name }"
      task.sources = "src/#{ example_name }/*.c"
      task.includes = Trema.include
      task.cflags = CFLAGS
      task.ldflags = "-L#{ Trema.lib }"
      task.library_dependencies = [
        "trema",
        "sqlite3",
        "pthread",
        "rt",
        "dl",
      ]
    end
  end
end


Rake::Task[ 'examples:openflow_message' ].prerequisites.each do | example |
  begin
    Rake::Task[ example ]
  rescue
    desc "Build #{ example }."
    task example => :libtrema

    PaperHouse::ExecutableTask.new example do | task |
      example_name = example.gsub(/:/,'/')
      task.executable_name = File.basename example_name
      task.target_directory = target_directory_of "#{ File.dirname example_name }"
      task.sources = "src/#{ example_name }.c"
      task.includes = Trema.include
      task.cflags = CFLAGS
      task.ldflags = "-L#{ Trema.lib }"
      task.library_dependencies = [
        "trema",
        "sqlite3",
        "pthread",
        "rt",
        "dl",
      ]
    end
  end
end


################################################################################
# Misc.
################################################################################

def phost_src
  File.join Trema.vendor_phost, "src"
end


task "vendor:phost" => [ Trema::Executables.phost, Trema::Executables.cli ]

directory File.dirname( Trema::Executables.phost )
file Trema::Executables.phost => File.dirname( Trema::Executables.phost ) do
  cd phost_src do
    sh "make"
  end
  sh "install #{ File.join( phost_src, "phost" ) } #{ Trema::Executables.phost } --mode=0755"
end

directory File.dirname( Trema::Executables.cli )
file Trema::Executables.cli => File.dirname( Trema::Executables.cli ) do
  cd phost_src do
    sh "make"
  end
  sh "install #{ File.join( phost_src, "cli" ) } #{ Trema::Executables.cli } --mode=0755"
end


################################################################################
# Unit tests
################################################################################
desc "Build Trema C unittest library."
PaperHouse::StaticLibraryTask.new :libtrema do | task |
  task.target_directory = Trema.obj_unittests
  task.sources = "#{ Trema.include }/*.c"
  task.cflags = [ '--coverage' ] + CFLAGS
end


desc "Build libofdp.a unittest library"
PaperHouse::StaticLibraryTask.new :libofdp do | task |
  task.target_directory = "#{ Trema.obj_unittests }/switch/datapath"
  task.sources = "#{ Trema.src_datapath }/*.c"
  task.includes = Trema.include
  task.cflags = [ '--coverage', '-DUNIT_TESTING' ] + CFLAGS
end


def switch_tests
  {
    parse_options_test: [
      "#{ Trema.src_unittests }/switch/switch/parse-options-test.c",
      "#{ Trema.src_unittests }/switch/switch/mocks.c",
      "#{ Trema.src_trema_switch }/parse-options.c"
    ],
    group_helper_test: [
      "#{ Trema.src_unittests }/switch/switch/group-helper-test.c",
      "#{ Trema.src_unittests }/switch/switch/mocks.c",
      "#{ Trema.src_trema_switch }/group-helper.c",
      "#{ Trema.src_trema_switch }/action*.c",
      "#{ Trema.src_trema_switch }/oxm*.c"
    ]
  }
end


desc "Build switch unittest"
switch_tests.keys.each do | each |
  task each => [ 'vendor:cmockery', :libtrema, :libofdp ]
  PaperHouse::ExecutableTask.new each do | task |
    task.target_directory = "#{ Trema.obj_unittests }/switch/switch"
    task.sources = switch_tests[ each ]
    task.includes = [
      File.dirname( Trema.cmockery_h ),
      Trema.src_datapath,
      Trema.include,
      Trema.src_unittests
    ]
    task.cflags = [ '--coverage', '-DUNIT_TESTING' ] + CFLAGS
    task.ldflags = "-Wl,--rpath -Wl,#{ Trema.cmockery }/lib --coverage -L#{ Trema.obj_unittests } -L#{ Trema.cmockery }/lib -L#{ Trema.obj_unittests }/switch/datapath"
    task.library_dependencies = [
      'cmockery',
      'ofdp',
      'trema',
      'sqlite3',
      'pthread',
      'rt',
      'dl'
    ]
  end
end


desc "Run unittests"
task :run_unittests => switch_tests.keys do
  cd Trema.obj_unittests do
    Dir.glob( "*/*/*_test" ).each do | exec |
      sh "sudo -E #{ exec }"
    end
  end
end


################################################################################
# Tests
################################################################################

task :spec => :libruby
RSpec::Core::RakeTask.new do | task |
  task.verbose = $trace
  task.pattern = FileList[ "spec/trema_spec.rb", "spec/trema/messages/hello_spec.rb" ]
  task.rspec_opts = "--format documentation --color"
end


require "cucumber/rake/task"
task :features => :default
Cucumber::Rake::Task.new( :features ) do | t |
  t.cucumber_opts = "features --tags ~@wip"
end


################################################################################
# YARD
################################################################################

begin
  require "yard"

  YARD::Rake::YardocTask.new do | t |
    t.files = [ "ruby/trema/**/*.c", "ruby/trema/**/*.rb" ]
    t.options = [ "--no-private" ]
    t.options << "--debug" << "--verbose" if $trace
  end
rescue LoadError
  $stderr.puts $!.to_s
end


## Local variables:
## mode: Ruby
## coding: utf-8-unix
## indent-tabs-mode: nil
## End: