1 # a waf tool to add autoconf-like macros to the configure section
3 import Build
, os
, sys
, Options
, preproc
, Logs
5 from Configure
import conf
6 from samba_utils
import *
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
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('CCDEFINES', d
+ '=' + str(v
))
24 def hlist_to_string(conf
, headers
=None):
25 '''convert a headers list to a set of #include lines'''
27 hlist
= conf
.env
.hlist
30 hlist
.extend(TO_LIST(headers
))
32 hdrs
+= '#include <%s>\n' % h
37 def COMPOUND_START(conf
, msg
):
38 '''start a compound test'''
39 def null_check_message_1(self
,*k
,**kw
):
41 def null_check_message_2(self
,*k
,**kw
):
44 v
= getattr(conf
.env
, 'in_compound', [])
45 if v
!= [] and v
!= 0:
46 conf
.env
.in_compound
= v
+ 1
48 conf
.check_message_1(msg
)
49 conf
.saved_check_message_1
= conf
.check_message_1
50 conf
.check_message_1
= null_check_message_1
51 conf
.saved_check_message_2
= conf
.check_message_2
52 conf
.check_message_2
= null_check_message_2
53 conf
.env
.in_compound
= 1
57 def COMPOUND_END(conf
, result
):
58 '''start a compound test'''
59 conf
.env
.in_compound
-= 1
60 if conf
.env
.in_compound
!= 0:
62 conf
.check_message_1
= conf
.saved_check_message_1
63 conf
.check_message_2
= conf
.saved_check_message_2
64 p
= conf
.check_message_2
68 p('not found', 'YELLOW')
75 '''using the nolink type in conf.check() allows us to avoid
76 the link stage of a test, thus speeding it up for tests
77 that where linking is not needed'''
81 def CHECK_HEADER(conf
, h
, add_headers
=False, lib
=None):
82 '''check for a header'''
83 if h
in missing_headers
and lib
is None:
85 d
= h
.upper().replace('/', '_')
86 d
= d
.replace('.', '_')
87 d
= d
.replace('-', '_')
89 if CONFIG_SET(conf
, d
):
91 if not h
in conf
.env
.hlist
:
92 conf
.env
.hlist
.append(h
)
95 (ccflags
, ldflags
, cpppath
) = library_flags(conf
, lib
)
97 hdrs
= hlist_to_string(conf
, headers
=h
)
100 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
,
236 def CHECK_FUNC(conf
, f
, link
=True, lib
=None, headers
=None):
237 '''check for a function'''
238 define
='HAVE_%s' % f
.upper()
242 conf
.COMPOUND_START('Checking for %s' % f
)
244 if link
is None or link
:
245 ret
= CHECK_CODE(conf
,
246 # this is based on the autoconf strategy
248 #define %s __fake__%s
255 #if defined __stub_%s || defined __stub___%s
256 #error "bad glibc stub"
259 int main() { return %s(); }
260 ''' % (f
, f
, f
, f
, f
, f
, f
),
269 msg
='Checking for %s' % f
)
272 ret
= CHECK_CODE(conf
,
273 # it might be a macro
274 # we need to make sure the compiler doesn't
276 'void *__x = (void *)%s; return (int)__x' % f
,
285 msg
='Checking for macro %s' % f
)
287 if not ret
and (link
is None or not link
):
288 ret
= CHECK_VARIABLE(conf
, f
,
291 msg
='Checking for declaration of %s' % f
)
292 conf
.COMPOUND_END(ret
)
297 def CHECK_FUNCS(conf
, list, link
=True, lib
=None, headers
=None):
298 '''check for a list of functions'''
300 for f
in TO_LIST(list):
301 if not CHECK_FUNC(conf
, f
, link
=link
, lib
=lib
, headers
=headers
):
307 def CHECK_SIZEOF(conf
, vars, headers
=None, define
=None):
308 '''check the size of a type'''
310 for v
in TO_LIST(vars):
313 v_define
= 'SIZEOF_%s' % v
.upper().replace(' ', '_')
314 if not CHECK_CODE(conf
,
315 'printf("%%u", (unsigned)sizeof(%s))' % v
,
322 msg
="Checking size of %s" % v
):
329 def CHECK_CODE(conf
, code
, define
,
330 always
=False, execute
=False, addmain
=True,
331 add_headers
=True, mandatory
=False,
332 headers
=None, msg
=None, cflags
='', includes
='# .',
333 local_include
=True, lib
=None, link
=True,
334 define_ret
=False, quote
=False,
336 '''check if some code compiles and/or runs'''
338 if CONFIG_SET(conf
, define
):
341 if headers
is not None:
342 CHECK_HEADERS(conf
, headers
=headers
, lib
=lib
)
345 hdrs
= header_list(conf
, headers
=headers
, lib
=lib
)
353 defs
= conf
.get_config_header()
356 fragment
='%s\n%s\n int main(void) { %s; return 0; }\n' % (defs
, hdrs
, code
)
358 fragment
='%s\n%s\n%s\n' % (defs
, hdrs
, code
)
361 msg
="Checking for %s" % define
363 cflags
= TO_LIST(cflags
)
366 cflags
.append('-I%s' % conf
.curdir
)
373 uselib
= TO_LIST(lib
)
375 (ccflags
, ldflags
, cpppath
) = library_flags(conf
, uselib
)
377 includes
= TO_LIST(includes
)
378 includes
.extend(cpppath
)
380 uselib
= [l
.upper() for l
in uselib
]
382 cflags
.extend(ccflags
)
385 exec_args
= conf
.SAMBA_CROSS_ARGS(msg
=msg
)
389 conf
.COMPOUND_START(msg
)
391 ret
= conf
.check(fragment
=fragment
,
393 define_name
= define
,
394 mandatory
= mandatory
,
403 define_ret
=define_ret
)
404 if not ret
and CONFIG_SET(conf
, define
):
405 # sometimes conf.check() returns false, but it
406 # sets the define. Maybe a waf bug?
410 conf
.DEFINE(define
, 1)
411 conf
.COMPOUND_END(True)
413 conf
.COMPOUND_END(conf
.env
[define
])
416 conf
.DEFINE(define
, 0)
417 conf
.COMPOUND_END(False)
423 def CHECK_STRUCTURE_MEMBER(conf
, structname
, member
,
424 always
=False, define
=None, headers
=None):
425 '''check for a structure member'''
427 define
= 'HAVE_%s' % member
.upper()
428 return CHECK_CODE(conf
,
429 '%s s; void *_x; _x=(void *)&s.%s' % (structname
, member
),
436 msg
="Checking for member %s in %s" % (member
, structname
))
440 def CHECK_CFLAGS(conf
, cflags
, fragment
='int main(void) { return 0; }\n'):
441 '''check if the given cflags are accepted by the compiler
443 return conf
.check(fragment
=fragment
,
447 msg
="Checking compiler accepts %s" % cflags
)
450 def CHECK_LDFLAGS(conf
, ldflags
):
451 '''check if the given ldflags are accepted by the linker
453 return conf
.check(fragment
='int main(void) { return 0; }\n',
456 msg
="Checking linker accepts %s" % ldflags
)
460 def CONFIG_GET(conf
, option
):
461 '''return True if a configuration option was found'''
462 if (option
in conf
.env
):
463 return conf
.env
[option
]
468 def CONFIG_SET(conf
, option
):
469 '''return True if a configuration option was found'''
470 if option
not in conf
.env
:
480 Build
.BuildContext
.CONFIG_SET
= CONFIG_SET
481 Build
.BuildContext
.CONFIG_GET
= CONFIG_GET
484 def library_flags(self
, libs
):
485 '''work out flags from pkg_config'''
489 for lib
in TO_LIST(libs
):
490 # note that we do not add the -I and -L in here, as that is added by the waf
491 # core. Adding it here would just change the order that it is put on the link line
492 # which can cause system paths to be added before internal libraries
493 extra_ccflags
= TO_LIST(getattr(self
.env
, 'CCFLAGS_%s' % lib
.upper(), []))
494 extra_ldflags
= TO_LIST(getattr(self
.env
, 'LDFLAGS_%s' % lib
.upper(), []))
495 extra_cpppath
= TO_LIST(getattr(self
.env
, 'CPPPATH_%s' % lib
.upper(), []))
496 ccflags
.extend(extra_ccflags
)
497 ldflags
.extend(extra_ldflags
)
498 cpppath
.extend(extra_cpppath
)
499 if 'EXTRA_LDFLAGS' in self
.env
:
500 ldflags
.extend(self
.env
['EXTRA_LDFLAGS'])
502 ccflags
= unique_list(ccflags
)
503 ldflags
= unique_list(ldflags
)
504 cpppath
= unique_list(cpppath
)
505 return (ccflags
, ldflags
, cpppath
)
509 def CHECK_LIB(conf
, libs
, mandatory
=False, empty_decl
=True, set_target
=True, shlib
=False):
510 '''check if a set of libraries exist as system libraries
512 returns the sublist of libs that do exist as a syslib or []
523 liblist
= TO_LIST(libs
)
524 for lib
in liblist
[:]:
525 if GET_TARGET_TYPE(conf
, lib
) == 'SYSLIB':
529 (ccflags
, ldflags
, cpppath
) = library_flags(conf
, lib
)
531 res
= conf
.check(features
='cc cshlib', fragment
=fragment
, lib
=lib
, uselib_store
=lib
, ccflags
=ccflags
, ldflags
=ldflags
, uselib
=lib
.upper())
533 res
= conf
.check(lib
=lib
, uselib_store
=lib
, ccflags
=ccflags
, ldflags
=ldflags
, uselib
=lib
.upper())
537 Logs
.error("Mandatory library '%s' not found for functions '%s'" % (lib
, list))
540 # if it isn't a mandatory library, then remove it from dependency lists
542 SET_TARGET_TYPE(conf
, lib
, 'EMPTY')
544 conf
.define('HAVE_LIB%s' % lib
.upper().replace('-','_'), 1)
545 conf
.env
['LIB_' + lib
.upper()] = lib
547 conf
.SET_TARGET_TYPE(lib
, 'SYSLIB')
555 def CHECK_FUNCS_IN(conf
, list, library
, mandatory
=False, checklibc
=False,
556 headers
=None, link
=True, empty_decl
=True, set_target
=True):
558 check that the functions in 'list' are available in 'library'
559 if they are, then make that library available as a dependency
561 if the library is not available and mandatory==True, then
564 If the library is not available and mandatory==False, then
565 add the library to the list of dependencies to remove from
568 optionally check for the functions first in libc
570 remaining
= TO_LIST(list)
571 liblist
= TO_LIST(library
)
573 # check if some already found
574 for f
in remaining
[:]:
575 if CONFIG_SET(conf
, 'HAVE_%s' % f
.upper()):
578 # see if the functions are in libc
580 for f
in remaining
[:]:
581 if CHECK_FUNC(conf
, f
, link
=True, headers
=headers
):
586 if GET_TARGET_TYPE(conf
, lib
) != 'SYSLIB' and empty_decl
:
587 SET_TARGET_TYPE(conf
, lib
, 'EMPTY')
590 checklist
= conf
.CHECK_LIB(liblist
, empty_decl
=empty_decl
, set_target
=set_target
)
591 for lib
in liblist
[:]:
592 if not lib
in checklist
and mandatory
:
593 Logs
.error("Mandatory library '%s' not found for functions '%s'" % (lib
, list))
598 if not CHECK_FUNC(conf
, f
, lib
=' '.join(checklist
), headers
=headers
, link
=link
):
605 def IN_LAUNCH_DIR(conf
):
606 '''return True if this rule is being run from the launch directory'''
607 return os
.path
.realpath(conf
.curdir
) == os
.path
.realpath(Options
.launch_dir
)
608 Options
.Handler
.IN_LAUNCH_DIR
= IN_LAUNCH_DIR
612 def SAMBA_CONFIG_H(conf
, path
=None):
613 '''write out config.h in the right directory'''
614 # we don't want to produce a config.h in places like lib/replace
615 # when we are building projects that depend on lib/replace
616 if not IN_LAUNCH_DIR(conf
):
619 if Options
.options
.debug
:
620 conf
.ADD_CFLAGS('-g',
623 if Options
.options
.developer
:
624 # we add these here to ensure that -Wstrict-prototypes is not set during configure
625 conf
.ADD_CFLAGS('-Wall -g -Wshadow -Werror=strict-prototypes -Wstrict-prototypes -Werror=pointer-arith -Wpointer-arith -Wcast-align -Werror=write-strings -Wwrite-strings -Werror-implicit-function-declaration -Wformat=2 -Wno-format-y2k -Wmissing-prototypes -fno-common -Werror=address',
627 conf
.ADD_CFLAGS('-Wcast-qual', testflags
=True)
628 conf
.env
.DEVELOPER_MODE
= True
630 # This check is because for ldb_search(), a NULL format string
631 # is not an error, but some compilers complain about that.
632 if CHECK_CFLAGS(conf
, ["-Werror=format", "-Wformat=2"], '''
633 int testformat(char *format, ...) __attribute__ ((format (__printf__, 1, 2)));
641 if not 'EXTRA_CFLAGS' in conf
.env
:
642 conf
.env
['EXTRA_CFLAGS'] = []
643 conf
.env
['EXTRA_CFLAGS'].extend(TO_LIST("-Werror=format"))
645 if Options
.options
.picky_developer
:
646 conf
.ADD_CFLAGS('-Werror', testflags
=True)
648 if Options
.options
.fatal_errors
:
649 conf
.ADD_CFLAGS('-Wfatal-errors', testflags
=True)
651 if Options
.options
.pedantic
:
652 conf
.ADD_CFLAGS('-W', testflags
=True)
655 conf
.write_config_header('config.h', top
=True)
657 conf
.write_config_header(path
)
658 conf
.SAMBA_CROSS_CHECK_COMPLETE()
662 def CONFIG_PATH(conf
, name
, default
):
663 '''setup a configurable path'''
664 if not name
in conf
.env
:
665 if default
[0] == '/':
666 conf
.env
[name
] = default
668 conf
.env
[name
] = conf
.env
['PREFIX'] + default
671 def ADD_CFLAGS(conf
, flags
, testflags
=False):
672 '''add some CFLAGS to the command line
673 optionally set testflags to ensure all the flags work
677 for f
in flags
.split():
678 if CHECK_CFLAGS(conf
, f
):
681 if not 'EXTRA_CFLAGS' in conf
.env
:
682 conf
.env
['EXTRA_CFLAGS'] = []
683 conf
.env
['EXTRA_CFLAGS'].extend(TO_LIST(flags
))
686 def ADD_LDFLAGS(conf
, flags
, testflags
=False):
687 '''add some LDFLAGS to the command line
688 optionally set testflags to ensure all the flags work
690 this will return the flags that are added, if any
694 for f
in flags
.split():
695 if CHECK_LDFLAGS(conf
, f
):
698 if not 'EXTRA_LDFLAGS' in conf
.env
:
699 conf
.env
['EXTRA_LDFLAGS'] = []
700 conf
.env
['EXTRA_LDFLAGS'].extend(TO_LIST(flags
))
705 def ADD_EXTRA_INCLUDES(conf
, includes
):
706 '''add some extra include directories to all builds'''
707 if not 'EXTRA_INCLUDES' in conf
.env
:
708 conf
.env
['EXTRA_INCLUDES'] = []
709 conf
.env
['EXTRA_INCLUDES'].extend(TO_LIST(includes
))
713 def CURRENT_CFLAGS(bld
, target
, cflags
, hide_symbols
=False):
714 '''work out the current flags. local flags are added first'''
715 if not 'EXTRA_CFLAGS' in bld
.env
:
718 list = bld
.env
['EXTRA_CFLAGS'];
719 ret
= TO_LIST(cflags
)
721 if hide_symbols
and bld
.env
.HAVE_VISIBILITY_ATTR
:
722 ret
.append('-fvisibility=hidden')
727 def CHECK_CC_ENV(conf
):
728 """trim whitespaces from 'CC'.
729 The build farm sometimes puts a space at the start"""
730 if os
.environ
.get('CC'):
731 conf
.env
.CC
= TO_LIST(os
.environ
.get('CC'))
732 if len(conf
.env
.CC
) == 1:
733 # make for nicer logs if just a single command
734 conf
.env
.CC
= conf
.env
.CC
[0]
738 def SETUP_CONFIGURE_CACHE(conf
, enable
):
739 '''enable/disable cache of configure results'''
741 # when -C is chosen, we will use a private cache and will
742 # not look into system includes. This roughtly matches what
743 # autoconf does with -C
744 cache_path
= os
.path
.join(conf
.blddir
, '.confcache')
746 Options
.cache_global
= os
.environ
['WAFCACHE'] = cache_path
748 # when -C is not chosen we will not cache configure checks
749 # We set the recursion limit low to prevent waf from spending
750 # a lot of time on the signatures of the files.
751 Options
.cache_global
= os
.environ
['WAFCACHE'] = ''
752 preproc
.recursion_limit
= 1
753 # in either case we don't need to scan system includes
754 preproc
.go_absolute
= False
758 def SAMBA_CHECK_UNDEFINED_SYMBOL_FLAGS(conf
):
759 # we don't want any libraries or modules to rely on runtime
760 # resolution of symbols
761 if sys
.platform
!= "openbsd4" and sys
.platform
!= "openbsd5":
762 conf
.env
.undefined_ldflags
= conf
.ADD_LDFLAGS('-Wl,-no-undefined', testflags
=True)
764 if sys
.platform
!= "openbsd4" and sys
.platform
!= "openbsd5" and conf
.env
.undefined_ignore_ldflags
== []:
765 if conf
.CHECK_LDFLAGS(['-undefined', 'dynamic_lookup']):
766 conf
.env
.undefined_ignore_ldflags
= ['-undefined', 'dynamic_lookup']