Files
flexnbd-c/Rakefile

265 lines
5.6 KiB
Ruby
Raw Normal View History

$: << '../rake_utils/lib'
require 'rake_utils/debian'
include RakeUtils::DSL
2012-06-27 15:45:33 +01:00
CC=ENV['CC'] || "gcc"
2012-05-31 12:12:32 +01:00
DEBUG = ENV.has_key?('DEBUG') &&
%w|yes y ok 1 true t|.include?(ENV['DEBUG'])
2012-05-16 01:27:14 +01:00
2012-05-30 15:06:06 +01:00
ALL_SOURCES =FileList['src/*']
SOURCES = ALL_SOURCES.select { |c| c =~ /\.c$/ }
OBJECTS = SOURCES.pathmap( "%{^src,build}X.o" )
2012-07-03 10:53:08 +01:00
TEST_SOURCES = FileList['tests/unit/*.c']
TEST_OBJECTS = TEST_SOURCES.pathmap( "%{^tests/unit,build/tests}X.o" )
2012-05-16 01:27:14 +01:00
LIBS = %w( pthread )
2012-08-24 09:32:33 +01:00
LDFLAGS = []
CCFLAGS = %w(
-D_GNU_SOURCE=1
-Wall
-Wextra
-Werror-implicit-function-declaration
-Wstrict-prototypes
-Wno-missing-field-initializers
) + # Added -Wno-missing-field-initializers to shut GCC up over {0} struct initialisers
[ENV['CFLAGS']]
LIBCHECK = File.exists?("/usr/lib/libcheck.a") ?
"/usr/lib/libcheck.a" :
"/usr/local/lib/libcheck.a"
2012-07-03 10:53:08 +01:00
TEST_MODULES = Dir["tests/unit/check_*.c"].map { |n|
File.basename( n )[%r{check_(.+)\.c},1] }
2012-05-16 01:27:14 +01:00
if DEBUG
LDFLAGS << ["-g"]
2012-05-16 01:27:14 +01:00
CCFLAGS << ["-g -DDEBUG"]
end
desc "Build the binary and man page"
task :build => ['build/flexnbd', 'build/flexnbd.1.gz']
task :default => :build
desc "Build just the binary"
task :flexnbd => "build/flexnbd"
2012-05-16 01:27:14 +01:00
def check(m)
"build/tests/check_#{m}"
end
file "README.txt"
file "build/flexnbd.1.gz" => "README.txt" do
FileUtils.mkdir_p( "build" )
sh "a2x --destination-dir build --format manpage README.txt"
2012-07-19 17:22:25 +01:00
sh "gzip -f build/flexnbd.1"
end
desc "Build just the man page"
task :man => "build/flexnbd.1.gz"
namespace "test" do
desc "Run all tests"
task 'run' => ["unit", "scenarios"]
desc "Build C tests"
task 'build' => TEST_MODULES.map { |n| check n}
TEST_MODULES.each do |m|
desc "Run tests for #{m}"
task "check_#{m}" => check(m) do
sh check m
end
end
desc "Run C tests"
task 'unit' => 'build' do
TEST_MODULES.each do |n|
ENV['EF_DISABLE_BANNER'] = '1'
sh check n
end
end
desc "Run NBD test scenarios"
task 'scenarios' => 'flexnbd' do
sh "cd tests/acceptance; ruby nbd_scenarios -v"
end
end
def gcc_compile( target, source )
FileUtils.mkdir_p File.dirname( target )
2012-06-27 15:45:33 +01:00
sh "#{CC} -Isrc -c #{CCFLAGS.join(' ')} -o #{target} #{source} "
end
def gcc_link(target, objects)
FileUtils.mkdir_p File.dirname( target )
2012-06-27 15:45:33 +01:00
sh "#{CC} #{LDFLAGS.join(' ')} "+
" -Isrc " +
" -o #{target} "+
objects.join(" ") +
" "+LIBS.map { |l| "-l#{l}" }.join(" ")
end
def headers(c)
2012-06-27 15:45:33 +01:00
`#{CC} -Isrc -MM #{c}`.gsub("\\\n", " ").split(" ")[2..-1]
end
rule 'build/flexnbd' => OBJECTS do |t|
gcc_link(t.name, t.sources)
end
2012-06-07 11:44:19 +01:00
file check("client") =>
%w{build/tests/check_client.o
2012-06-07 11:44:19 +01:00
build/self_pipe.o
build/nbdtypes.o
2012-06-27 15:45:33 +01:00
build/flexnbd.o
build/flexthread.o
2012-06-07 11:44:19 +01:00
build/control.o
build/readwrite.o
build/parse.o
build/client.o
build/serve.o
build/proxy.o
2012-06-07 17:47:43 +01:00
build/acl.o
build/ioutil.o
2012-06-27 15:45:33 +01:00
build/mbox.o
build/mirror.o
build/status.o
build/sockutil.o
2012-06-07 11:44:19 +01:00
build/util.o} do |t|
gcc_link t.name, t.prerequisites + [LIBCHECK]
end
2012-06-07 17:47:43 +01:00
file check("acl") =>
%w{build/tests/check_acl.o
2012-06-07 17:47:43 +01:00
build/parse.o
build/acl.o
build/util.o} do |t|
2012-06-07 17:47:43 +01:00
gcc_link t.name, t.prerequisites + [LIBCHECK]
end
2012-06-21 18:01:56 +01:00
file check( "util" ) =>
%w{build/tests/check_util.o
build/util.o
build/self_pipe.o} do |t|
gcc_link t.name, t.prerequisites + [LIBCHECK]
end
file check("serve") =>
%w{build/tests/check_serve.o
build/self_pipe.o
build/nbdtypes.o
build/control.o
build/readwrite.o
build/parse.o
build/client.o
build/flexthread.o
build/serve.o
build/proxy.o
2012-06-27 15:45:33 +01:00
build/flexnbd.o
build/mirror.o
build/status.o
build/acl.o
2012-06-27 15:45:33 +01:00
build/mbox.o
build/ioutil.o
build/sockutil.o
build/util.o} do |t|
gcc_link t.name, t.prerequisites + [LIBCHECK]
end
file check("readwrite") =>
%w{build/tests/check_readwrite.o
build/readwrite.o
build/client.o
build/self_pipe.o
build/serve.o
build/proxy.o
build/parse.o
build/acl.o
build/flexthread.o
build/control.o
2012-06-27 15:45:33 +01:00
build/flexnbd.o
build/mirror.o
build/status.o
build/nbdtypes.o
2012-06-27 15:45:33 +01:00
build/mbox.o
build/ioutil.o
build/sockutil.o
build/util.o} do |t|
gcc_link t.name, t.prerequisites + [LIBCHECK]
end
2012-06-21 18:01:50 +01:00
2012-06-27 15:45:33 +01:00
file check("flexnbd") =>
%w{build/tests/check_flexnbd.o
build/flexnbd.o
build/ioutil.o
build/sockutil.o
2012-06-27 15:45:33 +01:00
build/util.o
build/control.o
build/mbox.o
build/flexthread.o
2012-06-27 15:45:33 +01:00
build/status.o
build/self_pipe.o
build/client.o
build/acl.o
build/parse.o
build/nbdtypes.o
build/readwrite.o
build/mirror.o
build/serve.o
build/proxy.o} do |t|
2012-06-27 15:45:33 +01:00
gcc_link t.name, t.prerequisites + [LIBCHECK]
end
2012-06-27 15:45:33 +01:00
file check("control") =>
%w{build/tests/check_control.o} + OBJECTS - ["build/main.o"] do |t|
gcc_link t.name, t.prerequisites + [LIBCHECK]
end
2012-06-07 11:44:19 +01:00
(TEST_MODULES- %w{control flexnbd acl client serve readwrite util}).each do |m|
tgt = "build/tests/check_#{m}.o"
maybe_obj_name = "build/#{m}.o"
2012-06-21 18:01:56 +01:00
# Take it out in case we're testing util.o or ioutil.o
deps = ["build/ioutil.o", "build/util.o", "build/sockutil.o"] - [maybe_obj_name]
2012-06-21 18:01:56 +01:00
# Add it back in if it's something we need to compile
deps << maybe_obj_name if OBJECTS.include?( maybe_obj_name )
file check( m ) => deps + [tgt] do |t|
gcc_link(t.name, deps + [tgt, LIBCHECK])
end
2012-05-16 01:27:14 +01:00
end
OBJECTS.zip( SOURCES ).each do |o,c|
file o => [c]+headers(c) do |t| gcc_compile( o, c ) end
end
TEST_OBJECTS.zip( TEST_SOURCES ).each do |o,c|
file o => [c] + headers(c) do |t| gcc_compile( o, c ) end
2012-05-16 01:27:14 +01:00
end
desc "Remove all build targets, binaries and temporary files"
task :clean do
sh "rm -rf *~ build"
end
namespace :pkg do
deb do |t|
t.code_files = ALL_SOURCES + ["Rakefile", "README.txt"]
t.pkg_name = "flexnbd"
t.generate_changelog!
end
2012-05-16 01:27:14 +01:00
end
2012-05-31 12:12:32 +01:00