302 lines
9.6 KiB
Makefile
302 lines
9.6 KiB
Makefile
#
|
|
# 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.
|
|
#
|
|
|
|
###########################################################################
|
|
# Instructions
|
|
###########################################################################
|
|
#
|
|
# Create new control files for checklist:
|
|
#
|
|
# 1. Remove any selection for CREATE_BOARD_CHECKLIST
|
|
# 2. Remove any selection for MAKE_CHECKLIST_PUBLIC
|
|
# 3. make
|
|
# 4. nm build/cbfs/fallback/<stage>.debug > <stage>_symbols.txt
|
|
# 6. sed 's/^...........//' <stage>_symbols.txt > <stage>_complete.dat
|
|
# 7. grep -F " W " <stage>_symbols.txt | sed 's/^...........//' \
|
|
# > <stage>_optional.dat
|
|
# 8. Edit <stage>_complete.dat to remove any symbols that are not
|
|
# desired in the report
|
|
# 9. Edit <stage>_optional.dat to remove any symbols that are
|
|
# required to be implemented
|
|
#
|
|
# Create a board checklist:
|
|
#
|
|
# 1. select CREATE_BOARD_CHECKLIST
|
|
# 2. Optionally: select MAKE_CHECKLIST_PUBLIC
|
|
# 3. Specify CONFIG_CHECKLIST_DATA_FILE_LOCATION
|
|
# 4. make
|
|
#
|
|
# Build Errors:
|
|
# * No checklist built - verify CREATE_BOARD_CHECKLIST is selected in
|
|
# board Kconfig file. Do a make clean
|
|
# * <stage>_complete.dat not found - verify that
|
|
# CONFIG_CHECKLIST_DATA_FILE_LOCATION points to the directory
|
|
# containing the checklist data files. Build the checklist
|
|
# data files if necessary.
|
|
# * Segmentation fault - most likely caused by $(NM_$(class)) not being
|
|
# set.
|
|
#
|
|
###########################################################################
|
|
# 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)) $(*D)/$(*F).debug > $@
|
|
$(NM_$(class)) $< >> $@
|
|
|
|
#
|
|
# 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
|
|
cat $(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_complete.dat >> $@.tmp; \
|
|
cat $(CONFIG_CHECKLIST_DATA_FILE_LOCATION)/verstage_optional.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_C_ENVIRONMENT_BOOTBLOCK),y)
|
|
html_table_files += $(objcbfs)/bootblock.html
|
|
endif
|
|
ifeq ($(CONFIG_SEPARATE_VERSTAGE),y)
|
|
html_table_files += $(objcbfs)/verstage.html
|
|
endif
|
|
html_table_files += $(objcbfs)/romstage.html
|
|
ifeq ($(CONFIG_POSTCAR_STAGE),y)
|
|
html_table_files += $(objcbfs)/postcar.html
|
|
endif
|
|
html_table_files += $(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
|