This document, “API Compatibility Macros in HDF5,” describes the approach taken by The HDF Group in HDF5 Release 1.10 to help existing users of HDF5 address compatibility issues in the HDF5 API. A companion document, New Features in HDF5 Release 1.10, discusses features introduced in HDF5 Release 1.10 and the HDF5 API calls associated with those features.
HDF5 Release 1.10 includes a number of new features that offer users of HDF5 substantial performance improvements and expanded capabilities. Some of these features can only be accessed via revised API calls. Given the scope of the changes, and recognizing the potentially time-consuming task of editing all the affected calls in user applications, The HDF Group has created a set of macros that can be used to flexibly and easily map existing API calls to either 1.6.x, 1.8.x, or 1.10.x functions. We refer to these as the API compatibility macros.
The HDF Group generally encourages users to update applications to work with the latest HDF5 Library release so that all new features and enhancements are available to them. At the same time, The HDF Group understands that, under some circumstances, updating applications may not be feasible or necessary. The API compatibility macros, described in this document, provide a bridge from old APIs to new and can be particularly helpful in situations such as these:
H5Fget_info
, the change is in the struct employed
by the function. In this case, the struct was versioned in exactly the
same manner as the function.
API compatibility macros, with the same names as the original
function and struct names, were then created.
Note that twenty-three versioned functions and corresponding macros were introduced in HDF5 Release 1.8.0. These functions and macros were created in exactly the same manner discussed in the preceding paragraph.
Concretely, consider the function H5Rdereference
in HDF5 releases prior to 1.10.0:
hid_t H5Rdereference(
hid_t obj_id
,
H5R_type_t ref_type
,
void *ref
)
hid_t H5Rdereference2(
hid_t obj_id
,
hid_t oapl_id
,
H5R_type_t ref_type
,
void *ref
)
hid_t H5Rdereference1(
hid_t obj_id
,
H5R_type_t ref_type
,
void *ref
)
H5Rdereference
H5Rdereference
, will be mapped to either
H5Rdereference1
or H5Rdereference2
.
The mapping is determined by a combination of the
configuration options use to build the HDF5 Library
and compile-time options used to build the application.
The calling parameters used with the H5Rdereference
compatibility macro should match the number and type of the
function the macros will be mapped to
(H5Rdereference1
or H5Rdereference2
).
The function names ending in ‘1’ or ‘2’ are referred to as versioned names, and the corresponding functions are referred to as versioned functions. For new code development, The HDF Group recommends use of the compatibility macro mapped to the latest version of the function. The original versions of these functions, with names ending in ‘1’, should be considered deprecated and, in general, should not be used when developing new code.
Compatibility Macro Mapping Options
To determine the mapping for a given API compatibility macro in a given application, a combination of user-controlled selections, collectively referred to as the compatibility macro mapping options, is considered in the following sequence:
|
|
The tables that follow summarize the macro mapping behaviors, and the
configuration and compile-time options that control the mappings.
The macro H5Rdereference
is used to demonstrate mapping behavior.
Regardless of the macro mapping options used,
the 1.10.x functions will always be available
by explicitly calling the versioned functions
by their versioned names.
For example, H5Rdereference2
.
Through the compatibility macro mapping options provided, it is possible to
disallow calls to the deprecated 1.8.x functions,
such as H5Rdereference1
.
This capability can be used to guarantee that only the
most recent versions of the functions are being called.
Library Mapping Options
When the HDF5 Library is built, configure
flags can be
used to control the API compatibility macro mapping behavior
exhibited by the library. This behavior can be overridden by application
and function mappings. One configure flag excludes deprecated functions
from the HDF5 Library, making them unavailable to applications linked with
the library.
configure flag
|
Macros map to release
(versioned function; H5Rdereference shown)
|
Deprecated functions available?
( H5Rdereference1 )
|
---|---|---|
--with-default-api-version=v110
Default behavior if no flag is specified. |
1.10.x
( H5Rdereference2 )
| yes |
--with-default-api-version=v18
|
1.8.x
( H5Rdereference1 )
| yes |
--with-default-api-version=v16
|
1.6.x
( H5Rdereference1 )
| yes |
--disable-deprecated-symbols
|
1.10.x
( H5Rdereference2 )
| no |
Refer to the file libhdf5.settings
in the directory where
the HDF5 Library is installed to determine the configure
flags used to build the library.
In particular, look for the two lines shown here:
Default Version of Public Symbols: v110
With Deprecated Public Symbols: Yes
Application Mapping Options
When an application using HDF5 APIs is built and linked with the HDF5 Library,
compile-time options to h5cc
can be
used to control the API compatibility macro mapping behavior
exhibited by the application.
The application mapping overrides the behavior specified by the library mapping,
and can be overridden on a function-by-function basis by the function mappings.
If the HDF5 Library was configured with the
--disable-deprecated-symbols
flag,
then the deprecated functions will not be available, regardless of the
application mapping options.
h5cc option
|
Macros map to release
(versioned function; H5Rdereference shown)
|
Deprecated functions available?
( H5Rdereference1 )
|
---|---|---|
Default behavior if no option specified. |
1.10.x
( H5Rdereference2 )
|
yes*
*if available in library |
-DH5_USE_18_API
|
1.8.x
( H5Rdereference1 )
|
yes*
*if available in library |
-DH5_USE_16_API
|
1.6.x
( H5Rdereference1 )
|
yes*
*if available in library |
-DH5_NO_DEPRECATED_SYMBOLS
|
1.10.x
( H5Rdereference2 )
| no |
Function Mapping Options
Function mappings are specified when the application is built. These mappings can be used to control the mapping of the API compatibility macros to underlying functions on a function-by-function basis. The function mappings override the library and application mappings discussed earlier.
If the HDF5 Library was configured with the
--disable-deprecated-symbols
flag,
or -DH5_NO_DEPRECATED_SYMBOLS
is used to compile the application,
then the deprecated functions will not be available, regardless of the
function mapping options.
For every function with multiple available versions, a compile-time
version flag can be defined to selectively map the function macro
to the desired versioned function.
For example, the H5Rdereference
macro
can be mapped to either H5Rdereference1
or
H5Rdereference2
.
When used, the value of the
H5Rdereference_vers
compile-time version flag determines
which function will be called:
H5Rdereference_vers
is set to 1
,
the macro H5Rdereference
will be mapped to
H5Rdereference1
.
h5cc ... -DH5Rdereference_vers=1 ...
H5Rdereference_vers
is set to 2
,
the macro H5Rdereference
will be mapped to
H5Rdereference2
.
h5cc ... -DH5Rdereference_vers=2 ...
H5Rdereference_vers
is not set,
the macro H5Rdereference
will be mapped to
either
H5Rdereference1
or
H5Rdereference2
,
based on the application mapping, if one was specified,
or on the library mapping.
h5cc ...
At release 1.10.0, The following table lists the new API compatibility macros, function and struct mapping compile-time version flags and values, and corresponding versioned functions and struct that were introduced at HDF5 Release 1.10.0. If the application being compiled to run with any 1.10.x release was written to use any 1.8.x release of HDF5, these are the only macros you need to worry about.
Macro |
h5cc version flag and value |
Mapped to function or struct |
---|---|---|
H5Acreate |
-DH5Rdereference_vers=1 |
H5Rdereference1 |
-DH5Rdereference_vers=2 |
H5Rdereference2 |
|
H5Fget_info |
-DH5Fget_info_vers=1 |
H5Fget_info1
with struct H5F_info1_t |
-DH5Fget_info_vers=2 |
H5Fget_info2
with struct H5F_info2_t |
At release 1.8.0, the API compatibility macros, function mapping compile-time version flags and values, and corresponding versioned functions listed in the following table were introduced. If the application being compiled to run with any 1.10.x release was written to use any 1.6.x release of HDF5, you must also consider these macros and mapping options.
Macro |
h5cc version flag and value
|
Mapped to function or struct |
---|---|---|
H5Acreate
| -DH5Acreate_vers=1
| H5Acreate1
|
-DH5Acreate_vers=2
| H5Acreate2
| |
H5Aiterate
| -DH5Aiterate_vers=1
| H5Aiterate1
with struct H5A_operator1_t |
-DH5Aiterate_vers=2
| H5Aiterate2
with struct H5A_operator2_t |
|
H5Dcreate
| -DH5Dcreate_vers=1
| H5Dcreate1
|
-DH5Dcreate_vers=2
| H5Dcreate2
| |
H5Dopen
| -DH5Dopen_vers=1
| H5Dopen1
|
-DH5Dopen_vers=2
| H5Dopen2
| |
H5Eclear
| -DH5Eclear_vers=1
| H5Eclear1
|
-DH5Eclear_vers=2
| H5Eclear2
| |
H5Eprint
| -DH5Eprint_vers=1
| H5Eprint1
|
-DH5Eprint_vers=2
| H5Eprint2
| |
H5Epush
| -DH5Epush_vers=1
| H5Epush1
|
-DH5Epush_vers=2
| H5Epush2
| |
H5Eset_auto
| -DH5Eset_auto_vers=1
| H5Eset_auto1
|
-DH5Eset_auto_vers=2
| H5Eset_auto2
| |
H5Eget_auto
| -DH5Eget_auto_vers=1
| H5Eget_auto1
|
-DH5Eget_auto_vers=2
| H5Eget_auto2
| |
H5E_auto_t
Struct for H5Eset_auto
and H5Eget_auto
| -DH5E_auto_t_vers=1
| H5E_auto1_t
|
-DH5E_auto_t_vers=2
| H5E_auto2_t
| |
H5Ewalk
| -DH5Ewalk_vers=1
| H5Ewalk1
with callback H5E_walk1_t
and struct H5E_error1_t |
-DH5Ewalk_vers=2
| H5Ewalk2
with callback H5E_walk2_t
and struct H5E_error2_t |
|
H5Gcreate
| -DH5Gcreate_vers=1
| H5Gcreate1
|
-DH5Gcreate_vers=2
| H5Gcreate2
| |
H5Gopen
| -DH5Gopen_vers=1
| H5Gopen1
|
-DH5Gopen_vers=2
| H5Gopen2
| |
H5Pget_filter
| -DH5Pget_filter_vers=1
| H5Pget_filter1
|
-DH5Pget_filter_vers=2
| H5Pget_filter2
| |
H5Pget_filter_by_id
| -DH5Pget_filter_by_id_vers=1
| H5Pget_filter_by_id1
|
-DH5Pget_filter_by_id_vers=2
| H5Pget_filter_by_id2
| |
H5Pinsert
| -DH5Pinsert_vers=1
| H5Pinsert1
|
-DH5Pinsert_vers=2
| H5Pinsert2
| |
H5Pregister
| -DH5Pregister_vers=1
| H5Pregister1
|
-DH5Pregister_vers=2
| H5Pregister2
| |
H5Rget_obj_type
| -DH5Rget_obj_typevers=1
| H5Rget_obj_type1
|
-DH5Rget_obj_type_vers=2
| H5Rget_obj_type2
| |
H5Tarray_create
| -DH5Tarray_create_vers=1
| H5Tarray_create1
|
-DH5Tarray_create_vers=2
| H5Tarray_create2
| |
H5Tcommit
| -DH5Tcommit_vers=1
| H5Tcommit1
|
-DH5Tcommit_vers=2
| H5Tcommit2
| |
H5Tget_array_dims
| -DH5Tget_array_dims_vers=1
| H5Tget_array_dims1
|
-DH5Tget_array_dims_vers=2
| H5Tget_array_dims2
| |
H5Topen
| -DH5Topen_vers=1
| H5Topen1
|
-DH5Topen_vers=2
| H5Topen2
| |
H5Z_class_t
Struct for H5Zregister
| -DH5Z_class_t_vers=1
| H5Z_class1_t
|
-DH5Z_class_t_vers=2
| H5Z_class2_t
|
See the HDF5 Reference Manual for complete descriptions of all API compatibility macros and versioned functions shown in Table 3 (and Table 4, if the application in question was written for a 1.6.x version of HDF5).
It is possible to specify multiple function mappings for a single application build:
h5cc ... -DH5Rdereference_vers=1 -DH5Fget_info_vers=2 ...
H5Rdereference
will be mapped to H5Rdereference1
and
all occurrences of the macro H5Fget_info
will be mapped to H5Fget_info2
for the application being built.
The function and struct mappings can be used to guarantee that a given API compatibility macro will be mapped to the desired underlying function or struct version regardless of the library or application mappings. In cases where an application may benefit greatly from features offered by some of the later APIs, or must continue to use some earlier API versions for compatibility reasons, this fine-grained control may be very important.
As noted earlier, the function mappings can only reference versioned
functions that are included in the HDF5 Library,
as determined by the configure flag used to build the library.
For example, if the HDF5 Library being linked with the application was built
with the --disable-deprecated-symbols
option, version 1 of the
underlying functions would not be available, and the example above
that defined H5Rdereference_ver=1
would not be supported.
The function mappings do not negate any available functions.
If H5Rdereference1
is available in the installed version of the
HDF5 Library,
and the application was not compiled with the
-DH5_NO_DEPRECATED_SYMBOLS
flag,
the function H5Rdereference1
will remain available to
the application through its versioned name.
Similarly, H5Rdereference2
will remain available to the
application as H5Rdereference2
.
The function mapping version flag H5Rdereference_vers
only controls the mapping of the API compatibility macro
H5Rdereference
to one of the two available functions.
This can be especially useful in any case where the programmer does not have direct control over global macro definitions, such as when writing code meant to be copied to multiple applications or when writing code in a header file.
These macros were strictly a forward-looking feature at that time;
they were not necessary for compatibility in 1.6.x.
These macros were created at that time to enable writing code
that could be used with any version of the library after 1.6.8
and any library compilation options except
H5_NO_DEPRECATED_SYMBOLS
, by always using the ‘1’
version of versioned functions and types.
For example, H5Dopen1
will always be interpreted
in exactly the same manner by any version of the library since 1.6.8.
configure
flag.
In this default mode, the 1.6.x, 1.8.x, and 1.10.x versions of the
underlying functions are available, and the API compatibility macros
will be mapped to the 1.10.x versioned functions. For example,
H5Rdereference
will be mapped to H5Rdereference2
and H5Gcreate
will be mapped to H5Gcreate2
.
-DH5_USE_18_API
application
mapping option if it was written for use with an HDF5 Release 1.8.x library
(or with -DH5_USE_16_API
if it was written for use with 1.6.x)
and link with the HDF5 Library built in step 1.
No changes should be required to build the application.
The API compatibility macros, for example H5Rdereference
,
replace the actual function names that were used in versions of the library
prior to 1.10.0.
Because the application mapping overrides the library mapping, the macros
will all be mapped to the 1.8.x (or 1.6.x) versions of the functions.
-DH5Rdereference_vers=2
version flag setting to remap the H5Rdereference
macro to
H5Rdereference2
, the 1.10.x version.
During this step, the application code will need to be modified to change
the calling parameters used with the API compatibility macros
to match the number and type of the 1.10.x versioned functions.
The macro name, for example H5Rdereference
, should continue
to be used in the code, to allow for possible re-mappings
to later versioned functions in a future release.
-DH5_NO_DEPRECATED_SYMBOLS
,
and address any failures to complete the application migration process.
The HDF Group Help Desk:
Describes HDF5 Release 1.10. | Copyright by The HDF Group |