1
2import os
3import sys
4
5from distutils.command.build_ext import build_ext
6
7
8cares_sources = [
9    'deps/c-ares/src/ares__close_sockets.c',
10    'deps/c-ares/src/ares__get_hostent.c',
11    'deps/c-ares/src/ares__read_line.c',
12    'deps/c-ares/src/ares__timeval.c',
13    'deps/c-ares/src/ares_android.c',
14    'deps/c-ares/src/ares_cancel.c',
15    'deps/c-ares/src/ares_create_query.c',
16    'deps/c-ares/src/ares_data.c',
17    'deps/c-ares/src/ares_destroy.c',
18    'deps/c-ares/src/ares_expand_name.c',
19    'deps/c-ares/src/ares_expand_string.c',
20    'deps/c-ares/src/ares_fds.c',
21    'deps/c-ares/src/ares_free_hostent.c',
22    'deps/c-ares/src/ares_free_string.c',
23    'deps/c-ares/src/ares_gethostbyaddr.c',
24    'deps/c-ares/src/ares_gethostbyname.c',
25    'deps/c-ares/src/ares_getnameinfo.c',
26    'deps/c-ares/src/ares_getopt.c',
27    'deps/c-ares/src/ares_getsock.c',
28    'deps/c-ares/src/ares_init.c',
29    'deps/c-ares/src/ares_library_init.c',
30    'deps/c-ares/src/ares_llist.c',
31    'deps/c-ares/src/ares_mkquery.c',
32    'deps/c-ares/src/ares_nowarn.c',
33    'deps/c-ares/src/ares_options.c',
34    'deps/c-ares/src/ares_parse_a_reply.c',
35    'deps/c-ares/src/ares_parse_aaaa_reply.c',
36    'deps/c-ares/src/ares_parse_mx_reply.c',
37    'deps/c-ares/src/ares_parse_naptr_reply.c',
38    'deps/c-ares/src/ares_parse_ns_reply.c',
39    'deps/c-ares/src/ares_parse_ptr_reply.c',
40    'deps/c-ares/src/ares_parse_soa_reply.c',
41    'deps/c-ares/src/ares_parse_srv_reply.c',
42    'deps/c-ares/src/ares_parse_txt_reply.c',
43    'deps/c-ares/src/ares_process.c',
44    'deps/c-ares/src/ares_query.c',
45    'deps/c-ares/src/ares_search.c',
46    'deps/c-ares/src/ares_send.c',
47    'deps/c-ares/src/ares_strcasecmp.c',
48    'deps/c-ares/src/ares_strdup.c',
49    'deps/c-ares/src/ares_strerror.c',
50    'deps/c-ares/src/ares_strsplit.c',
51    'deps/c-ares/src/ares_timeout.c',
52    'deps/c-ares/src/ares_version.c',
53    'deps/c-ares/src/ares_writev.c',
54    'deps/c-ares/src/bitncmp.c',
55    'deps/c-ares/src/inet_net_pton.c',
56    'deps/c-ares/src/inet_ntop.c',
57]
58
59if sys.platform == 'win32':
60    cares_sources += ['deps/c-ares/src/windows_port.c',
61                      'deps/c-ares/src/ares_platform.c']
62
63
64class cares_build_ext(build_ext):
65    cares_dir = os.path.join('deps', 'c-ares')
66
67    def build_extensions(self):
68        self.compiler.add_include_dir(os.path.join(self.cares_dir, 'src'))
69        if sys.platform != 'win32':
70            self.compiler.define_macro('HAVE_CONFIG_H', 1)
71            self.compiler.define_macro('_LARGEFILE_SOURCE', 1)
72            self.compiler.define_macro('_FILE_OFFSET_BITS', 64)
73        if sys.platform.startswith('linux'):
74            # Check if it's actually Android
75            if os.environ.get('ANDROID_ROOT') and os.environ.get('ANDROID_DATA'):
76                self.compiler.add_include_dir(os.path.join(self.cares_dir, 'src/config_android'))
77            else:
78                self.compiler.add_include_dir(os.path.join(self.cares_dir, 'src/config_linux'))
79            self.compiler.add_library('dl')
80            self.compiler.add_library('rt')
81        elif sys.platform == 'darwin':
82            self.compiler.add_include_dir(os.path.join(self.cares_dir, 'src/config_darwin'))
83            self.compiler.define_macro('_DARWIN_USE_64_BIT_INODE', 1)
84        elif sys.platform.startswith('freebsd'):
85            self.compiler.add_include_dir(os.path.join(self.cares_dir, 'src/config_freebsd'))
86            self.compiler.add_library('kvm')
87        elif sys.platform.startswith('dragonfly'):
88            self.compiler.add_include_dir(os.path.join(self.cares_dir, 'src/config_freebsd'))
89        elif sys.platform.startswith('netbsd'):
90            self.compiler.add_include_dir(os.path.join(self.cares_dir, 'src/config_netbsd'))
91        elif sys.platform.startswith('openbsd'):
92            self.compiler.add_include_dir(os.path.join(self.cares_dir, 'src/config_openbsd'))
93        elif sys.platform.startswith('sunos'):
94            self.compiler.add_include_dir(os.path.join(self.cares_dir, 'src/config_sunos'))
95            self.compiler.add_library('socket')
96            self.compiler.add_library('nsl')
97            self.compiler.add_library('kstat')
98        elif sys.platform == 'cygwin':
99            self.compiler.add_include_dir(os.path.join(self.cares_dir, 'src/config_cygwin'))
100        elif sys.platform == 'win32':
101            if 'mingw' not in self.compiler.compiler_type:
102                self.extensions[0].extra_link_args = ['/NODEFAULTLIB:libcmt']
103            self.compiler.add_library('advapi32')
104            self.compiler.add_library('iphlpapi')
105            self.compiler.add_library('psapi')
106            self.compiler.add_library('ws2_32')
107            self.compiler.define_macro('CARES_PULL_WS2TCPIP_H', 1)
108        self.extensions[0].sources += cares_sources
109        build_ext.build_extensions(self)
110