1 # UCW Library configuration system: parameters of the library
2 # (c) 2005--2012 Martin Mares <mj@ucw.cz>
3 # (c) 2006 Robert Spalek <robert@ucw.cz>
4 # (c) 2008 Michal Vaner <vorner@ucw.cz>
5 # (c) 2020 Pavel Charvat <pchar@ucw.cz>
7 package UCW::Configure::LibUCW;
13 # Turn on debugging support if CONFIG_DEBUG
14 if (Get("CONFIG_DEBUG")) {
15 Set("CONFIG_UCW_DEBUG");
19 Test("CPU_PAGE_SIZE", "Determining page size", sub {
21 if (IsSet("CONFIG_DARWIN")) {
22 $p = `sysctl -n hw.pagesize`;
23 defined $p or Fail "sysctl hw.pagesize failed";
24 } elsif (IsSet("CONFIG_LINUX")) {
25 $p = `getconf PAGE_SIZE`;
26 defined $p or Fail "getconf PAGE_SIZE failed";
32 # Decide how will ucw/partmap.c work
33 Set("CONFIG_UCW_PARTMAP_IS_MMAP") if IsSet("CPU_64BIT_POINTERS");
35 # Option for ucw/mempool.c
36 Set("CONFIG_UCW_POOL_IS_MMAP");
38 # Guess optimal bit width of the radix-sorter
39 Test("CONFIG_UCW_RADIX_SORTER_BITS", "Determining radix sorter bucket width", sub {
40 if (Get("CPU_AMD64")) {
41 # All amd64 CPUs have large enough L1 cache
44 # This should be safe everywhere
49 # Detect if thread-local storage is supported
50 if (Get("CONFIG_UCW_THREADS")) {
51 TestBool("CONFIG_UCW_TLS", "Checking if GCC supports thread-local storage", sub {
52 if (UCW::Configure::C::TestCompile("__thread", "__thread int i;\nint main(void) { return 0; }\n")) {
60 # Detect if we have the epoll() syscall
61 TestBool("CONFIG_UCW_EPOLL", "Checking for epoll", sub {
62 return UCW::Configure::C::TestCompile("epoll", <<'FINIS' ) ? 1 : 0;
63 #include <sys/epoll.h>
72 # Detect if we have the getrandom() syscall
73 TestBool("CONFIG_UCW_GETRANDOM", "Checking for getrandom", sub {
74 return UCW::Configure::C::TestCompile("getrandom", <<'FINIS' ) ? 1 : 0;
75 #include <sys/random.h>
85 # Check if we want to use monotonic clock
86 TestBool("CONFIG_UCW_MONOTONIC_CLOCK", "Checking for monotonic clock", sub {
87 return Get("CONFIG_LINUX");
90 if (IsSet("CONFIG_DARWIN")) {
91 # Darwin does not support BSD regexes, fix up
92 if (!IsSet("CONFIG_UCW_POSIX_REGEX") && !IsSet("CONFIG_UCW_PCRE")) {
93 Set("CONFIG_UCW_POSIX_REGEX" => 1);
94 Warn "BSD regex library on Darwin isn't compatible, using POSIX regex.\n";
97 # Fill in some constants not found in the system header files
98 Set("SOL_TCP" => 6); # missing in /usr/include/netinet/tcp.h
99 if (IsGiven("CONFIG_UCW_DIRECT_IO") && IsSet("CONFIG_UCW_DIRECT_IO")) {
100 Fail("Direct I/O is not available on darwin");
102 UnSet("CONFIG_UCW_DIRECT_IO");
108 UCW::Configure::C::ConfigHeader("ucw/autoconf.h", [
112 '^UCW_VERSION(_|$)' => 1,
114 } if Get("CONFIG_INSTALL_API");
117 if (!IsSet("CONFIG_UCW_THREADS") || !IsSet("CONFIG_UCW_DIRECT_IO")) {
118 if (IsGiven("CONFIG_UCW_FB_DIRECT") && IsSet("CONFIG_UCW_FB_DIRECT")) {
119 if (!IsSet("CONFIG_UCW_THREADS")) {
120 Fail("CONFIG_UCW_FB_DIRECT needs CONFIG_UCW_THREADS");
122 Fail("CONFIG_UCW_FB_DIRECT needs CONFIG_UCW_DIRECT_IO");
125 UnSet("CONFIG_UCW_FB_DIRECT");