On Fri, Dec 10, 2021 at 8:23 PM Bruce Richardson <bruce.richard...@intel.com> wrote: > > Define a set of macros in the build configuration to allow C runtime > code to check the current OS environment. This saves the user having to > use ifdefs for e.g. disabling particular tests on Windows. See included > documentation changes for usage examples. > > Signed-off-by: Bruce Richardson <bruce.richard...@intel.com>
Acked-by: Jerin Jacob <jer...@marvell.com> > --- > doc/guides/contributing/coding_style.rst | 42 ++++++++++++++++++++++-- > lib/eal/meson.build | 7 ++++ > 2 files changed, 47 insertions(+), 2 deletions(-) > > diff --git a/doc/guides/contributing/coding_style.rst > b/doc/guides/contributing/coding_style.rst > index 0ec37c019b..e52ecb2b60 100644 > --- a/doc/guides/contributing/coding_style.rst > +++ b/doc/guides/contributing/coding_style.rst > @@ -136,6 +136,12 @@ For example: > Conditional Compilation > ~~~~~~~~~~~~~~~~~~~~~~~ > > +.. note:: > + > + Conditional compilation should be used only when absolutely necessary, as > it increases the number of target binaries that need to be built and tested. > + See below for details of some utility macros/defines available to allow > ifdefs/macros to be replaced by C conditional in some cases. > + > + > * When code is conditionally compiled using ``#ifdef`` or ``#if``, a comment > may be added following the matching > ``#endif`` or ``#else`` to permit the reader to easily discern where > conditionally compiled code regions end. > * This comment should be used only for (subjectively) long regions, regions > greater than 20 lines, or where a series of nested ``#ifdef``'s may be > confusing to the reader. > @@ -165,9 +171,41 @@ Conditional Compilation > /* Or here. */ > #endif /* !COMPAT_43 */ > > -.. note:: > +Defines to Avoid Conditional Compilation > +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > + > +In many cases in DPDK, one wants to optionally compile code based on the > target platform, > +or runtime environment. > +While this can be done using the conditional compilation directives, > +e.g. ``#ifdef RTE_EXEC_ENV_LINUX``, present in DPDK for many releases, > +this can also be done in many cases using regular ``if`` statements and the > following defines: > + > +* ``RTE_ENV_FREEBSD``, ``RTE_ENV_LINUX``, ``RTE_ENV_WINDOWS`` - these define > ids for each operating system environment. > +* ``RTE_EXEC_ENV`` - this defines the id of the current environment, i.e. > one of the items in list above. > +* ``RTE_EXEC_ENV_IS_FREEBSD``, ``RTE_EXEC_ENV_IS_LINUX``, > ``RTE_EXEC_ENV_IS_WINDOWS`` - 0/1 values indicating if the current > environment is that specified, > + shortcuts for checking e.g. ``RTE_EXEC_ENV == RTE_ENV_WINDOWS`` > + > +Examples of use: > + > +.. code-block:: c > + > + /* report a unit tests as unsupported on Windows */ > + if (RTE_EXEC_ENV_IS_WINDOWS) > + return TEST_SKIPPED; > + > + /* set different default values depending on OS Environment */ > + switch (RTE_EXEC_ENV) { > + case RTE_ENV_FREEBSD: > + default = x; > + break; > + case RTE_ENV_LINUX: > + default = y; > + break; > + case RTE_ENV_WINDOWS: > + default = z; > + break; > + } > > - Conditional compilation should be used only when absolutely necessary, as > it increases the number of target binaries that need to be built and tested. > > C Types > ------- > diff --git a/lib/eal/meson.build b/lib/eal/meson.build > index 1722924f67..056beb9461 100644 > --- a/lib/eal/meson.build > +++ b/lib/eal/meson.build > @@ -10,6 +10,13 @@ if not is_windows > subdir('unix') > endif > > +exec_envs = {'freebsd': 0, 'linux': 1, 'windows': 2} > +foreach env, id:exec_envs > + dpdk_conf.set('RTE_ENV_' + env.to_upper(), id) > + dpdk_conf.set10('RTE_EXEC_ENV_IS_' + env.to_upper(), (exec_env == env)) > +endforeach > +dpdk_conf.set('RTE_EXEC_ENV', exec_envs[exec_env]) > + > dpdk_conf.set('RTE_EXEC_ENV_' + exec_env.to_upper(), 1) > subdir(exec_env) > > -- > 2.32.0 >