> I suggest this change (I can send a patch fixing the issue in other .h files): > > +/* > + * RTE_TOOLCHAIN_GCC is true if the target is built with GCC, > + * while a host application (like pmdinfogen) may have another compiler. > + * RTE_CC_IS_GNU is true if the file is compiled with GCC, > + * no matter it is a target or host application. > + */ > +#if defined __GNUC__ && !defined __clang__ && !defined __INTEL_COMPILER > +#define RTE_CC_IS_GNU > +#endif > + > +#ifdef RTE_CC_IS_GNU > -/** Define GCC_VERSION **/ > -#ifdef RTE_TOOLCHAIN_GCC > #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + \ > __GNUC_PATCHLEVEL__) > #endif > @@ -96,7 +105,7 @@ typedef uint16_t unaligned_uint16_t; > * even if the underlying stdio implementation is ANSI-compliant, > * so this must be overridden. > */ > -#if defined(RTE_TOOLCHAIN_GCC) > +#ifdef RTE_CC_IS_GNU > #define __rte_format_printf(format_index, first_arg) \ > __attribute__((format(gnu_printf, format_index, first_arg))) > #else
The code you propose LGTM itself. If you think it's a better solution than the one proposed below, I see no problem going with it. What I wonder is whether pmdinfogen should include the problematic code in the first place. The errors come from declarations in rte_debug.h, but pmdinfogen really can't use them, because definitions are compiled for different machine. Pmdinfogen pulls rte_debug.h via rte_pci.h, which is only needed for struct rte_pci_id. Shouldn't we instead break this bogus dependency chain by moving struct rte_pci_id to a separate header? EAL defines are tied to the target toolchain and are consistent with each other, from this point of view RTE_CC_IS_GNU looks like a workaround. Another reason why pmdinfogen should not depend on EAL is that its code will differ considerably for POSIX and Windows (ELF vs COFF, mmap vs Win32 API). -- Dmitry Kozlyuk