@@ -18,58 +18,66 @@ Dir.glob("#{$root}/arch/certificate_model/*.yaml") do |f|
1818 base = cert_model_obj [ "base" ]
1919 raise "Missing certificate model base" if base . nil?
2020
21+ base_isa_name = "rv#{ base } "
22+
23+ puts "UPDATE: Extracted base=#{ base } from #{ f } "
24+
2125 file "#{ $root} /gen/certificate_doc/adoc/#{ cert_model_name } .adoc" => [
22- " #{ $root } /arch/certificate_model/ #{ cert_model_name } .yaml" ,
26+ __FILE__ ,
2327 "#{ $root} /arch/certificate_class/#{ cert_class_name } .yaml" ,
24- "#{ CERT_DOC_DIR } /templates/certificate.adoc.erb" ,
25- __FILE__
28+ "#{ $root} /arch/certificate_model/#{ cert_model_name } .yaml" ,
29+ "#{ $root} /lib/arch_obj_models/certificate.rb" ,
30+ "#{ $root} /lib/arch_obj_models/portfolio.rb" ,
31+ "#{ $root} /lib/portfolio_design.rb" ,
32+ "#{ $root} /lib/design.rb" ,
33+ "#{ CERT_DOC_DIR } /templates/certificate.adoc.erb"
2634 ] do |t |
27- puts "UPDATE: Creating bootstrap objects for #{ cert_model_name } "
28-
29- # Create bootstrap ConfiguredArchitecture object which also creates and contains
30- # a PartialConfig object for the rv32/rv64 configuration.
31- bootstrap_cfg_arch = cfg_arch_for ( "rv#{ base } " )
32-
33- # Creates CertModel object for every certificate model in the database
34- # using rv32/rv64 PartialConfig object and then returns named CertModel object.
35- bootstrap_cert_model = bootstrap_cfg_arch . cert_model ( cert_model_name )
36- raise "No certificate model named '#{ cert_model_name } '" if bootstrap_cert_model . nil?
37-
38- puts "UPDATE: Creating real objects for #{ cert_model_name } "
39-
40- # Use bootstrap CertModel to create a ConfiguredArchitecture for this CertModel
41- # to use instead of the the bootstrap one created based on the rv32/rv64 configuration.
42- cfg_arch = bootstrap_cert_model . to_cfg_arch
43-
44- # Use model-specific ConfiguredArchitecture to create CertModel objects again
45- # for every certificate model in the database and then return named CertModel object.
46- cert_model = cfg_arch . cert_model ( cert_model_name )
47-
48- # Set globals for ERB template.
49- portfolio = cert_model
50- cert_class = cert_model . cert_class
51- portfolio = cert_model
52- portfolio_class = cert_class
53-
54- version = File . basename ( t . name , '.adoc' ) . split ( '-' ) [ 1 ..] . join ( '-' )
55-
56- erb = ERB . new ( File . read ( "#{ CERT_DOC_DIR } /templates/certificate.adoc.erb" ) , trim_mode : "-" )
57- erb . filename = "#{ CERT_DOC_DIR } /templates/certificate.adoc.erb"
35+ # Create BaseArchitecture object. Function located in top-level Rakefile.
36+ puts "UPDATE: Creating BaseArchitecture #{ base_isa_name } for #{ t } "
37+ base_arch = base_arch_for ( base_isa_name , base )
38+
39+ # Create CertModel for specific certificate model as specified in its arch YAML file.
40+ # The Architecture object also creates all other portfolio-related class instances from their arch YAML files.
41+ # None of these objects are provided with a Design object when created.
42+ puts "UPDATE: Creating CertModel for #{ cert_model_name } using base #{ base_isa_name } "
43+ cert_model = base_arch . cert_model ( cert_model_name )
44+
45+ puts "UPDATE: Creating PortfolioDesign using CertModel #{ cert_model_name } "
46+ # Create the one PortfolioDesign object required for the ERB evaluation.
47+ portfolio_design = portfolio_design_for ( cert_model_name , base_arch , base , [ cert_model ] )
48+
49+ # Create empty binding and then specify explicitly which variables the ERB template can access.
50+ def create_empty_binding
51+ binding
52+ end
53+ erb_binding = create_empty_binding
54+ erb_binding . local_variable_set ( :arch , base_arch )
55+ erb_binding . local_variable_set ( :design , portfolio_design )
56+ erb_binding . local_variable_set ( :cert_class , cert_model . cert_class )
57+ erb_binding . local_variable_set ( :portfolio_class , cert_model . cert_class )
58+ erb_binding . local_variable_set ( :cert_model , cert_model )
59+ erb_binding . local_variable_set ( :portfolio , cert_model )
60+
61+ template_path = Pathname . new ( "#{ CERT_DOC_DIR } /templates/certificate.adoc.erb" )
62+ erb = ERB . new ( File . read ( template_path ) , trim_mode : "-" )
63+ erb . filename = template_path . to_s
5864
5965 FileUtils . mkdir_p File . dirname ( t . name )
6066
6167 # Convert ERB to final ASCIIDOC. Note that this code is broken up into separate function calls
6268 # each with a variable name to aid in running a command-line debugger on this code.
63- erb_result = erb . result ( binding )
64- erb_result_monospace_converted_to_links = cfg_arch . find_replace_links ( erb_result )
65- erb_result_with_links_added = cfg_arch . find_replace_links ( erb_result_monospace_converted_to_links )
69+ puts "UPDATE: Converting ERB template to adoc for #{ cert_model_name } "
70+ erb_result = erb . result ( erb_binding )
71+ erb_result_monospace_converted_to_links = portfolio_design . find_replace_links ( erb_result )
72+ erb_result_with_links_added = portfolio_design . find_replace_links ( erb_result_monospace_converted_to_links )
6673 erb_result_with_links_resolved = AsciidocUtils . resolve_links ( erb_result_with_links_added )
6774
68- File . write t . name , erb_result_with_links_resolved
69- puts "Generated adoc source at #{ t . name } "
75+ File . write ( t . name , erb_result_with_links_resolved )
76+ puts "UPDATE: Generated adoc source at #{ t . name } "
7077 end
7178
7279 file "#{ $root} /gen/certificate_doc/pdf/#{ cert_model_name } .pdf" => [
80+ __FILE__ ,
7381 "#{ $root} /gen/certificate_doc/adoc/#{ cert_model_name } .adoc"
7482 ] do |t |
7583 adoc_file = "#{ $root} /gen/certificate_doc/adoc/#{ cert_model_name } .adoc"
@@ -88,13 +96,17 @@ Dir.glob("#{$root}/arch/certificate_model/*.yaml") do |f|
8896 "-o #{ t . name } " ,
8997 adoc_file
9098 ] . join ( " " )
99+ puts "UPDATE: Generated PDF at #{ t . name } "
91100 end
92101
93102 file "#{ $root} /gen/certificate_doc/html/#{ cert_model_name } .html" => [
103+ __FILE__ ,
94104 "#{ $root} /gen/certificate_doc/adoc/#{ cert_model_name } .adoc"
95105 ] do |t |
96106 adoc_file = "#{ $root} /gen/certificate_doc/adoc/#{ cert_model_name } .adoc"
97107 FileUtils . mkdir_p File . dirname ( t . name )
108+
109+ puts "UPDATE: Generating PDF at #{ t . name } "
98110 sh [
99111 "asciidoctor" ,
100112 "-w" ,
@@ -107,29 +119,30 @@ Dir.glob("#{$root}/arch/certificate_model/*.yaml") do |f|
107119 "-o #{ t . name } " ,
108120 adoc_file
109121 ] . join ( " " )
122+ puts "UPDATE: Generated PDF at #{ t . name } "
110123 end
111-
112124end
113125
114126namespace :gen do
115127 desc <<~DESC
116- Generate certificate documentation for a specific version as a PDF
128+ Generate certificate documentation for a specific version as a PDF.
117129
118130 Required options:
119131 cert_model_name - The key of the certification model under arch/certificate_model
120132 DESC
121133 task :cert_model_pdf , [ :cert_model_name ] do |_t , args |
122- if args [ :cert_model_name ] . nil?
134+ cert_model_name = args [ :cert_model_name ]
135+ if cert_model_name . nil?
123136 warn "Missing required option: 'cert_model_name'"
124137 exit 1
125138 end
126139
127- unless File . exist? ( "#{ $root} /arch/certificate_model/#{ args [ : cert_model_name] } .yaml" )
128- warn "No certification model named '#{ args [ : cert_model_name] } ' found in arch/certificate_model"
140+ unless File . exist? ( "#{ $root} /arch/certificate_model/#{ cert_model_name } .yaml" )
141+ warn "No certification model named '#{ cert_model_name } ' found in arch/certificate_model"
129142 exit 1
130143 end
131144
132- Rake ::Task [ "#{ $root} /gen/certificate_doc/pdf/#{ args [ : cert_model_name] } .pdf" ] . invoke
145+ Rake ::Task [ "#{ $root} /gen/certificate_doc/pdf/#{ cert_model_name } .pdf" ] . invoke
133146 end
134147
135148 task :cert_model_html , [ :cert_model_name ] do |_t , args |
0 commit comments