1 # a waf tool to add autoconf-like macros to the configure section
4 import Build
, Options
, preproc
, Logs
5 from Configure
import conf
6 from TaskGen
import feature
7 from samba_utils
import TO_LIST
, GET_TARGET_TYPE
, SET_TARGET_TYPE
, unique_list
, mkdir_p
9 missing_headers
= set()
11 ####################################################
12 # some autoconf like helpers, to make the transition
13 # to waf a bit easier for those used to autoconf
17 def DEFINE(conf
, d
, v
, add_to_cflags
=False, quote
=False):
18 '''define a config option'''
19 conf
.define(d
, v
, quote
=quote
)
21 conf
.env
.append_value('CCDEFINES', d
+ '=' + str(v
))
23 def hlist_to_string(conf
, headers
=None):
24 '''convert a headers list to a set of #include lines'''
26 hlist
= conf
.env
.hlist
29 hlist
.extend(TO_LIST(headers
))
31 hdrs
+= '#include <%s>\n' % h
36 def COMPOUND_START(conf
, msg
):
37 '''start a compound test'''
38 def null_check_message_1(self
,*k
,**kw
):
40 def null_check_message_2(self
,*k
,**kw
):
43 v
= getattr(conf
.env
, 'in_compound', [])
44 if v
!= [] and v
!= 0:
45 conf
.env
.in_compound
= v
+ 1
47 conf
.check_message_1(msg
)
48 conf
.saved_check_message_1
= conf
.check_message_1
49 conf
.check_message_1
= null_check_message_1
50 conf
.saved_check_message_2
= conf
.check_message_2
51 conf
.check_message_2
= null_check_message_2
52 conf
.env
.in_compound
= 1
56 def COMPOUND_END(conf
, result
):
57 '''start a compound test'''
58 conf
.env
.in_compound
-= 1
59 if conf
.env
.in_compound
!= 0:
61 conf
.check_message_1
= conf
.saved_check_message_1
62 conf
.check_message_2
= conf
.saved_check_message_2
63 p
= conf
.check_message_2
67 p('not found', 'YELLOW')
74 '''using the nolink type in conf.check() allows us to avoid
75 the link stage of a test, thus speeding it up for tests
76 that where linking is not needed'''
80 def CHECK_HEADER(conf
, h
, add_headers
=False, lib
=None):
81 '''check for a header'''
82 if h
in missing_headers
and lib
is None:
84 d
= h
.upper().replace('/', '_')
85 d
= d
.replace('.', '_')
86 d
= d
.replace('-', '_')
88 if CONFIG_SET(conf
, d
):
90 if not h
in conf
.env
.hlist
:
91 conf
.env
.hlist
.append(h
)
94 (ccflags
, ldflags
, cpppath
) = library_flags(conf
, lib
)
96 hdrs
= hlist_to_string(conf
, headers
=h
)
99 ret
= conf
.check(fragment
='%s\nint main(void) { return 0; }' % hdrs
,
106 msg
="Checking for header %s" % h
)
108 missing_headers
.add(h
)
112 if add_headers
and not h
in conf
.env
.hlist
:
113 conf
.env
.hlist
.append(h
)
118 def CHECK_HEADERS(conf
, headers
, add_headers
=False, together
=False, lib
=None):
119 '''check for a list of headers
121 when together==True, then the headers accumulate within this test.
122 This is useful for interdependent headers
125 if not add_headers
and together
:
126 saved_hlist
= conf
.env
.hlist
[:]
127 set_add_headers
= True
129 set_add_headers
= add_headers
130 for hdr
in TO_LIST(headers
):
131 if not CHECK_HEADER(conf
, hdr
, set_add_headers
, lib
=lib
):
133 if not add_headers
and together
:
134 conf
.env
.hlist
= saved_hlist
138 def header_list(conf
, headers
=None, lib
=None):
139 '''form a list of headers which exist, as a string'''
141 if headers
is not None:
142 for h
in TO_LIST(headers
):
143 if CHECK_HEADER(conf
, h
, add_headers
=False, lib
=lib
):
145 return hlist_to_string(conf
, headers
=hlist
)
149 def CHECK_TYPE(conf
, t
, alternate
=None, headers
=None, define
=None, lib
=None, msg
=None):
150 '''check for a single type'''
152 define
= 'HAVE_' + t
.upper().replace(' ', '_')
154 msg
='Checking for %s' % t
155 ret
= CHECK_CODE(conf
, '%s _x' % t
,
163 if not ret
and alternate
:
164 conf
.DEFINE(t
, alternate
)
169 def CHECK_TYPES(conf
, list, headers
=None, define
=None, alternate
=None, lib
=None):
170 '''check for a list of types'''
172 for t
in TO_LIST(list):
173 if not CHECK_TYPE(conf
, t
, headers
=headers
,
174 define
=define
, alternate
=alternate
, lib
=lib
):
180 def CHECK_TYPE_IN(conf
, t
, headers
=None, alternate
=None, define
=None):
181 '''check for a single type with a header'''
182 return CHECK_TYPE(conf
, t
, headers
=headers
, alternate
=alternate
, define
=define
)
186 def CHECK_VARIABLE(conf
, v
, define
=None, always
=False,
187 headers
=None, msg
=None, lib
=None):
188 '''check for a variable declaration (or define)'''
190 define
= 'HAVE_%s' % v
.upper()
193 msg
="Checking for variable %s" % v
195 return CHECK_CODE(conf
,
196 # we need to make sure the compiler doesn't
200 void *_x; _x=(void *)&%s; return (int)_x;
215 def CHECK_DECLS(conf
, vars, reverse
=False, headers
=None, always
=False):
216 '''check a list of variable declarations, using the HAVE_DECL_xxx form
219 When reverse==True then use HAVE_xxx_DECL instead of HAVE_DECL_xxx
222 for v
in TO_LIST(vars):
224 define
='HAVE_DECL_%s' % v
.upper()
226 define
='HAVE_%s_DECL' % v
.upper()
227 if not CHECK_VARIABLE(conf
, v
,
230 msg
='Checking for declaration of %s' % v
,
232 if not CHECK_CODE(conf
,
238 msg
='Checking for declaration of %s (as enum)' % v
,
247 def CHECK_FUNC(conf
, f
, link
=True, lib
=None, headers
=None):
248 '''check for a function'''
249 define
='HAVE_%s' % f
.upper()
253 conf
.COMPOUND_START('Checking for %s' % f
)
255 if link
is None or link
:
256 ret
= CHECK_CODE(conf
,
257 # this is based on the autoconf strategy
259 #define %s __fake__%s
266 #if defined __stub_%s || defined __stub___%s
267 #error "bad glibc stub"
270 int main() { return %s(); }
271 ''' % (f
, f
, f
, f
, f
, f
, f
),
280 msg
='Checking for %s' % f
)
283 ret
= CHECK_CODE(conf
,
284 # it might be a macro
285 # we need to make sure the compiler doesn't
287 'void *__x = (void *)%s; return (int)__x' % f
,
296 msg
='Checking for macro %s' % f
)
298 if not ret
and (link
is None or not link
):
299 ret
= CHECK_VARIABLE(conf
, f
,
302 msg
='Checking for declaration of %s' % f
)
303 conf
.COMPOUND_END(ret
)
308 def CHECK_FUNCS(conf
, list, link
=True, lib
=None, headers
=None):
309 '''check for a list of functions'''
311 for f
in TO_LIST(list):
312 if not CHECK_FUNC(conf
, f
, link
=link
, lib
=lib
, headers
=headers
):
318 def CHECK_SIZEOF(conf
, vars, headers
=None, define
=None, critical
=True):
319 '''check the size of a type'''
320 for v
in TO_LIST(vars):
324 v_define
= 'SIZEOF_%s' % v
.upper().replace(' ', '_')
325 for size
in list((1, 2, 4, 8, 16, 32)):
327 'static int test_array[1 - 2 * !(((long int)(sizeof(%s))) <= %d)];' % (v
, size
),
332 msg
="Checking if size of %s == %d" % (v
, size
)):
333 conf
.DEFINE(v_define
, size
)
336 if not ret
and critical
:
337 Logs
.error("Couldn't determine size of '%s'" % v
)
342 def CHECK_VALUEOF(conf
, v
, headers
=None, define
=None):
343 '''check the value of a variable/define'''
347 v_define
= 'VALUEOF_%s' % v
.upper().replace(' ', '_')
349 'printf("%%u", (unsigned)(%s))' % v
,
356 msg
="Checking value of %s" % v
):
357 return int(conf
.env
[v_define
])
362 def CHECK_CODE(conf
, code
, define
,
363 always
=False, execute
=False, addmain
=True,
364 add_headers
=True, mandatory
=False,
365 headers
=None, msg
=None, cflags
='', includes
='# .',
366 local_include
=True, lib
=None, link
=True,
367 define_ret
=False, quote
=False,
369 '''check if some code compiles and/or runs'''
371 if CONFIG_SET(conf
, define
):
374 if headers
is not None:
375 CHECK_HEADERS(conf
, headers
=headers
, lib
=lib
)
378 hdrs
= header_list(conf
, headers
=headers
, lib
=lib
)
386 defs
= conf
.get_config_header()
389 fragment
='%s\n%s\n int main(void) { %s; return 0; }\n' % (defs
, hdrs
, code
)
391 fragment
='%s\n%s\n%s\n' % (defs
, hdrs
, code
)
394 msg
="Checking for %s" % define
396 cflags
= TO_LIST(cflags
)
399 cflags
.append('-I%s' % conf
.curdir
)
406 uselib
= TO_LIST(lib
)
408 (ccflags
, ldflags
, cpppath
) = library_flags(conf
, uselib
)
410 includes
= TO_LIST(includes
)
411 includes
.extend(cpppath
)
413 uselib
= [l
.upper() for l
in uselib
]
415 cflags
.extend(ccflags
)
418 exec_args
= conf
.SAMBA_CROSS_ARGS(msg
=msg
)
422 conf
.COMPOUND_START(msg
)
424 ret
= conf
.check(fragment
=fragment
,
426 define_name
= define
,
427 mandatory
= mandatory
,
436 define_ret
=define_ret
)
437 if not ret
and CONFIG_SET(conf
, define
):
438 # sometimes conf.check() returns false, but it
439 # sets the define. Maybe a waf bug?
443 conf
.DEFINE(define
, 1)
444 conf
.COMPOUND_END(True)
446 conf
.COMPOUND_END(conf
.env
[define
])
449 conf
.DEFINE(define
, 0)
450 conf
.COMPOUND_END(False)
456 def CHECK_STRUCTURE_MEMBER(conf
, structname
, member
,
457 always
=False, define
=None, headers
=None):
458 '''check for a structure member'''
460 define
= 'HAVE_%s' % member
.upper()
461 return CHECK_CODE(conf
,
462 '%s s; void *_x; _x=(void *)&s.%s' % (structname
, member
),
469 msg
="Checking for member %s in %s" % (member
, structname
))
473 def CHECK_CFLAGS(conf
, cflags
, fragment
='int main(void) { return 0; }\n'):
474 '''check if the given cflags are accepted by the compiler
476 return conf
.check(fragment
=fragment
,
480 msg
="Checking compiler accepts %s" % cflags
)
483 def CHECK_LDFLAGS(conf
, ldflags
):
484 '''check if the given ldflags are accepted by the linker
486 return conf
.check(fragment
='int main(void) { return 0; }\n',
490 msg
="Checking linker accepts %s" % ldflags
)
494 def CONFIG_GET(conf
, option
):
495 '''return True if a configuration option was found'''
496 if (option
in conf
.env
):
497 return conf
.env
[option
]
502 def CONFIG_SET(conf
, option
):
503 '''return True if a configuration option was found'''
504 if option
not in conf
.env
:
516 def CONFIG_RESET(conf
, option
):
517 if option
not in conf
.env
:
521 Build
.BuildContext
.CONFIG_RESET
= CONFIG_RESET
522 Build
.BuildContext
.CONFIG_SET
= CONFIG_SET
523 Build
.BuildContext
.CONFIG_GET
= CONFIG_GET
526 def library_flags(self
, libs
):
527 '''work out flags from pkg_config'''
531 for lib
in TO_LIST(libs
):
532 # note that we do not add the -I and -L in here, as that is added by the waf
533 # core. Adding it here would just change the order that it is put on the link line
534 # which can cause system paths to be added before internal libraries
535 extra_ccflags
= TO_LIST(getattr(self
.env
, 'CCFLAGS_%s' % lib
.upper(), []))
536 extra_ldflags
= TO_LIST(getattr(self
.env
, 'LDFLAGS_%s' % lib
.upper(), []))
537 extra_cpppath
= TO_LIST(getattr(self
.env
, 'CPPPATH_%s' % lib
.upper(), []))
538 ccflags
.extend(extra_ccflags
)
539 ldflags
.extend(extra_ldflags
)
540 cpppath
.extend(extra_cpppath
)
541 if 'EXTRA_LDFLAGS' in self
.env
:
542 ldflags
.extend(self
.env
['EXTRA_LDFLAGS'])
544 ccflags
= unique_list(ccflags
)
545 ldflags
= unique_list(ldflags
)
546 cpppath
= unique_list(cpppath
)
547 return (ccflags
, ldflags
, cpppath
)
551 def CHECK_LIB(conf
, libs
, mandatory
=False, empty_decl
=True, set_target
=True, shlib
=False):
552 '''check if a set of libraries exist as system libraries
554 returns the sublist of libs that do exist as a syslib or []
565 liblist
= TO_LIST(libs
)
566 for lib
in liblist
[:]:
567 if GET_TARGET_TYPE(conf
, lib
) == 'SYSLIB':
571 (ccflags
, ldflags
, cpppath
) = library_flags(conf
, lib
)
573 res
= conf
.check(features
='c cshlib', fragment
=fragment
, lib
=lib
, uselib_store
=lib
, ccflags
=ccflags
, ldflags
=ldflags
, uselib
=lib
.upper(), mandatory
=False)
575 res
= conf
.check(lib
=lib
, uselib_store
=lib
, ccflags
=ccflags
, ldflags
=ldflags
, uselib
=lib
.upper(), mandatory
=False)
579 Logs
.error("Mandatory library '%s' not found for functions '%s'" % (lib
, list))
582 # if it isn't a mandatory library, then remove it from dependency lists
584 SET_TARGET_TYPE(conf
, lib
, 'EMPTY')
586 conf
.define('HAVE_LIB%s' % lib
.upper().replace('-','_').replace('.','_'), 1)
587 conf
.env
['LIB_' + lib
.upper()] = lib
589 conf
.SET_TARGET_TYPE(lib
, 'SYSLIB')
597 def CHECK_FUNCS_IN(conf
, list, library
, mandatory
=False, checklibc
=False,
598 headers
=None, link
=True, empty_decl
=True, set_target
=True):
600 check that the functions in 'list' are available in 'library'
601 if they are, then make that library available as a dependency
603 if the library is not available and mandatory==True, then
606 If the library is not available and mandatory==False, then
607 add the library to the list of dependencies to remove from
610 optionally check for the functions first in libc
612 remaining
= TO_LIST(list)
613 liblist
= TO_LIST(library
)
615 # check if some already found
616 for f
in remaining
[:]:
617 if CONFIG_SET(conf
, 'HAVE_%s' % f
.upper()):
620 # see if the functions are in libc
622 for f
in remaining
[:]:
623 if CHECK_FUNC(conf
, f
, link
=True, headers
=headers
):
628 if GET_TARGET_TYPE(conf
, lib
) != 'SYSLIB' and empty_decl
:
629 SET_TARGET_TYPE(conf
, lib
, 'EMPTY')
632 checklist
= conf
.CHECK_LIB(liblist
, empty_decl
=empty_decl
, set_target
=set_target
)
633 for lib
in liblist
[:]:
634 if not lib
in checklist
and mandatory
:
635 Logs
.error("Mandatory library '%s' not found for functions '%s'" % (lib
, list))
640 if not CHECK_FUNC(conf
, f
, lib
=' '.join(checklist
), headers
=headers
, link
=link
):
647 def IN_LAUNCH_DIR(conf
):
648 '''return True if this rule is being run from the launch directory'''
649 return os
.path
.realpath(conf
.curdir
) == os
.path
.realpath(Options
.launch_dir
)
650 Options
.Handler
.IN_LAUNCH_DIR
= IN_LAUNCH_DIR
654 def SAMBA_CONFIG_H(conf
, path
=None):
655 '''write out config.h in the right directory'''
656 # we don't want to produce a config.h in places like lib/replace
657 # when we are building projects that depend on lib/replace
658 if not IN_LAUNCH_DIR(conf
):
661 # we need to build real code that can't be optimized away to test
662 if conf
.check(fragment
='''
668 while (fgets(t, sizeof(t), stdin));
673 ccflags
='-fstack-protector',
674 ldflags
='-fstack-protector',
676 msg
='Checking if toolchain accepts -fstack-protector'):
677 conf
.ADD_CFLAGS('-fstack-protector')
678 conf
.ADD_LDFLAGS('-fstack-protector')
680 if Options
.options
.debug
:
681 conf
.ADD_CFLAGS('-g', testflags
=True)
683 if Options
.options
.developer
:
684 conf
.env
.DEVELOPER_MODE
= True
686 conf
.ADD_CFLAGS('-g', testflags
=True)
687 conf
.ADD_CFLAGS('-Wall', testflags
=True)
688 conf
.ADD_CFLAGS('-Wshadow', testflags
=True)
689 conf
.ADD_CFLAGS('-Wmissing-prototypes', testflags
=True)
690 conf
.ADD_CFLAGS('-Wcast-align -Wcast-qual', testflags
=True)
691 conf
.ADD_CFLAGS('-fno-common', testflags
=True)
693 conf
.ADD_CFLAGS('-Werror=address', testflags
=True)
694 # we add these here to ensure that -Wstrict-prototypes is not set during configure
695 conf
.ADD_CFLAGS('-Werror=strict-prototypes -Wstrict-prototypes',
697 conf
.ADD_CFLAGS('-Werror=write-strings -Wwrite-strings',
699 conf
.ADD_CFLAGS('-Werror-implicit-function-declaration',
701 conf
.ADD_CFLAGS('-Werror=pointer-arith -Wpointer-arith',
703 conf
.ADD_CFLAGS('-Werror=declaration-after-statement -Wdeclaration-after-statement',
705 conf
.ADD_CFLAGS('-Werror=return-type -Wreturn-type',
707 conf
.ADD_CFLAGS('-Werror=uninitialized -Wuninitialized',
710 conf
.ADD_CFLAGS('-Wformat=2 -Wno-format-y2k', testflags
=True)
711 conf
.ADD_CFLAGS('-Werror=format-security -Wformat-security', testflags
=True)
712 # This check is because for ldb_search(), a NULL format string
713 # is not an error, but some compilers complain about that.
714 if CHECK_CFLAGS(conf
, ["-Werror=format", "-Wformat=2"], '''
715 int testformat(char *format, ...) __attribute__ ((format (__printf__, 1, 2)));
723 if not 'EXTRA_CFLAGS' in conf
.env
:
724 conf
.env
['EXTRA_CFLAGS'] = []
725 conf
.env
['EXTRA_CFLAGS'].extend(TO_LIST("-Werror=format"))
727 if Options
.options
.picky_developer
:
728 conf
.ADD_NAMED_CFLAGS('PICKY_CFLAGS', '-Werror -Wno-error=deprecated-declarations', testflags
=True)
729 conf
.ADD_NAMED_CFLAGS('PICKY_CFLAGS', '-Wno-error=tautological-compare', testflags
=True)
731 if Options
.options
.fatal_errors
:
732 conf
.ADD_CFLAGS('-Wfatal-errors', testflags
=True)
734 if Options
.options
.pedantic
:
735 conf
.ADD_CFLAGS('-W', testflags
=True)
737 if Options
.options
.address_sanitizer
:
738 conf
.ADD_CFLAGS('-fno-omit-frame-pointer -O1 -fsanitize=address', testflags
=True)
739 conf
.ADD_LDFLAGS('-fsanitize=address', testflags
=True)
740 conf
.env
['ADDRESS_SANITIZER'] = True
743 # Let people pass an additional ADDITIONAL_{CFLAGS,LDFLAGS}
744 # environment variables which are only used the for final build.
746 # The CFLAGS and LDFLAGS environment variables are also
747 # used for the configure checks which might impact their results.
748 conf
.add_os_flags('ADDITIONAL_CFLAGS')
749 if conf
.env
.ADDITIONAL_CFLAGS
and conf
.CHECK_CFLAGS(conf
.env
['ADDITIONAL_CFLAGS']):
750 conf
.env
['EXTRA_CFLAGS'].extend(conf
.env
['ADDITIONAL_CFLAGS'])
751 conf
.add_os_flags('ADDITIONAL_LDFLAGS')
752 if conf
.env
.ADDITIONAL_LDFLAGS
and conf
.CHECK_LDFLAGS(conf
.env
['ADDITIONAL_LDFLAGS']):
753 conf
.env
['EXTRA_LDFLAGS'].extend(conf
.env
['ADDITIONAL_LDFLAGS'])
756 conf
.write_config_header('config.h', top
=True)
758 conf
.write_config_header(path
)
759 conf
.SAMBA_CROSS_CHECK_COMPLETE()
763 def CONFIG_PATH(conf
, name
, default
):
764 '''setup a configurable path'''
765 if not name
in conf
.env
:
766 if default
[0] == '/':
767 conf
.env
[name
] = default
769 conf
.env
[name
] = conf
.env
['PREFIX'] + default
772 def ADD_NAMED_CFLAGS(conf
, name
, flags
, testflags
=False):
773 '''add some CFLAGS to the command line
774 optionally set testflags to ensure all the flags work
778 for f
in flags
.split():
779 if CHECK_CFLAGS(conf
, f
):
782 if not name
in conf
.env
:
784 conf
.env
[name
].extend(TO_LIST(flags
))
787 def ADD_CFLAGS(conf
, flags
, testflags
=False):
788 '''add some CFLAGS to the command line
789 optionally set testflags to ensure all the flags work
791 ADD_NAMED_CFLAGS(conf
, 'EXTRA_CFLAGS', flags
, testflags
=testflags
)
794 def ADD_LDFLAGS(conf
, flags
, testflags
=False):
795 '''add some LDFLAGS to the command line
796 optionally set testflags to ensure all the flags work
798 this will return the flags that are added, if any
802 for f
in flags
.split():
803 if CHECK_LDFLAGS(conf
, f
):
806 if not 'EXTRA_LDFLAGS' in conf
.env
:
807 conf
.env
['EXTRA_LDFLAGS'] = []
808 conf
.env
['EXTRA_LDFLAGS'].extend(TO_LIST(flags
))
813 def ADD_EXTRA_INCLUDES(conf
, includes
):
814 '''add some extra include directories to all builds'''
815 if not 'EXTRA_INCLUDES' in conf
.env
:
816 conf
.env
['EXTRA_INCLUDES'] = []
817 conf
.env
['EXTRA_INCLUDES'].extend(TO_LIST(includes
))
821 def CURRENT_CFLAGS(bld
, target
, cflags
, allow_warnings
=False, hide_symbols
=False):
822 '''work out the current flags. local flags are added first'''
823 ret
= TO_LIST(cflags
)
824 if not 'EXTRA_CFLAGS' in bld
.env
:
827 list = bld
.env
['EXTRA_CFLAGS'];
829 if not allow_warnings
and 'PICKY_CFLAGS' in bld
.env
:
830 list = bld
.env
['PICKY_CFLAGS'];
832 if hide_symbols
and bld
.env
.HAVE_VISIBILITY_ATTR
:
833 ret
.append(bld
.env
.VISIBILITY_CFLAGS
)
838 def CHECK_CC_ENV(conf
):
839 """trim whitespaces from 'CC'.
840 The build farm sometimes puts a space at the start"""
841 if os
.environ
.get('CC'):
842 conf
.env
.CC
= TO_LIST(os
.environ
.get('CC'))
843 if len(conf
.env
.CC
) == 1:
844 # make for nicer logs if just a single command
845 conf
.env
.CC
= conf
.env
.CC
[0]
849 def SETUP_CONFIGURE_CACHE(conf
, enable
):
850 '''enable/disable cache of configure results'''
852 # when -C is chosen, we will use a private cache and will
853 # not look into system includes. This roughtly matches what
854 # autoconf does with -C
855 cache_path
= os
.path
.join(conf
.blddir
, '.confcache')
857 Options
.cache_global
= os
.environ
['WAFCACHE'] = cache_path
859 # when -C is not chosen we will not cache configure checks
860 # We set the recursion limit low to prevent waf from spending
861 # a lot of time on the signatures of the files.
862 Options
.cache_global
= os
.environ
['WAFCACHE'] = ''
863 preproc
.recursion_limit
= 1
864 # in either case we don't need to scan system includes
865 preproc
.go_absolute
= False
869 def SAMBA_CHECK_UNDEFINED_SYMBOL_FLAGS(conf
):
870 # we don't want any libraries or modules to rely on runtime
871 # resolution of symbols
872 if not sys
.platform
.startswith("openbsd"):
873 conf
.env
.undefined_ldflags
= conf
.ADD_LDFLAGS('-Wl,-no-undefined', testflags
=True)
875 if not sys
.platform
.startswith("openbsd") and conf
.env
.undefined_ignore_ldflags
== []:
876 if conf
.CHECK_LDFLAGS(['-undefined', 'dynamic_lookup']):
877 conf
.env
.undefined_ignore_ldflags
= ['-undefined', 'dynamic_lookup']
880 def CHECK_CFG(self
, *k
, **kw
):
881 return self
.check_cfg(*k
, **kw
)