feat: 🔥 oh god
This commit is contained in:
parent
cdb5492bfe
commit
3c7f48016d
30 changed files with 708 additions and 280 deletions
140
bin/console
140
bin/console
|
@ -12,138 +12,20 @@ $core = Comfpile::Core.new()
|
|||
$core.add_artefact_engine Comfpile::FilesourceEngine, root_path: File.join(File.dirname(__FILE__), '../test/faux_build_dir')
|
||||
$core.add_artefact_engine Comfpile::ConfigLoaderEngine
|
||||
|
||||
$core.add_artefact_engine Comfpile::ParserEngine,
|
||||
file_regex: /^(.+)\.(h|c|cpp)$/,
|
||||
search_regexes: [
|
||||
{
|
||||
regex: /^#include\s*[<"](?<value>.+)[>"]/,
|
||||
key: 'include'
|
||||
},
|
||||
{
|
||||
regex: /\/\/\s*comf\.(?<key>\w+)[=:]\s*(?<value>.+)/
|
||||
}
|
||||
]
|
||||
$core.add_artefact_engine Comfpile::ParserEngine,
|
||||
file_regex: /^(.+)\.vhd$/,
|
||||
search_regexes: [
|
||||
{
|
||||
regex: /--+\s*comf\.(?<key>[^:]+)[=:]\s*(?<value>.+)/
|
||||
}
|
||||
]
|
||||
require_relative 'ghdl_engine.rb'
|
||||
require_relative 'cpp_engine.rb'
|
||||
|
||||
$core.add_artefact_engine do |engine|
|
||||
engine.add_recipe(:ghdl_analysed, /^(.+)\.vhd/) do |match, a|
|
||||
a.parent_artefact :dependency_analysis_include, a.target
|
||||
t_start = Time.now()
|
||||
dep_art = $core.craft_and_complete(:execute, "cpp/main.cpp")
|
||||
dep_art = $core.craft_and_complete(:execute, "cpp/main2.cpp")
|
||||
t_end = Time.now()
|
||||
|
||||
a.add_step do
|
||||
@parent_artefact.dependencies.each do |dependency|
|
||||
next if dependency.target == a.target
|
||||
# t_start = Time.now()
|
||||
# dep_art = $core.craft_and_complete(:gtkwave_output, "vhdl/spi_master_tb.vhd")
|
||||
# t_end = Time.now()
|
||||
|
||||
log "Adding dependency for ghdl analysis of #{dependency.target}..."
|
||||
|
||||
require_artefact :ghdl_analysed, dependency.target
|
||||
end
|
||||
end
|
||||
|
||||
a.add_step do
|
||||
work_library = find_parsed_parameter('vhdl.work')
|
||||
if work_library.nil?
|
||||
work_library = ''
|
||||
else
|
||||
work_library = '--work=' + work_library
|
||||
end
|
||||
|
||||
cmd = "ghdl -a -fsynopsys --std=08 #{work_library} #{self.file}"
|
||||
log "Executing: #{cmd}"
|
||||
|
||||
`#{cmd}`
|
||||
end
|
||||
end
|
||||
|
||||
engine.add_recipe(:ghdl_elaborated, /^(.+)\.vhd/) do |match, a|
|
||||
a.parent_artefact :dependency_analysis, a.target
|
||||
|
||||
a.add_step do
|
||||
dependencies.each do |dep|
|
||||
require_artefact :ghdl_analysed, dep.target
|
||||
end
|
||||
end
|
||||
|
||||
a.add_step do
|
||||
work_library = find_parsed_parameter('vhdl.work')
|
||||
if work_library.nil?
|
||||
work_library = ''
|
||||
else
|
||||
work_library = '--work=' + work_library
|
||||
end
|
||||
|
||||
elaborate_arch = find_parsed_parameter('vhdl.elaborate') || File.basename(@target).chomp(File.extname(@target))
|
||||
|
||||
cmd = "ghdl -e -fsynopsys --std=08 #{work_library} #{elaborate_arch}"
|
||||
log "Executing: #{cmd}"
|
||||
|
||||
`#{cmd}`
|
||||
end
|
||||
end
|
||||
|
||||
engine.add_recipe :ghdl_run, /^(.+)\.vhd/ do |match, a|
|
||||
a.parent_artefact :ghdl_elaborated, a.target
|
||||
|
||||
a.add_step do
|
||||
work_library = find_parsed_parameter('vhdl.work')
|
||||
if work_library.nil?
|
||||
work_library = ''
|
||||
else
|
||||
work_library = '--work=' + work_library
|
||||
end
|
||||
|
||||
elaborate_arch = find_parsed_parameter('vhdl.elaborate') || File.basename(@target).chomp(File.extname(@target))
|
||||
|
||||
@parameters[:ghdl_arch] = elaborate_arch
|
||||
|
||||
cmd = "ghdl -r -fsynopsys --std=08 #{work_library} #{elaborate_arch} --wave=#{elaborate_arch}.ghw"
|
||||
log "Executing: #{cmd}"
|
||||
|
||||
`#{cmd}`
|
||||
end
|
||||
end
|
||||
|
||||
engine.add_recipe(:gtkwave_output, /^(.+)\.vhd/) do |match, a|
|
||||
a.parent_artefact :ghdl_run, a.target
|
||||
a.add_step do
|
||||
`gtkwave #{@parent_artefact[:ghdl_arch]}.ghw`
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
$core.add_artefact_engine do |engine|
|
||||
|
||||
engine.add_recipe(:dependency_list, /^(.+)\.(h|c|cpp)$/) do |match, a|
|
||||
|
||||
a.require_artefact :dependency_analysis, a.target
|
||||
a.require_artefact :dependency_analysis_include, a.target
|
||||
|
||||
a.add_step do
|
||||
deps_artefact = find_artefact(:dependency_analysis, @target)
|
||||
@parameters[:dependency_list] = deps_artefact.dependencies
|
||||
end
|
||||
end
|
||||
|
||||
engine.add_recipe(:x86_debug, /^run (.+)/) do |match, a|
|
||||
|
||||
a.require_artefact :parsed, "#{match[1]}.cpp"
|
||||
end
|
||||
|
||||
engine.add_recipe(:x86_debug, /(.+)\.o$/) do |match, a|
|
||||
a.require_artefact :sourcefile, "#{match[1]}.cpp"
|
||||
|
||||
a.add_step do
|
||||
|
||||
end
|
||||
|
||||
true
|
||||
end
|
||||
end
|
||||
# puts "Full dependency list is: #{dep_art.dependencies.map(&:target)} (took #{t_end - t_start})"
|
||||
# puts "Includes of all source files:"
|
||||
|
||||
# (If you use this, don't forget to add pry to your Gemfile!)
|
||||
require "pry"
|
||||
|
|
48
bin/cpp-engine_old.rb
Normal file
48
bin/cpp-engine_old.rb
Normal file
|
@ -0,0 +1,48 @@
|
|||
|
||||
|
||||
$core.add_artefact_engine Comfpile::ParserEngine,
|
||||
file_regex: /^(.+)\.(h|c|cpp)$/,
|
||||
search_regexes: [
|
||||
{
|
||||
regex: /^#include\s*[<"](?<value>.+)[>"]/,
|
||||
key: 'include'
|
||||
},
|
||||
{
|
||||
regex: /\/\/\s*comf\.(?<key>\w+)[=:]\s*(?<value>.+)/
|
||||
}
|
||||
]
|
||||
|
||||
$core.add_artefact_engine do |engine|
|
||||
|
||||
engine.add_recipe(:dependency_list, /^(.+)\.(h|c|cpp)$/) do |match, a|
|
||||
|
||||
a.require_artefact :dependency_analysis, a.target
|
||||
a.require_artefact :dependency_analysis_include, a.target
|
||||
|
||||
a.add_step do
|
||||
deps_artefact = find_artefact(:dependency_analysis, @target)
|
||||
@parameters[:dependency_list] = deps_artefact.dependencies
|
||||
end
|
||||
end
|
||||
|
||||
engine.add_recipe(:x86_debug, /^run (.+)/) do |match, a|
|
||||
|
||||
a.require_artefact :parsed, "#{match[1]}.cpp"
|
||||
end
|
||||
|
||||
engine.add_recipe(:x86_debug, /(.+)\.o$/) do |match, a|
|
||||
a.require_artefact :sourcefile, "#{match[1]}.cpp"
|
||||
|
||||
a.add_step do
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
engine.add_recipe(:execute, /(.*)/) do |match, a|
|
||||
a.parent_artefact :executable, match[0]
|
||||
|
||||
a.add_step do
|
||||
@parent_artefact
|
||||
end
|
||||
end
|
||||
end
|
70
bin/cpp_engine.rb
Normal file
70
bin/cpp_engine.rb
Normal file
|
@ -0,0 +1,70 @@
|
|||
|
||||
|
||||
$core.add_artefact_engine Comfpile::ParserEngine,
|
||||
file_regex: /^(.+)\.(h|c|cpp)$/,
|
||||
search_regexes: [
|
||||
{
|
||||
regex: /^#include\s*[<"](?<value>.+)[>"]/,
|
||||
key: 'include'
|
||||
},
|
||||
{
|
||||
regex: /\/\/\s*comf\.(?<key>\w+)[=:]?\s*(?<value>.+)/
|
||||
}
|
||||
]
|
||||
|
||||
$core.add_artefact_engine do |engine|
|
||||
engine.add_recipe(:object, /^(.*)\.(h|c|cpp)$/) do |match, a|
|
||||
a.parent_artefact :sourcefile, match[0]
|
||||
|
||||
a.add_step do
|
||||
`g++ -I #{@build_dir} -c #{@target} -o #{@target}.o`
|
||||
end
|
||||
end
|
||||
|
||||
engine.add_recipe(:main_object, /^(.*)\.(h|c|cpp)$/) do |match, a|
|
||||
a.parent_artefact :sourcefile, match[0]
|
||||
|
||||
a.add_step do
|
||||
`g++ -DCOMF_MAIN -I #{@build_dir} -c #{@target} -o #{@target}.main.o`
|
||||
end
|
||||
end
|
||||
|
||||
engine.add_recipe(:executable) do |match, a|
|
||||
a.parent_artefact :dependency_analysis, match
|
||||
|
||||
a.add_step do
|
||||
@object_files = []
|
||||
|
||||
@parent_artefact.dependencies.each do |dep|
|
||||
next unless ['.c', '.cpp'].include? File.extname(dep.target)
|
||||
next if dep.target == @target
|
||||
|
||||
@object_files << require_artefact(:object, dep.target)
|
||||
end
|
||||
|
||||
@main_object_file = require_artefact(:main_object, @target)
|
||||
end
|
||||
|
||||
a.add_step do
|
||||
link_objects = []
|
||||
@object_files.each do |obj|
|
||||
link_objects << obj.target + '.o'
|
||||
end
|
||||
link_objects << @main_object_file.target + '.main.o'
|
||||
|
||||
cmd = "g++ #{link_objects.join(' ')} -o #{@target.sub(/\.[^.\/]*\Z/, '')}"
|
||||
log cmd
|
||||
|
||||
`#{cmd}`
|
||||
end
|
||||
end
|
||||
|
||||
engine.add_recipe(:execute) do |match, a|
|
||||
|
||||
a.parent_artefact :executable, match
|
||||
|
||||
a.add_step do
|
||||
print `./#{@target.sub(/\.[^.\/]*\Z/, '')}`
|
||||
end
|
||||
end
|
||||
end
|
94
bin/ghdl_engine.rb
Normal file
94
bin/ghdl_engine.rb
Normal file
|
@ -0,0 +1,94 @@
|
|||
|
||||
|
||||
$core.add_artefact_engine Comfpile::ParserEngine,
|
||||
file_regex: /^(.+)\.vhd$/,
|
||||
search_regexes: [
|
||||
{
|
||||
regex: /--+\s*comf\.(?<key>[^:]+)[=:]\s*(?<value>.+)/
|
||||
}
|
||||
]
|
||||
|
||||
$core.add_artefact_engine do |engine|
|
||||
engine.add_recipe(:ghdl_analysed, /^(.+)\.vhd/) do |match, a|
|
||||
a.parent_artefact :dependency_analysis_include, a.target
|
||||
|
||||
a.add_step do
|
||||
@parent_artefact.dependencies.each do |dependency|
|
||||
next if dependency.target == a.target
|
||||
|
||||
log "Adding dependency for ghdl analysis of #{dependency.target}..."
|
||||
|
||||
require_artefact :ghdl_analysed, dependency.target
|
||||
end
|
||||
end
|
||||
|
||||
a.add_step do
|
||||
work_library = find_parsed_parameter('vhdl.work')
|
||||
if work_library.nil?
|
||||
work_library = ''
|
||||
else
|
||||
work_library = '--work=' + work_library
|
||||
end
|
||||
|
||||
cmd = "ghdl -a -fsynopsys --std=08 #{work_library} #{self.file}"
|
||||
log "Executing: #{cmd}"
|
||||
|
||||
`#{cmd}`
|
||||
end
|
||||
end
|
||||
|
||||
engine.add_recipe(:ghdl_elaborated, /^(.+)\.vhd/) do |match, a|
|
||||
a.parent_artefact :dependency_analysis, a.target
|
||||
|
||||
a.add_step do
|
||||
dependencies.each do |dep|
|
||||
require_artefact :ghdl_analysed, dep.target
|
||||
end
|
||||
end
|
||||
|
||||
a.add_step do
|
||||
work_library = find_parsed_parameter('vhdl.work')
|
||||
if work_library.nil?
|
||||
work_library = ''
|
||||
else
|
||||
work_library = '--work=' + work_library
|
||||
end
|
||||
|
||||
elaborate_arch = find_parsed_parameter('vhdl.elaborate') || File.basename(@target).chomp(File.extname(@target))
|
||||
|
||||
cmd = "ghdl -e -fsynopsys --std=08 #{work_library} #{elaborate_arch}"
|
||||
log "Executing: #{cmd}"
|
||||
|
||||
`#{cmd}`
|
||||
end
|
||||
end
|
||||
|
||||
engine.add_recipe :ghdl_run, /^(.+)\.vhd/ do |match, a|
|
||||
a.parent_artefact :ghdl_elaborated, a.target
|
||||
|
||||
a.add_step do
|
||||
work_library = find_parsed_parameter('vhdl.work')
|
||||
if work_library.nil?
|
||||
work_library = ''
|
||||
else
|
||||
work_library = '--work=' + work_library
|
||||
end
|
||||
|
||||
elaborate_arch = find_parsed_parameter('vhdl.elaborate') || File.basename(@target).chomp(File.extname(@target))
|
||||
|
||||
@parameters[:ghdl_arch] = elaborate_arch
|
||||
|
||||
cmd = "ghdl -r -fsynopsys --std=08 #{work_library} #{elaborate_arch} --wave=#{elaborate_arch}.ghw"
|
||||
log "Executing: #{cmd}"
|
||||
|
||||
`#{cmd}`
|
||||
end
|
||||
end
|
||||
|
||||
engine.add_recipe(:gtkwave_output, /^(.+)\.vhd/) do |match, a|
|
||||
a.parent_artefact :ghdl_run, a.target
|
||||
a.add_step do
|
||||
`gtkwave #{@parent_artefact[:ghdl_arch]}.ghw`
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue