<html><body><div style="color:#000; background-color:#fff; font-family:arial, helvetica, sans-serif;font-size:10pt"><div><span><div style="font-size: 10pt;"><span>Hello Gedare, Joel</span></div><div style="background-color: transparent;"><span><br></span></div><div style="background-color: transparent;"><span>I've submitted the patch to add the bash script in the rtems-testing tree as you required. Please review it. Modified & added some new functionality.</span></div><div style="background-color: transparent;"><span><br></span></div><div style="background-color: transparent;"><span>* The internal functions( starting with an '_' ) used in a bsp is now checked for a ';' at the end of the same line & across multiple lines to ensure that the function is actually being called, not just written there. I hope I've covered all of the discrepancies present in previous output sent to you.</span></div><div style="background-color:
transparent;"><span><br></span></div><div style="background-color: transparent;">* If a function belonging to a file does not exist there or the file itself is not there, the script will locate the definition of that function in the bsp & report it. For Example, Some output which I got is :</div><div style="background-color: transparent;"><br></div><div style="font-size: medium; background-color: transparent;"><span class="Apple-tab-span" style="font-size: 13px; white-space: pre;"> </span><span style="font-size: 13px;">arm/gumstix : bspreset.c not compiled </span></div><div style="background-color: transparent;"><span><span class="Apple-tab-span" style="white-space: pre;"> </span>arm/gumstix : bsp_reset() present in file startup/bspstart.c</span></div><div style="background-color: transparent;"><span><br></span></div><div style="font-size: medium; background-color: transparent;"><span style="font-size: 13px;"><span class="Apple-tab-span"
style="white-space: pre;"> </span></span><span style="font-size: 13px;">powerpc/beatnik : bspreset.c not compiled </span></div><div style="background-color: transparent;"><span><span class="Apple-tab-span" style="white-space: pre;"> </span>powerpc/beatnik : bsp_reset() present in file include/bsp.h startup/reboot.c</span></div><div style="background-color: transparent;"><span><br></span></div><div style="font-size: medium; background-color: transparent;"><span style="font-size: 13px;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="font-size: 13px;">powerpc/mpc55xxevb : start.S not present in correct path </span></div><div style="background-color: transparent;"><span><br></span></div><div style="background-color: transparent;"><span><span class="Apple-tab-span" style="white-space: pre;"> </span>powerpc/mpc55xxevb : bspreset.c not compiled </span></div><div style="background-color:
transparent;"><span><span class="Apple-tab-span" style="white-space: pre;"> </span>powerpc/mpc55xxevb : bsp_reset() present in file startup/reset.c </span></div><div style="background-color: transparent;"><span><br></span></div><div style="background-color: transparent;"><span><span class="Apple-tab-span" style="white-space: pre;"> </span>powerpc/mpc55xxevb : bspgetworkarea.c not compiled </span></div><div style="background-color: transparent;"><span><span class="Apple-tab-span" style="white-space: pre;"> </span>powerpc/mpc55xxevb : bsp_work_area_initialize() present in file startup/bspworkareainit.c</span></div><div style="background-color: transparent;"><span><br></span></div><div style="background-color: transparent;"><span><br></span></div><div style="background-color: transparent;"><span>As always, the updated output of the script is attached with the mail.</span></div><div style="background-color:
transparent;"><span><br></span></div><div style="background-color: transparent;"><span>Hoping to hear your views soon !!</span></div></span></div><div style="color: rgb(0, 0, 0); font-size: 13px; font-family: arial, helvetica, clean, sans-serif; background-color: transparent; font-style: normal;"><br></div><div style="color: rgb(0, 0, 0); font-size: 13px; font-family: arial, helvetica, clean, sans-serif; background-color: transparent; font-style: normal;">Regards</div><div style="color: rgb(0, 0, 0); font-size: 13px; font-family: arial, helvetica, clean, sans-serif; background-color: transparent; font-style: normal;"><span style="background-color:transparent;line-height:1.22;">Vipul Nayyar </span></div><div style="color: rgb(0, 0, 0); font-size: 12.727272033691406px; font-family: arial, helvetica, clean, sans-serif; background-color: transparent; font-style: normal;"><br></div><div><br></div> <div style="font-family: arial, helvetica, sans-serif;
font-size: 10pt;"> <div style="font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;"> <div dir="ltr"> <hr size="1"> <font size="2" face="Arial"> <b><span style="font-weight:bold;">From:</span></b> Vipul Nayyar <nayyar_vipul@yahoo.com><br> <b><span style="font-weight: bold;">To:</span></b> rtems-devel@rtems.org <br> <b><span style="font-weight: bold;">Sent:</span></b> Sunday, 15 September 2013 1:31 AM<br> <b><span style="font-weight: bold;">Subject:</span></b> [PATCH] Bash script to review BSP File Organization<br> </font> </div> <div class="y_msg_container"><br>---<br> merge-helpers/review_bsp_files | 465 +++++++++++++++++++++++++++++++++++++++++<br> 1 file changed, 465 insertions(+)<br> create mode 100755 merge-helpers/review_bsp_files<br><br>diff --git a/merge-helpers/review_bsp_files b/merge-helpers/review_bsp_files<br>new file mode 100755<br>index 0000000..422d256<br>--- /dev/null<br>+++
b/merge-helpers/review_bsp_files<br>@@ -0,0 +1,465 @@<br>+#! /bin/bash<br>+<br>+# Bash Script to find discrepancies in BSP file organization<br>+# Author : Vipul Nayyar <<a ymailto="mailto:nayyar_vipul@yahoo.com" href="mailto:nayyar_vipul@yahoo.com">nayyar_vipul@yahoo.com</a>><br>+<br>+<br>+filename="0"<br>+# Passing --verbose turns verbose to 1 & gives the whole story, otherwise '0' to give only important stuff.<br>+verbose="0"<br>+faults="0"<br>+# Passing --warnings turns warnings to 1 & gives all the critical & non-critical bsp file org. problems.<br>+warnings="0"<br>+flag="0"<br>+<br>+calling_path=`pwd`<br>+path=""<br>+<br>+important="1"<br>+rtems_internal=""<br>+internal_done="0"<br>+<br>+<br>+# Finds all rtems internal functions ( name starting with '_' & type specifier)<br>+# that are defined in cpukit & libcpu<br>+function find_rtems_internal(){<br>+ if [[ $internal_done == "1" ]];
then<br>+ return<br>+ fi<br>+ echo "Compiling list of RTEMS Internal functions ..."<br>+ internal_files=""<br>+<br>+ for k in `find -name *.c`<br>+ do<br>+ for j in `grep -oE "[a-z|A-Z|0-9|_]+[\ |^][_]+[a-z|A-Z|0-9|_]*[\ ]*\(" $k`<br>+ do<br>+ if [[ $j == "_"* ]]; then<br>+ j=${j%%\(}<br>+ internal_files="$j $internal_files"<br>+ fi<br>+<br>+ done<br>+ done<br>+<br>+ for k in `find ../c/src/lib/libcpu/ -name
*.c`<br>+ do<br>+ for j in `grep -oE "[a-z|A-Z|0-9|_]+[\ |^][_]+[a-z|A-Z|0-9|_]*[\ ]*\(" $k`<br>+ do<br>+ if [[ $j == "_"* ]]; then<br>+ j=${j%%\(}<br>+ internal_files="$j $internal_files"<br>+ fi<br>+<br>+ done<br>+ done<br>+<br>+ for k in $internal_files<br>+ do<br>+ if echo $rtems_internal |grep -q $k ; then<br>+ echo > /dev/null<br>+ else<br>+
rtems_internal="$k $rtems_internal"<br>+ fi<br>+ done<br>+<br>+ internal_done="1"<br>+}<br>+<br>+# Finds all internal functions common in bsp and (cpukit + libcpu)<br>+function find_bsp_internal(){<br>+ bsp_methods=""<br>+ common_internal_methods=""<br>+<br>+# Searching for internal functions starting with '_' called(i.e ending with a ';')<br>+ for i in `find -name *.c`<br>+ do<br>+ file_contents=`tr -d '\n' < $i | grep -oE "[ |^][_]+[a-z|A-Z|0-9|_]*[ ]*[\n]*\([^;]*\)[ ]*;" | tr -d '\n' `<br>+<br>+ for j in `echo "$file_contents" | grep -oE "[_]+[a-z|A-Z|0-9|_]*[ ]*\("`<br>+ do<br>+ if `echo "$bsp_methods" |grep -q
"${j%%\(}"` ; then<br>+ echo > /dev/null<br>+ else<br>+ bsp_methods="${j%%\(} $bsp_methods"<br>+ fi<br>+ done<br>+ done<br>+<br>+# Identifying common fucntions between $rtems_interval & $bsp_methods<br>+ for i in $rtems_internal<br>+ do<br>+ if [[ $i == "__asm__" || $i == "__attribute__" || $i == "__volatile__" || $i == "__"* ]];then<br>+ continue<br>+ fi<br>+ for j in $bsp_methods<br>+
do<br>+ if [[ $i == $j ]]; then<br>+ common_internal_methods="$j $common_internal_methods"<br>+ fi<br>+ done<br>+ done<br>+<br>+ if [[ $common_internal_methods != "" ]]; then<br>+ echo -e "$bsp : RTEMS Internal functions used : \c"<br>+ for i in $common_internal_methods<br>+ do<br>+ echo -e "${i}() \c"<br>+ done<br>+ flag="1"<br>+ fi<br>+}<br>+<br>+<br>+# Passing 1 initially to any check function states that the file/method/header<br>+# being
checked is of critical nature<br>+function check_file(){<br>+ filename="0"<br>+ if [[ $1 == 1 ]]; then<br>+ important="1"<br>+ shift<br>+ else<br>+ important="0"<br>+ fi<br>+<br>+#Grabbing the path of file being evaluated from Makefile.am<br>+ if grep -wqE "[ ]*[^\ ]*/($1)" Makefile.am ; then<br>+ file_path=`grep -woE "[ ]*[^\ ]*/($1)" Makefile.am | head --lines=1`<br>+ cd `dirname $file_path`<br>+ filename=$1<br>+ file_path=`pwd`<br>+<br>+ cd - > /dev/null<br>+ shift<br>+<br>+# Checking if file lies in correct directory
path<br>+ for i in $*<br>+ do<br>+ if [[ -d $i ]]; then<br>+ cd $i<br>+ else<br>+ continue<br>+ fi<br>+<br>+<br>+ if [[ "$file_path" == `pwd` ]]; then<br>+ filename="$file_path/$filename"<br>+ cd - >/dev/null<br>+ return<br>+
fi<br>+ cd - > /dev/null<br>+ done<br>+ echo "$bsp : $filename not present in correct path"<br>+ filename="$file_path/$filename"<br>+ return<br>+ else<br>+ if [[ $warnings -eq "1" || $important -eq "1" || $verbose -eq "1" ]]; then<br>+ flag="1"<br>+ echo "$bsp : $1 not compiled"<br>+ fi<br>+ fi<br>+<br>+ filename="0"<br>+ faults="1"<br>+ return<br>+}<br>+<br>+# Checking presence of functions in specific files<br>+function check_methods(){<br>+ if [[ $1 == 1 ]];
then<br>+ important="1"<br>+ shift<br>+ else<br>+ important="0"<br>+ fi<br>+<br>+ for i in $*<br>+ do<br>+<br>+# When correct file for this function does not exist<br>+ if [[ $filename == "0" ]];then<br>+ if grep -rqlE "[a-z|A-Z|0-9|_]+[ ]*$i[ ]*\(" * ;then<br>+ if [[ $warnings -eq "1" || $important -eq "1" || $verbose -eq "1" ]];then<br>+ echo $bsp : ${i%(*}"()" present in file `grep -rlE "[a-z|A-Z|0-9|_]+[ ]*$i[ ]*\(" *`<br>+ fi<br>+
fi<br>+ else<br>+<br>+# When correct file for this function exists<br>+ if grep -Eq "[a-z|A-Z|0-9|_]+[ ]*$i[ ]*\(" $filename ; then<br>+ if [[ $verbose -eq "1" ]] ;then<br>+ echo "$bsp : `basename $filename` : ${i%(*}() present in file"<br>+ fi<br>+ else<br>+ if grep -rqlE "[a-z|A-Z|0-9|_]+[ ]*$i[ ]*\(" * ;then<br>+ if [[ $warnings -eq "1" || $important -eq "1" || $verbose -eq "1"
]];then<br>+ echo $bsp : ${i%(*}"()" present in file `grep -rlE "[a-z|A-Z|0-9|_]+[ ]*$i[ ]*\(" *`<br>+ fi<br>+ else<br>+ if [[ $warnings -eq "1" || $important -eq "1" || $verbose -eq "1" ]]; then<br>+ echo "$bsp : `basename $filename` : ${i%(*}() function does not exist in $filename "<br>+ flag="1"<br>+
fi<br>+ faults="1"<br>+ fi<br>+ fi<br>+<br>+ fi<br>+ done<br>+}<br>+<br>+# Checking presence of headers installed by bsp<br>+function check_header(){<br>+ if [[ $1 == 1 ]]; then<br>+ important="1"<br>+ shift<br>+ else<br>+ important="0"<br>+ fi<br>+<br>+ for i in $*<br>+ do<br>+ if grep -wq "$i" Makefile.am ;then<br>+ if [[ ! -f "$i" && !
-f "${i}.in" ]] ;then<br>+ continue<br>+ fi<br>+ if [[ $verbose -eq "1" ]] ;then<br>+ cd `dirname $i`<br>+ echo "$bsp : `basename $i` installed from directory" ${PWD##*/c/src/lib/}<br>+ cd - > /dev/null<br>+ fi<br>+ return<br>+ fi<br>+ done<br>+<br>+ if [[ $warnings -eq "1" || $important -eq "1" || $verbose -eq "1" ]]; then<br>+
echo "${bsp%%[\ ]*} : `basename $1` not installed "<br>+ flag="1"<br>+ fi<br>+ filename="0"<br>+ faults="1"<br>+ return<br>+<br>+}<br>+<br>+# Reviewing for a BSP Starts<br>+function main(){<br>+<br>+ flag="0"<br>+<br>+ check_file 1 start.S ../shared/start/ start/<br>+ if [[ $filename != "0" ]];then<br>+ if grep -wq "start" "$filename" || grep -wq "_start" "$filename"; then<br>+ if [[ $verbose -eq "1" ]] ;then<br>+ echo "$bsp : `basename $filename` start() present in $filename"<br>+ fi<br>+ else<br>+
echo "$bsp : `basename $filename` start() does not exist in start.S"<br>+ fi<br>+ fi<br>+<br>+ check_file 1 bspstart.c ../../shared/ ../shared/ startup/<br>+ check_methods "bsp_start"<br>+<br>+ check_file 1 bspreset.c ../../shared/ ../shared/ startup/<br>+ check_methods 1 "bsp_reset"<br>+<br>+<br>+ check_file 1 bootcard.c ../../shared/<br>+ check_header ../../shared/include/bootcard.h<br>+<br>+ check_file 1 bspclean.c ../../shared/ startup/<br>+ check_methods "bsp_fatal_extension"<br>+<br>+ check_file 1 bspgetworkarea.c ../../shared/ ../../shared/startup ../shared/ ../shared/startup/ startup/<br>+ check_methods 1 "bsp_work_area_initialize"<br>+<br>+<br>+ check_file 1 bsplibc.c
../../shared/<br>+ check_methods "bsp_libc_init"<br>+<br>+ check_file 1 bsppost.c ../../shared/<br>+ check_methods "bsp_postdriver_hook"<br>+<br>+ check_file 1 bsppredriverhook.c ../../shared/ ../shared/startup/ startup/<br>+ check_methods "bsp_predriver_hook"<br>+<br>+<br>+ check_file gnatinstallhandler.c ../../shared/<br>+<br>+ check_file sbrk.c ../../shared/ ../../shared/ startup/<br>+ check_methods "sbrk"<br>+<br>+<br>+ check_file stackalloc.c ../../shared/src/<br>+ check_methods "bsp_stack_allocate_init" "bsp_stack_allocate" "bsp_stack_free"<br>+<br>+ check_header ../../shared/include/stackalloc.h<br>+<br>+ # Interrupt Files<br>+ check_file 1 irq.c irq/<br>+ check_methods "bsp_interrupt_vector_enable"
"bsp_interrupt_vector_disable" "bsp_interrupt_facility_initialize" "bsp_interrupt_dispatch"<br>+ check_header 1 include/irq.h<br>+<br>+ # PIC Support<br>+<br>+ check_file irq-default-handler.c ../../shared/src/<br>+<br>+ check_file 1 irq-generic.c ../../shared/src/<br>+ check_header 1 ../../shared/include/irq-generic.h<br>+<br>+ check_file irq-info.c ../../shared/src/<br>+ check_header ../../shared/include/irq-info.h<br>+<br>+ check_file irq-legacy.c ../../shared/src/<br>+ check_file irq-server.c ../../shared/src/<br>+ check_file irq-shell.c ../../shared/src/<br>+<br>+ # Real Time Clock<br>+ check_file rtc-config.c rtc/<br>+ check_methods "bsp_rtc_initialize" "bsp_rtc_get_time" "bsp_rtc_set_time"
"bsp_rtc_probe"<br>+<br>+<br>+ check_file 1 tod.c ../../shared/ tod/<br>+<br>+ # Benchmark Timers<br>+ check_file benchmark_timer.c benchmark_timer/<br>+ check_methods "benchmark_timer_initialize" "benchmark_timer_read" "benchmark_timer_disable_subtracting_average_overhead"<br>+<br>+<br>+ # Standard Headers<br>+<br>+ check_header 1 include/bsp.h<br>+ check_header include/bspopts.h<br>+ check_header 1 ../../shared/include/coverhd.h include/coverhd.h<br>+ check_header ../../shared/include/utility.h<br>+ check_header 1 ../../shared/include/tm27.h include/tm27.h<br>+<br>+ # Finding all internal functions being used in a bsp<br>+ find_bsp_internal<br>+<br>+ if [[ $flag == "1" ]]; then<br>+
echo -e "\n"<br>+ fi<br>+}<br>+<br>+# Verifying if the directory given or pwd is a valid bsp, shared architecture, or libbsp directory<br>+function check_given_dir(){<br>+ if echo $cur_dir | grep -Eq "c/src/lib/libbsp/([^/]+)/([^/]+)/([^/]+)*" ; then<br>+ return 0<br>+<br>+ elif echo $cur_dir | grep -Eq "c/src/lib/libbsp/([^/]+)/([^/]+)" ; then<br>+# BSP given<br>+ cd ../../../../../../cpukit<br>+ find_rtems_internal<br>+<br>+ cd - > /dev/null<br>+ bsp=${cur_dir##*/}<br>+<br>+ if [[ $bsp == "shared" || $bsp == "autom4te.cache" || $bsp == "no_bsp" ]]; then<br>+ return 0<br>+
else<br>+ main<br>+ fi<br>+ elif echo $cur_dir | grep -Eq "c/src/lib/libbsp/([^/]+)" ; then<br>+# Shared architecture given<br>+ for i in *<br>+ do<br>+ if [[ -d $i ]]; then<br>+ if [[ $i == "shared" || $i == "autom4te.cache" || $i == "no_bsp" ]]; then<br>+ echo -n<br>+ else<br>+ cd ../../../../../cpukit<br>+
find_rtems_internal<br>+ cd - > /dev/null<br>+ bsp=$i<br>+<br>+ cd $bsp<br>+ main<br>+ cd .. > /dev/null<br>+ fi<br>+ fi<br>+ done<br>+ elif echo $cur_dir | grep -Eq "c/src/lib/libbsp" ; then<br>+# libbsp given<br>+ for i in
*/*/Makefile.am<br>+ do<br>+ i=`dirname $i`<br>+ if [[ -d $i ]]; then<br>+ if [[ $i == "shared" || $i == "autom4te.cache" || $i == "no_cpu/no_bsp" ]]; then<br>+ echo -n<br>+ else<br>+ cd ../../../../cpukit<br>+ find_rtems_internal<br>+ cd - > /dev/null<br>+
bsp=$i<br>+<br>+ cd $bsp<br>+ main<br>+ cd ../../ > /dev/null<br>+ fi<br>+ fi<br>+ done<br>+<br>+ else<br>+ return 0<br>+ fi<br>+}<br>+<br>+# Evaluating Command Line Arguments<br>+function start(){<br>+<br>+ for i in $*<br>+ do<br>+ case $i in<br>+
"--verbose") verbose="1" # The whole story<br>+ ;;<br>+<br>+ "--warnings") warnings="1" # All warnings<br>+ verbose="0"<br>+ ;;<br>+<br>+ "--help") echo "Help to be provided"<br>+ ;;<br>+<br>+ *) path="$path $i" ;; # If not above options, then assumed to be a path for bsp<br>+ esac<br>+ done<br>+<br>+# No path given, search for bsp from pwd<br>+ if [[ -z $path ]];then<br>+
path=$PWD<br>+ cur_dir=`pwd`<br>+ check_given_dir<br>+ if [[ $? -eq 1 ]];then<br>+ echo "Current directory does not seem a valid RTEMS directory"<br>+ fi<br>+<br>+ else<br>+ for i in $path<br>+ do<br>+ if [[ -d $i ]]; then<br>+ echo > /dev/null<br>+ else<br>+ echo "$i is an invalid directory."<br>+ continue<br>+
fi<br>+<br>+ cd $i<br>+ cur_dir=`pwd`<br>+ check_given_dir<br>+ if [[ $? -eq 1 ]];then<br>+ echo "$i does not seem a valid RTEMS directory"<br>+ fi<br>+ cd $calling_path<br>+<br>+ done<br>+ fi<br>+}<br>+<br>+# Let the Game begin !!<br>+start $*<br>+<br>+# End of Checks<br>+if [[ $faults -eq "0" ]] ; then<br>+ echo -e "\nNo faults found in BSP organization"<br>+fi<br>--
<br>1.7.11.7<br><br>_______________________________________________<br>rtems-devel mailing list<br><a ymailto="mailto:rtems-devel@rtems.org" href="mailto:rtems-devel@rtems.org">rtems-devel@rtems.org</a><br><a href="http://www.rtems.org/mailman/listinfo/rtems-devel" target="_blank">http://www.rtems.org/mailman/listinfo/rtems-devel</a><br><br><br></div> </div> </div> </div></body></html>