1 # a waf tool to add autoconf-like macros to the configure section
4 from waflib import Build, Options, Logs, Context
5 from waflib.Configure import conf
6 from waflib.TaskGen import feature
7 from waflib.Tools import c_preproc as preproc
8 from samba_utils import TO_LIST, GET_TARGET_TYPE, SET_TARGET_TYPE, unique_list, mkdir_p
10 missing_headers = set()
12 ####################################################
13 # some autoconf like helpers, to make the transition
14 # to waf a bit easier for those used to autoconf
18 def DEFINE(conf, d, v, add_to_cflags=False, quote=False):
19 '''define a config option'''
20 conf.define(d, v, quote=quote)
22 conf.env.append_value('CFLAGS', '-D%s=%s' % (d, str(v)))
24 def hlist_to_string(conf, headers=None):
25 '''convert a headers list to a set of #include lines'''
26 hlist = conf.env.hlist
29 hlist.extend(TO_LIST(headers))
30 hdrs = "\n".join('#include <%s>' % h for h in hlist)
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
48 conf.saved_check_message_1 = conf.start_msg
49 conf.start_msg = null_check_message_1
50 conf.saved_check_message_2 = conf.end_msg
51 conf.end_msg = 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.start_msg = conf.saved_check_message_1
62 conf.end_msg = conf.saved_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; }\n' % 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, lib=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,
231 msg='Checking for declaration of %s' % v,
233 if not CHECK_CODE(conf,
239 msg='Checking for declaration of %s (as enum)' % v,
249 def CHECK_FUNC(conf, f, link=True, lib=None, headers=None):
250 '''check for a function'''
251 define='HAVE_%s' % f.upper()
257 in_lib_str = " in %s" % lib
258 conf.COMPOUND_START('Checking for %s%s' % (f, in_lib_str))
260 if link is None or link:
261 ret = CHECK_CODE(conf,
262 # this is based on the autoconf strategy
264 #define %s __fake__%s
271 #if defined __stub_%s || defined __stub___%s
272 #error "bad glibc stub"
275 int main() { return %s(); }
276 ''' % (f, f, f, f, f, f, f),
285 msg='Checking for %s' % f)
288 ret = CHECK_CODE(conf,
289 # it might be a macro
290 # we need to make sure the compiler doesn't
292 'void *__x = (void *)%s; return (int)__x' % f,
301 msg='Checking for macro %s' % f)
303 if not ret and (link is None or not link):
304 ret = CHECK_VARIABLE(conf, f,
307 msg='Checking for declaration of %s' % f)
308 conf.COMPOUND_END(ret)
313 def CHECK_FUNCS(conf, list, link=True, lib=None, headers=None):
314 '''check for a list of functions'''
316 for f in TO_LIST(list):
317 if not CHECK_FUNC(conf, f, link=link, lib=lib, headers=headers):
323 def CHECK_SIZEOF(conf, vars, headers=None, define=None, critical=True):
324 '''check the size of a type'''
325 for v in TO_LIST(vars):
329 v_define = 'SIZEOF_%s' % v.upper().replace(' ', '_')
330 for size in list((1, 2, 4, 8, 16, 32, 64)):
332 'static int test_array[1 - 2 * !(((long int)(sizeof(%s))) <= %d)];' % (v, size),
337 msg="Checking if size of %s == %d" % (v, size)):
338 conf.DEFINE(v_define, size)
341 if not ret and critical:
342 Logs.error("Couldn't determine size of '%s'" % v)
347 def CHECK_VALUEOF(conf, v, headers=None, define=None):
348 '''check the value of a variable/define'''
352 v_define = 'VALUEOF_%s' % v.upper().replace(' ', '_')
354 'printf("%%u", (unsigned)(%s))' % v,
361 msg="Checking value of %s" % v):
362 return int(conf.env[v_define])
367 def CHECK_CODE(conf, code, define,
368 always=False, execute=False, addmain=True,
369 add_headers=True, mandatory=False,
370 headers=None, msg=None, cflags='', includes='# .',
371 local_include=True, lib=None, link=True,
372 define_ret=False, quote=False,
373 on_target=True, strict=False):
374 '''check if some code compiles and/or runs'''
376 if CONFIG_SET(conf, define):
379 if headers is not None:
380 CHECK_HEADERS(conf, headers=headers, lib=lib)
383 hdrs = header_list(conf, headers=headers, lib=lib)
392 fragment='%s\n int main(void) { %s; return 0; }\n' % (hdrs, code)
394 fragment='%s\n%s\n' % (hdrs, code)
397 msg="Checking for %s" % define
399 cflags = TO_LIST(cflags)
401 # Be strict when relying on a compiler check
402 # Some compilers (e.g. xlc) ignore non-supported features as warnings
404 if 'WERROR_CFLAGS' in conf.env:
405 cflags.extend(conf.env['WERROR_CFLAGS'])
408 cflags.append('-I%s' % conf.path.abspath())
415 uselib = TO_LIST(lib)
417 (ccflags, ldflags, cpppath) = library_flags(conf, uselib)
419 includes = TO_LIST(includes)
420 includes.extend(cpppath)
422 uselib = [l.upper() for l in uselib]
424 cflags.extend(ccflags)
427 test_args = conf.SAMBA_CROSS_ARGS(msg=msg)
431 conf.COMPOUND_START(msg)
434 ret = conf.check(fragment=fragment,
436 define_name = define,
445 define_ret=define_ret)
448 conf.DEFINE(define, 0)
450 conf.undefine(define)
451 conf.COMPOUND_END(False)
456 # Success is indicated by ret but we should unset
457 # defines set by WAF's c_config.check() because it
458 # defines it to int(ret) and we want to undefine it
460 conf.undefine(define)
461 conf.COMPOUND_END(False)
464 conf.DEFINE(define, 1)
465 conf.COMPOUND_END(True)
467 conf.DEFINE(define, ret, quote=quote)
468 conf.COMPOUND_END(ret)
473 def CHECK_STRUCTURE_MEMBER(conf, structname, member,
474 always=False, define=None, headers=None,
476 '''check for a structure member'''
478 define = 'HAVE_%s' % member.upper()
479 return CHECK_CODE(conf,
480 '%s s; void *_x; _x=(void *)&s.%s' % (structname, member),
488 msg="Checking for member %s in %s" % (member, structname))
492 def CHECK_CFLAGS(conf, cflags, fragment='int main(void) { return 0; }\n',
494 '''check if the given cflags are accepted by the compiler
496 check_cflags = TO_LIST(cflags)
497 if 'WERROR_CFLAGS' in conf.env:
498 check_cflags.extend(conf.env['WERROR_CFLAGS'])
499 return conf.check(fragment=fragment,
504 msg="Checking compiler accepts %s" % cflags)
507 def CHECK_LDFLAGS(conf, ldflags,
509 '''check if the given ldflags are accepted by the linker
511 return conf.check(fragment='int main(void) { return 0; }\n',
515 msg="Checking linker accepts %s" % ldflags)
519 def CONFIG_GET(conf, option):
520 '''return True if a configuration option was found'''
521 if (option in conf.env):
522 return conf.env[option]
527 def CONFIG_SET(conf, option):
528 '''return True if a configuration option was found'''
529 if option not in conf.env:
541 def CONFIG_RESET(conf, option):
542 if option not in conf.env:
546 Build.BuildContext.CONFIG_RESET = CONFIG_RESET
547 Build.BuildContext.CONFIG_SET = CONFIG_SET
548 Build.BuildContext.CONFIG_GET = CONFIG_GET
551 def library_flags(self, libs):
552 '''work out flags from pkg_config'''
556 for lib in TO_LIST(libs):
557 # note that we do not add the -I and -L in here, as that is added by the waf
558 # core. Adding it here would just change the order that it is put on the link line
559 # which can cause system paths to be added before internal libraries
560 extra_ccflags = TO_LIST(getattr(self.env, 'CFLAGS_%s' % lib.upper(), []))
561 extra_ldflags = TO_LIST(getattr(self.env, 'LDFLAGS_%s' % lib.upper(), []))
562 extra_cpppath = TO_LIST(getattr(self.env, 'CPPPATH_%s' % lib.upper(), []))
563 ccflags.extend(extra_ccflags)
564 ldflags.extend(extra_ldflags)
565 cpppath.extend(extra_cpppath)
567 extra_cpppath = TO_LIST(getattr(self.env, 'INCLUDES_%s' % lib.upper(), []))
568 cpppath.extend(extra_cpppath)
569 if 'EXTRA_LDFLAGS' in self.env:
570 ldflags.extend(self.env['EXTRA_LDFLAGS'])
572 ccflags = unique_list(ccflags)
573 ldflags = unique_list(ldflags)
574 cpppath = unique_list(cpppath)
575 return (ccflags, ldflags, cpppath)
579 def CHECK_LIB(conf, libs, mandatory=False, empty_decl=True, set_target=True, shlib=False):
580 '''check if a set of libraries exist as system libraries
582 returns the sublist of libs that do exist as a syslib or []
593 liblist = TO_LIST(libs)
594 for lib in liblist[:]:
595 if GET_TARGET_TYPE(conf, lib) == 'SYSLIB':
599 (ccflags, ldflags, cpppath) = library_flags(conf, lib)
601 res = conf.check(features='c cshlib', fragment=fragment, lib=lib, uselib_store=lib, cflags=ccflags, ldflags=ldflags, uselib=lib.upper(), mandatory=False)
603 res = conf.check(lib=lib, uselib_store=lib, cflags=ccflags, ldflags=ldflags, uselib=lib.upper(), mandatory=False)
607 Logs.error("Mandatory library '%s' not found for functions '%s'" % (lib, list))
610 # if it isn't a mandatory library, then remove it from dependency lists
612 SET_TARGET_TYPE(conf, lib, 'EMPTY')
614 conf.define('HAVE_LIB%s' % lib.upper().replace('-','_').replace('.','_'), 1)
615 conf.env['LIB_' + lib.upper()] = lib
617 conf.SET_TARGET_TYPE(lib, 'SYSLIB')
625 def CHECK_FUNCS_IN(conf, list, library, mandatory=False, checklibc=False,
626 headers=None, link=True, empty_decl=True, set_target=True):
628 check that the functions in 'list' are available in 'library'
629 if they are, then make that library available as a dependency
631 if the library is not available and mandatory==True, then
634 If the library is not available and mandatory==False, then
635 add the library to the list of dependencies to remove from
638 optionally check for the functions first in libc
640 remaining = TO_LIST(list)
641 liblist = TO_LIST(library)
643 # check if some already found
644 for f in remaining[:]:
645 if CONFIG_SET(conf, 'HAVE_%s' % f.upper()):
648 # see if the functions are in libc
650 for f in remaining[:]:
651 if CHECK_FUNC(conf, f, link=True, headers=headers):
656 if GET_TARGET_TYPE(conf, lib) != 'SYSLIB' and empty_decl:
657 SET_TARGET_TYPE(conf, lib, 'EMPTY')
660 checklist = conf.CHECK_LIB(liblist, empty_decl=empty_decl, set_target=set_target)
661 for lib in liblist[:]:
662 if not lib in checklist and mandatory:
663 Logs.error("Mandatory library '%s' not found for functions '%s'" % (lib, list))
668 if not CHECK_FUNC(conf, f, lib=' '.join(checklist), headers=headers, link=link):
675 def IN_LAUNCH_DIR(conf):
676 '''return True if this rule is being run from the launch directory'''
677 return os.path.realpath(conf.path.abspath()) == os.path.realpath(Context.launch_dir)
678 Options.OptionsContext.IN_LAUNCH_DIR = IN_LAUNCH_DIR
682 def SAMBA_CONFIG_H(conf, path=None):
683 '''write out config.h in the right directory'''
684 # we don't want to produce a config.h in places like lib/replace
685 # when we are building projects that depend on lib/replace
686 if not IN_LAUNCH_DIR(conf):
689 # we need to build real code that can't be optimized away to test
690 stack_protect_list = ['-fstack-protector-strong', '-fstack-protector']
691 for stack_protect_flag in stack_protect_list:
692 flag_supported = conf.check(fragment='''
698 while (fgets(t, sizeof(t), stdin));
703 cflags=[ '-Werror', '-Wp,-D_FORTIFY_SOURCE=2', stack_protect_flag],
705 msg='Checking if compiler accepts %s' % (stack_protect_flag))
707 conf.ADD_CFLAGS('%s' % (stack_protect_flag))
710 flag_supported = conf.check(fragment='''
716 while (fgets(t, sizeof(t), stdin));
721 cflags=[ '-Werror', '-fstack-clash-protection'],
723 msg='Checking if compiler accepts -fstack-clash-protection')
725 conf.ADD_CFLAGS('-fstack-clash-protection')
727 if Options.options.debug:
728 conf.ADD_CFLAGS('-g', testflags=True)
730 if Options.options.pidl_developer:
731 conf.env.PIDL_DEVELOPER_MODE = True
733 if Options.options.developer:
734 conf.env.DEVELOPER_MODE = True
736 conf.ADD_CFLAGS('-g', testflags=True)
737 conf.ADD_CFLAGS('-Wall', testflags=True)
738 conf.ADD_CFLAGS('-Wshadow', testflags=True)
739 conf.ADD_CFLAGS('-Wmissing-prototypes', testflags=True)
741 'struct a { int b; }; struct c { struct a d; } e = { };',
744 cflags='-Wmissing-field-initializers -Werror=missing-field-initializers',
745 msg="Checking C99 init of nested structs."):
746 conf.ADD_CFLAGS('-Wmissing-field-initializers', testflags=True)
747 conf.ADD_CFLAGS('-Wformat-overflow=2', testflags=True)
748 conf.ADD_CFLAGS('-Wformat-zero-length', testflags=True)
749 conf.ADD_CFLAGS('-Wcast-align -Wcast-qual', testflags=True)
750 conf.ADD_CFLAGS('-fno-common', testflags=True)
752 conf.ADD_CFLAGS('-Werror=address', testflags=True)
753 # we add these here to ensure that -Wstrict-prototypes is not set during configure
754 conf.ADD_CFLAGS('-Werror=strict-prototypes -Wstrict-prototypes',
756 conf.ADD_CFLAGS('-Werror=write-strings -Wwrite-strings',
758 conf.ADD_CFLAGS('-Werror-implicit-function-declaration',
760 conf.ADD_CFLAGS('-Werror=pointer-arith -Wpointer-arith',
762 conf.ADD_CFLAGS('-Werror=declaration-after-statement -Wdeclaration-after-statement',
764 conf.ADD_CFLAGS('-Werror=return-type -Wreturn-type',
766 conf.ADD_CFLAGS('-Werror=uninitialized -Wuninitialized',
768 conf.ADD_CFLAGS('-Wimplicit-fallthrough',
770 conf.ADD_CFLAGS('-Werror=strict-overflow -Wstrict-overflow=2',
773 conf.ADD_CFLAGS('-Wformat=2 -Wno-format-y2k', testflags=True)
774 conf.ADD_CFLAGS('-Wno-format-zero-length', testflags=True)
775 conf.ADD_CFLAGS('-Werror=format-security -Wformat-security',
776 testflags=True, prereq_flags='-Wformat')
777 # This check is because for ldb_search(), a NULL format string
778 # is not an error, but some compilers complain about that.
779 if CHECK_CFLAGS(conf, ["-Werror=format", "-Wformat=2"], '''
780 int testformat(char *format, ...) __attribute__ ((format (__printf__, 1, 2)));
788 if not 'EXTRA_CFLAGS' in conf.env:
789 conf.env['EXTRA_CFLAGS'] = []
790 conf.env['EXTRA_CFLAGS'].extend(TO_LIST("-Werror=format"))
792 if not Options.options.disable_warnings_as_errors:
793 conf.ADD_NAMED_CFLAGS('PICKY_CFLAGS', '-Werror -Wno-error=deprecated-declarations', testflags=True)
794 conf.ADD_NAMED_CFLAGS('PICKY_CFLAGS', '-Wno-error=tautological-compare', testflags=True)
795 conf.ADD_NAMED_CFLAGS('PICKY_CFLAGS', '-Wno-error=cast-align', testflags=True)
797 if Options.options.fatal_errors:
798 conf.ADD_CFLAGS('-Wfatal-errors', testflags=True)
800 if Options.options.pedantic:
801 conf.ADD_CFLAGS('-W', testflags=True)
803 if (Options.options.address_sanitizer or
804 Options.options.undefined_sanitizer):
805 conf.ADD_CFLAGS('-g -O1', testflags=True)
806 if Options.options.address_sanitizer:
807 conf.ADD_CFLAGS('-fno-omit-frame-pointer', testflags=True)
808 conf.ADD_CFLAGS('-fsanitize=address', testflags=True)
809 conf.ADD_LDFLAGS('-fsanitize=address', testflags=True)
810 conf.env['ADDRESS_SANITIZER'] = True
811 if Options.options.undefined_sanitizer:
812 conf.ADD_CFLAGS('-fsanitize=undefined', testflags=True)
813 conf.ADD_CFLAGS('-fsanitize=null', testflags=True)
814 conf.ADD_CFLAGS('-fsanitize=alignment', testflags=True)
815 conf.ADD_LDFLAGS('-fsanitize=undefined', testflags=True)
816 conf.env['UNDEFINED_SANITIZER'] = True
819 # Let people pass an additional ADDITIONAL_{CFLAGS,LDFLAGS}
820 # environment variables which are only used the for final build.
822 # The CFLAGS and LDFLAGS environment variables are also
823 # used for the configure checks which might impact their results.
825 # If these variables don't pass a smoke test, fail the configure
827 conf.add_os_flags('ADDITIONAL_CFLAGS')
828 if conf.env.ADDITIONAL_CFLAGS:
829 conf.CHECK_CFLAGS(conf.env['ADDITIONAL_CFLAGS'],
831 conf.env['EXTRA_CFLAGS'].extend(conf.env['ADDITIONAL_CFLAGS'])
833 conf.add_os_flags('ADDITIONAL_LDFLAGS')
834 if conf.env.ADDITIONAL_LDFLAGS:
835 conf.CHECK_LDFLAGS(conf.env['ADDITIONAL_LDFLAGS'],
837 conf.env['EXTRA_LDFLAGS'].extend(conf.env['ADDITIONAL_LDFLAGS'])
840 conf.write_config_header('default/config.h', top=True, remove=False)
842 conf.write_config_header(os.path.join(conf.variant, path), remove=False)
843 for key in conf.env.define_key:
844 conf.undefine(key, from_env=False)
845 conf.env.define_key = []
846 conf.SAMBA_CROSS_CHECK_COMPLETE()
850 def CONFIG_PATH(conf, name, default):
851 '''setup a configurable path'''
852 if not name in conf.env:
853 if default[0] == '/':
854 conf.env[name] = default
856 conf.env[name] = conf.env['PREFIX'] + default
859 def ADD_NAMED_CFLAGS(conf, name, flags, testflags=False, prereq_flags=[]):
860 '''add some CFLAGS to the command line
861 optionally set testflags to ensure all the flags work
863 prereq_flags = TO_LIST(prereq_flags)
866 for f in flags.split():
867 if CHECK_CFLAGS(conf, [f] + prereq_flags):
870 if not name in conf.env:
872 conf.env[name].extend(TO_LIST(flags))
875 def ADD_CFLAGS(conf, flags, testflags=False, prereq_flags=[]):
876 '''add some CFLAGS to the command line
877 optionally set testflags to ensure all the flags work
879 ADD_NAMED_CFLAGS(conf, 'EXTRA_CFLAGS', flags, testflags=testflags,
880 prereq_flags=prereq_flags)
883 def ADD_LDFLAGS(conf, flags, testflags=False):
884 '''add some LDFLAGS to the command line
885 optionally set testflags to ensure all the flags work
887 this will return the flags that are added, if any
891 for f in flags.split():
892 if CHECK_LDFLAGS(conf, f):
895 if not 'EXTRA_LDFLAGS' in conf.env:
896 conf.env['EXTRA_LDFLAGS'] = []
897 conf.env['EXTRA_LDFLAGS'].extend(TO_LIST(flags))
902 def ADD_EXTRA_INCLUDES(conf, includes):
903 '''add some extra include directories to all builds'''
904 if not 'EXTRA_INCLUDES' in conf.env:
905 conf.env['EXTRA_INCLUDES'] = []
906 conf.env['EXTRA_INCLUDES'].extend(TO_LIST(includes))
910 def CURRENT_CFLAGS(bld, target, cflags,
911 allow_warnings=False,
914 '''work out the current flags. local flags are added first'''
917 ret += ['-D_SAMBA_HOSTCC_']
918 ret += TO_LIST(cflags)
919 if not 'EXTRA_CFLAGS' in bld.env:
922 list = bld.env['EXTRA_CFLAGS'];
924 if not allow_warnings and 'PICKY_CFLAGS' in bld.env:
925 list = bld.env['PICKY_CFLAGS'];
927 if hide_symbols and bld.env.HAVE_VISIBILITY_ATTR:
928 ret.append(bld.env.VISIBILITY_CFLAGS)
933 def CHECK_CC_ENV(conf):
934 """trim whitespaces from 'CC'.
935 The build farm sometimes puts a space at the start"""
936 if os.environ.get('CC'):
937 conf.env.CC = TO_LIST(os.environ.get('CC'))
941 def SETUP_CONFIGURE_CACHE(conf, enable):
942 '''enable/disable cache of configure results'''
944 # when -C is chosen, we will use a private cache and will
945 # not look into system includes. This roughtly matches what
946 # autoconf does with -C
947 cache_path = os.path.join(conf.bldnode.abspath(), '.confcache')
949 Options.cache_global = os.environ['WAFCACHE'] = cache_path
951 # when -C is not chosen we will not cache configure checks
952 # We set the recursion limit low to prevent waf from spending
953 # a lot of time on the signatures of the files.
954 Options.cache_global = os.environ['WAFCACHE'] = ''
955 preproc.recursion_limit = 1
956 # in either case we don't need to scan system includes
957 preproc.go_absolute = False
961 def SAMBA_CHECK_UNDEFINED_SYMBOL_FLAGS(conf):
962 if Options.options.address_sanitizer or Options.options.enable_libfuzzer:
963 # Sanitizers can rely on symbols undefined at library link time and the
964 # symbols used for fuzzers are only defined by compiler wrappers.
967 if not sys.platform.startswith("openbsd"):
968 # we don't want any libraries or modules to rely on runtime
969 # resolution of symbols
970 conf.env.undefined_ldflags = conf.ADD_LDFLAGS('-Wl,-no-undefined', testflags=True)
972 if (conf.env.undefined_ignore_ldflags == [] and
973 conf.CHECK_LDFLAGS(['-undefined', 'dynamic_lookup'])):
974 conf.env.undefined_ignore_ldflags = ['-undefined', 'dynamic_lookup']