Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Conditional compilation based on functionality in Linux kernel headers

Consider the case where I'm using some functionality from the Linux headers exported to user space, such as perf_event_open from <linux/perf_event.h>.

The functionality offered by this API has changed over time, as members have been added to the perf_event_attr, such as perf_event_attr.cap_user_time.

How can I write source that compiles and uses these new functionalities if they are available locally, but falls back gracefully if they aren't and doesn't use them?

In particular, how can I detect in the pre-processor whether this stuff is available?

I've used this perf_event_attr as an example, but my question is a general one because structure members, new structures, definitions and functions are added all the time.

Note that here I'm only considering the case where a process is compiled on the same system that it will run on: if you want to compile on one host and run on another you need a different set of tricks.

like image 927
BeeOnRope Avatar asked Sep 02 '25 11:09

BeeOnRope


1 Answers

Use the macros from /usr/include/linux/version.h:

#include <linux/version.h>

int main() {
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
                                      // ^^^^^^ change for the proper version when `perf_event_attr.cap_user_time` was introduced
   // use old interface
#else
   // use new interface
   // use  perf_event_attr.cap_user_time
#endif
}
like image 68
KamilCuk Avatar answered Sep 04 '25 01:09

KamilCuk