Message ID | 20250107-perf_syscalltbl-v5-0-935de46d3175@rivosinc.com (mailing list archive) |
---|---|
Headers | show |
Series | perf tools: Use generic syscall scripts for all archs | expand |
Hello, On Tue, Jan 07, 2025 at 06:07:48PM -0800, Charlie Jenkins wrote: > Standardize the generation of syscall headers around syscall tables. > Previously each architecture independently selected how syscall headers > would be generated, or would not define a way and fallback onto > libaudit. Convert all architectures to use a standard syscall header > generation script and allow each architecture to override the syscall > table to use if they do not use the generic table. > > As a result of these changes, no architecture will require libaudit, and > so the fallback case of using libaudit is removed by this series. > > Testing: > > I have tested that the syscall mappings of id to name generation works > as expected for every architecture, but I have only validated that perf > trace compiles and runs as expected on riscv, arm64, and x86_64. > > Signed-off-by: Charlie Jenkins <charlie@rivosinc.com> > Reviewed-by: Ian Rogers <irogers@google.com> > Tested-by: Ian Rogers <irogers@google.com> Acked-by: Namhyung Kim <namhyung@kernel.org> Thanks, Namhyung > > --- > Changes in v5: > - Remove references to HAVE_SYSCALL_TABLE_SUPPORT that were > missed/recently introduced > - Rebase on perf-tools-next > - Install headers to $(OUTPUT)arch instead of $(OUTPUT)tools/perf/arch > - Link to v4: https://lore.kernel.org/r/20241218-perf_syscalltbl-v4-0-bc8caef2ca8e@rivosinc.com > > Changes in v4: > - Remove audit_machine member of syscalltbl struct (Ian) > - Rebase on perf-tools-next > - Link to v3: https://lore.kernel.org/r/20241216-perf_syscalltbl-v3-0-239f032481d5@rivosinc.com > > Changes in v3: > - Fix compiliation when OUTPUT is empty > - Correct unused headers to be .h instead of .c (Namhyung) > - Make variable definition of supported archs (Namhyung) > - Convert += into := for syscalls headers (Namhyung) > - Link to v2: https://lore.kernel.org/r/20241212-perf_syscalltbl-v2-0-f8ca984ffe40@rivosinc.com > > Changes in v2: > - Rebase onto 6.13-rc2 > - Fix output path so it generates to /tools/perf/arch properly > - Link to v1: https://lore.kernel.org/r/20241104-perf_syscalltbl-v1-0-9adae5c761ef@rivosinc.com > > --- > Charlie Jenkins (16): > perf tools: Create generic syscall table support > perf tools: arc: Support generic syscall headers > perf tools: csky: Support generic syscall headers > perf tools: arm: Support syscall headers > perf tools: sh: Support syscall headers > perf tools: sparc: Support syscall headers > perf tools: xtensa: Support syscall header > perf tools: x86: Use generic syscall scripts > perf tools: alpha: Support syscall header > perf tools: parisc: Support syscall header > perf tools: arm64: Use syscall table > perf tools: loongarch: Use syscall table > perf tools: mips: Use generic syscall scripts > perf tools: powerpc: Use generic syscall table scripts > perf tools: s390: Use generic syscall table scripts > perf tools: Remove dependency on libaudit > > Documentation/admin-guide/workload-tracing.rst | 2 +- > tools/build/feature/Makefile | 4 - > tools/build/feature/test-libaudit.c | 11 - > tools/perf/Documentation/perf-check.txt | 2 - > tools/perf/Makefile.config | 39 +- > tools/perf/Makefile.perf | 12 +- > tools/perf/arch/alpha/entry/syscalls/Kbuild | 2 + > .../arch/alpha/entry/syscalls/Makefile.syscalls | 5 + > tools/perf/arch/alpha/entry/syscalls/syscall.tbl | 504 ++++++++++++++++++++ > tools/perf/arch/alpha/include/syscall_table.h | 2 + > tools/perf/arch/arc/entry/syscalls/Kbuild | 2 + > .../perf/arch/arc/entry/syscalls/Makefile.syscalls | 3 + > tools/perf/arch/arc/include/syscall_table.h | 2 + > tools/perf/arch/arm/entry/syscalls/Kbuild | 4 + > .../perf/arch/arm/entry/syscalls/Makefile.syscalls | 2 + > tools/perf/arch/arm/entry/syscalls/syscall.tbl | 483 +++++++++++++++++++ > tools/perf/arch/arm/include/syscall_table.h | 2 + > tools/perf/arch/arm64/Makefile | 22 - > tools/perf/arch/arm64/entry/syscalls/Kbuild | 3 + > .../arch/arm64/entry/syscalls/Makefile.syscalls | 6 + > tools/perf/arch/arm64/entry/syscalls/mksyscalltbl | 46 -- > .../perf/arch/arm64/entry/syscalls/syscall_32.tbl | 476 +++++++++++++++++++ > .../perf/arch/arm64/entry/syscalls/syscall_64.tbl | 1 + > tools/perf/arch/arm64/include/syscall_table.h | 8 + > tools/perf/arch/csky/entry/syscalls/Kbuild | 2 + > .../arch/csky/entry/syscalls/Makefile.syscalls | 3 + > tools/perf/arch/csky/include/syscall_table.h | 2 + > tools/perf/arch/loongarch/Makefile | 22 - > tools/perf/arch/loongarch/entry/syscalls/Kbuild | 2 + > .../loongarch/entry/syscalls/Makefile.syscalls | 3 + > .../arch/loongarch/entry/syscalls/mksyscalltbl | 45 -- > tools/perf/arch/loongarch/include/syscall_table.h | 2 + > tools/perf/arch/mips/entry/syscalls/Kbuild | 2 + > .../arch/mips/entry/syscalls/Makefile.syscalls | 5 + > tools/perf/arch/mips/entry/syscalls/mksyscalltbl | 32 -- > tools/perf/arch/mips/include/syscall_table.h | 2 + > tools/perf/arch/parisc/entry/syscalls/Kbuild | 3 + > .../arch/parisc/entry/syscalls/Makefile.syscalls | 6 + > tools/perf/arch/parisc/entry/syscalls/syscall.tbl | 463 +++++++++++++++++++ > tools/perf/arch/parisc/include/syscall_table.h | 8 + > tools/perf/arch/powerpc/Makefile | 25 - > tools/perf/arch/powerpc/entry/syscalls/Kbuild | 3 + > .../arch/powerpc/entry/syscalls/Makefile.syscalls | 6 + > .../perf/arch/powerpc/entry/syscalls/mksyscalltbl | 39 -- > tools/perf/arch/powerpc/include/syscall_table.h | 8 + > tools/perf/arch/riscv/Makefile | 22 - > tools/perf/arch/riscv/entry/syscalls/Kbuild | 2 + > .../arch/riscv/entry/syscalls/Makefile.syscalls | 4 + > tools/perf/arch/riscv/entry/syscalls/mksyscalltbl | 47 -- > tools/perf/arch/riscv/include/syscall_table.h | 8 + > tools/perf/arch/s390/Makefile | 21 - > tools/perf/arch/s390/entry/syscalls/Kbuild | 2 + > .../arch/s390/entry/syscalls/Makefile.syscalls | 5 + > tools/perf/arch/s390/entry/syscalls/mksyscalltbl | 32 -- > tools/perf/arch/s390/include/syscall_table.h | 2 + > tools/perf/arch/sh/entry/syscalls/Kbuild | 2 + > .../perf/arch/sh/entry/syscalls/Makefile.syscalls | 4 + > tools/perf/arch/sh/entry/syscalls/syscall.tbl | 472 +++++++++++++++++++ > tools/perf/arch/sh/include/syscall_table.h | 2 + > tools/perf/arch/sparc/entry/syscalls/Kbuild | 3 + > .../arch/sparc/entry/syscalls/Makefile.syscalls | 5 + > tools/perf/arch/sparc/entry/syscalls/syscall.tbl | 514 +++++++++++++++++++++ > tools/perf/arch/sparc/include/syscall_table.h | 8 + > tools/perf/arch/x86/Build | 1 - > tools/perf/arch/x86/Makefile | 25 - > tools/perf/arch/x86/entry/syscalls/Kbuild | 3 + > .../perf/arch/x86/entry/syscalls/Makefile.syscalls | 6 + > tools/perf/arch/x86/entry/syscalls/syscalltbl.sh | 42 -- > tools/perf/arch/x86/include/syscall_table.h | 8 + > tools/perf/arch/xtensa/entry/syscalls/Kbuild | 2 + > .../arch/xtensa/entry/syscalls/Makefile.syscalls | 4 + > tools/perf/arch/xtensa/entry/syscalls/syscall.tbl | 439 ++++++++++++++++++ > tools/perf/arch/xtensa/include/syscall_table.h | 2 + > tools/perf/builtin-check.c | 2 - > tools/perf/builtin-help.c | 2 - > tools/perf/builtin-trace.c | 30 -- > tools/perf/check-headers.sh | 9 + > tools/perf/perf.c | 6 +- > tools/perf/scripts/Makefile.syscalls | 61 +++ > tools/perf/scripts/syscalltbl.sh | 86 ++++ > tools/perf/tests/make | 7 +- > tools/perf/util/env.c | 6 +- > tools/perf/util/generate-cmdlist.sh | 4 +- > tools/perf/util/syscalltbl.c | 90 +--- > tools/perf/util/syscalltbl.h | 1 - > tools/scripts/syscall.tbl | 409 ++++++++++++++++ > 86 files changed, 4103 insertions(+), 623 deletions(-) > --- > base-commit: 034b5b147bf7f44a45e39334725f8633b7ca8c3b > change-id: 20240913-perf_syscalltbl-6f98defcc6f5 > -- > - Charlie >
On Wed, Jan 08, 2025 at 09:57:44AM -0800, Namhyung Kim wrote: > Hello, > > On Tue, Jan 07, 2025 at 06:07:48PM -0800, Charlie Jenkins wrote: > > Standardize the generation of syscall headers around syscall tables. > > Previously each architecture independently selected how syscall headers > > would be generated, or would not define a way and fallback onto > > libaudit. Convert all architectures to use a standard syscall header > > generation script and allow each architecture to override the syscall > > table to use if they do not use the generic table. > > > > As a result of these changes, no architecture will require libaudit, and > > so the fallback case of using libaudit is removed by this series. > > > > Testing: > > > > I have tested that the syscall mappings of id to name generation works > > as expected for every architecture, but I have only validated that perf > > trace compiles and runs as expected on riscv, arm64, and x86_64. > > > > Signed-off-by: Charlie Jenkins <charlie@rivosinc.com> > > Reviewed-by: Ian Rogers <irogers@google.com> > > Tested-by: Ian Rogers <irogers@google.com> > > Acked-by: Namhyung Kim <namhyung@kernel.org> So, somehow the first patch of this series didn't reach my inbox, b4 found it, and in it perf now does; tools/perf/scripts/Makefile.syscalls include $(srctree)/scripts/Kbuild.include I.e. it uses a file that is outside tools/ so normal devel in the kernel community may end up breaking tools/ living code, something we decided not to have. I noticed this while doing a: "make -C tools/perf build-test", the first test creates a perf tarball and then tries to build it after uncompressing it somewhere out of the checked out kernel source tree: ⬢ [acme@toolbox perf-tools-next]$ make help | grep perf perf-tar-src-pkg - Build the perf source tarball with no compression perf-targz-src-pkg - Build the perf source tarball with gzip compression perf-tarbz2-src-pkg - Build the perf source tarball with bz2 compression perf-tarxz-src-pkg - Build the perf source tarball with xz compression perf-tarzst-src-pkg - Build the perf source tarball with zst compression ⬢ [acme@toolbox perf-tools-next]$ make perf-tarxz-src-pkg UPD .tmp_HEAD COPY .tmp_perf/HEAD GEN .tmp_perf/PERF-VERSION-FILE PERF_VERSION = 6.13.rc2.g48d3eefaa683 ARCHIVE perf-6.13.0-rc2.tar.xz ⬢ [acme@toolbox perf-tools-next]$ mv perf-6.13.0-rc2.tar.xz ~ ⬢ [acme@toolbox perf-tools-next]$ cd ~ ⬢ [acme@toolbox ~]$ tar xvf perf-6.13.0-rc2.tar.xz | tail -5 perf-6.13.0-rc2/tools/scripts/Makefile.include perf-6.13.0-rc2/tools/scripts/syscall.tbl perf-6.13.0-rc2/tools/scripts/utilities.mak perf-6.13.0-rc2/HEAD perf-6.13.0-rc2/PERF-VERSION-FILE ⬢ [acme@toolbox ~]$ cd perf-6.13.0-rc2/ ⬢ [acme@toolbox perf-6.13.0-rc2]$ make -C tools/perf make: Entering directory '/home/acme/perf-6.13.0-rc2/tools/perf' BUILD: Doing 'make -j28' parallel build Warning: Skipped check-headers due to missing ../../include Auto-detecting system features: ... libdw: [ on ] ... glibc: [ on ] ... libbfd: [ on ] ... libbfd-buildid: [ on ] ... libelf: [ on ] ... libnuma: [ on ] ... numa_num_possible_cpus: [ on ] ... libperl: [ on ] ... libpython: [ on ] ... libcrypto: [ on ] ... libunwind: [ on ] ... libcapstone: [ on ] ... llvm-perf: [ on ] ... zlib: [ on ] ... lzma: [ on ] ... get_cpuid: [ on ] ... bpf: [ on ] ... libaio: [ on ] ... libzstd: [ on ] /home/acme/perf-6.13.0-rc2/tools/perf/scripts/Makefile.syscalls:18: /home/acme/perf-6.13.0-rc2/scripts/Kbuild.include: No such file or directory make[2]: *** No rule to make target '/home/acme/perf-6.13.0-rc2/scripts/Kbuild.include'. Stop. make[1]: *** [Makefile.perf:286: sub-make] Error 2 make: *** [Makefile:76: all] Error 2 make: Leaving directory '/home/acme/perf-6.13.0-rc2/tools/perf' ⬢ [acme@toolbox perf-6.13.0-rc2]$ This would probably (it does, just tested, but read on) make it work: ⬢ [acme@toolbox perf-tools-next]$ git diff diff --git a/tools/perf/MANIFEST b/tools/perf/MANIFEST index dc42de1785cee715..83ef5d1365880929 100644 --- a/tools/perf/MANIFEST +++ b/tools/perf/MANIFEST @@ -22,6 +22,7 @@ tools/lib/str_error_r.c tools/lib/vsprintf.c tools/lib/zalloc.c scripts/bpf_doc.py +scripts/Kbuild.include tools/bpf/bpftool kernel/bpf/disasm.c kernel/bpf/disasm.h ⬢ [acme@toolbox perf-tools-next]$ As now we would find it, but then it references some other part of the kernel's Kbuild system: ⬢ [acme@toolbox perf-tools-next]$ grep -w srctree scripts/Kbuild.include build := -f $(srctree)/scripts/Makefile.build obj clean := -f $(srctree)/scripts/Makefile.clean obj ⬢ [acme@toolbox perf-tools-next]$ And perf has: ⬢ [acme@toolbox perf-tools-next]$ find tools/ -name Makefile.build tools/build/Makefile.build ⬢ [acme@toolbox perf-tools-next]$ And we also have: ⬢ [acme@toolbox perf-tools-next]$ ls -la tools/scripts/ total 40 drwxr-xr-x. 1 acme acme 106 Jan 8 19:13 . drwxr-xr-x. 1 acme acme 514 Jan 8 11:39 .. -rw-r--r--. 1 acme acme 1224 Jan 8 11:41 Makefile.arch -rw-r--r--. 1 acme acme 6205 Dec 20 21:48 Makefile.include -rw-r--r--. 1 acme acme 17401 Jan 8 19:13 syscall.tbl -rw-r--r--. 1 acme acme 6186 Dec 20 21:48 utilities.mak ⬢ [acme@toolbox perf-tools-next]$ And: ⬢ [acme@toolbox perf-tools-next]$ grep -w build tools/build/Makefile.include build := -f $(srctree)/tools/build/Makefile.build dir=. obj $(SILENT_MAKE) -C $(srctree)/tools/build CFLAGS= LDFLAGS= $(OUTPUT)fixdep $(Q)$(MAKE) -C $(srctree)/tools/build clean ⬢ [acme@toolbox perf-tools-next]$ That is also in: ⬢ [acme@toolbox perf-tools-next]$ grep -w build scripts/Kbuild.include # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj= # $(Q)$(MAKE) $(build)=dir build := -f $(srctree)/scripts/Makefile.build obj # the interrupted recipe. So, you can safely stop the build by Ctrl-C (Make # (1) PHONY targets are always build # (2) No target, so we better build it ⬢ [acme@toolbox perf-tools-next]$ So it seems we need to look at what we're using from the kernel's scripts/Makefile.build to have it in a tools/build/ file. Its late here and I'll have to stop at this point, please take a look to see if this can be easily resolved so that we can merge your series, I very much like to say goodbye to one more tools/perf library dependency :-) Best regards, - Arnaldo
On Wed, Jan 08, 2025 at 07:39:51PM -0300, Arnaldo Carvalho de Melo wrote: > On Wed, Jan 08, 2025 at 09:57:44AM -0800, Namhyung Kim wrote: > > Hello, > > > > On Tue, Jan 07, 2025 at 06:07:48PM -0800, Charlie Jenkins wrote: > > > Standardize the generation of syscall headers around syscall tables. > > > Previously each architecture independently selected how syscall headers > > > would be generated, or would not define a way and fallback onto > > > libaudit. Convert all architectures to use a standard syscall header > > > generation script and allow each architecture to override the syscall > > > table to use if they do not use the generic table. > > > > > > As a result of these changes, no architecture will require libaudit, and > > > so the fallback case of using libaudit is removed by this series. > > > > > > Testing: > > > > > > I have tested that the syscall mappings of id to name generation works > > > as expected for every architecture, but I have only validated that perf > > > trace compiles and runs as expected on riscv, arm64, and x86_64. > > > > > > Signed-off-by: Charlie Jenkins <charlie@rivosinc.com> > > > Reviewed-by: Ian Rogers <irogers@google.com> > > > Tested-by: Ian Rogers <irogers@google.com> > > > > Acked-by: Namhyung Kim <namhyung@kernel.org> > > So, somehow the first patch of this series didn't reach my inbox, b4 > found it, and in it perf now does; > > tools/perf/scripts/Makefile.syscalls > > include $(srctree)/scripts/Kbuild.include > > I.e. it uses a file that is outside tools/ so normal devel in the kernel > community may end up breaking tools/ living code, something we decided > not to have. > > I noticed this while doing a: "make -C tools/perf build-test", the first > test creates a perf tarball and then tries to build it after > uncompressing it somewhere out of the checked out kernel source tree: > > ⬢ [acme@toolbox perf-tools-next]$ make help | grep perf > perf-tar-src-pkg - Build the perf source tarball with no compression > perf-targz-src-pkg - Build the perf source tarball with gzip compression > perf-tarbz2-src-pkg - Build the perf source tarball with bz2 compression > perf-tarxz-src-pkg - Build the perf source tarball with xz compression > perf-tarzst-src-pkg - Build the perf source tarball with zst compression > ⬢ [acme@toolbox perf-tools-next]$ make perf-tarxz-src-pkg > UPD .tmp_HEAD > COPY .tmp_perf/HEAD > GEN .tmp_perf/PERF-VERSION-FILE > PERF_VERSION = 6.13.rc2.g48d3eefaa683 > ARCHIVE perf-6.13.0-rc2.tar.xz > ⬢ [acme@toolbox perf-tools-next]$ mv perf-6.13.0-rc2.tar.xz ~ > ⬢ [acme@toolbox perf-tools-next]$ cd ~ > ⬢ [acme@toolbox ~]$ tar xvf perf-6.13.0-rc2.tar.xz | tail -5 > perf-6.13.0-rc2/tools/scripts/Makefile.include > perf-6.13.0-rc2/tools/scripts/syscall.tbl > perf-6.13.0-rc2/tools/scripts/utilities.mak > perf-6.13.0-rc2/HEAD > perf-6.13.0-rc2/PERF-VERSION-FILE > ⬢ [acme@toolbox ~]$ cd perf-6.13.0-rc2/ > ⬢ [acme@toolbox perf-6.13.0-rc2]$ make -C tools/perf > make: Entering directory '/home/acme/perf-6.13.0-rc2/tools/perf' > BUILD: Doing 'make -j28' parallel build > Warning: Skipped check-headers due to missing ../../include > > Auto-detecting system features: > ... libdw: [ on ] > ... glibc: [ on ] > ... libbfd: [ on ] > ... libbfd-buildid: [ on ] > ... libelf: [ on ] > ... libnuma: [ on ] > ... numa_num_possible_cpus: [ on ] > ... libperl: [ on ] > ... libpython: [ on ] > ... libcrypto: [ on ] > ... libunwind: [ on ] > ... libcapstone: [ on ] > ... llvm-perf: [ on ] > ... zlib: [ on ] > ... lzma: [ on ] > ... get_cpuid: [ on ] > ... bpf: [ on ] > ... libaio: [ on ] > ... libzstd: [ on ] > > /home/acme/perf-6.13.0-rc2/tools/perf/scripts/Makefile.syscalls:18: /home/acme/perf-6.13.0-rc2/scripts/Kbuild.include: No such file or directory > make[2]: *** No rule to make target '/home/acme/perf-6.13.0-rc2/scripts/Kbuild.include'. Stop. > make[1]: *** [Makefile.perf:286: sub-make] Error 2 > make: *** [Makefile:76: all] Error 2 > make: Leaving directory '/home/acme/perf-6.13.0-rc2/tools/perf' > ⬢ [acme@toolbox perf-6.13.0-rc2]$ > > This would probably (it does, just tested, but read on) make it work: > > ⬢ [acme@toolbox perf-tools-next]$ git diff > diff --git a/tools/perf/MANIFEST b/tools/perf/MANIFEST > index dc42de1785cee715..83ef5d1365880929 100644 > --- a/tools/perf/MANIFEST > +++ b/tools/perf/MANIFEST > @@ -22,6 +22,7 @@ tools/lib/str_error_r.c > tools/lib/vsprintf.c > tools/lib/zalloc.c > scripts/bpf_doc.py > +scripts/Kbuild.include > tools/bpf/bpftool > kernel/bpf/disasm.c > kernel/bpf/disasm.h > ⬢ [acme@toolbox perf-tools-next]$ > > As now we would find it, but then it references some other part of the > kernel's Kbuild system: > > ⬢ [acme@toolbox perf-tools-next]$ grep -w srctree scripts/Kbuild.include > build := -f $(srctree)/scripts/Makefile.build obj > clean := -f $(srctree)/scripts/Makefile.clean obj > ⬢ [acme@toolbox perf-tools-next]$ > > And perf has: > > ⬢ [acme@toolbox perf-tools-next]$ find tools/ -name Makefile.build > tools/build/Makefile.build > ⬢ [acme@toolbox perf-tools-next]$ > > And we also have: > > ⬢ [acme@toolbox perf-tools-next]$ ls -la tools/scripts/ > total 40 > drwxr-xr-x. 1 acme acme 106 Jan 8 19:13 . > drwxr-xr-x. 1 acme acme 514 Jan 8 11:39 .. > -rw-r--r--. 1 acme acme 1224 Jan 8 11:41 Makefile.arch > -rw-r--r--. 1 acme acme 6205 Dec 20 21:48 Makefile.include > -rw-r--r--. 1 acme acme 17401 Jan 8 19:13 syscall.tbl > -rw-r--r--. 1 acme acme 6186 Dec 20 21:48 utilities.mak > ⬢ [acme@toolbox perf-tools-next]$ > > And: > > ⬢ [acme@toolbox perf-tools-next]$ grep -w build tools/build/Makefile.include > build := -f $(srctree)/tools/build/Makefile.build dir=. obj > $(SILENT_MAKE) -C $(srctree)/tools/build CFLAGS= LDFLAGS= $(OUTPUT)fixdep > $(Q)$(MAKE) -C $(srctree)/tools/build clean > ⬢ [acme@toolbox perf-tools-next]$ > > That is also in: > > ⬢ [acme@toolbox perf-tools-next]$ grep -w build scripts/Kbuild.include > # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj= > # $(Q)$(MAKE) $(build)=dir > build := -f $(srctree)/scripts/Makefile.build obj > # the interrupted recipe. So, you can safely stop the build by Ctrl-C (Make > # (1) PHONY targets are always build > # (2) No target, so we better build it > ⬢ [acme@toolbox perf-tools-next]$ > > So it seems we need to look at what we're using from the kernel's > scripts/Makefile.build to have it in a tools/build/ file. > > Its late here and I'll have to stop at this point, please take a look to > see if this can be easily resolved so that we can merge your series, I > very much like to say goodbye to one more tools/perf library dependency > :-) Thank you for pointing this out. We can use tools/build/Build.include which seems to have everything that is required. A "space" convenience variable needs to be added, but that is all. I'll send an updated version with that change. - Charlie > > Best regards, > > - Arnaldo