Re: [DTrace-devel] [PATCH v3] Refactor the versioning handling system (consolidate data)
Eugene Loh <[email protected]>
| Newsgroups | dev.linux.lists.dtrace |
|---|---|
| Message-ID | <[email protected]> |
Reviewed-by: Eugene Loh <[email protected]> On 8/18/25 18:19, Kris Van Hees via DTrace-devel wrote: > Rather than having multiple data items that need to be updated whenever > a new version is released, a single entry in versions.list will now be > all that is needed. The mkvers script generates the necessary defines, > and is also used to return the most recent release version to be used > in GNUmakefile. > > Signed-off-by: Kris Van Hees <[email protected]> > --- > GNUmakefile | 2 +- > libdtrace/.gitignore | 1 + > libdtrace/Build | 8 +- > libdtrace/dt_version.h | 82 +------------------- > libdtrace/mkvers | 67 ++++++++++++++++ > libdtrace/versions.list | 67 ++++++++++++++++ > test/unittest/dtrace-util/tst.APIVersion.d | 11 +-- > test/unittest/dtrace-util/tst.APIVersion.r | 2 +- > test/unittest/dtrace-util/tst.APIVersion.r.p | 12 +++ > test/unittest/options/tst.version.r | 1 - > test/unittest/options/tst.version.sh | 3 +- > 11 files changed, 163 insertions(+), 93 deletions(-) > create mode 100755 libdtrace/mkvers > create mode 100644 libdtrace/versions.list > create mode 100755 test/unittest/dtrace-util/tst.APIVersion.r.p > > diff --git a/GNUmakefile b/GNUmakefile > index 7ad857f88..38ae54236 100644 > --- a/GNUmakefile > +++ b/GNUmakefile > @@ -14,7 +14,7 @@ > SHELL = /bin/bash > > PROJECT := dtrace > -VERSION := 2.0.3 > +VERSION := $(shell ./libdtrace/mkvers -vcurrent=t libdtrace/versions.list) > > # Verify supported hardware. > > diff --git a/libdtrace/.gitignore b/libdtrace/.gitignore > index cf124ba1d..ebf6ac9b2 100644 > --- a/libdtrace/.gitignore > +++ b/libdtrace/.gitignore > @@ -3,6 +3,7 @@ dt_errtags.c > dt_grammar.[ch] > dt_lex.c > dt_names.c > +dt_versions_defs.h > errno.d > regs.d > signal.d > diff --git a/libdtrace/Build b/libdtrace/Build > index 164023bbc..3540d1c12 100644 > --- a/libdtrace/Build > +++ b/libdtrace/Build > @@ -73,7 +73,8 @@ libdtrace-build_SOURCES = dt_aggregate.c \ > dt_work.c \ > dt_xlator.c > > -libdtrace-build_SRCDEPS := dt_grammar.h $(objdir)/dt_git_version.h > +libdtrace-build_SRCDEPS := dt_grammar.h dt_versions_defs.h \ > + $(objdir)/dt_git_version.h > > SHLIBS += libdtrace > > @@ -129,6 +130,10 @@ SHORTKERNELS := $(foreach kernel,$(KERNELS),$(shell printf %s $(kernel) | sed -e > $(libdtrace-build_DIR)dt_errtags.c: $(libdtrace-build_DIR)dt_errtags.h $(libdtrace-build_DIR)/mkerrtags.sh > sh $(libdtrace-build_DIR)mkerrtags.sh < $(libdtrace-build_DIR)dt_errtags.h | sed -e 's/\\n/\n/g' > $@ > > +$(libdtrace-build_DIR)dt_versions_defs.h: $(libdtrace-build_DIR)versions.list > + $(call describe-target,MKVERS,$@) > + $(libdtrace-build_DIR)mkvers $< > $@ > + > $(libdtrace-build_DIR)%.h $(libdtrace-build_DIR)%.c: $(libdtrace-build_DIR)%.y > $(call describe-target,YACC,$(libdtrace-build_DIR)$*.c) > bison -o $(libdtrace-build_DIR)$*.c -d $(libdtrace-build_DIR)$*.y > @@ -279,6 +284,7 @@ clean:: > rm -f $(libdtrace-build_DIR)dt_errtags.c > rm -f $(libdtrace-build_DIR)dt_grammar.h $(libdtrace-build_DIR)dt_grammar.c > rm -f $(libdtrace-build_DIR)dt_lex.c > + rm -f $(libdtrace-build_DIR)dt_versions_defs.h > rm -f $(addprefix $(libdtrace-build_DIR),$(BUILD_DLIBS)) > > install:: > diff --git a/libdtrace/dt_version.h b/libdtrace/dt_version.h > index 8dd252b08..527087db3 100644 > --- a/libdtrace/dt_version.h > +++ b/libdtrace/dt_version.h > @@ -13,83 +13,7 @@ extern "C" { > #endif > > #include <dt_ident.h> > - > -/* > - * Versioning definitions > - * > - * These #defines are used in identifier tables to fill in the version fields > - * associated with each identifier. The DT_VERS_* macros declare the encoded > - * integer values of all versions used so far. DT_VERS_LATEST must correspond > - * to the latest version value among all versions exported by the D compiler. > - * DT_VERS_STRING must be an ASCII string that contains DT_VERS_LATEST within > - * it along with any suffixes (e.g. Beta). > - * > - * Refer to the Solaris Dynamic Tracing Guide Versioning chapter for an > - * explanation of these DTrace features and their values. > - * > - * When adding a new version: > - * - Add a new DT_VERS_* macro > - * - Add the new DT_VERS_* macro at the end of the DTRACE_VERSIONS macro > - * - Set DT_VERS_LATEST to the new DT_VERS_* > - * - Update DT_VERS_STRING to reflect the new version > - * > - * NOTE: Although the DTrace versioning scheme supports the labeling and > - * introduction of incompatible changes (e.g. dropping an interface in a > - * major release), the libdtrace code does not currently support this. > - * All versions are assumed to strictly inherit from one another. If > - * we ever need to provide divergent interfaces, this will need work. > - * > - * The version number should be increased for every customer visible release > - * of DTrace. > - * - The major number should be incremented when a fundamental change has been > - * made that would affect all consumers, and would reflect sweeping changes > - * to DTrace or the D language. > - * - The minor number should be incremented when a change is introduced that > - * could break scripts that had previously worked; for example, adding a new > - * built-in variable could break a script which was already using that > - * identifier. > - * - The micro number should be changed when introducing functionality changes > - * or major bug fixes that do not affect backward compatibility -- this is > - * merely to make capabilities easily determined from the version number. > - * Minor bugs do not require any modification to the version number. > - */ > -#define DT_VERS_1_0 DT_VERSION_NUMBER(1, 0, 0) > -#define DT_VERS_1_1 DT_VERSION_NUMBER(1, 1, 0) > -#define DT_VERS_1_2 DT_VERSION_NUMBER(1, 2, 0) > -#define DT_VERS_1_2_1 DT_VERSION_NUMBER(1, 2, 1) > -#define DT_VERS_1_2_2 DT_VERSION_NUMBER(1, 2, 2) > -#define DT_VERS_1_3 DT_VERSION_NUMBER(1, 3, 0) > -#define DT_VERS_1_4 DT_VERSION_NUMBER(1, 4, 0) > -#define DT_VERS_1_4_1 DT_VERSION_NUMBER(1, 4, 1) > -#define DT_VERS_1_5 DT_VERSION_NUMBER(1, 5, 0) > -#define DT_VERS_1_6 DT_VERSION_NUMBER(1, 6, 0) > -#define DT_VERS_1_6_1 DT_VERSION_NUMBER(1, 6, 1) > -#define DT_VERS_1_6_2 DT_VERSION_NUMBER(1, 6, 2) > -#define DT_VERS_1_6_3 DT_VERSION_NUMBER(1, 6, 3) > -#define DT_VERS_1_6_4 DT_VERSION_NUMBER(1, 6, 4) > -#define DT_VERS_2_0 DT_VERSION_NUMBER(2, 0, 0) > -#define DT_VERS_2_0_1 DT_VERSION_NUMBER(2, 0, 1) > - > -#define DTRACE_VERSIONS { \ > - DT_VERS_1_0, /* D API 1.0.0 (PSARC 2001/466) Solaris 10 FCS */ \ > - DT_VERS_1_1, /* D API 1.1.0 Solaris Express 6/05 */ \ > - DT_VERS_1_2, /* D API 1.2.0 Solaris 10 Update 1 */ \ > - DT_VERS_1_2_1, /* D API 1.2.1 Solaris Express 4/06 */ \ > - DT_VERS_1_2_2, /* D API 1.2.2 Solaris Express 6/06 */ \ > - DT_VERS_1_3, /* D API 1.3 Solaris Express 10/06 */ \ > - DT_VERS_1_4, /* D API 1.4 Solaris Express 2/07 */ \ > - DT_VERS_1_4_1, /* D API 1.4.1 Solaris Express 4/07 */ \ > - DT_VERS_1_5, /* D API 1.5 Solaris Express 7/07 */ \ > - DT_VERS_1_6, /* D API 1.6 */ \ > - DT_VERS_1_6_1, /* D API 1.6.1 */ \ > - DT_VERS_1_6_2, /* D API 1.6.2 */ \ > - DT_VERS_1_6_3, /* D API 1.6.3 */ \ > - DT_VERS_1_6_4, /* D API 1.6.4 */ \ > - DT_VERS_2_0, /* D API 2.0 */ \ > -} > - > -#define DT_VERS_LATEST DT_VERS_2_0_1 > -#define DT_VERS_STRING "Oracle D 2.0" > +#include "dt_versions_defs.h" > > /* > * Interfaces for parsing and handling DTrace version strings. Version binding > @@ -112,8 +36,8 @@ extern "C" { > > typedef uint32_t dt_version_t; > > -extern const dt_version_t _dtrace_versions[]; > -extern const char *const _dtrace_version; > +extern const dt_version_t _dtrace_versions[]; > +extern const char *const _dtrace_version; > > extern char *dt_version_num2str(dt_version_t, char *, size_t); > extern int dt_version_str2num(const char *, dt_version_t *); > diff --git a/libdtrace/mkvers b/libdtrace/mkvers > new file mode 100755 > index 000000000..82295b152 > --- /dev/null > +++ b/libdtrace/mkvers > @@ -0,0 +1,67 @@ > +#!/usr/bin/gawk -f > +# > +# Oracle Linux DTrace. > +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. > +# Licensed under the Universal Permissive License v 1.0 as shown at > +# http://oss.oracle.com/licenses/upl. > +# > + > +/^\s*#/ { next; } > +NF == 0 { next; } > + > +{ > + if (match($1, /^[1-9][0-9]*(\.[0-9]*){1,2}$/) == 0) { > + print "E: Invalid version string: " $1 >"/dev/stderr"; > + exit 1 > + } > + > + n = split($1, arr, /\./); > + if (n == 2) > + arr[3] = 0; > + > + code = arr[1] * 0x1000000 + arr[2] * 0x1000 + arr[3]; > + versions[code] = arr[1] " " arr[2] " " arr[3]; > + next; > +} > + > +END { > + n = asorti(versions, idx); > + > + if (current) { > + $0 = versions[idx[n]]; > + if ($3 == 0) > + printf "%s.%s", $1, $2; > + else > + printf "%s.%s.%s", $1, $2, $3; > + > + exit(0); > + } > + > + for (i = 1; i <= n; i++) { > + $0 = versions[idx[i]]; > + if ($3 == 0) > + printf "#define DT_VERS_%d_%d\tDT_VERSION_NUMBER(%d, %d, 0)\n",\ > + $1, $2, $1, $2; > + else > + printf "#define DT_VERS_%d_%d_%d\tDT_VERSION_NUMBER(%d, %d, %d)\n",\ > + $1, $2, $3, $1, $2, $3; > + } > + > + print "\n#define DTRACE_VERSIONS { \\"; > + for (i = 1; i <= n; i++) { > + $0 = versions[idx[i]]; > + if ($3 == 0) > + printf "\t\tDT_VERS_%d_%d, \\\n", $1, $2, $1, $2; > + else > + printf "\t\tDT_VERS_%d_%d_%d, \\\n", $1, $2, $3, $1, $2, $3; > + } > + print "}"; > + > + if ($3 == 0) { > + printf "\n#define DT_VERS_LATEST\tDT_VERS_%d_%d\n", $1, $2; > + printf "#define DT_VERS_STRING\t\"Oracle D %d.%d\"\n", $1, $2; > + } else { > + printf "\n#define DT_VERS_LATEST\tDT_VERS_%d_%d_%d\n", $1, $2, $3; > + printf "#define DT_VERS_STRING\t\"Oracle D %d.%d.%d\"\n", $1, $2, $3; > + } > +} > diff --git a/libdtrace/versions.list b/libdtrace/versions.list > new file mode 100644 > index 000000000..8986d2007 > --- /dev/null > +++ b/libdtrace/versions.list > @@ -0,0 +1,67 @@ > +# > +# Oracle Linux DTrace. > +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. > +# Licensed under the Universal Permissive License v 1.0 as shown at > +# http://oss.oracle.com/licenses/upl. > +# > + > +# > +# Version definitions > +# > +# These definitions are used to generate dt_versions_defs.h. > +# > +# The generated file contains: > +# - DT_VERS_* defines that are used in identifier tables to fill in the > +# version fields associated with each identifier. > +# > +# - DTRACE_VERSIONS which is used in dt_versions.c to populate the array of > +# valid DTrace versions > +# > +# - DT_VERS_LATEST which has the value of the most recent DT_VERS_* define > +# > +# - DT_VERS_STRING which provides a string representation of the most recent > +# DTrace version > +# > +# Refer to the Solaris Dynamic Tracing Guide Versioning chapter for an > +# explanation of these DTrace features and their values. > +# > +# NOTE: Although the DTrace versioning scheme supports the labeling and > +# introduction of incompatible changes (e.g. dropping an interface in a > +# major release), the libdtrace code does not currently support this. > +# All versions are assumed to strictly inherit from one another. If > +# we ever need to provide divergent interfaces, this will need work. > +# > +# The version number should be increased for every customer visible release > +# of DTrace. > +# - The major number should be incremented when a fundamental change has been > +# made that would affect all consumers, and would reflect sweeping changes > +# to DTrace or the D language. > +# - The minor number should be incremented when a change is introduced that > +# could break scripts that had previously worked; for example, adding a new > +# built-in variable could break a script which was already using that > +# identifier. > +# - The micro number should be changed when introducing functionality changes > +# or major bug fixes that do not affect backward compatibility -- this is > +# merely to make capabilities easily determined from the version number. > +# Minor bugs do not require any modification to the version number. > +# > + > +# Ver Description > +1.0 D API 1.0.0 (PSARC 2001/466) Solaris 10 FCS > +1.1 D API 1.1.0 Solaris Express 6/05 > +1.2 D API 1.2.0 Solaris 10 Update 1 > +1.2.1 D API 1.2.1 Solaris Express 4/06 > +1.2.2 D API 1.2.2 Solaris Express 6/06 > +1.3 D API 1.3 Solaris Express 10/06 > +1.4 D API 1.4 Solaris Express 2/07 > +1.4.1 D API 1.4.1 Solaris Express 4/07 > +1.5 D API 1.5 Solaris Express 7/07 > +1.6 D API 1.6 > +1.6.1 D API 1.6.1 > +1.6.2 D API 1.6.2 > +1.6.3 D API 1.6.3 > +1.6.4 D API 1.6.4 > +2.0 D API 2.0 Linux (BPF) > +2.0.1 D API 2.0.1 Linux (BPF) > +2.0.2 D API 2.0.2 Linux (BPF) > +2.0.3 D API 2.0.3 Linux (BPF) > diff --git a/test/unittest/dtrace-util/tst.APIVersion.d b/test/unittest/dtrace-util/tst.APIVersion.d > index 85108c027..3b2baaa60 100644 > --- a/test/unittest/dtrace-util/tst.APIVersion.d > +++ b/test/unittest/dtrace-util/tst.APIVersion.d > @@ -1,18 +1,13 @@ > /* > * Oracle Linux DTrace. > - * Copyright (c) 2006, 2021, Oracle and/or its affiliates. All rights reserved. > + * Copyright (c) 2006, 2025, Oracle and/or its affiliates. All rights reserved. > * Licensed under the Universal Permissive License v 1.0 as shown at > * http://oss.oracle.com/licenses/upl. > */ > > -/* Assertion: > - * Use the -V option to printout API version. > +/* ASSERTION: Use the -V option to printout API version. > * > - * SECTION: > - * dtrace Utility/-V Option > - * > - * NOTES: > - * Use /usr/sbin/dtrace -V on command line. > + * SECTION: dtrace Utility/-V Option > */ > > /* @@runtest-opts: -V */ > diff --git a/test/unittest/dtrace-util/tst.APIVersion.r b/test/unittest/dtrace-util/tst.APIVersion.r > index 6bc7b9d72..0d88b694e 100644 > --- a/test/unittest/dtrace-util/tst.APIVersion.r > +++ b/test/unittest/dtrace-util/tst.APIVersion.r > @@ -1 +1 @@ > -dtrace: Oracle D 2.0 > +dtrace: Oracle D x.y.z > diff --git a/test/unittest/dtrace-util/tst.APIVersion.r.p b/test/unittest/dtrace-util/tst.APIVersion.r.p > new file mode 100755 > index 000000000..8da4f22c1 > --- /dev/null > +++ b/test/unittest/dtrace-util/tst.APIVersion.r.p > @@ -0,0 +1,12 @@ > +#!/usr/bin/gawk -f > + > +# We do not care about the actual version number - we just want to ensure that > +# a version using the correct format is reported. > +/dtrace:/ { > + sub(/[1-9][0-9]*\.[0-9]+\.[0-9]+/, "x.y.z"); > + sub(/[1-9][0-9]*\.[0-9]+/, "x.y.z"); > +} > + > +{ > + print; > +} > diff --git a/test/unittest/options/tst.version.r b/test/unittest/options/tst.version.r > index 15010b3db..8b1378917 100644 > --- a/test/unittest/options/tst.version.r > +++ b/test/unittest/options/tst.version.r > @@ -1,2 +1 @@ > -version is 2.0 > > diff --git a/test/unittest/options/tst.version.sh b/test/unittest/options/tst.version.sh > index ffffcdd8b..37fb6f752 100755 > --- a/test/unittest/options/tst.version.sh > +++ b/test/unittest/options/tst.version.sh > @@ -1,7 +1,7 @@ > #!/bin/bash > # > # Oracle Linux DTrace. > -# Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. > +# Copyright (c) 2023, 2025,Oracle and/or its affiliates. All rights reserved. > # Licensed under the Universal Permissive License v 1.0 as shown at > # http://oss.oracle.com/licenses/upl. > # > @@ -9,7 +9,6 @@ > dtrace=$1 > > myversion=`$dtrace $dt_flags -V | gawk '{ print $NF }'` > -echo version is $myversion > > $dtrace $dt_flags -xversion=$myversion -qn 'BEGIN { exit(0) }' > exit $?