[DTrace-devel] [PATCH 2/2] Refactor the versioning handling system (consolidate data)

Kris Van Hees kris.van.hees at oracle.com
Mon Aug 18 22:07:14 UTC 2025


More replies below...

On Mon, Aug 18, 2025 at 05:13:20PM -0400, Kris Van Hees wrote:
> 
> 
> On Mon, Aug 18, 2025 at 04:45:31PM -0400, Eugene Loh wrote:
> > With this patch, I get test regressions:
> > 
> >    test/unittest/options/tst.version.sh
> >         Diff against expected:
> >         -version is 2.0
> >         +version is 2.0.3
> > 
> >     test/unittest/dtrace-util/tst.APIVersion.d
> >         Diff against expected:
> >         -dtrace: Oracle D 2.0
> >         +dtrace: Oracle D 2.0.3
> 
> Test with v2.
> 
> > I did not run the test suite, so I do not know if other tests also fail.
> > 
> > Should something be done in libdtrace/Build with
> >     libdtrace_VERSION := 2.0.0
> 
> No, see Nick's email on this a while back.  Library version is a different
> thing.
> 
> > Should something be done in dtrace.spec with
> >     Version:      2.0.3
> 
> No, that should be done separately because it is a distro-specific release
> thing.  That should remain separate because (1) it is hard to automate its
> value, and (2) we have to change the spec file for each release anyway.
> 
> > On 8/15/25 23:46, 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 generated the necessary defines,
> > 
> > s/generated/generates/

Thanks.

> > 
> > > and is also used to return the most recent release version to be used
> > > in GNUmakefile.
> > > 
> > > Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
> > > ---
> > >   GNUmakefile             |  2 +-
> > >   libdtrace/.gitignore    |  1 +
> > >   libdtrace/Build         |  7 +++-
> > >   libdtrace/dt_version.h  | 83 ++---------------------------------------
> > >   libdtrace/mkvers        | 68 +++++++++++++++++++++++++++++++++
> > >   libdtrace/versions.list | 67 +++++++++++++++++++++++++++++++++
> > >   6 files changed, 147 insertions(+), 81 deletions(-)
> > >   create mode 100755 libdtrace/mkvers
> > >   create mode 100644 libdtrace/versions.list
> > > 
> > > diff --git a/GNUmakefile b/GNUmakefile
> > > index 7ad857f88..03687bf3f 100644
> > > --- a/GNUmakefile
> > > +++ b/GNUmakefile
> > > @@ -14,7 +14,7 @@
> > >   SHELL = /bin/bash
> > >   PROJECT := dtrace
> > > -VERSION := 2.0.3
> > > +VERSION := $(shell ./libdtrace/mkvers -vrelease=1 libdtrace/versions.list)
> > 
> > I think to most readers "release=1" means, well, release 1.  How about
> > renaming the variable.  Alternatively, just say "-vrelease=t".

Sure.

> > >   # 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
> > 
> > Great.  But dt_versions_defs.h should also not survive "make clean".  So
> > that also should be added (in the appropriate place).

Will do.

> > 
> > >   errno.d
> > >   regs.d
> > >   signal.d
> > > diff --git a/libdtrace/Build b/libdtrace/Build
> > > index 164023bbc..a3c3a2e1a 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
> > > diff --git a/libdtrace/dt_version.h b/libdtrace/dt_version.h
> > > index 8dd252b08..5c1528266 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).
> > > - *
> > 
> > The comment about "any suffixes (e.g. Beta)" disappears here.  More
> > significantly, the ability to have such suffixes seems to disappear.  Is
> > that a notable loss?  The loss of capability should at least be noted.

There is no loss of capability here.  While we can't use arbitrary version
strings anymore with the new setup, it is simply a string that is displayed and
being able to give it an arbitrary value is actually more likely to cause
confusion.

This ability has not been used in the entire time DTrace for Linux has
existed so I don't think it warrants pointing out that change explicitly.

> > > - * 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,9 @@ 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 const dt_version_t	_dtrace_vers_latest;
> > 
> > What is _dtrace_vers_latest for?

Oops, left over from a previous way of trying to do this.  Removed.

> > >   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..c45617773
> > > --- /dev/null
> > > +++ b/libdtrace/mkvers
> > > @@ -0,0 +1,68 @@
> > > +#!/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; }
> > > +
> > > +# 1.2.1	D API 1.2.1 Solaris Express 4/06
> > 
> > Solaris Express?  Is this a vestigial comment?

Ah, I had that in there for my own purposes when writing the script.  Removed.

> > > +{
> > > +	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 (release) {
> > > +		$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)



More information about the DTrace-devel mailing list