tasks/compile.rake in webroar-0.3.1 vs tasks/compile.rake in webroar-0.4.0

- old
+ new

@@ -22,165 +22,125 @@ #rake without any argument, it will invoke default task of making executable. #rake::clean, removes all the object files from obj directory. #rake::clobber, performs rake::clean, also removes executable from bin directory. -#% $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/lib") - require 'mkmf' +CC = CONFIG['CC'] +ROOT_DIR = File.expand_path(File.join(File.dirname(__FILE__), '..')).freeze +LIBEV_DIR = File.join(ROOT_DIR, 'src', 'vendor', 'libev').freeze +EBB_DIR = File.join(ROOT_DIR, 'src', 'vendor', 'libebb').freeze +YAML_DIR = File.join(ROOT_DIR, 'src', 'vendor', 'libyaml').freeze +BIN_DIR = File.join(ROOT_DIR,'bin').freeze +HEAD_DIR = File.join(ROOT_DIR, 'src', 'head').freeze +HELPER_DIR = File.join(ROOT_DIR, 'src', 'helper').freeze +WORKER_DIR = File.join(ROOT_DIR, 'src', 'worker').freeze +CONF_DIR = File.join(ROOT_DIR, 'conf').freeze +UNIT_TEST_DIR = File.join(ROOT_DIR, 'test', 'unit').freeze +HEAD_OBJ_DIR = File.join(ROOT_DIR, 'obj', 'head').freeze +HELPER_OBJ_DIR = File.join(ROOT_DIR, 'obj', 'helper').freeze +WORKER_OBJ_DIR = File.join(ROOT_DIR, 'obj', 'worker').freeze +TEST_OBJ_DIR = File.join(ROOT_DIR, 'obj', 'test').freeze +LOG_FILES = File.join('','var','log','webroar').freeze +TMP_FILES = File.join('','tmp').freeze +RUBY_VERSION_CODE = RUBY_VERSION.gsub(/\D/, '').freeze + #Boolean to keep check method webroar_config has been called or not -$webroar_config_called=false +$webroar_config_called = false ## Set compilation flags needed by libebb & libev. Courtesy libebb -$flags = [] +$flags = "" -def webroar_config - #add flag to compile libev +## Set library flags needed +$lib_flags = "" + +CLEAN.include(File.join(WORKER_OBJ_DIR,'*.o'), File.join(HEAD_OBJ_DIR,'*.o'), File.join(HELPER_OBJ_DIR,'*.o'), File.join(TEST_OBJ_DIR,'*.o')) +CLOBBER.include(File.join(BIN_DIR,'webroar-head'),File.join(BIN_DIR,'webroar-worker'), File.join(UNIT_TEST_DIR,'*.so')) + +def set_flags + flags = [] + flags << '-DEV_USE_SELECT' if have_header('sys/select.h') + flags << '-DEV_USE_POLL' if have_header('poll.h') + flags << '-DEV_USE_EPOLL' if have_header('sys/epoll.h') + flags << '-DEV_USE_KQUEUE' if have_header('sys/event.h') and have_header('sys/queue.h') + flags << '-DEV_USE_PORT' if have_header('port.h') + flags << '-DEV_USE_INOTIFY' if have_header('sys/inotify.h') + flags << '-DEV_USE_MONOTONIC=0' + flags << '-DHAVE_GNUTLS' if ENV['ssl'].eql?("yes") + flags << "-DRUBY_VERSION=#{RUBY_VERSION_CODE}" + flags << Config::expand($CFLAGS,CONFIG) + flags << "-g -O2" if RUBY_PLATFORM =~ /darwin/ + flags << "-DL_ERROR -DL_INFO" + $flags << flags.join(" ") +end + +def set_include_flags + inc_flags = [" "] + inc_flags << " #{ENV['include_flags']}" if ENV['include_flags'] - if have_header('sys/select.h') - $flags << '-DEV_USE_SELECT' + if RUBY_VERSION_CODE.to_i < 190 + inc_flags << Config::expand($INCFLAGS,CONFIG.merge('hdrdir' => $hdrdir.quote, 'srcdir' => $srcdir.quote)) + else + inc_flags << Config::expand($INCFLAGS,CONFIG.merge('hdrdir' => $hdrdir.quote, 'srcdir' => $srcdir.quote, 'arch_hdrdir' => "#$arch_hdrdir", 'top_srcdir' => $top_srcdir.quote)) end - if have_header('poll.h') - $flags << '-DEV_USE_POLL' - end + inc_flags << " #{Config::CONFIG['cppflags']}" if Config::CONFIG['cppflags'] - if have_header('sys/epoll.h') - $flags << '-DEV_USE_EPOLL' - end + include_dir = ["#{LIBEV_DIR}","#{EBB_DIR}","#{HEAD_DIR}","#{YAML_DIR}","#{HELPER_DIR}","#{UNIT_TEST_DIR}", "#{WORKER_DIR}"] + include_dir << Config::CONFIG['includedir'] if Config::CONFIG['includedir'] - if have_header('sys/event.h') and have_header('sys/queue.h') - $flags << '-DEV_USE_KQUEUE' + include_dir.each do |dir| + inc_flags << " -I#{dir} " end - - if have_header('port.h') - $flags << '-DEV_USE_PORT' - end - - if have_header('sys/inotify.h') - $flags << '-DEV_USE_INOTIFY' - end - - $flags << '-DEV_USE_MONOTONIC=0' - if ENV['ssl'].eql?("yes") - puts "Adding HAVE_GNUTLS flag." - $flags << '-DHAVE_GNUTLS' - end - $flags = $flags.join(" ") - $webroar_config_called=true + $flags << inc_flags.join(" ") end -#Create directories if they don't exists -def create_directories(required_directories) - rv = true - for directory in required_directories - #check to see if it exists - unless File.exists?(directory) - begin - print "#{directory} doesn't exist. Creating it..." - FileUtils.mkdir_p(directory) - rescue Exception => e - puts "Failed." - puts e - puts e.backtrace - rv = false - next - end - puts "Created." - end - end - rv +def set_lib_flags + lib_flags = [$libs, $LIBS] + lib_flags << " #{ENV['library_flags']}" if ENV['library_flags'] + lib_flags << "-L" + Config::expand($libdir,CONFIG) + lib_flags << " " + $lib_flags << lib_flags.join(" ") end -ruby_version_code = RUBY_VERSION.gsub(/\D/, '') -$flags << "-DRUBY_VERSION=#{ruby_version_code}" -## Include for ruby files -if ruby_version_code.to_i < 190 - $inc_flags = Config::expand($INCFLAGS,CONFIG.merge('hdrdir' => $hdrdir.quote, 'srcdir' => $srcdir.quote)) -else - $inc_flags = Config::expand($INCFLAGS,CONFIG.merge('hdrdir' => $hdrdir.quote, 'srcdir' => $srcdir.quote, 'arch_hdrdir' => "#$arch_hdrdir", 'top_srcdir' => $top_srcdir.quote)) +def webroar_config + set_flags + set_include_flags + set_lib_flags + $webroar_config_called = true end -$inc_flags << " #{Config::CONFIG['cppflags']}" if Config::CONFIG['cppflags'] - -$c_flags = Config::expand($CFLAGS,CONFIG) -if RUBY_PLATFORM =~ /darwin/ - $c_flags += " -g -O2 " -end -$debug_flags = " -DL_ERROR -DL_INFO " - -## Set static veriables - -COMPILER = CONFIG['CC'] -DIR = File.expand_path(File.join(File.dirname(__FILE__), '..')).freeze -SRC_DIR = File.join(DIR, 'src').freeze -HEAD_DIR = File.join(SRC_DIR, 'head').freeze -HELPER_DIR = File.join(SRC_DIR, 'helper').freeze -VENDOR_DIR = File.join(SRC_DIR, 'vendor').freeze -LIBEV_DIR = File.join(VENDOR_DIR, 'libev').freeze -EBB_DIR = File.join(VENDOR_DIR, 'libebb').freeze -BIN_DIR = File.join(DIR,'bin').freeze -OBJ_DIR = File.join(DIR,'obj').freeze -WORKER_DIR = File.join(SRC_DIR, 'worker').freeze -WORKER_OBJ_DIR = File.join(OBJ_DIR, 'worker').freeze -YAML_DIR = File.join(VENDOR_DIR, 'libyaml').freeze -YAML_OBJ_DIR = File.join(OBJ_DIR, 'libyaml').freeze -CONF_DIR = File.join(SRC_DIR, 'conf').freeze -UNIT_TEST_DIR = File.join(DIR, 'test', 'unit').freeze -TEST_OBJ_DIR = File.join(OBJ_DIR, 'test').freeze -LOG_FILES = File.join('','var','log','webroar').freeze -TMP_FILES = File.join('','tmp').freeze - -## Create necessory directories -#create_directories([OBJ_DIR, WORKER_OBJ_DIR, YAML_OBJ_DIR, TEST_OBJ_DIR, TMP_FILES, LOG_FILES]) - -include_dir = ["#{LIBEV_DIR}","#{EBB_DIR}","#{HEAD_DIR}","#{YAML_DIR}","#{HELPER_DIR}","#{UNIT_TEST_DIR}", "#{WORKER_DIR}"] - -include_dir.each do |dir| - $inc_flags << " -I#{dir} " -end - -$inc_flags << " #{ENV['include_flags']}" if ENV['include_flags'] - -CLEAN.include(File.join(OBJ_DIR,'*.o'),File.join(WORKER_OBJ_DIR,'*.o'), File.join(YAML_OBJ_DIR,'*.o'), File.join(TEST_OBJ_DIR,'*.o')) -CLOBBER.include(File.join(BIN_DIR,'webroar-head'),File.join(BIN_DIR,'webroar-worker'), File.join(UNIT_TEST_DIR,'*.so')) - -webroar_bin = File.join(BIN_DIR,"webroar-head") +head_bin = File.join(BIN_DIR,"webroar-head") worker_bin = File.join(BIN_DIR,"webroar-worker") -#% ebb_request_parser_rl_file = FileList[File.join(EBB_DIR,'ebb_requset_parser.rl')] -src_files = FileList[File.join(HEAD_DIR,'*.c'),File.join(EBB_DIR,'*.c')] +head_files = FileList[File.join(HEAD_DIR,'*.c'),File.join(EBB_DIR,'*.c')] worker_files = FileList[File.join(WORKER_DIR,'*.c')] -yaml_files = FileList[File.join(YAML_DIR,'*.c')] -helper_files = FileList[File.join(HELPER_DIR,'*.c')] +helper_files = FileList[File.join(HELPER_DIR,'*.c'), File.join(YAML_DIR,'*.c')] #src_obj is a hash which will keep object file name as key and source file name as value. This is used to map source file to object file. #It's been used at time of object generation -src_obj={} +head_obj={} worker_obj={} -yaml_obj={} helper_obj={} # File dependencies go here ... -src_files.each do |sfn| +head_files.each do |sfn| obj = sfn.sub(/\.[^.]*$/, '.o') - obj_file = File.join(OBJ_DIR , obj[obj.rindex(File::SEPARATOR)+1..obj.length]) + obj_file = File.join(HEAD_OBJ_DIR , obj[obj.rindex(File::SEPARATOR)+1..obj.length]) desc "Setting Executable's dependency on objects files" - file webroar_bin => obj_file + file head_bin => obj_file #Insertion of object file to source file mapping in hash - src_obj[obj_file]=sfn + head_obj[obj_file]=sfn end -src_obj.each { |obj_file,src_file| +head_obj.each { |obj_file,src_file| file obj_file => src_file do - unless $webroar_config_called - webroar_config - end - cmd = "#{COMPILER} #$inc_flags #$c_flags #$flags #$debug_flags -c #{src_file} -o #{obj_file} " + webroar_config unless $webroar_config_called + cmd = "#{CC} #{$flags} -c #{src_file} -o #{obj_file} " sh cmd end } worker_files.each do |sfn| @@ -195,105 +155,76 @@ worker_obj[obj_file]=sfn end worker_obj.each { |obj_file,src_file| file obj_file => src_file do - unless $webroar_config_called - webroar_config - end - cmd = "#{COMPILER} #$inc_flags #$c_flags #$flags #$debug_flags -c #{src_file} -o #{obj_file} " + webroar_config unless $webroar_config_called + flags = $flags + flags << ' -DW_ZLIB' if ENV['zlib']=='yes' + flags << ' -DW_REGEX' if ENV['regex']=='yes' + cmd = "#{CC} #{flags} -c #{src_file} -o #{obj_file} " sh cmd end } -yaml_files.each do |sfn| - obj = sfn.sub(/\.[^.]*$/, '.o') - obj_file = File.join(YAML_OBJ_DIR , obj[obj.rindex(File::SEPARATOR)+1..obj.length]) - file webroar_bin => obj_file - yaml_obj[obj_file]=sfn -end - -yaml_obj.each { |obj_file,src_file| - file obj_file => src_file do - cmd = "#{COMPILER} #$inc_flags -c #{src_file} -o #{obj_file} " - sh cmd - end -} - helper_files.each do |sfn| obj = sfn.sub(/\.[^.]*$/, '.o') - obj_file = File.join(OBJ_DIR , obj[obj.rindex(File::SEPARATOR)+1..obj.length]) + obj_file = File.join(HELPER_OBJ_DIR , obj[obj.rindex(File::SEPARATOR)+1..obj.length]) desc "Setting Executable's dependency on objects files" - file worker_bin => obj_file + #file worker_bin => obj_file + file head_bin => obj_file #Insertion of object file to source file mapping in hash helper_obj[obj_file]=sfn end helper_obj.each { |obj_file,src_file| file obj_file => src_file do - unless $webroar_config_called - webroar_config - end - cmd = "#{COMPILER} #$inc_flags #$c_flags #$flags #$debug_flags -c #{src_file} -o #{obj_file} " + webroar_config unless $webroar_config_called + cmd = "#{CC} #{$flags} -c #{src_file} -o #{obj_file} " sh cmd end } file worker_bin do - unless $webroar_config_called - webroar_config - end + puts $lib_flags + lib_flags = String.new($lib_flags) + lib_flags << Config::expand($LIBRUBYARG_SHARED,CONFIG) if CONFIG["ENABLE_SHARED"] == "yes" + lib_flags << Config::expand($LIBRUBYARG_STATIC, CONFIG) if CONFIG["ENABLE_SHARED"] == "no" + lib_flags << " -lz" if ENV['zlib'] == "yes" #libraries for making executable - lib_flags = $libs + $LIBS + ' -L' + Config::expand($libdir,CONFIG) + ' ' + Config::expand($LIBRUBYARG_SHARED,CONFIG) - #$libs += ' '+CONFIG["LIBRUBYARG"] - #$libs += ' -lpthread ' - lib_flags += " #{ENV['library_flags']}" if ENV['library_flags'] - out_file=File.join(BIN_DIR,'webroar-worker') - object_files=FileList[File.join(WORKER_OBJ_DIR,'*.o'), helper_obj.keys, File.join(YAML_OBJ_DIR,'*.o')] + out_file = File.join(BIN_DIR,'webroar-worker') + object_files = FileList[File.join(WORKER_OBJ_DIR,'*.o'), File.join(HELPER_OBJ_DIR,'*.o')] # -rdynamic option to get function name in stacktrace - cmd="#{COMPILER} #{lib_flags} -rdynamic #{object_files} -o #{out_file}" + cmd = "#{CC} -o #{out_file} #{object_files} -rdynamic #{lib_flags}" sh cmd end -file webroar_bin do - unless $webroar_config_called - webroar_config - end - #libraries for making executable - lib_flags = $libs + $LIBS # + ' -L' + Config::expand($libdir,CONFIG) + ' ' + Config::expand($LIBRUBYARG_SHARED,CONFIG) - #$libs += ' '+CONFIG["LIBRUBYARG"] - #$libs += ' -lpthread ' - lib_flags += " #{ENV['library_flags']}" if ENV['library_flags'] - if ENV['ssl'].eql?("yes") - puts "Compiling with gnutls library." - lib_flags += ' -L' + Config::CONFIG['libdir'] + ' -lgnutls ' - end - out_file=File.join(BIN_DIR,'webroar-head') - object_files=FileList[File.join(OBJ_DIR,'*.o'),File.join(YAML_OBJ_DIR,'*.o')] +file head_bin do + puts $lib_flags + out_file = File.join(BIN_DIR,'webroar-head') + object_files = FileList[File.join(HEAD_OBJ_DIR,'*.o'), File.join(HELPER_OBJ_DIR,'*.o')] # -rdynamic option to get function name in stacktrace - cmd="#{COMPILER} #{lib_flags} -rdynamic #{object_files} -o #{out_file}" + cmd="#{CC} -o #{out_file} #{object_files} -rdynamic #{$lib_flags} #{ENV['ssl'].eql?("yes")? ' -lgnutls ' : '' } " sh cmd end -file webroar_bin => worker_bin -task :compile => [:create_obj_dirs, webroar_bin] +file head_bin => worker_bin +task :compile => [:create_obj_dirs, head_bin] task :default => :compile desc "Build with debug statements" task :debug_build do - $debug_flags<<" -DL_DEBUG " + $flags << " -DL_DEBUG " d=Rake::Task[:default] d.invoke(); end -$sbin_flag=true - desc "Creates required folders for compilation." task :create_obj_dirs do - if create_directories([OBJ_DIR, WORKER_OBJ_DIR, YAML_OBJ_DIR, TMP_FILES]) == true + if create_directories([WORKER_OBJ_DIR, HEAD_OBJ_DIR, HELPER_OBJ_DIR, TMP_FILES]) == true puts 'Required directories created successfully. Building executables...' else puts 'Required directories could not be created. Can not continue...' end end @@ -302,6 +233,28 @@ if create_directories([LOG_FILES]) == true puts 'Required directories created successfully. Building executables...' else puts 'Required directories could not be created. Can not continue...' end +end + +#Create directories if they don't exists +def create_directories(required_directories) + rv = true + for directory in required_directories + #check to see if it exists + unless File.exists?(directory) + begin + print "#{directory} doesn't exist. Creating it..." + FileUtils.mkdir_p(directory) + rescue Exception => e + puts "Failed." + puts e + puts e.backtrace + rv = false + next + end + puts "Created." + end + end + rv end