• Athira Rajeev's avatar
    perf tools: Add perf binary dependent rule for shellcheck log in Makefile.perf · 1638b11e
    Athira Rajeev authored
    Add rule in new Makefile "tests/Makefile.tests" for running shellcheck
    on shell test scripts. This automates below shellcheck into the build.
    
    	$ for F in $(find tests/shell/ -perm -o=x -name '*.sh'); do shellcheck -S warning $F; done
    
    Condition for shellcheck is added in Makefile.perf to avoid build
    breakage in the absence of shellcheck binary. Update Makefile.perf to
    contain new rule for "SHELLCHECK_TEST" which is for making shellcheck
    test as a dependency on perf binary.
    
    Added "tests/Makefile.tests" to run shellcheck on shellscripts in
    tests/shell. The make rule "SHLLCHECK_RUN" ensures that, every time
    during make, shellcheck will be run only on modified files during
    subsequent invocations. By this, if any newly added shell scripts or
    fixes in existing scripts breaks coding/formatting style, it will get
    captured during the perf build.
    
    Example build failure by modifying probe_vfs_getname.sh in tests/shell:
    
    	In tests/shell/probe_vfs_getname.sh line 8:
    	. $(dirname $0)/lib/probe.sh
    	  ^-----------^ SC2046 (warning): Quote this to prevent word splitting.
    
    	For more information:
    	  https://www.shellcheck.net/wiki/SC2046 -- Quote this to prevent word splitt...
    	make[3]: *** [/root/athira/perf-tools-next/tools/perf/tests/Makefile.tests:18: tests/shell/.probe_vfs_getname.sh.shellcheck_log] Error 1
    	make[2]: *** [Makefile.perf:686: SHELLCHECK_TEST] Error 2
    	make[2]: *** Waiting for unfinished jobs....
    	make[1]: *** [Makefile.perf:244: sub-make] Error 2
    	make: *** [Makefile:70: all] Error 2
    
    Here, like other files which gets created during compilation (ex:
    .builtin-bench.o.cmd or .perf.o.cmd ), create .shellcheck_log also as a
    hidden file.  Example: tests/shell/.probe_vfs_getname.sh.shellcheck_log
    shellcheck is re-run if any of the script gets modified based on its
    dependency of this log file.
    
    After this, for testing, changed "tests/shell/trace+probe_vfs_getname.sh" to
    break shellcheck format. In the next make run, it is also captured:
    
    	In tests/shell/probe_vfs_getname.sh line 8:
    	. $(dirname $0)/lib/probe.sh
    	  ^-----------^ SC2046 (warning): Quote this to prevent word splitting.
    
    	For more information:
    	  https://www.shellcheck.net/wiki/SC2046 -- Quote this to prevent word splitt...
    	make[3]: *** [/root/athira/perf-tools-next/tools/perf/tests/Makefile.tests:18: tests/shell/.probe_vfs_getname.sh.shellcheck_log] Error 1
    	make[3]: *** Waiting for unfinished jobs....
    
    	In tests/shell/trace+probe_vfs_getname.sh line 14:
    	. $(dirname $0)/lib/probe.sh
    	  ^-----------^ SC2046 (warning): Quote this to prevent word splitting.
    
    	For more information:
    	  https://www.shellcheck.net/wiki/SC2046 -- Quote this to prevent word splitt...
    	make[3]: *** [/root/athira/perf-tools-next/tools/perf/tests/Makefile.tests:18: tests/shell/.trace+probe_vfs_getname.sh.shellcheck_log] Error 1
    	make[2]: *** [Makefile.perf:686: SHELLCHECK_TEST] Error 2
    	make[2]: *** Waiting for unfinished jobs....
    	make[1]: *** [Makefile.perf:244: sub-make] Error 2
    	make: *** [Makefile:70: all] Error 2
    
    Failure log can be found in the stdout of make itself.
    
    This is reported at build time. To be able to go ahead with the build or
    disable shellcheck even though it is known that some test is broken, add
    a "NO_SHELLCHECK" option. Example:
    
      make NO_SHELLCHECK=1
    
    	  INSTALL libsubcmd_headers
    	  INSTALL libsymbol_headers
    	  INSTALL libapi_headers
    	  INSTALL libperf_headers
    	  INSTALL libbpf_headers
    	  LINK    perf
    
    Note:
    
    This is tested on RHEL and also SLES. Use below check:
    "$(shell which shellcheck 2> /dev/null)" to look for presence
    of shellcheck binary. The approach "shell command -v" is not
    used here. In some of the distros(RHEL), command is available
    as executable file (/usr/bin/command). But in some distros(SLES),
    it is a shell builtin and not available as executable file.
    
    Committer testing:
    
      $ type shellcheck
      shellcheck is hashed (/usr/bin/shellcheck)
      $ rpm -qf /usr/bin/shellcheck
      ShellCheck-0.9.0-2.fc38.x86_64
      $
      $ alias m
      $ git diff
      diff --git a/tools/perf/tests/shell/probe_vfs_getname.sh b/tools/perf/tests/shell/probe_vfs_getname.sh
      index 554e12e83c55fd56..dbc14634678e2bf6 100755
      --- a/tools/perf/tests/shell/probe_vfs_getname.sh
      +++ b/tools/perf/tests/shell/probe_vfs_getname.sh
      @@ -5,7 +5,7 @@
       # Arnaldo Carvalho de Melo <acme@kernel.org>, 2017
    
       # shellcheck source=lib/probe.sh
      -. "$(dirname $0)"/lib/probe.sh
      +. $(dirname $0)/lib/probe.sh
    
       skip_if_no_perf_probe || exit 2
    
      alias m='rm -rf ~/libexec/perf-core/ ; make -k CORESIGHT=1 O=/tmp/build/$(basename $PWD) -C tools/perf install-bin && perf test python'
      $ m
      make: Entering directory '/home/acme/git/perf-tools-next/tools/perf'
        BUILD:   Doing 'make -j32' parallel build
    <SNIP>
        INSTALL libbpf_headers
    
      In tests/shell/probe_vfs_getname.sh line 8:
      . $(dirname $0)/lib/probe.sh
        ^-----------^ SC2046 (warning): Quote this to prevent word splitting.
    
      For more information:
        https://www.shellcheck.net/wiki/SC2046 -- Quote this to prevent word splitt...
      make[3]: *** [/home/acme/git/perf-tools-next/tools/perf/tests/Makefile.tests:18: tests/shell/.probe_vfs_getname.sh.shellcheck_log] Error 1
      make[2]: *** [Makefile.perf:686: SHELLCHECK_TEST] Error 2
      make[2]: *** Waiting for unfinished jobs....
      make[1]: *** [Makefile.perf:244: sub-make] Error 2
      make: *** [Makefile:113: install-bin] Error 2
      make: Leaving directory '/home/acme/git/perf-tools-next/tools/perf'
      $
    Reviewed-by: default avatarJames Clark <james.clark@arm.com>
    Signed-off-by: default avatarAthira Jajeev <atrajeev@linux.vnet.ibm.com>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Disha Goel <disgoel@linux.vnet.ibm.com>
    Cc: Ian Rogers <irogers@google.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Kajol Jain <kjain@linux.ibm.com>
    Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: linuxppc-dev@lists.ozlabs.org
    Link: https://lore.kernel.org/r/20231123160232.94253-1-atrajeev@linux.vnet.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    1638b11e
Makefile.tests 587 Bytes