2012-06-09 02:17:34 +01:00
|
|
|
$: << '../rake_utils/lib'
|
2012-06-06 10:24:04 +01:00
|
|
|
require 'rake_utils/debian'
|
|
|
|
include RakeUtils::DSL
|
2012-05-30 17:35:07 +01:00
|
|
|
|
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
|
|
|
|
2013-03-19 13:13:37 +00:00
|
|
|
ALL_SOURCES = FileList['src/*']
|
|
|
|
|
|
|
|
PROXY_ONLY_SOURCES = FileList['src/{proxy-main,proxy}.c']
|
|
|
|
PROXY_ONLY_OBJECTS = PROXY_ONLY_SOURCES.pathmap( "%{^src,build}X.o" )
|
|
|
|
|
|
|
|
SOURCES = ALL_SOURCES.select { |c| c =~ /\.c$/ } - PROXY_ONLY_SOURCES
|
|
|
|
OBJECTS = SOURCES.pathmap( "%{^src,build}X.o" ) - PROXY_ONLY_OBJECTS
|
|
|
|
|
|
|
|
PROXY_SOURCES = FileList['src/{ioutil,nbdtypes,readwrite,sockutil,util,parse}.c'] + PROXY_ONLY_SOURCES
|
|
|
|
PROXY_OBJECTS = PROXY_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-30 09:51:20 +01:00
|
|
|
|
2012-05-16 01:27:14 +01:00
|
|
|
LIBS = %w( pthread )
|
2013-06-06 11:57:05 +01:00
|
|
|
LDFLAGS = ["-lrt"]
|
2012-06-13 09:59:08 +01:00
|
|
|
CCFLAGS = %w(
|
|
|
|
-D_GNU_SOURCE=1
|
2012-06-21 15:31:28 +01:00
|
|
|
-Wall
|
|
|
|
-Wextra
|
|
|
|
-Werror-implicit-function-declaration
|
2012-06-11 13:57:03 +01:00
|
|
|
-Wstrict-prototypes
|
|
|
|
-Wno-missing-field-initializers
|
2012-07-14 10:05:35 +01:00
|
|
|
) + # Added -Wno-missing-field-initializers to shut GCC up over {0} struct initialisers
|
|
|
|
[ENV['CFLAGS']]
|
2012-10-09 17:35:20 +01:00
|
|
|
|
|
|
|
LIBCHECK = File.exists?("/usr/lib/libcheck.a") ?
|
2012-10-07 02:09:34 +01:00
|
|
|
"/usr/lib/libcheck.a" :
|
|
|
|
"/usr/local/lib/libcheck.a"
|
2012-05-20 14:38:46 +01:00
|
|
|
|
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
|
2012-10-07 02:09:34 +01:00
|
|
|
LDFLAGS << ["-g"]
|
2012-05-16 01:27:14 +01:00
|
|
|
CCFLAGS << ["-g -DDEBUG"]
|
2013-07-24 12:34:36 +01:00
|
|
|
else
|
|
|
|
CCFLAGS << "-O2"
|
2012-05-16 01:27:14 +01:00
|
|
|
end
|
|
|
|
|
2012-07-14 18:47:25 +01:00
|
|
|
desc "Build the binary and man page"
|
2013-03-19 13:13:37 +00:00
|
|
|
task :build => [:flexnbd, :flexnbd_proxy, :man]
|
2012-07-14 18:47:25 +01:00
|
|
|
task :default => :build
|
|
|
|
|
2013-03-19 13:13:37 +00:00
|
|
|
desc "Build just the flexnbd binary"
|
2012-07-14 18:47:25 +01:00
|
|
|
task :flexnbd => "build/flexnbd"
|
2012-05-16 01:27:14 +01:00
|
|
|
|
2013-03-19 13:13:37 +00:00
|
|
|
desc "Build just the flexnbd-proxy binary"
|
|
|
|
task :flexnbd_proxy => "build/flexnbd-proxy"
|
|
|
|
|
2012-06-07 14:25:30 +01:00
|
|
|
def check(m)
|
|
|
|
"build/tests/check_#{m}"
|
|
|
|
end
|
|
|
|
|
2012-07-16 10:29:06 +01:00
|
|
|
file "README.txt"
|
2013-03-19 13:13:37 +00:00
|
|
|
file "README.proxy.txt"
|
2012-07-11 09:43:16 +01:00
|
|
|
|
2013-03-19 13:13:37 +00:00
|
|
|
def manpage(name, src)
|
2012-07-14 18:47:25 +01:00
|
|
|
FileUtils.mkdir_p( "build" )
|
2013-03-19 13:13:37 +00:00
|
|
|
sh "a2x --destination-dir build --format manpage #{src}"
|
|
|
|
sh "gzip -f build/#{name}"
|
|
|
|
end
|
|
|
|
|
|
|
|
file "build/flexnbd.1.gz" => "README.txt" do
|
|
|
|
manpage("flexnbd.1", "README.txt")
|
|
|
|
end
|
|
|
|
|
|
|
|
file "build/flexnbd-proxy.1.gz" => "README.proxy.txt" do
|
|
|
|
manpage("flexnbd-proxy.1", "README.proxy.txt")
|
2012-07-14 18:36:02 +01:00
|
|
|
end
|
|
|
|
|
2012-07-14 18:47:25 +01:00
|
|
|
desc "Build just the man page"
|
2013-03-19 13:13:37 +00:00
|
|
|
task :man => ["build/flexnbd.1.gz", "build/flexnbd-proxy.1.gz"]
|
2012-07-14 18:47:25 +01:00
|
|
|
|
2012-07-11 09:43:16 +01:00
|
|
|
|
2012-05-20 14:38:46 +01:00
|
|
|
namespace "test" do
|
2012-05-27 14:40:16 +01:00
|
|
|
desc "Run all tests"
|
2012-05-24 01:39:35 +01:00
|
|
|
task 'run' => ["unit", "scenarios"]
|
2012-05-30 09:51:20 +01:00
|
|
|
|
2012-05-27 14:40:16 +01:00
|
|
|
desc "Build C tests"
|
2012-06-07 14:25:30 +01:00
|
|
|
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
|
2012-05-30 09:51:20 +01:00
|
|
|
|
2012-05-27 14:40:16 +01:00
|
|
|
desc "Run C tests"
|
2012-05-24 01:39:35 +01:00
|
|
|
task 'unit' => 'build' do
|
2012-05-20 14:38:46 +01:00
|
|
|
TEST_MODULES.each do |n|
|
|
|
|
ENV['EF_DISABLE_BANNER'] = '1'
|
2012-06-07 14:25:30 +01:00
|
|
|
sh check n
|
2012-05-20 14:38:46 +01:00
|
|
|
end
|
|
|
|
end
|
2012-05-30 09:51:20 +01:00
|
|
|
|
2012-05-27 14:40:16 +01:00
|
|
|
desc "Run NBD test scenarios"
|
2013-03-19 13:13:37 +00:00
|
|
|
task 'scenarios' => ['build/flexnbd', 'build/flexnbd-proxy'] do
|
2013-02-14 11:17:44 +00:00
|
|
|
sh "cd tests/acceptance; ruby nbd_scenarios -v"
|
2012-05-24 01:39:35 +01:00
|
|
|
end
|
2012-05-20 14:38:46 +01:00
|
|
|
end
|
|
|
|
|
2012-05-30 09:51:20 +01:00
|
|
|
|
2012-06-11 13:57:03 +01:00
|
|
|
|
|
|
|
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} "
|
2012-06-11 13:57:03 +01:00
|
|
|
end
|
|
|
|
|
2012-05-20 14:38:46 +01:00
|
|
|
def gcc_link(target, objects)
|
2012-05-30 09:51:20 +01:00
|
|
|
FileUtils.mkdir_p File.dirname( target )
|
|
|
|
|
2012-06-27 15:45:33 +01:00
|
|
|
sh "#{CC} #{LDFLAGS.join(' ')} "+
|
2012-06-11 13:57:03 +01:00
|
|
|
" -Isrc " +
|
2012-05-20 14:38:46 +01:00
|
|
|
" -o #{target} "+
|
2012-10-07 02:09:34 +01:00
|
|
|
objects.join(" ") +
|
|
|
|
" "+LIBS.map { |l| "-l#{l}" }.join(" ")
|
2012-05-20 14:38:46 +01:00
|
|
|
end
|
|
|
|
|
2012-06-09 02:17:34 +01:00
|
|
|
def headers(c)
|
2012-06-27 15:45:33 +01:00
|
|
|
`#{CC} -Isrc -MM #{c}`.gsub("\\\n", " ").split(" ")[2..-1]
|
2012-06-09 02:17:34 +01:00
|
|
|
end
|
|
|
|
|
2013-03-19 13:13:37 +00:00
|
|
|
rule 'build/flexnbd-proxy' => PROXY_OBJECTS do |t|
|
|
|
|
gcc_link(t.name, t.sources)
|
|
|
|
end
|
|
|
|
|
2012-05-30 09:51:20 +01:00
|
|
|
rule 'build/flexnbd' => OBJECTS do |t|
|
2012-05-20 14:38:46 +01:00
|
|
|
gcc_link(t.name, t.sources)
|
|
|
|
end
|
|
|
|
|
2012-06-07 11:44:19 +01:00
|
|
|
|
2012-06-21 15:31:28 +01:00
|
|
|
file check("client") =>
|
2012-06-11 13:57:03 +01:00
|
|
|
%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
|
2012-07-11 09:43:16 +01:00
|
|
|
build/flexthread.o
|
2012-06-07 11:44:19 +01:00
|
|
|
build/control.o
|
|
|
|
build/readwrite.o
|
|
|
|
build/parse.o
|
|
|
|
build/client.o
|
2012-06-21 15:31:28 +01:00
|
|
|
build/serve.o
|
2012-06-07 17:47:43 +01:00
|
|
|
build/acl.o
|
2012-06-21 15:31:28 +01:00
|
|
|
build/ioutil.o
|
2012-06-27 15:45:33 +01:00
|
|
|
build/mbox.o
|
|
|
|
build/mirror.o
|
|
|
|
build/status.o
|
2013-02-13 13:43:52 +00:00
|
|
|
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") =>
|
2012-06-11 13:57:03 +01:00
|
|
|
%w{build/tests/check_acl.o
|
2012-06-07 17:47:43 +01:00
|
|
|
build/parse.o
|
|
|
|
build/acl.o
|
2012-06-21 15:31:28 +01:00
|
|
|
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
|
|
|
|
|
2012-06-08 10:32:33 +01:00
|
|
|
file check("serve") =>
|
2012-06-11 13:57:03 +01:00
|
|
|
%w{build/tests/check_serve.o
|
2012-06-08 10:32:33 +01:00
|
|
|
build/self_pipe.o
|
|
|
|
build/nbdtypes.o
|
|
|
|
build/control.o
|
|
|
|
build/readwrite.o
|
|
|
|
build/parse.o
|
|
|
|
build/client.o
|
2012-07-11 09:43:16 +01:00
|
|
|
build/flexthread.o
|
2012-06-21 15:31:28 +01:00
|
|
|
build/serve.o
|
2012-06-27 15:45:33 +01:00
|
|
|
build/flexnbd.o
|
|
|
|
build/mirror.o
|
|
|
|
build/status.o
|
2012-06-08 10:32:33 +01:00
|
|
|
build/acl.o
|
2012-06-27 15:45:33 +01:00
|
|
|
build/mbox.o
|
2012-06-21 15:31:28 +01:00
|
|
|
build/ioutil.o
|
2013-02-13 13:43:52 +00:00
|
|
|
build/sockutil.o
|
2012-06-08 10:32:33 +01:00
|
|
|
build/util.o} do |t|
|
|
|
|
gcc_link t.name, t.prerequisites + [LIBCHECK]
|
|
|
|
end
|
|
|
|
|
2013-07-08 13:32:14 +01:00
|
|
|
file check("status") =>
|
|
|
|
%w{
|
|
|
|
build/tests/check_status.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/flexnbd.o
|
|
|
|
build/mirror.o
|
|
|
|
build/status.o
|
|
|
|
build/acl.o
|
|
|
|
build/mbox.o
|
|
|
|
build/ioutil.o
|
|
|
|
build/sockutil.o
|
|
|
|
build/util.o
|
|
|
|
} do |t|
|
|
|
|
gcc_link t.name, t.prerequisites + [LIBCHECK]
|
|
|
|
end
|
|
|
|
|
|
|
|
|
2012-06-13 09:59:08 +01:00
|
|
|
file check("readwrite") =>
|
|
|
|
%w{build/tests/check_readwrite.o
|
|
|
|
build/readwrite.o
|
|
|
|
build/client.o
|
|
|
|
build/self_pipe.o
|
|
|
|
build/serve.o
|
|
|
|
build/parse.o
|
|
|
|
build/acl.o
|
2012-07-11 09:43:16 +01:00
|
|
|
build/flexthread.o
|
2012-06-13 09:59:08 +01:00
|
|
|
build/control.o
|
2012-06-27 15:45:33 +01:00
|
|
|
build/flexnbd.o
|
|
|
|
build/mirror.o
|
|
|
|
build/status.o
|
2012-06-13 09:59:08 +01:00
|
|
|
build/nbdtypes.o
|
2012-06-27 15:45:33 +01:00
|
|
|
build/mbox.o
|
2012-06-13 09:59:08 +01:00
|
|
|
build/ioutil.o
|
2013-02-13 13:43:52 +00:00
|
|
|
build/sockutil.o
|
2012-06-13 09:59:08 +01:00
|
|
|
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
|
2013-02-13 13:43:52 +00:00
|
|
|
build/sockutil.o
|
2012-06-27 15:45:33 +01:00
|
|
|
build/util.o
|
|
|
|
build/control.o
|
|
|
|
build/mbox.o
|
2012-07-11 09:43:16 +01:00
|
|
|
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
|
2013-03-19 13:13:37 +00:00
|
|
|
build/serve.o} do |t|
|
2012-06-27 15:45:33 +01:00
|
|
|
gcc_link t.name, t.prerequisites + [LIBCHECK]
|
|
|
|
end
|
|
|
|
|
2012-10-09 17:35:20 +01:00
|
|
|
|
2012-06-27 15:45:33 +01:00
|
|
|
file check("control") =>
|
2013-03-19 13:13:37 +00:00
|
|
|
%w{build/tests/check_control.o} + OBJECTS - ["build/main.o", 'build/proxy-main.o', 'build/proxy.o'] do |t|
|
2012-06-27 15:45:33 +01:00
|
|
|
gcc_link t.name, t.prerequisites + [LIBCHECK]
|
|
|
|
end
|
2012-06-07 11:44:19 +01:00
|
|
|
|
2013-07-08 13:32:14 +01:00
|
|
|
(TEST_MODULES- %w{status control flexnbd acl client serve readwrite util}).each do |m|
|
2012-06-11 13:57:03 +01:00
|
|
|
tgt = "build/tests/check_#{m}.o"
|
2012-05-30 09:51:20 +01:00
|
|
|
maybe_obj_name = "build/#{m}.o"
|
2013-03-19 13:13:37 +00:00
|
|
|
# Take it out in case we're testing one of the utils
|
2013-02-15 16:52:16 +00:00
|
|
|
deps = ["build/ioutil.o", "build/util.o", "build/sockutil.o"] - [maybe_obj_name]
|
2012-05-30 09:51:20 +01:00
|
|
|
|
2012-06-21 18:01:56 +01:00
|
|
|
# Add it back in if it's something we need to compile
|
2012-05-30 09:51:20 +01:00
|
|
|
deps << maybe_obj_name if OBJECTS.include?( maybe_obj_name )
|
|
|
|
|
2012-06-11 13:57:03 +01:00
|
|
|
file check( m ) => deps + [tgt] do |t|
|
|
|
|
gcc_link(t.name, deps + [tgt, LIBCHECK])
|
2012-05-30 09:51:20 +01:00
|
|
|
end
|
2012-05-16 01:27:14 +01:00
|
|
|
end
|
|
|
|
|
2012-05-30 09:51:20 +01:00
|
|
|
|
|
|
|
OBJECTS.zip( SOURCES ).each do |o,c|
|
2012-06-11 13:57:03 +01:00
|
|
|
file o => [c]+headers(c) do |t| gcc_compile( o, c ) end
|
|
|
|
end
|
|
|
|
|
2013-03-19 13:13:37 +00:00
|
|
|
PROXY_ONLY_OBJECTS.zip( PROXY_ONLY_SOURCES).each do |o, c|
|
|
|
|
file o => [c]+headers(c) do |t| gcc_compile( o, c ) end
|
|
|
|
end
|
|
|
|
|
2012-06-11 13:57:03 +01:00
|
|
|
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
|
|
|
|
|
2012-05-27 14:40:16 +01:00
|
|
|
desc "Remove all build targets, binaries and temporary files"
|
2012-05-30 17:35:07 +01:00
|
|
|
task :clean do
|
|
|
|
sh "rm -rf *~ build"
|
|
|
|
end
|
|
|
|
|
2012-06-06 10:24:04 +01:00
|
|
|
namespace :pkg do
|
|
|
|
deb do |t|
|
2013-03-19 13:13:37 +00:00
|
|
|
t.code_files = ALL_SOURCES + ["Rakefile", "README.txt", "README.proxy.txt"]
|
2012-05-30 17:35:07 +01:00
|
|
|
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
|
|
|
|