diff options
author | Lee Leahy <leroy.p.leahy@intel.com> | 2016-05-26 17:12:17 -0700 |
---|---|---|
committer | Martin Roth <martinroth@google.com> | 2016-06-03 17:29:13 +0200 |
commit | fc3741f379f972d9d7d962fa4e62cec7a01f5e86 (patch) | |
tree | e45de306e12391e802e5cd68674c2b1792c1421e /util | |
parent | eb0e7bc9763de294ab74f67e38a78e6706246966 (diff) | |
download | coreboot-fc3741f379f972d9d7d962fa4e62cec7a01f5e86.tar.xz |
Add Board Checklist Support
Build the <board>_checklist.html file which contains a checklist table
for each stage of coreboot. This processing builds a set of implemented
(done) routines which are marked green in the table. The remaining
required routines (work-to-do) are marked red in the table and the
optional routines are marked yellow in the table. The table heading
for each stage contains a completion percentage in terms of count of
routines (done .vs. required).
Add some Kconfig values:
* CREATE_BOARD_CHECKLIST - When selected creates the checklist file
* MAKE_CHECKLIST_PUBLIC - Copies the checklist file into the
Documenation directory
* CHECKLIST_DATA_FILE_LOCATION - Location of the checklist data files:
* <stage>_complete.dat - Lists all of the weak routines
* <stage>_optional.dat - Lists weak routines which may be optionally
implemented
TEST=Build with Galileo Gen2.
Change-Id: Ie056f8bb6d45ff7f3bc6390b5630b5063f54c527
Signed-off-by: Lee Leahy <leroy.p.leahy@intel.com>
Reviewed-on: https://review.coreboot.org/15011
Tested-by: build bot (Jenkins)
Reviewed-by: Martin Roth <martinroth@google.com>
Diffstat (limited to 'util')
-rw-r--r-- | util/checklist/Makefile.inc | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/util/checklist/Makefile.inc b/util/checklist/Makefile.inc new file mode 100644 index 0000000000..f8e5ebd5e6 --- /dev/null +++ b/util/checklist/Makefile.inc @@ -0,0 +1,260 @@ +# +# This file is part of the coreboot project. +# +# Copyright (C) 2016 Intel Corporation. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# + +########################################################################### +# Build the board implementation checklist +########################################################################### + +# Only build the checklist for boards under development +ifeq ($(CONFIG_CREATE_BOARD_CHECKLIST),y) + +# +# Extract the symbol table from the image +# +%.symbol_table: %.elf %.debug + $(NM_$(class)) $< > $@ + $(NM_$(class)) $(*D)/$(*F).debug >> $@ + +# +# All symbols in the image +# +# 1. Remove the address and symbol type +# 2. Sort the table into alphabetical order +# 3. Remove any duplicates +# +%.symbols: %.symbol_table + sed 's/^...........//' $< > $@.tmp + sort $@.tmp > $@.tmp2 + uniq $@.tmp2 > $@ + rm $@.tmp $@.tmp2 + +# +# Weak symbols in the image +# +# 1. Find the weak symbols +# 2. Remove the address and symbol type +# 3. Sort the table into alphabetical order +# 4. Remove any duplicates +# +%.weak: %.symbol_table + grep -F " W " $< | sed 's/^...........//' > $@.tmp + sort $@.tmp > $@.tmp2 + uniq $@.tmp2 > $@ + rm $@.tmp $@.tmp2 + +# +# Expected symbols in the image +# +# 1. Get the complete list of expected symbols in the image +# 2. Sort the table into alphabetical order +# 3. Remove any duplicates +# +%.expected: %.symbol_table + cp $(CONFIG_CHECKLIST_DATA_FILE_LOCATION)/$(basename $(*F))_complete.dat $@.tmp + # If no separate verstage, combine verstage and romstage routines into a single list + if [ "$(*F)" = "romstage" ]; then \ + if [ ! -e $(*D)/verstage.elf ]; then \ + if [ ! -e $(*D)/postcar.elf ]; then \ + cat $(CONFIG_CHECKLIST_DATA_FILE_LOCATION)/verstage_complete.dat >> $@.tmp; \ + fi; \ + fi; \ + fi + sort $@.tmp > $@.tmp2 + uniq $@.tmp2 > $@ + rm $@.tmp $@.tmp2 + +# +# Optional symbols in the image +# +# 1. Get the list of optional symbols in the image +# 2. Sort the table into alphabetical order +# 3. Remove any duplicates +# +%.optional: %.symbol_table + cp $(CONFIG_CHECKLIST_DATA_FILE_LOCATION)/$(basename $(*F))_optional.dat $@.tmp + # If no separate verstage, combine verstage and romstage routines into a single list + if [ "$(*F)" = "romstage" ]; then \ + if [ ! -e $(*D)/verstage.elf ]; then \ + if [ ! -e $(*D)/postcar.elf ]; then \ + cat $(CONFIG_CHECKLIST_DATA_FILE_LOCATION)/verstage_optional.dat >> $@.tmp; \ + fi; \ + fi; \ + fi + sort $@.tmp > $@.tmp2 + uniq $@.tmp2 > $@ + rm $@.tmp $@.tmp2 + +# +# Expected Symbols Optional Weak Done Type +# no yes no d/c yes Don't display +# yes no no no no Required - not implemented +# yes no yes no no Optional - not implemented +# yes yes yes yes no Optional - not implemented +# yes yes no no yes Required - implemented +# yes yes yes no yes Required - implemented +# +# Implemented routines are in the symbol table and are not weak +# +# 1. Remove expected symbols which are not in the image (not implemented yet) +# 2. Remove weak symbols from the list (not implemented yet) +# +%.done: %.symbols %.expected %.weak %.optional + comm -12 $(*D)/$(*F).expected $(*D)/$(*F).symbols | sed "s/^[ \t]*//" > $@.tmp + comm -23 $@.tmp $(*D)/$(*F).weak | sed "s/^[ \t]*//" > $@ + rm $@.tmp + +# +# Remove any routines that are implemented +# +%.optional2: %.optional %.done + comm -23 $^ | sed "s/^[ \t]*//" > $@ + +# +# Remove any implemented or optional routines +# +%.tbd: %.expected %.done %.optional2 + comm -23 $(*D)/$(*F).expected $(*D)/$(*F).done | sed "s/^[ \t]*//" > $@.tmp + comm -23 $@.tmp $(*D)/$(*F).optional2 | sed "s/^[ \t]*//" > $@ + rm $@.tmp + +# +# Build the implementation table for each stage +# 1. Color code the rows +# * Done table rows are in green +# * Optional table rows are in yellow +# * TBD table rows are in red +# 2. Add the row termination +# 3. Sort the rows into alphabetical order +# +%.table_rows: %.optional2 %.done %.expected %.tbd + sed -e 's/^/<tr bgcolor=#c0ffc0><td>Required<\/td><td>/' $(*D)/$(basename $(*F)).done > $@.tmp + sed -e 's/^/<tr bgcolor=#ffffc0><td>Optional<\/td><td>/' $(*D)/$(basename $(*F)).optional2 >> $@.tmp + if [ -s $(*D)/$(basename $(*F)).tbd ]; then \ + sed -e 's/^/<tr bgcolor=#ffc0c0><td>Required<\/td><td>/' $(*D)/$(basename $(*F)).tbd >> $@.tmp; \ + fi + sed -e 's/$$/<\/td><\/tr>/' -i $@.tmp + sort -t ">" -k4 $@.tmp > $@ + rm $@.tmp + +# +# Count the lines in the done file +# +done_lines = $$(wc -l $(*D)/$(basename $(*F)).done | sed 's/ .*//') + +# +# Count the lines in the optional file +# +optional_lines = $$(wc -l $(*D)/$(basename $(*F)).optional2 | sed 's/ .*//') + +# +# Count the lines in the expected file +# +expected_lines = $$(wc -l $(*D)/$(basename $(*F)).expected | sed 's/ .*//') + +# Compute the percentage done by routine count +percent_complete = $$(($(done_lines) * 100 / ($(expected_lines) - $(optional_lines)))) + +# +# Build the table +# 1. Add the table header +# 2. Add the table rows +# 3. Add the table trailer +# +%.html: %.table_rows + echo "<table border=1>" > $@ + echo "<tr><th colspan=2>$(basename $(*F)): $(percent_complete)% Done</th></tr>" >> $@ + echo "<tr><th>Type</th><th>Routine</td></tr>" >> $@ + cat $< >> $@ + echo "</table>" >> $@ + +# +# Determine which HTML files to include into the webpage +# +ifeq ($(CONFIG_SEPARATE_VERSTAGE),y) +html_table_files += $(objcbfs)/verstage.html +endif +ifeq ($(CONFIG_POSTCAR_STAGE),y) +html_table_files += $(objcbfs)/postcar.html +endif +html_table_files += $(objcbfs)/romstage.html $(objcbfs)/ramstage.html + +# +# Create a list with each file on a separate line +# +list_of_html_files = $(subst _NEWLINE_,${\n},${html_table_files}) + +# +# Get the date for the webpage +# +current_date_time = $$(date +"%Y/%m/%d %T %Z") + +# +# Build the webpage from the implementation tables +# 1. Add the header to the webpage +# 2. Add the legend to the webpage +# 3. Use a table to place stage tables side-by-side +# 4. Add the stage tables to the webpage +# 5. Separate the stage tables +# 6. Terminate the outer table +# 7. Add the trailer to the webpage +# +$(obj)/$(CONFIG_MAINBOARD_PART_NUMBER)_checklist.html: $(html_table_files) + echo "<html>" > $@ + echo "<head>" >> $@ + echo "<title>$(CONFIG_MAINBOARD_PART_NUMBER) Implementation Status</title>" >> $@ + echo "</title>" >> $@ + echo "<body>" >> $@ + echo "<h1>$(CONFIG_MAINBOARD_PART_NUMBER) Implementation Status<br>$(current_date_time)</h1>" >> $@ + echo "<table>" >> $@ + echo " <tr><td colspan=2><b>Legend</b></td></tr>" >> $@ + echo " <tr><td bgcolor=\"#ffc0c0\">Red</td><td>Required - To-be-implemented</td></tr>" >> $@ + echo " <tr><td bgcolor=\"#ffffc0\">Yellow</td><td>Optional</td></tr>" >> $@ + echo " <tr><td bgcolor=\"#c0ffc0\">Green</td><td>Implemented</td></tr>" >> $@ + echo "</table>" >> $@ + echo "<table>" >> $@ + echo " <tr valign=\"top\">" >> $@ + for table in $(list_of_html_files); do \ + echo " <td>" >> $@; \ + cat $$table >> $@; \ + echo " </td>" >> $@; \ + echo " <td width=5> </td>" >> $@; \ + done + echo " </tr>" >> $@ + echo "</table>" >> $@ + echo "</body>" >> $@ + echo "</html>" >> $@ + +# +# Copy the output file into the Documentation directory +# +Documentation/$(CONFIG_MAINBOARD_VENDOR)/Board/$(CONFIG_MAINBOARD_PART_NUMBER)_checklist.html: $(obj)/$(CONFIG_MAINBOARD_PART_NUMBER)_checklist.html + if [ ! -d Documentation/$(CONFIG_MAINBOARD_VENDOR) ]; then \ + mkdir Documentation/$(CONFIG_MAINBOARD_VENDOR); \ + fi + if [ ! -d Documentation/$(CONFIG_MAINBOARD_VENDOR)/Board ]; then \ + mkdir Documentation/$(CONFIG_MAINBOARD_VENDOR)/Board; \ + fi + cp $< $@ + +# +# Determine where to place the output file +# +ifeq ($(CONFIG_MAKE_CHECKLIST_PUBLIC),y) +INTERMEDIATE+=Documentation/$(CONFIG_MAINBOARD_VENDOR)/Board/$(CONFIG_MAINBOARD_PART_NUMBER)_checklist.html +else +INTERMEDIATE+=$(obj)/$(CONFIG_MAINBOARD_PART_NUMBER)_checklist.html +endif + +endif |