class Fortran::Dependencies
Find Fortran
dependencies
Constants
- FILE_EXTENSION
- MODULE_DEF_REGEX
- MODULE_INCLUDE_REGEX
- OPTIONS
- USE_MODULE_REGEX
Attributes
file_dependencies[R]
inlined_dependencies[R]
source_files[R]
Public Class Methods
new( config=OPTIONS )
click to toggle source
# File lib/fortran.rb, line 26 def initialize( config=OPTIONS ) @config = config OPTIONS.each{ |opt,default| @config[opt] = default unless @config.has_key? opt } @parsed, @file_dependencies, @source_files = [], {}, [] @inlined_dependencies = {} @hash = build_hash_of_modules_in_files @included_files = build_hash_of_non_module_files self end
Public Instance Methods
build_dictionary_of_modules( array_of_file_names )
click to toggle source
# File lib/fortran.rb, line 54 def build_dictionary_of_modules( array_of_file_names ) file_containing_module = {} array_of_file_names.each do |file| modules_defined_in( file ).each{ |mod| file_containing_module[mod]=file } end file_containing_module end
build_hash_of_modules_in_files()
click to toggle source
# File lib/fortran.rb, line 88 def build_hash_of_modules_in_files build_dictionary_of_modules find_fortran_files end
build_hash_of_non_module_files()
click to toggle source
# File lib/fortran.rb, line 70 def build_hash_of_non_module_files files = find_fortran_files included_files = {} files.each do |file| unless file_is_module?(file) included_files[File.basename(file)] = file end end included_files end
dependencies( start )
click to toggle source
# File lib/fortran.rb, line 129 def dependencies( start ) modules = modules_used_in( start ) @parsed = @parsed || [start] new_source_files = modules.collect{ |mod| @hash[mod] }.compact makefile_dependency_line(start) + new_source_files.collect do |file| next if @parsed.include?(file) @parsed.push file dependencies file end.join end
file_is_module?(file)
click to toggle source
# File lib/fortran.rb, line 81 def file_is_module?(file) IO.readlines( file ).map do |line| return true if line.match MODULE_DEF_REGEX end return false end
files_included_in( file )
click to toggle source
# File lib/fortran.rb, line 48 def files_included_in( file ) IO.readlines( file ).map do |line| $2 if line.match MODULE_INCLUDE_REGEX end.uniq.compact end
find_fortran_files()
click to toggle source
# File lib/fortran.rb, line 62 def find_fortran_files source = @config[:search_paths].map{ |path| Dir[path+"/*.[fF]90"] } source.flatten!.uniq! source.delete_if{ |file| File.lstat(file).symlink? } if @config[:ignore_symlinks] source.delete_if{ |file| file.match @config[:ignore_files] } source.map!{ |file| file.sub(/^\.\//,'') }# strip leading ./ end
included_files_in_module( file )
click to toggle source
# File lib/fortran.rb, line 98 def included_files_in_module( file ) files_included_in( file ).map do |included_file| @included_files[included_file] end.flatten.uniq.compact end
makefile_dependency_line( source )
click to toggle source
# File lib/fortran.rb, line 104 def makefile_dependency_line( source ) real_source = source.sub(/PHYSICS_DUMMY/,'PHYSICS_MODULES')# FIXME: What's this?! source_no_path = File.basename source @source_files.push source_no_path.gsub(%r|^.*/|,'') output = '' if (File.expand_path(source) != File.expand_path(source_no_path)) output += source_no_path+ ": " + real_source + "\n" output += "\tln -sf "+real_source+" .\n" end output += source.gsub(FILE_EXTENSION, ".o").gsub(%r|^.*/|,'' ) + ": " + source.gsub(%r|^.*/|,"" ) modules_used_in( source ).each do |use| unless @hash[use] unless use.match @config[:ignore_modules] $stderr.puts 'Warning: unable to locate module #{use} used in #{source}.' $stderr.puts ' set :search_paths or :ignore_module_regex options.' end next end output = output + " \\\n " + @hash[use].gsub(FILE_EXTENSION, ".o").gsub(%r|^.*/|,'' ) end output+"\n" end
modules_defined_in( file )
click to toggle source
# File lib/fortran.rb, line 42 def modules_defined_in( file ) IO.readlines( file ).map do |line| $1.downcase if line.match MODULE_DEF_REGEX end.uniq.compact end
modules_in_included_files( file )
click to toggle source
# File lib/fortran.rb, line 92 def modules_in_included_files( file ) files_included_in( file ).map do |included_file| modules_used_in(@included_files[included_file]) end.flatten.uniq.compact end
modules_used_in( file )
click to toggle source
# File lib/fortran.rb, line 36 def modules_used_in( file ) IO.readlines( file ).map do |line| $1.downcase if line.match USE_MODULE_REGEX end.uniq.compact end
required_source_files( head_f90 )
click to toggle source
# File lib/fortran.rb, line 157 def required_source_files( head_f90 ) @parsed.clear source_file_dependencies( head_f90 ) sources = [] until @file_dependencies.empty? do no_dependents_pair = @file_dependencies.detect{ |h,d| d == [] } no_dependents = no_dependents_pair.first sources.push no_dependents @file_dependencies.delete(no_dependents){ |el| "#{el} not found" } @file_dependencies.each_value{ |deps| deps.delete(no_dependents) } end sources end
source_file_dependencies( head_f90 )
click to toggle source
# File lib/fortran.rb, line 141 def source_file_dependencies( head_f90 ) modules_head_uses = modules_used_in( head_f90 ) modules_head_uses += modules_in_included_files( head_f90 ) required_f90s = modules_head_uses.map{ |mod| @hash[mod] }.compact required_f90s.delete_if{ |f| f == head_f90 } required_inlined = included_files_in_module( head_f90 ) required_inlined.delete_if{ |f| f == head_f90 } @file_dependencies[head_f90] = required_f90s @inlined_dependencies[head_f90] = required_inlined required_f90s.each do |required_f90| next if @parsed.include?(required_f90) source_file_dependencies( required_f90 ) end @parsed.push head_f90 end