]> mj.ucw.cz Git - libucw.git/blob - ucw/perl/UCW/Configure/LibUCW.pm
Config: Moved CONFIG_LARGE_FILES to UCW namespace, removed CONFIG_LFS
[libucw.git] / ucw / perl / UCW / Configure / LibUCW.pm
1 # UCW Library configuration system: parameters of the library
2 # (c) 2005--2010 Martin Mares <mj@ucw.cz>
3 # (c) 2006 Robert Spalek <robert@ucw.cz>
4 # (c) 2008 Michal Vaner <vorner@ucw.cz>
5
6 package UCW::Configure::LibUCW;
7 use UCW::Configure;
8
9 use strict;
10 use warnings;
11
12 # Determine page size
13 Test("CPU_PAGE_SIZE", "Determining page size", sub {
14         my $p;
15         if (IsSet("CONFIG_DARWIN")) {
16                 $p = `sysctl -n hw.pagesize`;
17                 defined $p or Fail "sysctl hw.pagesize failed";
18         } elsif (IsSet("CONFIG_LINUX")) {
19                 $p = `getconf PAGE_SIZE`;
20                 defined $p or Fail "getconf PAGE_SIZE failed";
21         }
22         chomp $p;
23         return $p;
24 });
25
26 # Decide how will ucw/partmap.c work
27 Set("CONFIG_UCW_PARTMAP_IS_MMAP") if IsSet("CPU_64BIT_POINTERS");
28
29 # Option for ucw/mempool.c
30 Set("CONFIG_UCW_POOL_IS_MMAP");
31
32 # Guess optimal bit width of the radix-sorter
33 if (Get("CPU_ARCH") eq "default" || Get("CPU_ARCH") =~ /^i[345]86$/) {
34         # This should be safe everywhere
35         Set("CONFIG_UCW_RADIX_SORTER_BITS" => 10);
36 } else {
37         # Use this on modern CPU's
38         Set("CONFIG_UCW_RADIX_SORTER_BITS" => 12);
39 }
40
41 # Detect if thread-local storage is supported
42 if (Get("CONFIG_UCW_THREADS")) {
43         TestBool("CONFIG_UCW_TLS", "Checking if GCC supports thread-local storage", sub {
44                 if (UCW::Configure::C::TestCompile("__thread", "__thread int i;\nint main(void) { return 0; }\n")) {
45                         return 1;
46                 } else {
47                         return 0;
48                 }
49         });
50 }
51
52 # Detect if we have the epoll() syscall
53 TestBool("CONFIG_UCW_EPOLL", "Checking for epoll", sub {
54         return UCW::Configure::C::TestCompile("epoll", <<'FINIS' ) ? 1 : 0;
55 #include <sys/epoll.h>
56 int main(void)
57 {
58         epoll_create(256);
59         return 0;
60 }
61 FINIS
62 });
63
64 PostConfig {
65         AtWrite {
66                 UCW::Configure::C::ConfigHeader("ucw/autoconf.h", [
67                         # Excluded symbols (danger of collision)
68                         '^CONFIG_DEBUG$' => 0,
69
70                         # Included symbols
71                         '^CONFIG_' => 1,
72                         '^CPU_' => 1,
73                         '^(SHERLOCK|UCW)_VERSION(_|$)' => 1,
74                         '^MAX_WORD_(BYTES|CHARS)$' => 1,
75
76                 ]);
77         } if Get("CONFIG_INSTALL_API");
78
79         # Include direct FB?
80         if (!IsSet("CONFIG_UCW_THREADS") || !IsSet("CONFIG_UCW_DIRECT_IO")) {
81                 if (IsGiven("CONFIG_UCW_FB_DIRECT") && IsSet("CONFIG_UCW_FB_DIRECT")) {
82                         if (!IsSet("CONFIG_UCW_THREADS")) {
83                                 Fail("CONFIG_UCW_FB_DIRECT needs CONFIG_UCW_THREADS");
84                         } else {
85                                 Fail("CONFIG_UCW_FB_DIRECT needs CONFIG_UCW_DIRECT_IO");
86                         }
87                 }
88                 UnSet("CONFIG_UCW_FB_DIRECT");
89         }
90 };
91
92 # We succeeded
93 1;