diff --git a/bin/console b/bin/console index fe6a8ab..7b1dfdd 100755 --- a/bin/console +++ b/bin/console @@ -9,65 +9,30 @@ require "comfpile" $core = Comfpile::Core.new() -`mkdir /tmp/test` -`touch /tmp/test/main.cpp` - -`mkdir /tmp/test2/` -`touch /tmp/test2/main.cpp` - -$core.add_artefact_engine Comfpile::FilesourceEngine, root_path: "/tmp/test2" -$core.add_artefact_engine Comfpile::FilesourceEngine, root_path: "/tmp/test" +$core.add_artefact_engine Comfpile::FilesourceEngine, root_path: File.join(File.dirname(__FILE__), '../test/faux_build_dir') +$core.add_artefact_engine Comfpile::ParserEngine, + file_regex: /^(.+)\.(h|c|cpp)$/, + search_regexes: [ + { + regex: /^#include\s*[<"](?.+)[>"]/, + key: 'include' + }, + { + regex: /\/\/\s*comf\.(?\w+)[=:]\s*(?.+)/ + } +] $core.add_artefact_engine do |engine| - engine.add_recipe(:parsed, /^(.+)\.(h|c|cpp)$/) do |match, a| - - a.parent_artefact :sourcefile, a.target - - a.add_step do - puts "Parsing file #{@target}..." - - @linked_artefacts = [] - - File.readlines(@required_artefacts[:sourcefile][@target][:file]).each do |l| - case l - when /^#include\s*[<"](.+)[>"]/ - - puts "Got include for file #{$1}!" - @linked_artefacts << craft_artefact(:parsed, $1) - - when /\/\/+\s*require\s*[<"]((?:.+)\.(?:c|cpp))[>"]/ - puts "Got require for file #{$1}!" - @linked_artefacts << require_artefact(:parsed, $1) - end - end - end - end engine.add_recipe(:dependency_list, /^(.+)\.(h|c|cpp)$/) do |match, a| - a.parent_artefact :parsed, a.target + + a.require_artefact :dependency_analysis, a.target + a.require_artefact :dependency_analysis_include, a.target a.add_step do - puts "Generating dependency list for #{@target}..." - - parsed_marker = {} - parsing_list = [@parent_artefact] - - loop do - break if parsing_list.empty? - a = parsing_list.pop - - next if a.nil? - next unless a.stage == :parsed - next unless a.succeeded? - - next if parsed_marker[a.target] - parsed_marker[a.target] = true - - parsing_list += a.linked_artefacts - end - - @parameters[:dependency_list] = parsed_marker.keys + deps_artefact = find_artefact(:dependency_analysis, @target) + @parameters[:dependency_list] = deps_artefact.dependencies end end @@ -87,14 +52,21 @@ $core.add_artefact_engine do |engine| end end -$tst = $core.craft_artefact(:dependency_list, "main.cpp"); +t_start = Time.now() +dep_art = $core.craft_and_complete(:dependency_analysis, "main.cpp") +t_end = Time.now() -50.times do - $core.execute_step +puts "Full dependency list is: #{dep_art.dependencies.map(&:target)} (took #{t_end - t_start})" +puts "Includes of all source files:" + +dep_art.dependencies.each do |art| + next unless ['.cpp', '.c'].include? File.extname(art.target) + + include_art = $core.craft_and_complete(:dependency_analysis_include, art.target) + + puts "Included dependencies for #{art.target} are #{include_art.dependencies.map(&:target)}" end -puts "Dependency list is: #{$tst[:dependency_list]}" - # (If you use this, don't forget to add pry to your Gemfile!) require "pry" Pry.start diff --git a/test/faux_build_dir/lib_test/test.cpp b/test/faux_build_dir/lib_test/test.cpp index 3744f41..6623c35 100644 --- a/test/faux_build_dir/lib_test/test.cpp +++ b/test/faux_build_dir/lib_test/test.cpp @@ -1,3 +1,5 @@ #include "main.h" -#include "test.h" \ No newline at end of file +#include "test.h" + +#include "test_settings.h" \ No newline at end of file diff --git a/test/faux_build_dir/lib_test/test_settings.h b/test/faux_build_dir/lib_test/test_settings.h new file mode 100644 index 0000000..e69de29